Merge pull request #142 from TheBlueMatt/main
authorMatt Corallo <649246+TheBlueMatt@users.noreply.github.com>
Sat, 11 Nov 2023 03:24:39 +0000 (03:24 +0000)
committerGitHub <noreply@github.com>
Sat, 11 Nov 2023 03:24:39 +0000 (03:24 +0000)
Initial 0.0.118.0-alpha0 C# Release

412 files changed:
.github/workflows/build.yml
.gitignore
README.md
c_sharp/bindings.c [new file with mode: 0644]
c_sharp/bindings.c.body [new file with mode: 0644]
c_sharp/build-release-nupkg.sh [new file with mode: 0755]
c_sharp/packaging_artifacts/LICENSE-APACHE [new symlink]
c_sharp/packaging_artifacts/LICENSE-MIT [new symlink]
c_sharp/packaging_artifacts/LICENSE.md [new symlink]
c_sharp/packaging_artifacts/README.md [new symlink]
c_sharp/packaging_artifacts/[Content_Types].xml [new file with mode: 0644]
c_sharp/packaging_artifacts/_rels/.rels [new file with mode: 0644]
c_sharp/packaging_artifacts/org.ldk.nuspec [new file with mode: 0644]
c_sharp/packaging_artifacts/package/services/metadata/core-properties/ldk.psmdcp [new file with mode: 0644]
c_sharp/src/org/ldk/enums/Bolt12SemanticError.cs
c_sharp/src/org/ldk/enums/ChannelMonitorUpdateStatus.cs
c_sharp/src/org/ldk/enums/ConfirmationTarget.cs
c_sharp/src/org/ldk/enums/FailureCode.cs [deleted file]
c_sharp/src/org/ldk/enums/SocketAddressParseError.cs [new file with mode: 0644]
c_sharp/src/org/ldk/impl/bindings.cs
c_sharp/src/org/ldk/impl/version.cs [deleted file]
c_sharp/src/org/ldk/structs/.BroadcasterInterface.cs.swo [new file with mode: 0644]
c_sharp/src/org/ldk/structs/APIError.cs
c_sharp/src/org/ldk/structs/AcceptChannel.cs
c_sharp/src/org/ldk/structs/AcceptChannelV2.cs
c_sharp/src/org/ldk/structs/AnchorDescriptor.cs
c_sharp/src/org/ldk/structs/AnnouncementSignatures.cs
c_sharp/src/org/ldk/structs/BackgroundProcessor.cs
c_sharp/src/org/ldk/structs/Balance.cs
c_sharp/src/org/ldk/structs/BestBlock.cs
c_sharp/src/org/ldk/structs/BigEndianScalar.cs
c_sharp/src/org/ldk/structs/BigSize.cs
c_sharp/src/org/ldk/structs/BlindedHop.cs
c_sharp/src/org/ldk/structs/BlindedHopFeatures.cs
c_sharp/src/org/ldk/structs/BlindedPath.cs
c_sharp/src/org/ldk/structs/BlindedPayInfo.cs
c_sharp/src/org/ldk/structs/BlindedTail.cs
c_sharp/src/org/ldk/structs/Bolt11Invoice.cs
c_sharp/src/org/ldk/structs/Bolt11InvoiceFeatures.cs
c_sharp/src/org/ldk/structs/Bolt11ParseError.cs
c_sharp/src/org/ldk/structs/Bolt12Invoice.cs
c_sharp/src/org/ldk/structs/Bolt12InvoiceFeatures.cs
c_sharp/src/org/ldk/structs/BroadcasterInterface.cs
c_sharp/src/org/ldk/structs/BuiltCommitmentTransaction.cs
c_sharp/src/org/ldk/structs/BumpTransactionEvent.cs
c_sharp/src/org/ldk/structs/ChainMonitor.cs
c_sharp/src/org/ldk/structs/ChannelAnnouncement.cs
c_sharp/src/org/ldk/structs/ChannelConfig.cs
c_sharp/src/org/ldk/structs/ChannelCounterparty.cs
c_sharp/src/org/ldk/structs/ChannelDerivationParameters.cs
c_sharp/src/org/ldk/structs/ChannelDetails.cs
c_sharp/src/org/ldk/structs/ChannelFeatures.cs
c_sharp/src/org/ldk/structs/ChannelInfo.cs
c_sharp/src/org/ldk/structs/ChannelManager.cs
c_sharp/src/org/ldk/structs/ChannelManagerReadArgs.cs
c_sharp/src/org/ldk/structs/ChannelMessageHandler.cs
c_sharp/src/org/ldk/structs/ChannelMonitor.cs
c_sharp/src/org/ldk/structs/ChannelMonitorUpdate.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/ChannelTransactionParameters.cs
c_sharp/src/org/ldk/structs/ChannelTypeFeatures.cs
c_sharp/src/org/ldk/structs/ChannelUpdate.cs
c_sharp/src/org/ldk/structs/ChannelUpdateInfo.cs
c_sharp/src/org/ldk/structs/ChannelUsage.cs
c_sharp/src/org/ldk/structs/ClaimedHTLC.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/ClosingSigned.cs
c_sharp/src/org/ldk/structs/ClosingSignedFeeRange.cs
c_sharp/src/org/ldk/structs/ClosingTransaction.cs
c_sharp/src/org/ldk/structs/ClosureReason.cs
c_sharp/src/org/ldk/structs/CoinSelection.cs
c_sharp/src/org/ldk/structs/CoinSelectionSource.cs
c_sharp/src/org/ldk/structs/CommitmentSigned.cs
c_sharp/src/org/ldk/structs/CommitmentTransaction.cs
c_sharp/src/org/ldk/structs/CommitmentUpdate.cs
c_sharp/src/org/ldk/structs/Confirm.cs
c_sharp/src/org/ldk/structs/CounterpartyChannelTransactionParameters.cs
c_sharp/src/org/ldk/structs/CounterpartyCommitmentSecrets.cs
c_sharp/src/org/ldk/structs/CounterpartyForwardingInfo.cs
c_sharp/src/org/ldk/structs/CustomMessageHandler.cs
c_sharp/src/org/ldk/structs/CustomMessageReader.cs
c_sharp/src/org/ldk/structs/CustomOnionMessageContents.cs [deleted file]
c_sharp/src/org/ldk/structs/CustomOnionMessageHandler.cs
c_sharp/src/org/ldk/structs/DefaultMessageRouter.cs
c_sharp/src/org/ldk/structs/DefaultRouter.cs
c_sharp/src/org/ldk/structs/DelayedPaymentOutputDescriptor.cs
c_sharp/src/org/ldk/structs/Description.cs
c_sharp/src/org/ldk/structs/Destination.cs
c_sharp/src/org/ldk/structs/EcdsaChannelSigner.cs
c_sharp/src/org/ldk/structs/EntropySource.cs
c_sharp/src/org/ldk/structs/ErrorMessage.cs
c_sharp/src/org/ldk/structs/Event.cs
c_sharp/src/org/ldk/structs/EventHandler.cs
c_sharp/src/org/ldk/structs/EventsProvider.cs
c_sharp/src/org/ldk/structs/ExpandedKey.cs
c_sharp/src/org/ldk/structs/FailureCode.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Fallback.cs
c_sharp/src/org/ldk/structs/FeeEstimator.cs
c_sharp/src/org/ldk/structs/FilesystemPersister.cs [deleted file]
c_sharp/src/org/ldk/structs/FilesystemStore.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Filter.cs
c_sharp/src/org/ldk/structs/FixedPenaltyScorer.cs
c_sharp/src/org/ldk/structs/ForwardNode.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/ForwardTlvs.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/FutureCallback.cs
c_sharp/src/org/ldk/structs/GossipTimestampFilter.cs
c_sharp/src/org/ldk/structs/HTLCDescriptor.cs
c_sharp/src/org/ldk/structs/HTLCDestination.cs
c_sharp/src/org/ldk/structs/HTLCOutputInCommitment.cs
c_sharp/src/org/ldk/structs/HTLCUpdate.cs
c_sharp/src/org/ldk/structs/HolderCommitmentTransaction.cs
c_sharp/src/org/ldk/structs/Hostname.cs
c_sharp/src/org/ldk/structs/IgnoringMessageHandler.cs
c_sharp/src/org/ldk/structs/InFlightHtlcs.cs
c_sharp/src/org/ldk/structs/InMemorySigner.cs
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/InvoiceError.cs
c_sharp/src/org/ldk/structs/InvoiceRequest.cs
c_sharp/src/org/ldk/structs/InvoiceRequestFeatures.cs
c_sharp/src/org/ldk/structs/KVStore.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/KeysManager.cs
c_sharp/src/org/ldk/structs/LightningError.cs
c_sharp/src/org/ldk/structs/Listen.cs
c_sharp/src/org/ldk/structs/LockableScore.cs
c_sharp/src/org/ldk/structs/Logger.cs
c_sharp/src/org/ldk/structs/MaxDustHTLCExposure.cs
c_sharp/src/org/ldk/structs/MessageRouter.cs
c_sharp/src/org/ldk/structs/MessageSendEvent.cs
c_sharp/src/org/ldk/structs/MessageSendEventsProvider.cs
c_sharp/src/org/ldk/structs/MonitorEvent.cs
c_sharp/src/org/ldk/structs/MonitorUpdatingPersister.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/MultiThreadedLockableScore.cs
c_sharp/src/org/ldk/structs/MultiThreadedScoreLock.cs [deleted file]
c_sharp/src/org/ldk/structs/MultiThreadedScoreLockRead.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/MultiThreadedScoreLockWrite.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/NetAddress.cs [deleted file]
c_sharp/src/org/ldk/structs/NetworkGraph.cs
c_sharp/src/org/ldk/structs/NetworkUpdate.cs
c_sharp/src/org/ldk/structs/NodeAlias.cs
c_sharp/src/org/ldk/structs/NodeAnnouncement.cs
c_sharp/src/org/ldk/structs/NodeAnnouncementInfo.cs
c_sharp/src/org/ldk/structs/NodeFeatures.cs
c_sharp/src/org/ldk/structs/NodeId.cs
c_sharp/src/org/ldk/structs/NodeInfo.cs
c_sharp/src/org/ldk/structs/NodeSigner.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/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/OnionMessageProvider.cs [deleted file]
c_sharp/src/org/ldk/structs/OnionMessenger.cs
c_sharp/src/org/ldk/structs/OpenChannel.cs
c_sharp/src/org/ldk/structs/OpenChannelV2.cs
c_sharp/src/org/ldk/structs/Option_BigEndianScalarZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Option_BlockHashZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_C2Tuple_EightU16sEightU16sZZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Option_C2Tuple_u64u16ZZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Option_CVec_ChainHashZZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_CVec_NetAddressZZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_CVec_SocketAddressZZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Option_CVec_ThirtyTwoBytesZZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Option_CVec_u8ZZ.cs
c_sharp/src/org/ldk/structs/Option_CustomOnionMessageContentsZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_DurationZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_KeyPairZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_NetAddressZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_OnionMessageContentsZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Option_PackedLockTimeZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_PaymentHashZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_PaymentIdZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_PaymentPreimageZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_PaymentSecretZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_ScalarZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_ScriptZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_SecretKeyZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Option_SocketAddressZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Option_StrZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Option_ThirtyTwoBytesZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Option_TxidZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_U128Z.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Option_boolZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Option_f64Z.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Option_u128Z.cs [deleted file]
c_sharp/src/org/ldk/structs/Option_usizeZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/OutPoint.cs
c_sharp/src/org/ldk/structs/Packet.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/ParseOrSemanticError.cs
c_sharp/src/org/ldk/structs/ParsedOnionMessageContents.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Path.cs
c_sharp/src/org/ldk/structs/PathFailure.cs
c_sharp/src/org/ldk/structs/Payee.cs
c_sharp/src/org/ldk/structs/PayeePubKey.cs
c_sharp/src/org/ldk/structs/PaymentConstraints.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/PaymentError.cs
c_sharp/src/org/ldk/structs/PaymentParameters.cs
c_sharp/src/org/ldk/structs/PaymentPurpose.cs
c_sharp/src/org/ldk/structs/PaymentRelay.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/PaymentSendFailure.cs
c_sharp/src/org/ldk/structs/PeeledOnion.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/PeerManager.cs
c_sharp/src/org/ldk/structs/Persist.cs
c_sharp/src/org/ldk/structs/Persister.cs
c_sharp/src/org/ldk/structs/PhantomKeysManager.cs
c_sharp/src/org/ldk/structs/PhantomRouteHints.cs
c_sharp/src/org/ldk/structs/Ping.cs
c_sharp/src/org/ldk/structs/Pong.cs
c_sharp/src/org/ldk/structs/PrintableString.cs
c_sharp/src/org/ldk/structs/ProbabilisticScorer.cs
c_sharp/src/org/ldk/structs/ProbabilisticScoringFeeParameters.cs
c_sharp/src/org/ldk/structs/ProbeSendFailure.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/ProbingError.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/RapidGossipSync.cs
c_sharp/src/org/ldk/structs/RawBolt11Invoice.cs
c_sharp/src/org/ldk/structs/ReadOnlyNetworkGraph.cs
c_sharp/src/org/ldk/structs/ReceiveTlvs.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/RecentPaymentDetails.cs
c_sharp/src/org/ldk/structs/RecipientOnionFields.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_C2Tuple_BlindedPayInfoBlindedPathZNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_C2Tuple_CVec_u8ZusizeZNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_C2Tuple_PaymentHashPaymentSecretZNoneZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_C2Tuple_SignatureCVec_SignatureZZNoneZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_COption_CustomOnionMessageContentsZDecodeErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_COption_KeyPairZNoneZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_COption_OnionMessageContentsZDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_CVec_CVec_u8ZZNoneZ.cs
c_sharp/src/org/ldk/structs/Result_CVec_ECDSASignatureZNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_CVec_SignatureZNoneZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_CVec_StrZIOErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_CVec_UtxoZNoneZ.cs
c_sharp/src/org/ldk/structs/Result_CVec_u8ZIOErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_CVec_u8ZNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_CVec_u8ZPeerHandleErrorZ.cs
c_sharp/src/org/ldk/structs/Result_ChannelDerivationParametersDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_ChannelMonitorUpdateStatusNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_ClaimedHTLCDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_ECDSASignatureNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_HTLCDescriptorDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_NetAddressDecodeErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_NoneBolt12SemanticErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_NoneErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_NoneIOErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_PartiallySignedTransactionNoneZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_PayeePubKeyErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_PayeePubKeySecp256k1ErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_PaymentConstraintsDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_PaymentHashPaymentSendFailureZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_PaymentHashRetryableSendFailureZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_PaymentIdPaymentErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_PaymentPreimageAPIErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_PaymentRelayDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_PaymentSecretNoneZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_PeeledOnionNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_PublicKeyErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_PublicKeyNoneZ.cs
c_sharp/src/org/ldk/structs/Result_PublicKeySecp256k1ErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_ReceiveTlvsDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_RecipientOnionFieldsNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_RecoverableSignatureNoneZ.cs
c_sharp/src/org/ldk/structs/Result_RetryDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_SchnorrSignatureNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_ScriptNoneZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_SharedSecretNoneZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_SignatureNoneZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_SocketAddressDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_SocketAddressSocketAddressParseErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_StrSecp256k1ErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_StringErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_ThirtyTwoBytesAPIErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_ThirtyTwoBytesNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_ThirtyTwoBytesPaymentErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_ThirtyTwoBytesPaymentSendFailureZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_ThirtyTwoBytesRetryableSendFailureZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_TransactionNoneZ.cs
c_sharp/src/org/ldk/structs/Result_VerifiedInvoiceRequestNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result__u832APIErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Retry.cs
c_sharp/src/org/ldk/structs/RevokeAndACK.cs
c_sharp/src/org/ldk/structs/Route.cs
c_sharp/src/org/ldk/structs/RouteHint.cs
c_sharp/src/org/ldk/structs/RouteHintHop.cs
c_sharp/src/org/ldk/structs/RouteHop.cs
c_sharp/src/org/ldk/structs/RouteParameters.cs
c_sharp/src/org/ldk/structs/Router.cs
c_sharp/src/org/ldk/structs/RoutingFees.cs
c_sharp/src/org/ldk/structs/RoutingMessageHandler.cs
c_sharp/src/org/ldk/structs/Score.cs
c_sharp/src/org/ldk/structs/ScoreLookUp.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/ScoreUpdate.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/ScorerAccountingForInFlightHtlcs.cs
c_sharp/src/org/ldk/structs/Sha256.cs
c_sharp/src/org/ldk/structs/Shutdown.cs
c_sharp/src/org/ldk/structs/ShutdownScript.cs
c_sharp/src/org/ldk/structs/SignOrCreationError.cs
c_sharp/src/org/ldk/structs/SignedRawBolt11Invoice.cs
c_sharp/src/org/ldk/structs/SignerProvider.cs
c_sharp/src/org/ldk/structs/Sleeper.cs
c_sharp/src/org/ldk/structs/SocketAddress.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/SocketDescriptor.cs
c_sharp/src/org/ldk/structs/SpendableOutputDescriptor.cs
c_sharp/src/org/ldk/structs/StaticPaymentOutputDescriptor.cs
c_sharp/src/org/ldk/structs/TaggedHash.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/ThreeTuple_OffersMessageDestinationBlindedPathZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/ThreeTuple_OnionMessageContentsDestinationBlindedPathZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/ThreeTuple_OutPointCVec_MonitorEventZPublicKeyZ.cs
c_sharp/src/org/ldk/structs/ThreeTuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ.cs
c_sharp/src/org/ldk/structs/TransactionU16LenLimited.cs
c_sharp/src/org/ldk/structs/TrustedClosingTransaction.cs
c_sharp/src/org/ldk/structs/TrustedCommitmentTransaction.cs
c_sharp/src/org/ldk/structs/TwoTuple_BlockHashChannelManagerZ.cs [deleted file]
c_sharp/src/org/ldk/structs/TwoTuple_BlockHashChannelMonitorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/TwoTuple_CVec_u8ZusizeZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_ECDSASignatureCVec_ECDSASignatureZZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_OutPointCVec_MonitorUpdateIdZZ.cs
c_sharp/src/org/ldk/structs/TwoTuple_OutPointCVec_u8ZZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_OutPointScriptZ.cs [deleted file]
c_sharp/src/org/ldk/structs/TwoTuple_PartiallySignedTransactionusizeZ.cs [deleted file]
c_sharp/src/org/ldk/structs/TwoTuple_PaymentHashPaymentIdZ.cs [deleted file]
c_sharp/src/org/ldk/structs/TwoTuple_PaymentHashPaymentSecretZ.cs [deleted file]
c_sharp/src/org/ldk/structs/TwoTuple_PublicKeyCOption_NetAddressZZ.cs [deleted file]
c_sharp/src/org/ldk/structs/TwoTuple_PublicKeyCOption_SocketAddressZZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_PublicKeyOnionMessageZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_PublicKeyTypeZ.cs
c_sharp/src/org/ldk/structs/TwoTuple_SignatureCVec_SignatureZZ.cs [deleted file]
c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesChannelManagerZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesChannelMonitorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesPublicKeyZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_TxidCOption_BlockHashZZ.cs [deleted file]
c_sharp/src/org/ldk/structs/TwoTuple_TxidCVec_C2Tuple_u32ScriptZZZ.cs [deleted file]
c_sharp/src/org/ldk/structs/TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ.cs [deleted file]
c_sharp/src/org/ldk/structs/TwoTuple_Z.cs
c_sharp/src/org/ldk/structs/TwoTuple__u1632_u1632Z.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple__u168_u168Z.cs [deleted file]
c_sharp/src/org/ldk/structs/TwoTuple_u32CVec_u8ZZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_u32ScriptZ.cs [deleted file]
c_sharp/src/org/ldk/structs/TwoTuple_u64CVec_u8ZZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_u64u16Z.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_usizeTransactionZ.cs
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/TxIn.cs
c_sharp/src/org/ldk/structs/TxInitRbf.cs
c_sharp/src/org/ldk/structs/TxOut.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/Type.cs
c_sharp/src/org/ldk/structs/UnsignedBolt12Invoice.cs
c_sharp/src/org/ldk/structs/UnsignedChannelAnnouncement.cs
c_sharp/src/org/ldk/structs/UnsignedChannelUpdate.cs
c_sharp/src/org/ldk/structs/UnsignedGossipMessage.cs
c_sharp/src/org/ldk/structs/UnsignedInvoiceRequest.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/Utxo.cs
c_sharp/src/org/ldk/structs/UtxoLookup.cs
c_sharp/src/org/ldk/structs/VerifiedInvoiceRequest.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/WalletSource.cs
c_sharp/src/org/ldk/structs/WarningMessage.cs
c_sharp/src/org/ldk/structs/Watch.cs
c_sharp/src/org/ldk/structs/WatchedOutput.cs
c_sharp/src/org/ldk/structs/WriteableEcdsaChannelSigner.cs
c_sharp/src/org/ldk/structs/WriteableScore.cs
c_sharp/src/org/ldk/util/InternalUtils.cs
c_sharp/test/src/tests.cs [new file with mode: 0644]
csharp_strings.py
genbindings.sh

index 845ab9e13e1807fd40ec3a258d0347f0bc951410..b57cbad22ff3e17e702818f5cc6367d577890376 100644 (file)
@@ -104,6 +104,148 @@ jobs:
           git checkout node-net/package.json
           git diff --exit-code
 
+  c_sharp_bindings:
+    runs-on: ubuntu-latest
+    # Ubuntu's version of clang doesn't support....anything that should work.
+    # Ubuntu is an utter trash OS and should generally never be used for anything.
+    # We also require at least rustc 1.51 (ie https://github.com/rust-lang/rust/pull/79998),
+    # so we use debian testing
+    container: debian:bookworm
+    strategy:
+      fail-fast: false
+    steps:
+      - name: Install required dependencies
+        run: |
+          apt-get update
+          apt-get -y dist-upgrade
+          apt-get -y install cargo lld llvm git g++ clang curl python3 mono-devel
+      - name: Checkout source code
+        uses: actions/checkout@v2
+        with:
+          fetch-depth: 0
+      - name: Install cbindgen
+        run: |
+          git clone https://github.com/eqrion/cbindgen
+          cd cbindgen/
+          git checkout v0.20.0
+          cargo update -p indexmap --precise "1.6.2" --verbose
+          cargo install --locked --path .
+      - name: Checkout Rust-Lightning and LDK-C-Bindings git
+        run: |
+          git config --global safe.directory '*'
+          git config --global user.email "ldk-ci@example.com"
+          git config --global user.name "LDK CI"
+          # Note this is a different endpoint, as we need one non-upstream commit!
+          git clone https://github.com/lightningdevkit/rust-lightning
+          cd rust-lightning
+          git checkout origin/0.0.118-bindings
+          cd ..
+          git clone https://github.com/lightningdevkit/ldk-c-bindings
+          cd ldk-c-bindings
+          git checkout 0.0.118
+          cd lightning-c-bindings
+          cargo update -p memchr --precise "2.5.0" --verbose
+      - name: Rebuild C bindings with STD
+        run: |
+          cd ldk-c-bindings
+          git config --global safe.directory "*"
+          ./genbindings.sh ../rust-lightning true
+      - name: Build and Test C# Debug Bindings
+        run: |
+          ./genbindings.sh ./ldk-c-bindings/ c_sharp true true
+          mono-csc -out:test.exe -langversion:3 -unsafe c_sharp/src/org/ldk/enums/*.cs c_sharp/src/org/ldk/impl/*.cs c_sharp/src/org/ldk/util/*.cs c_sharp/src/org/ldk/structs/*.cs c_sharp/test/src/tests.cs
+          ln -s libldkcsharp_debug_Linux-amd64.so libldkcsharp.so
+          export ASAN_OPTIONS=detect_leaks=0
+          LD_PRELOAD=/usr/lib/llvm-14/lib/clang/14.0.6/lib/linux/libclang_rt.asan-x86_64.so mono test.exe
+
+  c_sharp_determinism:
+    runs-on: ubuntu-latest
+    # Ubuntu's version of clang doesn't support....anything that should work.
+    # Ubuntu is an utter trash OS and should generally never be used for anything.
+    # We also require at least rustc 1.51 (ie https://github.com/rust-lang/rust/pull/79998),
+    # so we use debian testing
+    container: debian:bookworm
+    strategy:
+      fail-fast: false
+    steps:
+      - name: Install required dependencies
+        run: |
+          apt-get update
+          apt-get -y dist-upgrade
+          apt-get -y install cargo libstd-rust-dev-windows lld llvm git g++ clang curl gcc-mingw-w64-x86-64-win32 python3 mono-devel zip faketime
+      - name: Checkout source code
+        uses: actions/checkout@v2
+        with:
+          fetch-depth: 0
+      - name: Install cbindgen
+        run: |
+          git clone https://github.com/eqrion/cbindgen
+          cd cbindgen/
+          git checkout v0.20.0
+          cargo update -p indexmap --precise "1.6.2" --verbose
+          cargo install --locked --path .
+      - name: Checkout Rust-Lightning and LDK-C-Bindings git
+        run: |
+          git config --global safe.directory '*'
+          git config --global user.email "ldk-ci@example.com"
+          git config --global user.name "LDK CI"
+          # Note this is a different endpoint, as we need one non-upstream commit!
+          git clone https://github.com/lightningdevkit/rust-lightning
+          cd rust-lightning
+          git checkout origin/0.0.118-bindings
+          cd ..
+          git clone https://github.com/lightningdevkit/ldk-c-bindings
+          cd ldk-c-bindings
+          git checkout 0.0.118
+      - name: Rebuild C bindings with STD
+        run: |
+          cd ldk-c-bindings
+          export LDK_C_BINDINGS_EXTRA_TARGETS=x86_64-pc-windows-gnu
+          export LDK_C_BINDINGS_EXTRA_TARGET_CCS=`pwd`/deterministic-build-wrappers/clang-x86_64-windows
+          ./genbindings.sh ../rust-lightning true
+      - name: Remove checked-in source to ensure its correctly checked-in
+        run: rm c_sharp/src/org/ldk/enums/*.cs c_sharp/src/org/ldk/impl/*.cs c_sharp/src/org/ldk/structs/*.cs
+      - name: Build Windows C# Bindings
+        run: |
+          export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)"
+          LDK_TARGET=x86_64-pc-windows-gnu faketime -f "2021-01-01 00:00:00" ./genbindings.sh ./ldk-c-bindings/ c_sharp false false
+      - name: Build Linux C# Bindings
+        run: |
+          export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)"
+          ./genbindings.sh ./ldk-c-bindings/ c_sharp false false
+      - name: Build Release NUPKG
+        run: |
+          cd c_sharp
+          ./build-release-nupkg.sh
+      - name: Check latest auto-generated code is in git
+        run: |
+          # Checkout files that get updated with version information
+          git checkout c_sharp/packaging_artifacts/package/services/metadata/core-properties/ldk.psmdcp
+          git checkout c_sharp/packaging_artifacts/org.ldk.nuspec
+          git diff --exit-code
+      - name: Checkout latest binaries
+        shell: bash
+        run: |
+          export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)"
+          echo "Fetching deterministic binaries for LDK-GC ${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}"
+          # Gitweb only allows snapshots of folders by providing the object hash, which we have to extract:
+          SNAPSHOT_LINK="$(curl "https://git.bitcoin.ninja/index.cgi?p=ldk-java-bins;a=tree;f=${LDK_GARBAGECOLLECTED_GIT_OVERRIDE};hb=refs/heads/main" | grep snapshot | grep -o 'href="[a-zA-Z0-9/?\.=;\-]*"' | sed 's/href="//' | tr -d '"' | grep snapshot)"
+          curl -o bins-snapshot.tgz "https://git.bitcoin.ninja${SNAPSHOT_LINK}"
+          mkdir -p ldk-java-bins/"${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}"
+          cd ldk-java-bins/"${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}"
+          tar xvvf ../../bins-snapshot.tgz
+          mv ldk-java-bins-*/* ./
+          rm -r ldk-java-bins-*
+      - name: Compare C# nupkg with built one
+        shell: bash
+        run: |
+          export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD)"
+          if ! diff ldk-java-bins/"${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"org.ldk.nupkg c_sharp/org.ldk.nupkg; then
+            apt-get -y install diffoscope
+            diffoscope ldk-java-bins/"${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"org.ldk.nupkg c_sharp/org.ldk.nupkg || echo
+            exit 1
+          fi
+
   java_bindings:
     runs-on: ubuntu-latest
     # Ubuntu's version of rustc uses its own LLVM instead of being a real native package.
index 9ea8916d6e157e7f860cccda5edf87cee6a879a8..283ad722c299b6815dd2c16f9e1717e2ba87a438 100644 (file)
@@ -5,6 +5,10 @@ target
 __pycache__
 src/main/java/org/ldk/impl/version.java
 src/main/jni/version.c
+**/*.class
 ts/version.ts
 ts/version.c
-**/*.class
+c_sharp/src/org/ldk/impl/version.cs
+c_sharp/version.c
+c_sharp/packaging_artifacts/runtimes/
+c_sharp/packaging_artifacts/lib/
index ed88ceba2f64831f57ee30f7254ffe5ee8ff8aa3..4189b966803f4a606706771bb547673a7497e7ef 100644 (file)
--- a/README.md
+++ b/README.md
@@ -58,6 +58,11 @@ well to implement the required network handling to bridge the `lightningdevkit`
 `SocketDescriptor` interface to Node.JS TCP Sockets. For those wishing to run a lightning node in
 the browser you will need to provide your own bridge from `SocketDescriptor` to a WebSocket proxy.
 
+# C#
+
+The C# bindings are functionally complete, but should be considered alpha quality. They are brand
+new and likely contain bugs or memory leaks.
+
 ## General
 
 The only known issue resulting in a use-after-free bug requires custom a custom ChannelKeys instance
diff --git a/c_sharp/bindings.c b/c_sharp/bindings.c
new file mode 100644 (file)
index 0000000..ae8f11a
--- /dev/null
@@ -0,0 +1,71353 @@
+#define LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ LDKCVec_TransactionOutputsZ
+#define CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ_free CVec_TransactionOutputsZ_free
+#define LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ LDKCVec_TransactionOutputsZ
+#define CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ_free CVec_TransactionOutputsZ_free
+
+// On OSX jlong (ie long long) is not equivalent to int64_t, so we override here
+#define int64_t jlong
+#include <lightning.h>
+#include <string.h>
+#include <stdatomic.h>
+#include <stdlib.h>
+
+#define LIKELY(v) __builtin_expect(!!(v), 1)
+#define UNLIKELY(v) __builtin_expect(!!(v), 0)
+
+#include <stdio.h>
+#define DEBUG_PRINT(...) fprintf(stderr, __VA_ARGS__)
+#define do_MALLOC(a, _b, _c) malloc(a)
+#define MALLOC(a, _) malloc(a)
+#define FREE(p) if ((uint64_t)(p) > 4096) { free(p); }
+#define CHECK_ACCESS(p)
+#define CHECK_INNER_FIELD_ACCESS_OR_NULL(v)
+#define DO_ASSERT(a) (void)(a)
+#define CHECK(a)
+
+
+// We assume that CVec_u8Z and u8slice are the same size and layout (and thus pointers to the two can be mixed)
+_Static_assert(sizeof(LDKCVec_u8Z) == sizeof(LDKu8slice), "Vec<u8> and [u8] need to have been mapped identically");
+_Static_assert(offsetof(LDKCVec_u8Z, data) == offsetof(LDKu8slice, data), "Vec<u8> and [u8] need to have been mapped identically");
+_Static_assert(offsetof(LDKCVec_u8Z, datalen) == offsetof(LDKu8slice, datalen), "Vec<u8> and [u8] need to have been mapped identically");
+
+_Static_assert(sizeof(void*) <= 8, "Pointers must fit into 64 bits");
+
+#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 */ \
+               ty elems[]; \
+       }; \
+       typedef struct name##array * name##Array; \
+       static inline name##Array init_##name##Array(size_t arr_len, int lineno) { \
+               name##Array arr = (name##Array)do_MALLOC(arr_len * sizeof(ty) + sizeof(uint64_t), #name" array init", lineno); \
+               arr->arr_len = arr_len; \
+               return arr; \
+       }
+
+DECL_ARR_TYPE(int64_t, int64_t);
+DECL_ARR_TYPE(uint64_t, uint64_t);
+DECL_ARR_TYPE(int8_t, int8_t);
+DECL_ARR_TYPE(int16_t, int16_t);
+DECL_ARR_TYPE(uint32_t, uint32_t);
+DECL_ARR_TYPE(void*, ptr);
+DECL_ARR_TYPE(char, char);
+typedef charArray jstring;
+
+static inline jstring str_ref_to_cs(const char* chars, size_t len) {
+       charArray arr = init_charArray(len, __LINE__);
+       memcpy(arr->elems, chars, len);
+       return arr;
+}
+static inline LDKStr str_ref_to_owned_c(const jstring str) {
+       char* newchars = MALLOC(str->arr_len + 1, "String chars");
+       memcpy(newchars, str->elems, str->arr_len);
+       newchars[str->arr_len] = 0;
+       LDKStr res = {
+               .chars = newchars,
+               .len = str->arr_len,
+               .chars_is_owned = true
+       };
+       return res;
+}
+
+typedef bool jboolean;
+
+int64_t CS_LDK_allocate_buffer(int64_t len) {
+       return MALLOC(len, "C#-requested buffer");
+}
+
+void CS_LDK_free_buffer(int64_t buf) {
+       FREE(buf);
+}
+
+jstring CS_LDK_get_ldk_c_bindings_version() {
+       return str_ref_to_cs(check_get_ldk_bindings_version(), strlen(check_get_ldk_bindings_version()));
+}
+jstring CS_LDK_get_ldk_version() {
+       return str_ref_to_cs(check_get_ldk_version(), strlen(check_get_ldk_version()));
+}
+#include "version.c"
+
+typedef int8_tArray (*invoker_l_l)(int obj_ptr, int fn_id, int64_t a);
+static invoker_l_l js_invoke_function_l_l;
+int CS_LDK_register_l_l_invoker(invoker_l_l invoker) {
+       js_invoke_function_l_l = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_ll)(int obj_ptr, int fn_id, int64_t a, ptrArray b);
+static invoker_l_ll js_invoke_function_l_ll;
+int CS_LDK_register_l_ll_invoker(invoker_l_ll invoker) {
+       js_invoke_function_l_ll = invoker;
+       return 0;
+}
+
+typedef int8_tArray (*invoker_l_)(int obj_ptr, int fn_id);
+static invoker_l_ js_invoke_function_l_;
+int CS_LDK_register_l__invoker(invoker_l_ invoker) {
+       js_invoke_function_l_ = invoker;
+       return 0;
+}
+
+typedef void (*invoker_void_l)(int obj_ptr, int fn_id, int64_t a);
+static invoker_void_l js_invoke_function_void_l;
+int CS_LDK_register_void_l_invoker(invoker_void_l invoker) {
+       js_invoke_function_void_l = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_llll)(int obj_ptr, int fn_id, int8_tArray a, int64_t b, int64_t c, int8_tArray d);
+static invoker_l_llll js_invoke_function_l_llll;
+int CS_LDK_register_l_llll_invoker(invoker_l_llll invoker) {
+       js_invoke_function_l_llll = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_lllll)(int obj_ptr, int fn_id, int8_tArray a, int64_t b, int64_t c, int8_tArray d, int64_t e);
+static invoker_l_lllll js_invoke_function_l_lllll;
+int CS_LDK_register_l_lllll_invoker(invoker_l_lllll invoker) {
+       js_invoke_function_l_lllll = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_lll)(int obj_ptr, int fn_id, int8_tArray 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 void (*invoker_void_ll)(int obj_ptr, int fn_id, int64_t a, int64_t b);
+static invoker_void_ll js_invoke_function_void_ll;
+int CS_LDK_register_void_ll_invoker(invoker_void_ll invoker) {
+       js_invoke_function_void_ll = invoker;
+       return 0;
+}
+
+typedef int32_t (*invoker_ChannelMonitorUpdateStatus_ll)(int obj_ptr, int fn_id, int64_t a, int64_t b);
+static invoker_ChannelMonitorUpdateStatus_ll js_invoke_function_ChannelMonitorUpdateStatus_ll;
+int CS_LDK_register_ChannelMonitorUpdateStatus_ll_invoker(invoker_ChannelMonitorUpdateStatus_ll invoker) {
+       js_invoke_function_ChannelMonitorUpdateStatus_ll = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_Recipient)(int obj_ptr, int fn_id, int32_t a);
+static invoker_l_Recipient js_invoke_function_l_Recipient;
+int CS_LDK_register_l_Recipient_invoker(invoker_l_Recipient invoker) {
+       js_invoke_function_l_Recipient = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_Recipientll)(int obj_ptr, int fn_id, int32_t a, int8_tArray b, int64_t c);
+static invoker_l_Recipientll js_invoke_function_l_Recipientll;
+int CS_LDK_register_l_Recipientll_invoker(invoker_l_Recipientll invoker) {
+       js_invoke_function_l_Recipientll = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_llRecipient)(int obj_ptr, int fn_id, int8_tArray a, ptrArray b, int32_t c);
+static invoker_l_llRecipient js_invoke_function_l_llRecipient;
+int CS_LDK_register_l_llRecipient_invoker(invoker_l_llRecipient invoker) {
+       js_invoke_function_l_llRecipient = invoker;
+       return 0;
+}
+
+typedef int8_tArray (*invoker_l_bll)(int obj_ptr, int fn_id, jboolean a, int64_t b, int8_tArray c);
+static invoker_l_bll js_invoke_function_l_bll;
+int CS_LDK_register_l_bll_invoker(invoker_l_bll invoker) {
+       js_invoke_function_l_bll = invoker;
+       return 0;
+}
+
+typedef int32_t (*invoker_i_ConfirmationTarget)(int obj_ptr, int fn_id, int32_t a);
+static invoker_i_ConfirmationTarget js_invoke_function_i_ConfirmationTarget;
+int CS_LDK_register_i_ConfirmationTarget_invoker(invoker_i_ConfirmationTarget invoker) {
+       js_invoke_function_i_ConfirmationTarget = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_llllll)(int obj_ptr, int fn_id, int8_tArray a, int64_t b, int64_tArray c, int64_t d, int8_tArray e, int8_tArray f);
+static invoker_l_llllll js_invoke_function_l_llllll;
+int CS_LDK_register_l_llllll_invoker(invoker_l_llllll invoker) {
+       js_invoke_function_l_llllll = invoker;
+       return 0;
+}
+
+typedef int16_t (*invoker_s_)(int obj_ptr, int fn_id);
+static invoker_s_ js_invoke_function_s_;
+int CS_LDK_register_s__invoker(invoker_s_ invoker) {
+       js_invoke_function_s_ = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_lllb)(int obj_ptr, int fn_id, jstring a, jstring b, jstring c, jboolean d);
+static invoker_l_lllb js_invoke_function_l_lllb;
+int CS_LDK_register_l_lllb_invoker(invoker_l_lllb invoker) {
+       js_invoke_function_l_lllb = invoker;
+       return 0;
+}
+
+typedef int32_t (*invoker_ChannelMonitorUpdateStatus_lll)(int obj_ptr, int fn_id, int64_t a, int64_t b, int64_t c);
+static invoker_ChannelMonitorUpdateStatus_lll js_invoke_function_ChannelMonitorUpdateStatus_lll;
+int CS_LDK_register_ChannelMonitorUpdateStatus_lll_invoker(invoker_ChannelMonitorUpdateStatus_lll invoker) {
+       js_invoke_function_ChannelMonitorUpdateStatus_lll = invoker;
+       return 0;
+}
+
+typedef int32_t (*invoker_ChannelMonitorUpdateStatus_llll)(int obj_ptr, int fn_id, int64_t a, int64_t b, int64_t c, int64_t d);
+static invoker_ChannelMonitorUpdateStatus_llll js_invoke_function_ChannelMonitorUpdateStatus_llll;
+int CS_LDK_register_ChannelMonitorUpdateStatus_llll_invoker(invoker_ChannelMonitorUpdateStatus_llll invoker) {
+       js_invoke_function_ChannelMonitorUpdateStatus_llll = invoker;
+       return 0;
+}
+
+typedef void (*invoker_void_)(int obj_ptr, int fn_id);
+static invoker_void_ js_invoke_function_void_;
+int CS_LDK_register_void__invoker(invoker_void_ invoker) {
+       js_invoke_function_void_ = invoker;
+       return 0;
+}
+
+typedef void (*invoker_void_lli)(int obj_ptr, int fn_id, int8_tArray a, int64_tArray b, int32_t c);
+static invoker_void_lli js_invoke_function_void_lli;
+int CS_LDK_register_void_lli_invoker(invoker_void_lli invoker) {
+       js_invoke_function_void_lli = invoker;
+       return 0;
+}
+
+typedef void (*invoker_void_li)(int obj_ptr, int fn_id, int8_tArray a, int32_t b);
+static invoker_void_li js_invoke_function_void_li;
+int CS_LDK_register_void_li_invoker(invoker_void_li invoker) {
+       js_invoke_function_void_li = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_llb)(int obj_ptr, int fn_id, int8_tArray a, int64_t b, jboolean c);
+static invoker_l_llb js_invoke_function_l_llb;
+int CS_LDK_register_l_llb_invoker(invoker_l_llb invoker) {
+       js_invoke_function_l_llb = invoker;
+       return 0;
+}
+
+typedef jboolean (*invoker_b_)(int obj_ptr, int fn_id);
+static invoker_b_ js_invoke_function_b_;
+int CS_LDK_register_b__invoker(invoker_b_ invoker) {
+       js_invoke_function_b_ = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_sl)(int obj_ptr, int fn_id, int16_t a, int8_tArray b);
+static invoker_l_sl js_invoke_function_l_sl;
+int CS_LDK_register_l_sl_invoker(invoker_l_sl invoker) {
+       js_invoke_function_l_sl = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_lb)(int obj_ptr, int fn_id, int8_tArray a, jboolean b);
+static invoker_l_lb js_invoke_function_l_lb;
+int CS_LDK_register_l_lb_invoker(invoker_l_lb invoker) {
+       js_invoke_function_l_lb = invoker;
+       return 0;
+}
+
+typedef jboolean (*invoker_b_l)(int obj_ptr, int fn_id, int64_t a);
+static invoker_b_l js_invoke_function_b_l;
+int CS_LDK_register_b_l_invoker(invoker_b_l invoker) {
+       js_invoke_function_b_l = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_llli)(int obj_ptr, int fn_id, int8_tArray a, int64_tArray b, int64_tArray c, int32_t d);
+static invoker_l_llli js_invoke_function_l_llli;
+int CS_LDK_register_l_llli_invoker(invoker_l_llli invoker) {
+       js_invoke_function_l_llli = invoker;
+       return 0;
+}
+static inline struct LDKThirtyTwoBytes ThirtyTwoBytes_clone(const struct LDKThirtyTwoBytes *orig) { struct LDKThirtyTwoBytes ret; memcpy(ret.data, orig->data, 32); return ret; }
+
+static inline void* untag_ptr(uint64_t ptr) {
+       if (ptr < 4096) return (void*)ptr;
+       if (sizeof(void*) == 4) {
+               // For 32-bit systems, store pointers as 64-bit ints and use the 31st bit
+               return (void*)(uintptr_t)ptr;
+       } else {
+               // For 64-bit systems, assume the top byte is used for tagging, then
+               // use bit 9 ^ bit 10.
+               uint64_t tenth_bit = (((uintptr_t)ptr) & (1ULL << 54)) >> 54;
+               uintptr_t p = (ptr & ~(1ULL << 55)) | (tenth_bit << 55);
+#ifdef LDK_DEBUG_BUILD
+               // On debug builds we also use the 11th bit as a debug flag
+               uintptr_t eleventh_bit = (((uintptr_t)ptr) & (1ULL << 53)) >> 53;
+               CHECK(tenth_bit != eleventh_bit);
+               p ^= 1ULL << 53;
+#endif
+               return (void*)p;
+       }
+}
+static inline bool ptr_is_owned(uint64_t ptr) {
+       if(ptr < 4096) return true;
+       if (sizeof(void*) == 4) {
+               return ptr & (1ULL << 32);
+       } else {
+               uintptr_t ninth_bit = (((uintptr_t)ptr) & (1ULL << 55)) >> 55;
+               uintptr_t tenth_bit = (((uintptr_t)ptr) & (1ULL << 54)) >> 54;
+#ifdef LDK_DEBUG_BUILD
+               // On debug builds we also use the 11th bit as a debug flag
+               uintptr_t eleventh_bit = (((uintptr_t)ptr) & (1ULL << 53)) >> 53;
+               CHECK(tenth_bit != eleventh_bit);
+#endif
+               return (ninth_bit ^ tenth_bit) ? true : false;
+       }
+}
+static inline uint64_t tag_ptr(const void* ptr, bool is_owned) {
+       if ((uintptr_t)ptr < 4096) return (uint64_t)ptr;
+       if (sizeof(void*) == 4) {
+               return (((uint64_t)ptr) | ((is_owned ? 1ULL : 0) << 32));
+       } else {
+               CHECK(sizeof(uintptr_t) == 8);
+               uintptr_t tenth_bit = (((uintptr_t)ptr) & (1ULL << 54)) >> 54;
+               uintptr_t t = (((uintptr_t)ptr) | (((is_owned ? 1ULL : 0ULL) ^ tenth_bit) << 55));
+#ifdef LDK_DEBUG_BUILD
+               uintptr_t ninth_bit = (((uintptr_t)ptr) & (1ULL << 55)) >> 55;
+               uintptr_t eleventh_bit = (((uintptr_t)ptr) & (1ULL << 53)) >> 53;
+               CHECK(ninth_bit == tenth_bit);
+               CHECK(ninth_bit == eleventh_bit);
+               t ^= 1ULL << 53;
+#endif
+               CHECK(ptr_is_owned(t) == is_owned);
+               CHECK(untag_ptr(t) == ptr);
+               return t;
+       }
+}
+
+static inline LDKBolt11SemanticError LDKBolt11SemanticError_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKBolt11SemanticError_NoPaymentHash;
+               case 1: return LDKBolt11SemanticError_MultiplePaymentHashes;
+               case 2: return LDKBolt11SemanticError_NoDescription;
+               case 3: return LDKBolt11SemanticError_MultipleDescriptions;
+               case 4: return LDKBolt11SemanticError_NoPaymentSecret;
+               case 5: return LDKBolt11SemanticError_MultiplePaymentSecrets;
+               case 6: return LDKBolt11SemanticError_InvalidFeatures;
+               case 7: return LDKBolt11SemanticError_InvalidRecoveryId;
+               case 8: return LDKBolt11SemanticError_InvalidSignature;
+               case 9: return LDKBolt11SemanticError_ImpreciseAmount;
+               default: abort();
+       }
+}
+static inline int32_t LDKBolt11SemanticError_to_cs(LDKBolt11SemanticError val) {
+       switch (val) {
+               case LDKBolt11SemanticError_NoPaymentHash: return 0;
+               case LDKBolt11SemanticError_MultiplePaymentHashes: return 1;
+               case LDKBolt11SemanticError_NoDescription: return 2;
+               case LDKBolt11SemanticError_MultipleDescriptions: return 3;
+               case LDKBolt11SemanticError_NoPaymentSecret: return 4;
+               case LDKBolt11SemanticError_MultiplePaymentSecrets: return 5;
+               case LDKBolt11SemanticError_InvalidFeatures: return 6;
+               case LDKBolt11SemanticError_InvalidRecoveryId: return 7;
+               case LDKBolt11SemanticError_InvalidSignature: return 8;
+               case LDKBolt11SemanticError_ImpreciseAmount: return 9;
+               default: abort();
+       }
+}
+static inline LDKBolt12SemanticError LDKBolt12SemanticError_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKBolt12SemanticError_AlreadyExpired;
+               case 1: return LDKBolt12SemanticError_UnsupportedChain;
+               case 2: return LDKBolt12SemanticError_UnexpectedChain;
+               case 3: return LDKBolt12SemanticError_MissingAmount;
+               case 4: return LDKBolt12SemanticError_InvalidAmount;
+               case 5: return LDKBolt12SemanticError_InsufficientAmount;
+               case 6: return LDKBolt12SemanticError_UnexpectedAmount;
+               case 7: return LDKBolt12SemanticError_UnsupportedCurrency;
+               case 8: return LDKBolt12SemanticError_UnknownRequiredFeatures;
+               case 9: return LDKBolt12SemanticError_UnexpectedFeatures;
+               case 10: return LDKBolt12SemanticError_MissingDescription;
+               case 11: return LDKBolt12SemanticError_MissingSigningPubkey;
+               case 12: return LDKBolt12SemanticError_InvalidSigningPubkey;
+               case 13: return LDKBolt12SemanticError_UnexpectedSigningPubkey;
+               case 14: return LDKBolt12SemanticError_MissingQuantity;
+               case 15: return LDKBolt12SemanticError_InvalidQuantity;
+               case 16: return LDKBolt12SemanticError_UnexpectedQuantity;
+               case 17: return LDKBolt12SemanticError_InvalidMetadata;
+               case 18: return LDKBolt12SemanticError_UnexpectedMetadata;
+               case 19: return LDKBolt12SemanticError_MissingPayerMetadata;
+               case 20: return LDKBolt12SemanticError_MissingPayerId;
+               case 21: return LDKBolt12SemanticError_DuplicatePaymentId;
+               case 22: return LDKBolt12SemanticError_MissingPaths;
+               case 23: return LDKBolt12SemanticError_InvalidPayInfo;
+               case 24: return LDKBolt12SemanticError_MissingCreationTime;
+               case 25: return LDKBolt12SemanticError_MissingPaymentHash;
+               case 26: return LDKBolt12SemanticError_MissingSignature;
+               default: abort();
+       }
+}
+static inline int32_t LDKBolt12SemanticError_to_cs(LDKBolt12SemanticError val) {
+       switch (val) {
+               case LDKBolt12SemanticError_AlreadyExpired: return 0;
+               case LDKBolt12SemanticError_UnsupportedChain: return 1;
+               case LDKBolt12SemanticError_UnexpectedChain: return 2;
+               case LDKBolt12SemanticError_MissingAmount: return 3;
+               case LDKBolt12SemanticError_InvalidAmount: return 4;
+               case LDKBolt12SemanticError_InsufficientAmount: return 5;
+               case LDKBolt12SemanticError_UnexpectedAmount: return 6;
+               case LDKBolt12SemanticError_UnsupportedCurrency: return 7;
+               case LDKBolt12SemanticError_UnknownRequiredFeatures: return 8;
+               case LDKBolt12SemanticError_UnexpectedFeatures: return 9;
+               case LDKBolt12SemanticError_MissingDescription: return 10;
+               case LDKBolt12SemanticError_MissingSigningPubkey: return 11;
+               case LDKBolt12SemanticError_InvalidSigningPubkey: return 12;
+               case LDKBolt12SemanticError_UnexpectedSigningPubkey: return 13;
+               case LDKBolt12SemanticError_MissingQuantity: return 14;
+               case LDKBolt12SemanticError_InvalidQuantity: return 15;
+               case LDKBolt12SemanticError_UnexpectedQuantity: return 16;
+               case LDKBolt12SemanticError_InvalidMetadata: return 17;
+               case LDKBolt12SemanticError_UnexpectedMetadata: return 18;
+               case LDKBolt12SemanticError_MissingPayerMetadata: return 19;
+               case LDKBolt12SemanticError_MissingPayerId: return 20;
+               case LDKBolt12SemanticError_DuplicatePaymentId: return 21;
+               case LDKBolt12SemanticError_MissingPaths: return 22;
+               case LDKBolt12SemanticError_InvalidPayInfo: return 23;
+               case LDKBolt12SemanticError_MissingCreationTime: return 24;
+               case LDKBolt12SemanticError_MissingPaymentHash: return 25;
+               case LDKBolt12SemanticError_MissingSignature: return 26;
+               default: abort();
+       }
+}
+static inline LDKCOption_NoneZ LDKCOption_NoneZ_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKCOption_NoneZ_Some;
+               case 1: return LDKCOption_NoneZ_None;
+               default: abort();
+       }
+}
+static inline int32_t LDKCOption_NoneZ_to_cs(LDKCOption_NoneZ val) {
+       switch (val) {
+               case LDKCOption_NoneZ_Some: return 0;
+               case LDKCOption_NoneZ_None: return 1;
+               default: abort();
+       }
+}
+static inline LDKChannelMonitorUpdateStatus LDKChannelMonitorUpdateStatus_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKChannelMonitorUpdateStatus_Completed;
+               case 1: return LDKChannelMonitorUpdateStatus_InProgress;
+               case 2: return LDKChannelMonitorUpdateStatus_UnrecoverableError;
+               default: abort();
+       }
+}
+static inline int32_t LDKChannelMonitorUpdateStatus_to_cs(LDKChannelMonitorUpdateStatus val) {
+       switch (val) {
+               case LDKChannelMonitorUpdateStatus_Completed: return 0;
+               case LDKChannelMonitorUpdateStatus_InProgress: return 1;
+               case LDKChannelMonitorUpdateStatus_UnrecoverableError: return 2;
+               default: abort();
+       }
+}
+static inline LDKChannelShutdownState LDKChannelShutdownState_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKChannelShutdownState_NotShuttingDown;
+               case 1: return LDKChannelShutdownState_ShutdownInitiated;
+               case 2: return LDKChannelShutdownState_ResolvingHTLCs;
+               case 3: return LDKChannelShutdownState_NegotiatingClosingFee;
+               case 4: return LDKChannelShutdownState_ShutdownComplete;
+               default: abort();
+       }
+}
+static inline int32_t LDKChannelShutdownState_to_cs(LDKChannelShutdownState val) {
+       switch (val) {
+               case LDKChannelShutdownState_NotShuttingDown: return 0;
+               case LDKChannelShutdownState_ShutdownInitiated: return 1;
+               case LDKChannelShutdownState_ResolvingHTLCs: return 2;
+               case LDKChannelShutdownState_NegotiatingClosingFee: return 3;
+               case LDKChannelShutdownState_ShutdownComplete: return 4;
+               default: abort();
+       }
+}
+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;
+               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;
+               default: abort();
+       }
+}
+static inline LDKCreationError LDKCreationError_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKCreationError_DescriptionTooLong;
+               case 1: return LDKCreationError_RouteTooLong;
+               case 2: return LDKCreationError_TimestampOutOfBounds;
+               case 3: return LDKCreationError_InvalidAmount;
+               case 4: return LDKCreationError_MissingRouteHints;
+               case 5: return LDKCreationError_MinFinalCltvExpiryDeltaTooShort;
+               default: abort();
+       }
+}
+static inline int32_t LDKCreationError_to_cs(LDKCreationError val) {
+       switch (val) {
+               case LDKCreationError_DescriptionTooLong: return 0;
+               case LDKCreationError_RouteTooLong: return 1;
+               case LDKCreationError_TimestampOutOfBounds: return 2;
+               case LDKCreationError_InvalidAmount: return 3;
+               case LDKCreationError_MissingRouteHints: return 4;
+               case LDKCreationError_MinFinalCltvExpiryDeltaTooShort: return 5;
+               default: abort();
+       }
+}
+static inline LDKCurrency LDKCurrency_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKCurrency_Bitcoin;
+               case 1: return LDKCurrency_BitcoinTestnet;
+               case 2: return LDKCurrency_Regtest;
+               case 3: return LDKCurrency_Simnet;
+               case 4: return LDKCurrency_Signet;
+               default: abort();
+       }
+}
+static inline int32_t LDKCurrency_to_cs(LDKCurrency val) {
+       switch (val) {
+               case LDKCurrency_Bitcoin: return 0;
+               case LDKCurrency_BitcoinTestnet: return 1;
+               case LDKCurrency_Regtest: return 2;
+               case LDKCurrency_Simnet: return 3;
+               case LDKCurrency_Signet: return 4;
+               default: abort();
+       }
+}
+static inline LDKHTLCClaim LDKHTLCClaim_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKHTLCClaim_OfferedTimeout;
+               case 1: return LDKHTLCClaim_OfferedPreimage;
+               case 2: return LDKHTLCClaim_AcceptedTimeout;
+               case 3: return LDKHTLCClaim_AcceptedPreimage;
+               case 4: return LDKHTLCClaim_Revocation;
+               default: abort();
+       }
+}
+static inline int32_t LDKHTLCClaim_to_cs(LDKHTLCClaim val) {
+       switch (val) {
+               case LDKHTLCClaim_OfferedTimeout: return 0;
+               case LDKHTLCClaim_OfferedPreimage: return 1;
+               case LDKHTLCClaim_AcceptedTimeout: return 2;
+               case LDKHTLCClaim_AcceptedPreimage: return 3;
+               case LDKHTLCClaim_Revocation: return 4;
+               default: abort();
+       }
+}
+static inline LDKIOError LDKIOError_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKIOError_NotFound;
+               case 1: return LDKIOError_PermissionDenied;
+               case 2: return LDKIOError_ConnectionRefused;
+               case 3: return LDKIOError_ConnectionReset;
+               case 4: return LDKIOError_ConnectionAborted;
+               case 5: return LDKIOError_NotConnected;
+               case 6: return LDKIOError_AddrInUse;
+               case 7: return LDKIOError_AddrNotAvailable;
+               case 8: return LDKIOError_BrokenPipe;
+               case 9: return LDKIOError_AlreadyExists;
+               case 10: return LDKIOError_WouldBlock;
+               case 11: return LDKIOError_InvalidInput;
+               case 12: return LDKIOError_InvalidData;
+               case 13: return LDKIOError_TimedOut;
+               case 14: return LDKIOError_WriteZero;
+               case 15: return LDKIOError_Interrupted;
+               case 16: return LDKIOError_Other;
+               case 17: return LDKIOError_UnexpectedEof;
+               default: abort();
+       }
+}
+static inline int32_t LDKIOError_to_cs(LDKIOError val) {
+       switch (val) {
+               case LDKIOError_NotFound: return 0;
+               case LDKIOError_PermissionDenied: return 1;
+               case LDKIOError_ConnectionRefused: return 2;
+               case LDKIOError_ConnectionReset: return 3;
+               case LDKIOError_ConnectionAborted: return 4;
+               case LDKIOError_NotConnected: return 5;
+               case LDKIOError_AddrInUse: return 6;
+               case LDKIOError_AddrNotAvailable: return 7;
+               case LDKIOError_BrokenPipe: return 8;
+               case LDKIOError_AlreadyExists: return 9;
+               case LDKIOError_WouldBlock: return 10;
+               case LDKIOError_InvalidInput: return 11;
+               case LDKIOError_InvalidData: return 12;
+               case LDKIOError_TimedOut: return 13;
+               case LDKIOError_WriteZero: return 14;
+               case LDKIOError_Interrupted: return 15;
+               case LDKIOError_Other: return 16;
+               case LDKIOError_UnexpectedEof: return 17;
+               default: abort();
+       }
+}
+static inline LDKLevel LDKLevel_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKLevel_Gossip;
+               case 1: return LDKLevel_Trace;
+               case 2: return LDKLevel_Debug;
+               case 3: return LDKLevel_Info;
+               case 4: return LDKLevel_Warn;
+               case 5: return LDKLevel_Error;
+               default: abort();
+       }
+}
+static inline int32_t LDKLevel_to_cs(LDKLevel val) {
+       switch (val) {
+               case LDKLevel_Gossip: return 0;
+               case LDKLevel_Trace: return 1;
+               case LDKLevel_Debug: return 2;
+               case LDKLevel_Info: return 3;
+               case LDKLevel_Warn: return 4;
+               case LDKLevel_Error: return 5;
+               default: abort();
+       }
+}
+static inline LDKNetwork LDKNetwork_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKNetwork_Bitcoin;
+               case 1: return LDKNetwork_Testnet;
+               case 2: return LDKNetwork_Regtest;
+               case 3: return LDKNetwork_Signet;
+               default: abort();
+       }
+}
+static inline int32_t LDKNetwork_to_cs(LDKNetwork val) {
+       switch (val) {
+               case LDKNetwork_Bitcoin: return 0;
+               case LDKNetwork_Testnet: return 1;
+               case LDKNetwork_Regtest: return 2;
+               case LDKNetwork_Signet: return 3;
+               default: abort();
+       }
+}
+static inline LDKPaymentFailureReason LDKPaymentFailureReason_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKPaymentFailureReason_RecipientRejected;
+               case 1: return LDKPaymentFailureReason_UserAbandoned;
+               case 2: return LDKPaymentFailureReason_RetriesExhausted;
+               case 3: return LDKPaymentFailureReason_PaymentExpired;
+               case 4: return LDKPaymentFailureReason_RouteNotFound;
+               case 5: return LDKPaymentFailureReason_UnexpectedError;
+               default: abort();
+       }
+}
+static inline int32_t LDKPaymentFailureReason_to_cs(LDKPaymentFailureReason val) {
+       switch (val) {
+               case LDKPaymentFailureReason_RecipientRejected: return 0;
+               case LDKPaymentFailureReason_UserAbandoned: return 1;
+               case LDKPaymentFailureReason_RetriesExhausted: return 2;
+               case LDKPaymentFailureReason_PaymentExpired: return 3;
+               case LDKPaymentFailureReason_RouteNotFound: return 4;
+               case LDKPaymentFailureReason_UnexpectedError: return 5;
+               default: abort();
+       }
+}
+static inline LDKRecipient LDKRecipient_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKRecipient_Node;
+               case 1: return LDKRecipient_PhantomNode;
+               default: abort();
+       }
+}
+static inline int32_t LDKRecipient_to_cs(LDKRecipient val) {
+       switch (val) {
+               case LDKRecipient_Node: return 0;
+               case LDKRecipient_PhantomNode: return 1;
+               default: abort();
+       }
+}
+static inline LDKRetryableSendFailure LDKRetryableSendFailure_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKRetryableSendFailure_PaymentExpired;
+               case 1: return LDKRetryableSendFailure_RouteNotFound;
+               case 2: return LDKRetryableSendFailure_DuplicatePayment;
+               default: abort();
+       }
+}
+static inline int32_t LDKRetryableSendFailure_to_cs(LDKRetryableSendFailure val) {
+       switch (val) {
+               case LDKRetryableSendFailure_PaymentExpired: return 0;
+               case LDKRetryableSendFailure_RouteNotFound: return 1;
+               case LDKRetryableSendFailure_DuplicatePayment: return 2;
+               default: abort();
+       }
+}
+static inline LDKSecp256k1Error LDKSecp256k1Error_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKSecp256k1Error_IncorrectSignature;
+               case 1: return LDKSecp256k1Error_InvalidMessage;
+               case 2: return LDKSecp256k1Error_InvalidPublicKey;
+               case 3: return LDKSecp256k1Error_InvalidSignature;
+               case 4: return LDKSecp256k1Error_InvalidSecretKey;
+               case 5: return LDKSecp256k1Error_InvalidSharedSecret;
+               case 6: return LDKSecp256k1Error_InvalidRecoveryId;
+               case 7: return LDKSecp256k1Error_InvalidTweak;
+               case 8: return LDKSecp256k1Error_NotEnoughMemory;
+               case 9: return LDKSecp256k1Error_InvalidPublicKeySum;
+               case 10: return LDKSecp256k1Error_InvalidParityValue;
+               default: abort();
+       }
+}
+static inline int32_t LDKSecp256k1Error_to_cs(LDKSecp256k1Error val) {
+       switch (val) {
+               case LDKSecp256k1Error_IncorrectSignature: return 0;
+               case LDKSecp256k1Error_InvalidMessage: return 1;
+               case LDKSecp256k1Error_InvalidPublicKey: return 2;
+               case LDKSecp256k1Error_InvalidSignature: return 3;
+               case LDKSecp256k1Error_InvalidSecretKey: return 4;
+               case LDKSecp256k1Error_InvalidSharedSecret: return 5;
+               case LDKSecp256k1Error_InvalidRecoveryId: return 6;
+               case LDKSecp256k1Error_InvalidTweak: return 7;
+               case LDKSecp256k1Error_NotEnoughMemory: return 8;
+               case LDKSecp256k1Error_InvalidPublicKeySum: return 9;
+               case LDKSecp256k1Error_InvalidParityValue: return 10;
+               default: abort();
+       }
+}
+static inline LDKSiPrefix LDKSiPrefix_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKSiPrefix_Milli;
+               case 1: return LDKSiPrefix_Micro;
+               case 2: return LDKSiPrefix_Nano;
+               case 3: return LDKSiPrefix_Pico;
+               default: abort();
+       }
+}
+static inline int32_t LDKSiPrefix_to_cs(LDKSiPrefix val) {
+       switch (val) {
+               case LDKSiPrefix_Milli: return 0;
+               case LDKSiPrefix_Micro: return 1;
+               case LDKSiPrefix_Nano: return 2;
+               case LDKSiPrefix_Pico: return 3;
+               default: abort();
+       }
+}
+static inline LDKSocketAddressParseError LDKSocketAddressParseError_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKSocketAddressParseError_SocketAddrParse;
+               case 1: return LDKSocketAddressParseError_InvalidInput;
+               case 2: return LDKSocketAddressParseError_InvalidPort;
+               case 3: return LDKSocketAddressParseError_InvalidOnionV3;
+               default: abort();
+       }
+}
+static inline int32_t LDKSocketAddressParseError_to_cs(LDKSocketAddressParseError val) {
+       switch (val) {
+               case LDKSocketAddressParseError_SocketAddrParse: return 0;
+               case LDKSocketAddressParseError_InvalidInput: return 1;
+               case LDKSocketAddressParseError_InvalidPort: return 2;
+               case LDKSocketAddressParseError_InvalidOnionV3: return 3;
+               default: abort();
+       }
+}
+static inline LDKUtxoLookupError LDKUtxoLookupError_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKUtxoLookupError_UnknownChain;
+               case 1: return LDKUtxoLookupError_UnknownTx;
+               default: abort();
+       }
+}
+static inline int32_t LDKUtxoLookupError_to_cs(LDKUtxoLookupError val) {
+       switch (val) {
+               case LDKUtxoLookupError_UnknownChain: return 0;
+               case LDKUtxoLookupError_UnknownTx: return 1;
+               default: abort();
+       }
+}
+struct LDKThirtyTwoBytes BigEndianScalar_get_bytes (struct LDKBigEndianScalar* thing) {
+       LDKThirtyTwoBytes ret = { .data = *thing->big_endian_bytes };
+       return ret;
+}
+int8_tArray  CS_LDK_BigEndianScalar_get_bytes(int64_t thing) {
+       LDKBigEndianScalar* thing_conv = (LDKBigEndianScalar*)untag_ptr(thing);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, BigEndianScalar_get_bytes(thing_conv).data, 32);
+       return ret_arr;
+}
+
+static void BigEndianScalar_free (struct LDKBigEndianScalar thing) {}
+void  CS_LDK_BigEndianScalar_free(int64_t thing) {
+       if (!ptr_is_owned(thing)) return;
+       void* thing_ptr = untag_ptr(thing);
+       CHECK_ACCESS(thing_ptr);
+       LDKBigEndianScalar thing_conv = *(LDKBigEndianScalar*)(thing_ptr);
+       FREE(untag_ptr(thing));
+       BigEndianScalar_free(thing_conv);
+}
+
+uint32_t CS_LDK_LDKBech32Error_ty_from_ptr(int64_t ptr) {
+       LDKBech32Error *obj = (LDKBech32Error*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKBech32Error_MissingSeparator: return 0;
+               case LDKBech32Error_InvalidChecksum: return 1;
+               case LDKBech32Error_InvalidLength: return 2;
+               case LDKBech32Error_InvalidChar: return 3;
+               case LDKBech32Error_InvalidData: return 4;
+               case LDKBech32Error_InvalidPadding: return 5;
+               case LDKBech32Error_MixedCase: return 6;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKBech32Error_InvalidChar_get_invalid_char(int64_t ptr) {
+       LDKBech32Error *obj = (LDKBech32Error*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBech32Error_InvalidChar);
+       int32_t invalid_char_conv = obj->invalid_char;
+       return invalid_char_conv;
+}
+int8_t CS_LDK_LDKBech32Error_InvalidData_get_invalid_data(int64_t ptr) {
+       LDKBech32Error *obj = (LDKBech32Error*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBech32Error_InvalidData);
+       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) {
+               case LDKCOption_u64Z_Some: return 0;
+               case LDKCOption_u64Z_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_u64Z_Some_get_some(int64_t ptr) {
+       LDKCOption_u64Z *obj = (LDKCOption_u64Z*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_u64Z_Some);
+       int64_t some_conv = obj->some;
+       return some_conv;
+}
+static inline LDKCVec_BlindedPathZ CVec_BlindedPathZ_clone(const LDKCVec_BlindedPathZ *orig) {
+       LDKCVec_BlindedPathZ ret = { .data = MALLOC(sizeof(LDKBlindedPath) * orig->datalen, "LDKCVec_BlindedPathZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = BlindedPath_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKRefund CResult_RefundBolt12ParseErrorZ_get_ok(LDKCResult_RefundBolt12ParseErrorZ *NONNULL_PTR owner){
+       LDKRefund ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RefundBolt12ParseErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RefundBolt12ParseErrorZ* owner_conv = (LDKCResult_RefundBolt12ParseErrorZ*)untag_ptr(owner);
+       LDKRefund ret_var = CResult_RefundBolt12ParseErrorZ_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 LDKBolt12ParseError CResult_RefundBolt12ParseErrorZ_get_err(LDKCResult_RefundBolt12ParseErrorZ *NONNULL_PTR owner){
+       LDKBolt12ParseError ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RefundBolt12ParseErrorZ_get_err(int64_t owner) {
+       LDKCResult_RefundBolt12ParseErrorZ* owner_conv = (LDKCResult_RefundBolt12ParseErrorZ*)untag_ptr(owner);
+       LDKBolt12ParseError ret_var = CResult_RefundBolt12ParseErrorZ_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;
+}
+
+uint32_t CS_LDK_LDKRetry_ty_from_ptr(int64_t ptr) {
+       LDKRetry *obj = (LDKRetry*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKRetry_Attempts: return 0;
+               case LDKRetry_Timeout: return 1;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKRetry_Attempts_get_attempts(int64_t ptr) {
+       LDKRetry *obj = (LDKRetry*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRetry_Attempts);
+       int32_t attempts_conv = obj->attempts;
+       return attempts_conv;
+}
+int64_t CS_LDK_LDKRetry_Timeout_get_timeout(int64_t ptr) {
+       LDKRetry *obj = (LDKRetry*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRetry_Timeout);
+       int64_t timeout_conv = obj->timeout;
+       return timeout_conv;
+}
+uint32_t CS_LDK_LDKDecodeError_ty_from_ptr(int64_t ptr) {
+       LDKDecodeError *obj = (LDKDecodeError*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKDecodeError_UnknownVersion: return 0;
+               case LDKDecodeError_UnknownRequiredFeature: return 1;
+               case LDKDecodeError_InvalidValue: return 2;
+               case LDKDecodeError_ShortRead: return 3;
+               case LDKDecodeError_BadLengthDescriptor: return 4;
+               case LDKDecodeError_Io: return 5;
+               case LDKDecodeError_UnsupportedCompression: return 6;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKDecodeError_Io_get_io(int64_t ptr) {
+       LDKDecodeError *obj = (LDKDecodeError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKDecodeError_Io);
+       int32_t io_conv = LDKIOError_to_cs(obj->io);
+       return io_conv;
+}
+static inline struct LDKRetry CResult_RetryDecodeErrorZ_get_ok(LDKCResult_RetryDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return Retry_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_RetryDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RetryDecodeErrorZ* owner_conv = (LDKCResult_RetryDecodeErrorZ*)untag_ptr(owner);
+       LDKRetry *ret_copy = MALLOC(sizeof(LDKRetry), "LDKRetry");
+       *ret_copy = CResult_RetryDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_RetryDecodeErrorZ_get_err(LDKCResult_RetryDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RetryDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RetryDecodeErrorZ* owner_conv = (LDKCResult_RetryDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RetryDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKAPIError_ty_from_ptr(int64_t ptr) {
+       LDKAPIError *obj = (LDKAPIError*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKAPIError_APIMisuseError: return 0;
+               case LDKAPIError_FeeRateTooHigh: return 1;
+               case LDKAPIError_InvalidRoute: return 2;
+               case LDKAPIError_ChannelUnavailable: return 3;
+               case LDKAPIError_MonitorUpdateInProgress: return 4;
+               case LDKAPIError_IncompatibleShutdownScript: return 5;
+               default: abort();
+       }
+}
+jstring CS_LDK_LDKAPIError_APIMisuseError_get_err(int64_t ptr) {
+       LDKAPIError *obj = (LDKAPIError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKAPIError_APIMisuseError);
+       LDKStr err_str = obj->api_misuse_error.err;
+                       jstring err_conv = str_ref_to_cs(err_str.chars, err_str.len);
+       return err_conv;
+}
+jstring CS_LDK_LDKAPIError_FeeRateTooHigh_get_err(int64_t ptr) {
+       LDKAPIError *obj = (LDKAPIError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKAPIError_FeeRateTooHigh);
+       LDKStr err_str = obj->fee_rate_too_high.err;
+                       jstring err_conv = str_ref_to_cs(err_str.chars, err_str.len);
+       return err_conv;
+}
+int32_t CS_LDK_LDKAPIError_FeeRateTooHigh_get_feerate(int64_t ptr) {
+       LDKAPIError *obj = (LDKAPIError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKAPIError_FeeRateTooHigh);
+       int32_t feerate_conv = obj->fee_rate_too_high.feerate;
+       return feerate_conv;
+}
+jstring CS_LDK_LDKAPIError_InvalidRoute_get_err(int64_t ptr) {
+       LDKAPIError *obj = (LDKAPIError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKAPIError_InvalidRoute);
+       LDKStr err_str = obj->invalid_route.err;
+                       jstring err_conv = str_ref_to_cs(err_str.chars, err_str.len);
+       return err_conv;
+}
+jstring CS_LDK_LDKAPIError_ChannelUnavailable_get_err(int64_t ptr) {
+       LDKAPIError *obj = (LDKAPIError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKAPIError_ChannelUnavailable);
+       LDKStr err_str = obj->channel_unavailable.err;
+                       jstring err_conv = str_ref_to_cs(err_str.chars, err_str.len);
+       return err_conv;
+}
+int64_t CS_LDK_LDKAPIError_IncompatibleShutdownScript_get_script(int64_t ptr) {
+       LDKAPIError *obj = (LDKAPIError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKAPIError_IncompatibleShutdownScript);
+       LDKShutdownScript script_var = obj->incompatible_shutdown_script.script;
+                       int64_t script_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(script_var);
+                       script_ref = tag_ptr(script_var.inner, false);
+       return script_ref;
+}
+static inline void CResult_NoneAPIErrorZ_get_ok(LDKCResult_NoneAPIErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NoneAPIErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NoneAPIErrorZ* owner_conv = (LDKCResult_NoneAPIErrorZ*)untag_ptr(owner);
+       CResult_NoneAPIErrorZ_get_ok(owner_conv);
+}
+
+static inline struct LDKAPIError CResult_NoneAPIErrorZ_get_err(LDKCResult_NoneAPIErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return APIError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NoneAPIErrorZ_get_err(int64_t owner) {
+       LDKCResult_NoneAPIErrorZ* owner_conv = (LDKCResult_NoneAPIErrorZ*)untag_ptr(owner);
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = CResult_NoneAPIErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_CResult_NoneAPIErrorZZ CVec_CResult_NoneAPIErrorZZ_clone(const LDKCVec_CResult_NoneAPIErrorZZ *orig) {
+       LDKCVec_CResult_NoneAPIErrorZZ ret = { .data = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ) * orig->datalen, "LDKCVec_CResult_NoneAPIErrorZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = CResult_NoneAPIErrorZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_APIErrorZ CVec_APIErrorZ_clone(const LDKCVec_APIErrorZ *orig) {
+       LDKCVec_APIErrorZ ret = { .data = MALLOC(sizeof(LDKAPIError) * orig->datalen, "LDKCVec_APIErrorZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = APIError_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKCOption_ThirtyTwoBytesZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_ThirtyTwoBytesZ *obj = (LDKCOption_ThirtyTwoBytesZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_ThirtyTwoBytesZ_Some: return 0;
+               case LDKCOption_ThirtyTwoBytesZ_None: return 1;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKCOption_ThirtyTwoBytesZ_Some_get_some(int64_t ptr) {
+       LDKCOption_ThirtyTwoBytesZ *obj = (LDKCOption_ThirtyTwoBytesZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_ThirtyTwoBytesZ_Some);
+       int8_tArray some_arr = init_int8_tArray(32, __LINE__);
+       memcpy(some_arr->elems, obj->some.data, 32);
+       return some_arr;
+}
+uint32_t CS_LDK_LDKCOption_CVec_u8ZZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_CVec_u8ZZ *obj = (LDKCOption_CVec_u8ZZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_CVec_u8ZZ_Some: return 0;
+               case LDKCOption_CVec_u8ZZ_None: return 1;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKCOption_CVec_u8ZZ_Some_get_some(int64_t ptr) {
+       LDKCOption_CVec_u8ZZ *obj = (LDKCOption_CVec_u8ZZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_CVec_u8ZZ_Some);
+       LDKCVec_u8Z some_var = obj->some;
+                       int8_tArray some_arr = init_int8_tArray(some_var.datalen, __LINE__);
+                       memcpy(some_arr->elems, some_var.data, some_var.datalen);
+       return some_arr;
+}
+static inline struct LDKRecipientOnionFields CResult_RecipientOnionFieldsDecodeErrorZ_get_ok(LDKCResult_RecipientOnionFieldsDecodeErrorZ *NONNULL_PTR owner){
+       LDKRecipientOnionFields ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* owner_conv = (LDKCResult_RecipientOnionFieldsDecodeErrorZ*)untag_ptr(owner);
+       LDKRecipientOnionFields ret_var = CResult_RecipientOnionFieldsDecodeErrorZ_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_RecipientOnionFieldsDecodeErrorZ_get_err(LDKCResult_RecipientOnionFieldsDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* owner_conv = (LDKCResult_RecipientOnionFieldsDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RecipientOnionFieldsDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline uint64_t C2Tuple_u64CVec_u8ZZ_get_a(LDKC2Tuple_u64CVec_u8ZZ *NONNULL_PTR owner){
+       return owner->a;
+}
+int64_t  CS_LDK_C2Tuple_u64CVec_u8ZZ_get_a(int64_t owner) {
+       LDKC2Tuple_u64CVec_u8ZZ* owner_conv = (LDKC2Tuple_u64CVec_u8ZZ*)untag_ptr(owner);
+       int64_t ret_conv = C2Tuple_u64CVec_u8ZZ_get_a(owner_conv);
+       return ret_conv;
+}
+
+static inline struct LDKCVec_u8Z C2Tuple_u64CVec_u8ZZ_get_b(LDKC2Tuple_u64CVec_u8ZZ *NONNULL_PTR owner){
+       return CVec_u8Z_clone(&owner->b);
+}
+int8_tArray  CS_LDK_C2Tuple_u64CVec_u8ZZ_get_b(int64_t owner) {
+       LDKC2Tuple_u64CVec_u8ZZ* owner_conv = (LDKC2Tuple_u64CVec_u8ZZ*)untag_ptr(owner);
+       LDKCVec_u8Z ret_var = C2Tuple_u64CVec_u8ZZ_get_b(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 LDKCVec_C2Tuple_u64CVec_u8ZZZ CVec_C2Tuple_u64CVec_u8ZZZ_clone(const LDKCVec_C2Tuple_u64CVec_u8ZZZ *orig) {
+       LDKCVec_C2Tuple_u64CVec_u8ZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_u64CVec_u8ZZ) * orig->datalen, "LDKCVec_C2Tuple_u64CVec_u8ZZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_u64CVec_u8ZZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKRecipientOnionFields CResult_RecipientOnionFieldsNoneZ_get_ok(LDKCResult_RecipientOnionFieldsNoneZ *NONNULL_PTR owner){
+       LDKRecipientOnionFields ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RecipientOnionFieldsNoneZ_get_ok(int64_t owner) {
+       LDKCResult_RecipientOnionFieldsNoneZ* owner_conv = (LDKCResult_RecipientOnionFieldsNoneZ*)untag_ptr(owner);
+       LDKRecipientOnionFields ret_var = CResult_RecipientOnionFieldsNoneZ_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_RecipientOnionFieldsNoneZ_get_err(LDKCResult_RecipientOnionFieldsNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_RecipientOnionFieldsNoneZ_get_err(int64_t owner) {
+       LDKCResult_RecipientOnionFieldsNoneZ* owner_conv = (LDKCResult_RecipientOnionFieldsNoneZ*)untag_ptr(owner);
+       CResult_RecipientOnionFieldsNoneZ_get_err(owner_conv);
+}
+
+static inline LDKCVec_ThirtyTwoBytesZ CVec_ThirtyTwoBytesZ_clone(const LDKCVec_ThirtyTwoBytesZ *orig) {
+       LDKCVec_ThirtyTwoBytesZ ret = { .data = MALLOC(sizeof(LDKThirtyTwoBytes) * orig->datalen, "LDKCVec_ThirtyTwoBytesZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = ThirtyTwoBytes_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKCOption_CVec_ThirtyTwoBytesZZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_CVec_ThirtyTwoBytesZZ *obj = (LDKCOption_CVec_ThirtyTwoBytesZZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_CVec_ThirtyTwoBytesZZ_Some: return 0;
+               case LDKCOption_CVec_ThirtyTwoBytesZZ_None: return 1;
+               default: abort();
+       }
+}
+ptrArray CS_LDK_LDKCOption_CVec_ThirtyTwoBytesZZ_Some_get_some(int64_t ptr) {
+       LDKCOption_CVec_ThirtyTwoBytesZZ *obj = (LDKCOption_CVec_ThirtyTwoBytesZZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_CVec_ThirtyTwoBytesZZ_Some);
+       LDKCVec_ThirtyTwoBytesZ some_var = obj->some;
+                       ptrArray some_arr = NULL;
+                       some_arr = init_ptrArray(some_var.datalen, __LINE__);
+                       int8_tArray *some_arr_ptr = (int8_tArray*)(((uint8_t*)some_arr) + 8);
+                       for (size_t i = 0; i < some_var.datalen; i++) {
+                               int8_tArray some_conv_8_arr = init_int8_tArray(32, __LINE__);
+                               memcpy(some_conv_8_arr->elems, some_var.data[i].data, 32);
+                               some_arr_ptr[i] = some_conv_8_arr;
+                       }
+                       
+       return some_arr;
+}
+static inline struct LDKThirtyTwoBytes CResult_ThirtyTwoBytesNoneZ_get_ok(LDKCResult_ThirtyTwoBytesNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return ThirtyTwoBytes_clone(&*owner->contents.result);
+}
+int8_tArray  CS_LDK_CResult_ThirtyTwoBytesNoneZ_get_ok(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesNoneZ* owner_conv = (LDKCResult_ThirtyTwoBytesNoneZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, CResult_ThirtyTwoBytesNoneZ_get_ok(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline void CResult_ThirtyTwoBytesNoneZ_get_err(LDKCResult_ThirtyTwoBytesNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_ThirtyTwoBytesNoneZ_get_err(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesNoneZ* owner_conv = (LDKCResult_ThirtyTwoBytesNoneZ*)untag_ptr(owner);
+       CResult_ThirtyTwoBytesNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKBlindedPayInfo CResult_BlindedPayInfoDecodeErrorZ_get_ok(LDKCResult_BlindedPayInfoDecodeErrorZ *NONNULL_PTR owner){
+       LDKBlindedPayInfo ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BlindedPayInfoDecodeErrorZ* owner_conv = (LDKCResult_BlindedPayInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKBlindedPayInfo ret_var = CResult_BlindedPayInfoDecodeErrorZ_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_BlindedPayInfoDecodeErrorZ_get_err(LDKCResult_BlindedPayInfoDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BlindedPayInfoDecodeErrorZ* owner_conv = (LDKCResult_BlindedPayInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BlindedPayInfoDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDelayedPaymentOutputDescriptor CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_get_ok(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ *NONNULL_PTR owner){
+       LDKDelayedPaymentOutputDescriptor ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* owner_conv = (LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(owner);
+       LDKDelayedPaymentOutputDescriptor ret_var = CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_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_DelayedPaymentOutputDescriptorDecodeErrorZ_get_err(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* owner_conv = (LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKStaticPaymentOutputDescriptor CResult_StaticPaymentOutputDescriptorDecodeErrorZ_get_ok(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ *NONNULL_PTR owner){
+       LDKStaticPaymentOutputDescriptor ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_StaticPaymentOutputDescriptorDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* owner_conv = (LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(owner);
+       LDKStaticPaymentOutputDescriptor ret_var = CResult_StaticPaymentOutputDescriptorDecodeErrorZ_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_StaticPaymentOutputDescriptorDecodeErrorZ_get_err(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_StaticPaymentOutputDescriptorDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* owner_conv = (LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_StaticPaymentOutputDescriptorDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKSpendableOutputDescriptor_ty_from_ptr(int64_t ptr) {
+       LDKSpendableOutputDescriptor *obj = (LDKSpendableOutputDescriptor*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKSpendableOutputDescriptor_StaticOutput: return 0;
+               case LDKSpendableOutputDescriptor_DelayedPaymentOutput: return 1;
+               case LDKSpendableOutputDescriptor_StaticPaymentOutput: return 2;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKSpendableOutputDescriptor_StaticOutput_get_outpoint(int64_t ptr) {
+       LDKSpendableOutputDescriptor *obj = (LDKSpendableOutputDescriptor*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSpendableOutputDescriptor_StaticOutput);
+       LDKOutPoint outpoint_var = obj->static_output.outpoint;
+                       int64_t outpoint_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_var);
+                       outpoint_ref = tag_ptr(outpoint_var.inner, false);
+       return outpoint_ref;
+}
+int64_t CS_LDK_LDKSpendableOutputDescriptor_StaticOutput_get_output(int64_t ptr) {
+       LDKSpendableOutputDescriptor *obj = (LDKSpendableOutputDescriptor*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSpendableOutputDescriptor_StaticOutput);
+       LDKTxOut* output_ref = &obj->static_output.output;
+       return tag_ptr(output_ref, false);
+}
+int64_t CS_LDK_LDKSpendableOutputDescriptor_DelayedPaymentOutput_get_delayed_payment_output(int64_t ptr) {
+       LDKSpendableOutputDescriptor *obj = (LDKSpendableOutputDescriptor*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSpendableOutputDescriptor_DelayedPaymentOutput);
+       LDKDelayedPaymentOutputDescriptor delayed_payment_output_var = obj->delayed_payment_output;
+                       int64_t delayed_payment_output_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(delayed_payment_output_var);
+                       delayed_payment_output_ref = tag_ptr(delayed_payment_output_var.inner, false);
+       return delayed_payment_output_ref;
+}
+int64_t CS_LDK_LDKSpendableOutputDescriptor_StaticPaymentOutput_get_static_payment_output(int64_t ptr) {
+       LDKSpendableOutputDescriptor *obj = (LDKSpendableOutputDescriptor*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSpendableOutputDescriptor_StaticPaymentOutput);
+       LDKStaticPaymentOutputDescriptor static_payment_output_var = obj->static_payment_output;
+                       int64_t static_payment_output_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(static_payment_output_var);
+                       static_payment_output_ref = tag_ptr(static_payment_output_var.inner, false);
+       return static_payment_output_ref;
+}
+static inline struct LDKSpendableOutputDescriptor CResult_SpendableOutputDescriptorDecodeErrorZ_get_ok(LDKCResult_SpendableOutputDescriptorDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return SpendableOutputDescriptor_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* owner_conv = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)untag_ptr(owner);
+       LDKSpendableOutputDescriptor *ret_copy = MALLOC(sizeof(LDKSpendableOutputDescriptor), "LDKSpendableOutputDescriptor");
+       *ret_copy = CResult_SpendableOutputDescriptorDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_SpendableOutputDescriptorDecodeErrorZ_get_err(LDKCResult_SpendableOutputDescriptorDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* owner_conv = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_SpendableOutputDescriptorDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_SpendableOutputDescriptorZ CVec_SpendableOutputDescriptorZ_clone(const LDKCVec_SpendableOutputDescriptorZ *orig) {
+       LDKCVec_SpendableOutputDescriptorZ ret = { .data = MALLOC(sizeof(LDKSpendableOutputDescriptor) * orig->datalen, "LDKCVec_SpendableOutputDescriptorZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = SpendableOutputDescriptor_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_TxOutZ CVec_TxOutZ_clone(const LDKCVec_TxOutZ *orig) {
+       LDKCVec_TxOutZ ret = { .data = MALLOC(sizeof(LDKTxOut) * orig->datalen, "LDKCVec_TxOutZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = TxOut_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKCOption_u32Z_ty_from_ptr(int64_t ptr) {
+       LDKCOption_u32Z *obj = (LDKCOption_u32Z*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_u32Z_Some: return 0;
+               case LDKCOption_u32Z_None: return 1;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKCOption_u32Z_Some_get_some(int64_t ptr) {
+       LDKCOption_u32Z *obj = (LDKCOption_u32Z*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_u32Z_Some);
+       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){
+       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 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){
+       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);
+       return ret_conv;
+}
+
+static inline struct LDKC2Tuple_CVec_u8ZusizeZ CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_ok(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return C2Tuple_CVec_u8ZusizeZ_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);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline void CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_err(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ *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);
+}
+
+static inline struct LDKChannelDerivationParameters CResult_ChannelDerivationParametersDecodeErrorZ_get_ok(LDKCResult_ChannelDerivationParametersDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelDerivationParameters ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* owner_conv = (LDKCResult_ChannelDerivationParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelDerivationParameters ret_var = CResult_ChannelDerivationParametersDecodeErrorZ_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_ChannelDerivationParametersDecodeErrorZ_get_err(LDKCResult_ChannelDerivationParametersDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* owner_conv = (LDKCResult_ChannelDerivationParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelDerivationParametersDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKHTLCDescriptor CResult_HTLCDescriptorDecodeErrorZ_get_ok(LDKCResult_HTLCDescriptorDecodeErrorZ *NONNULL_PTR owner){
+       LDKHTLCDescriptor ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_HTLCDescriptorDecodeErrorZ* owner_conv = (LDKCResult_HTLCDescriptorDecodeErrorZ*)untag_ptr(owner);
+       LDKHTLCDescriptor ret_var = CResult_HTLCDescriptorDecodeErrorZ_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_HTLCDescriptorDecodeErrorZ_get_err(LDKCResult_HTLCDescriptorDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_HTLCDescriptorDecodeErrorZ* owner_conv = (LDKCResult_HTLCDescriptorDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_HTLCDescriptorDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline void CResult_NoneNoneZ_get_ok(LDKCResult_NoneNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NoneNoneZ_get_ok(int64_t owner) {
+       LDKCResult_NoneNoneZ* owner_conv = (LDKCResult_NoneNoneZ*)untag_ptr(owner);
+       CResult_NoneNoneZ_get_ok(owner_conv);
+}
+
+static inline void CResult_NoneNoneZ_get_err(LDKCResult_NoneNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_NoneNoneZ_get_err(int64_t owner) {
+       LDKCResult_NoneNoneZ* owner_conv = (LDKCResult_NoneNoneZ*)untag_ptr(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;
+}
+int8_tArray  CS_LDK_CResult_PublicKeyNoneZ_get_ok(int64_t owner) {
+       LDKCResult_PublicKeyNoneZ* owner_conv = (LDKCResult_PublicKeyNoneZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, CResult_PublicKeyNoneZ_get_ok(owner_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+static inline void CResult_PublicKeyNoneZ_get_err(LDKCResult_PublicKeyNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_PublicKeyNoneZ_get_err(int64_t owner) {
+       LDKCResult_PublicKeyNoneZ* owner_conv = (LDKCResult_PublicKeyNoneZ*)untag_ptr(owner);
+       CResult_PublicKeyNoneZ_get_err(owner_conv);
+}
+
+uint32_t CS_LDK_LDKCOption_BigEndianScalarZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_BigEndianScalarZ *obj = (LDKCOption_BigEndianScalarZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_BigEndianScalarZ_Some: return 0;
+               case LDKCOption_BigEndianScalarZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_BigEndianScalarZ_Some_get_some(int64_t ptr) {
+       LDKCOption_BigEndianScalarZ *obj = (LDKCOption_BigEndianScalarZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_BigEndianScalarZ_Some);
+       LDKBigEndianScalar* some_ref = &obj->some;
+       return tag_ptr(some_ref, false);
+}
+static inline struct LDKRecoverableSignature CResult_RecoverableSignatureNoneZ_get_ok(LDKCResult_RecoverableSignatureNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+int8_tArray  CS_LDK_CResult_RecoverableSignatureNoneZ_get_ok(int64_t owner) {
+       LDKCResult_RecoverableSignatureNoneZ* owner_conv = (LDKCResult_RecoverableSignatureNoneZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(68, __LINE__);
+       memcpy(ret_arr->elems, CResult_RecoverableSignatureNoneZ_get_ok(owner_conv).serialized_form, 68);
+       return ret_arr;
+}
+
+static inline void CResult_RecoverableSignatureNoneZ_get_err(LDKCResult_RecoverableSignatureNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_RecoverableSignatureNoneZ_get_err(int64_t owner) {
+       LDKCResult_RecoverableSignatureNoneZ* owner_conv = (LDKCResult_RecoverableSignatureNoneZ*)untag_ptr(owner);
+       CResult_RecoverableSignatureNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKSchnorrSignature CResult_SchnorrSignatureNoneZ_get_ok(LDKCResult_SchnorrSignatureNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+int8_tArray  CS_LDK_CResult_SchnorrSignatureNoneZ_get_ok(int64_t owner) {
+       LDKCResult_SchnorrSignatureNoneZ* owner_conv = (LDKCResult_SchnorrSignatureNoneZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(64, __LINE__);
+       memcpy(ret_arr->elems, CResult_SchnorrSignatureNoneZ_get_ok(owner_conv).compact_form, 64);
+       return ret_arr;
+}
+
+static inline void CResult_SchnorrSignatureNoneZ_get_err(LDKCResult_SchnorrSignatureNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_SchnorrSignatureNoneZ_get_err(int64_t owner) {
+       LDKCResult_SchnorrSignatureNoneZ* owner_conv = (LDKCResult_SchnorrSignatureNoneZ*)untag_ptr(owner);
+       CResult_SchnorrSignatureNoneZ_get_err(owner_conv);
+}
+
+typedef struct LDKChannelSigner_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKChannelSigner_JCalls;
+static void LDKChannelSigner_JCalls_free(void* this_arg) {
+       LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKPublicKey get_per_commitment_point_LDKChannelSigner_jcall(const void* this_arg, uint64_t idx) {
+       LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) this_arg;
+       int64_t idx_conv = idx;
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_l(j_calls->instance_ptr, 0, idx_conv);
+       LDKPublicKey ret_ref;
+       CHECK(ret->arr_len == 33);
+       memcpy(ret_ref.compressed_form, ret->elems, 33); FREE(ret);
+       return ret_ref;
+}
+LDKThirtyTwoBytes release_commitment_secret_LDKChannelSigner_jcall(const void* this_arg, uint64_t idx) {
+       LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) this_arg;
+       int64_t idx_conv = idx;
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_l(j_calls->instance_ptr, 1, idx_conv);
+       LDKThirtyTwoBytes ret_ref;
+       CHECK(ret->arr_len == 32);
+       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) {
+       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;
+       }
+       
+       FREE(preimages_var.data);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 2, holder_tx_ref, (int64_t)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;
+}
+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);
+       LDKThirtyTwoBytes ret_ref;
+       CHECK(ret->arr_len == 32);
+       memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
+       return ret_ref;
+}
+void provide_channel_parameters_LDKChannelSigner_jcall(void* this_arg, const LDKChannelTransactionParameters * channel_parameters) {
+       LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) this_arg;
+       LDKChannelTransactionParameters channel_parameters_var = *channel_parameters;
+       int64_t channel_parameters_ref = 0;
+       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);
+}
+static void LDKChannelSigner_JCalls_cloned(LDKChannelSigner* new_obj) {
+       LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKChannelSigner LDKChannelSigner_init (int64_t o, int64_t pubkeys) {
+       LDKChannelSigner_JCalls *calls = MALLOC(sizeof(LDKChannelSigner_JCalls), "LDKChannelSigner_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKChannelPublicKeys pubkeys_conv;
+       pubkeys_conv.inner = untag_ptr(pubkeys);
+       pubkeys_conv.is_owned = ptr_is_owned(pubkeys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(pubkeys_conv);
+
+       LDKChannelSigner ret = {
+               .this_arg = (void*) calls,
+               .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,
+               .channel_keys_id = channel_keys_id_LDKChannelSigner_jcall,
+               .provide_channel_parameters = provide_channel_parameters_LDKChannelSigner_jcall,
+               .free = LDKChannelSigner_JCalls_free,
+               .pubkeys = pubkeys_conv,
+               .set_pubkeys = NULL,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKChannelSigner_new(int32_t o, int64_t pubkeys) {
+       LDKChannelSigner *res_ptr = MALLOC(sizeof(LDKChannelSigner), "LDKChannelSigner");
+       *res_ptr = LDKChannelSigner_init(o, pubkeys);
+       return tag_ptr(res_ptr, true);
+}
+int8_tArray  CS_LDK_ChannelSigner_get_per_commitment_point(int64_t this_arg, int64_t idx) {
+       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;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, (this_arg_conv->get_per_commitment_point)(this_arg_conv->this_arg, idx).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_ChannelSigner_release_commitment_secret(int64_t this_arg, int64_t idx) {
+       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;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, (this_arg_conv->release_commitment_secret)(this_arg_conv->this_arg, idx).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_ChannelSigner_validate_holder_commitment(int64_t this_arg, int64_t holder_tx, ptrArray 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;
+       LDKHolderCommitmentTransaction holder_tx_conv;
+       holder_tx_conv.inner = untag_ptr(holder_tx);
+       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");
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelSigner_channel_keys_id(int64_t this_arg) {
+       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;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, (this_arg_conv->channel_keys_id)(this_arg_conv->this_arg).data, 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelSigner_provide_channel_parameters(int64_t this_arg, int64_t channel_parameters) {
+       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;
+       LDKChannelTransactionParameters channel_parameters_conv;
+       channel_parameters_conv.inner = untag_ptr(channel_parameters);
+       channel_parameters_conv.is_owned = ptr_is_owned(channel_parameters);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_parameters_conv);
+       channel_parameters_conv.is_owned = false;
+       (this_arg_conv->provide_channel_parameters)(this_arg_conv->this_arg, &channel_parameters_conv);
+}
+
+LDKChannelPublicKeys LDKChannelSigner_set_get_pubkeys(LDKChannelSigner* this_arg) {
+       if (this_arg->set_pubkeys != NULL)
+               this_arg->set_pubkeys(this_arg);
+       return this_arg->pubkeys;
+}
+int64_t  CS_LDK_ChannelSigner_get_pubkeys(int64_t this_arg) {
+       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;
+       LDKChannelPublicKeys ret_var = LDKChannelSigner_set_get_pubkeys(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;
+}
+
+typedef struct LDKEcdsaChannelSigner_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+       LDKChannelSigner_JCalls* ChannelSigner;
+} LDKEcdsaChannelSigner_JCalls;
+static void LDKEcdsaChannelSigner_JCalls_free(void* this_arg) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ sign_counterparty_commitment_LDKEcdsaChannelSigner_jcall(const void* this_arg, const LDKCommitmentTransaction * commitment_tx, LDKCVec_ThirtyTwoBytesZ 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;
+       }
+       
+       FREE(preimages_var.data);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 5, commitment_tx_ref, (int64_t)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;
+       int64_t commitment_tx_ref = 0;
+       commitment_tx_var = HolderCommitmentTransaction_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);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 7, commitment_tx_ref);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ECDSASignatureNoneZ sign_justice_revoked_output_LDKEcdsaChannelSigner_jcall(const void* this_arg, LDKTransaction justice_tx, uintptr_t input, uint64_t amount, const uint8_t (* per_commitment_key)[32]) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
+       LDKTransaction justice_tx_var = justice_tx;
+       int8_tArray justice_tx_arr = init_int8_tArray(justice_tx_var.datalen, __LINE__);
+       memcpy(justice_tx_arr->elems, justice_tx_var.data, justice_tx_var.datalen);
+       Transaction_free(justice_tx_var);
+       int64_t input_conv = input;
+       int64_t amount_conv = amount;
+       int8_tArray per_commitment_key_arr = init_int8_tArray(32, __LINE__);
+       memcpy(per_commitment_key_arr->elems, *per_commitment_key, 32);
+       uint64_t ret = js_invoke_function_l_llll(j_calls->instance_ptr, 8, (int64_t)justice_tx_arr, input_conv, amount_conv, (int64_t)per_commitment_key_arr);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ECDSASignatureNoneZ sign_justice_revoked_htlc_LDKEcdsaChannelSigner_jcall(const void* this_arg, LDKTransaction justice_tx, uintptr_t input, uint64_t amount, const uint8_t (* per_commitment_key)[32], const LDKHTLCOutputInCommitment * htlc) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
+       LDKTransaction justice_tx_var = justice_tx;
+       int8_tArray justice_tx_arr = init_int8_tArray(justice_tx_var.datalen, __LINE__);
+       memcpy(justice_tx_arr->elems, justice_tx_var.data, justice_tx_var.datalen);
+       Transaction_free(justice_tx_var);
+       int64_t input_conv = input;
+       int64_t amount_conv = amount;
+       int8_tArray per_commitment_key_arr = init_int8_tArray(32, __LINE__);
+       memcpy(per_commitment_key_arr->elems, *per_commitment_key, 32);
+       LDKHTLCOutputInCommitment htlc_var = *htlc;
+       int64_t htlc_ref = 0;
+       htlc_var = HTLCOutputInCommitment_clone(&htlc_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_var);
+       htlc_ref = tag_ptr(htlc_var.inner, htlc_var.is_owned);
+       uint64_t ret = js_invoke_function_l_lllll(j_calls->instance_ptr, 9, (int64_t)justice_tx_arr, input_conv, amount_conv, (int64_t)per_commitment_key_arr, htlc_ref);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ECDSASignatureNoneZ sign_holder_htlc_transaction_LDKEcdsaChannelSigner_jcall(const void* this_arg, LDKTransaction htlc_tx, uintptr_t input, const LDKHTLCDescriptor * htlc_descriptor) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
+       LDKTransaction htlc_tx_var = htlc_tx;
+       int8_tArray htlc_tx_arr = init_int8_tArray(htlc_tx_var.datalen, __LINE__);
+       memcpy(htlc_tx_arr->elems, htlc_tx_var.data, htlc_tx_var.datalen);
+       Transaction_free(htlc_tx_var);
+       int64_t input_conv = input;
+       LDKHTLCDescriptor htlc_descriptor_var = *htlc_descriptor;
+       int64_t htlc_descriptor_ref = 0;
+       htlc_descriptor_var = HTLCDescriptor_clone(&htlc_descriptor_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_descriptor_var);
+       htlc_descriptor_ref = tag_ptr(htlc_descriptor_var.inner, htlc_descriptor_var.is_owned);
+       uint64_t ret = js_invoke_function_l_lll(j_calls->instance_ptr, 10, (int64_t)htlc_tx_arr, input_conv, htlc_descriptor_ref);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ECDSASignatureNoneZ sign_counterparty_htlc_transaction_LDKEcdsaChannelSigner_jcall(const void* this_arg, LDKTransaction htlc_tx, uintptr_t input, uint64_t amount, LDKPublicKey per_commitment_point, const LDKHTLCOutputInCommitment * htlc) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
+       LDKTransaction htlc_tx_var = htlc_tx;
+       int8_tArray htlc_tx_arr = init_int8_tArray(htlc_tx_var.datalen, __LINE__);
+       memcpy(htlc_tx_arr->elems, htlc_tx_var.data, htlc_tx_var.datalen);
+       Transaction_free(htlc_tx_var);
+       int64_t input_conv = input;
+       int64_t amount_conv = amount;
+       int8_tArray per_commitment_point_arr = init_int8_tArray(33, __LINE__);
+       memcpy(per_commitment_point_arr->elems, per_commitment_point.compressed_form, 33);
+       LDKHTLCOutputInCommitment htlc_var = *htlc;
+       int64_t htlc_ref = 0;
+       htlc_var = HTLCOutputInCommitment_clone(&htlc_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_var);
+       htlc_ref = tag_ptr(htlc_var.inner, htlc_var.is_owned);
+       uint64_t ret = js_invoke_function_l_lllll(j_calls->instance_ptr, 11, (int64_t)htlc_tx_arr, input_conv, amount_conv, (int64_t)per_commitment_point_arr, htlc_ref);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ECDSASignatureNoneZ sign_closing_transaction_LDKEcdsaChannelSigner_jcall(const void* this_arg, const LDKClosingTransaction * closing_tx) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
+       LDKClosingTransaction closing_tx_var = *closing_tx;
+       int64_t closing_tx_ref = 0;
+       closing_tx_var = ClosingTransaction_clone(&closing_tx_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(closing_tx_var);
+       closing_tx_ref = tag_ptr(closing_tx_var.inner, closing_tx_var.is_owned);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 12, closing_tx_ref);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ECDSASignatureNoneZ sign_holder_anchor_input_LDKEcdsaChannelSigner_jcall(const void* this_arg, LDKTransaction anchor_tx, uintptr_t input) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
+       LDKTransaction anchor_tx_var = anchor_tx;
+       int8_tArray anchor_tx_arr = init_int8_tArray(anchor_tx_var.datalen, __LINE__);
+       memcpy(anchor_tx_arr->elems, anchor_tx_var.data, anchor_tx_var.datalen);
+       Transaction_free(anchor_tx_var);
+       int64_t input_conv = input;
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 13, (int64_t)anchor_tx_arr, input_conv);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ECDSASignatureNoneZ sign_channel_announcement_with_funding_key_LDKEcdsaChannelSigner_jcall(const void* this_arg, const LDKUnsignedChannelAnnouncement * msg) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
+       LDKUnsignedChannelAnnouncement msg_var = *msg;
+       int64_t msg_ref = 0;
+       msg_var = UnsignedChannelAnnouncement_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, 14, msg_ref);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKEcdsaChannelSigner_JCalls_cloned(LDKEcdsaChannelSigner* new_obj) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->ChannelSigner->refcnt, 1, memory_order_release);
+}
+static inline LDKEcdsaChannelSigner LDKEcdsaChannelSigner_init (int64_t o, int64_t ChannelSigner, int64_t pubkeys) {
+       LDKEcdsaChannelSigner_JCalls *calls = MALLOC(sizeof(LDKEcdsaChannelSigner_JCalls), "LDKEcdsaChannelSigner_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKChannelPublicKeys pubkeys_conv;
+       pubkeys_conv.inner = untag_ptr(pubkeys);
+       pubkeys_conv.is_owned = ptr_is_owned(pubkeys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(pubkeys_conv);
+
+       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,
+               .sign_holder_htlc_transaction = sign_holder_htlc_transaction_LDKEcdsaChannelSigner_jcall,
+               .sign_counterparty_htlc_transaction = sign_counterparty_htlc_transaction_LDKEcdsaChannelSigner_jcall,
+               .sign_closing_transaction = sign_closing_transaction_LDKEcdsaChannelSigner_jcall,
+               .sign_holder_anchor_input = sign_holder_anchor_input_LDKEcdsaChannelSigner_jcall,
+               .sign_channel_announcement_with_funding_key = sign_channel_announcement_with_funding_key_LDKEcdsaChannelSigner_jcall,
+               .free = LDKEcdsaChannelSigner_JCalls_free,
+               .ChannelSigner = LDKChannelSigner_init(ChannelSigner, pubkeys),
+       };
+       calls->ChannelSigner = ret.ChannelSigner.this_arg;
+       return ret;
+}
+uint64_t  CS_LDK_LDKEcdsaChannelSigner_new(int32_t o, int32_t ChannelSigner, int64_t pubkeys) {
+       LDKEcdsaChannelSigner *res_ptr = MALLOC(sizeof(LDKEcdsaChannelSigner), "LDKEcdsaChannelSigner");
+       *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) {
+       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;
+       LDKCommitmentTransaction commitment_tx_conv;
+       commitment_tx_conv.inner = untag_ptr(commitment_tx);
+       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");
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_EcdsaChannelSigner_sign_holder_commitment(int64_t this_arg, int64_t commitment_tx) {
+       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;
+       LDKHolderCommitmentTransaction commitment_tx_conv;
+       commitment_tx_conv.inner = untag_ptr(commitment_tx);
+       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;
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_holder_commitment)(this_arg_conv->this_arg, &commitment_tx_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_EcdsaChannelSigner_sign_justice_revoked_output(int64_t this_arg, int8_tArray justice_tx, int64_t input, int64_t amount, int8_tArray per_commitment_key) {
+       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;
+       LDKTransaction justice_tx_ref;
+       justice_tx_ref.datalen = justice_tx->arr_len;
+       justice_tx_ref.data = MALLOC(justice_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(justice_tx_ref.data, justice_tx->elems, justice_tx_ref.datalen); FREE(justice_tx);
+       justice_tx_ref.data_is_owned = true;
+       uint8_t per_commitment_key_arr[32];
+       CHECK(per_commitment_key->arr_len == 32);
+       memcpy(per_commitment_key_arr, per_commitment_key->elems, 32); FREE(per_commitment_key);
+       uint8_t (*per_commitment_key_ref)[32] = &per_commitment_key_arr;
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_justice_revoked_output)(this_arg_conv->this_arg, justice_tx_ref, input, amount, per_commitment_key_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_EcdsaChannelSigner_sign_justice_revoked_htlc(int64_t this_arg, int8_tArray justice_tx, int64_t input, int64_t amount, int8_tArray per_commitment_key, int64_t htlc) {
+       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;
+       LDKTransaction justice_tx_ref;
+       justice_tx_ref.datalen = justice_tx->arr_len;
+       justice_tx_ref.data = MALLOC(justice_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(justice_tx_ref.data, justice_tx->elems, justice_tx_ref.datalen); FREE(justice_tx);
+       justice_tx_ref.data_is_owned = true;
+       uint8_t per_commitment_key_arr[32];
+       CHECK(per_commitment_key->arr_len == 32);
+       memcpy(per_commitment_key_arr, per_commitment_key->elems, 32); FREE(per_commitment_key);
+       uint8_t (*per_commitment_key_ref)[32] = &per_commitment_key_arr;
+       LDKHTLCOutputInCommitment htlc_conv;
+       htlc_conv.inner = untag_ptr(htlc);
+       htlc_conv.is_owned = ptr_is_owned(htlc);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_conv);
+       htlc_conv.is_owned = false;
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_justice_revoked_htlc)(this_arg_conv->this_arg, justice_tx_ref, input, amount, per_commitment_key_ref, &htlc_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_EcdsaChannelSigner_sign_holder_htlc_transaction(int64_t this_arg, int8_tArray htlc_tx, int64_t input, int64_t htlc_descriptor) {
+       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;
+       LDKTransaction htlc_tx_ref;
+       htlc_tx_ref.datalen = htlc_tx->arr_len;
+       htlc_tx_ref.data = MALLOC(htlc_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(htlc_tx_ref.data, htlc_tx->elems, htlc_tx_ref.datalen); FREE(htlc_tx);
+       htlc_tx_ref.data_is_owned = true;
+       LDKHTLCDescriptor htlc_descriptor_conv;
+       htlc_descriptor_conv.inner = untag_ptr(htlc_descriptor);
+       htlc_descriptor_conv.is_owned = ptr_is_owned(htlc_descriptor);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_descriptor_conv);
+       htlc_descriptor_conv.is_owned = false;
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_holder_htlc_transaction)(this_arg_conv->this_arg, htlc_tx_ref, input, &htlc_descriptor_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_EcdsaChannelSigner_sign_counterparty_htlc_transaction(int64_t this_arg, int8_tArray htlc_tx, int64_t input, int64_t amount, int8_tArray per_commitment_point, int64_t htlc) {
+       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;
+       LDKTransaction htlc_tx_ref;
+       htlc_tx_ref.datalen = htlc_tx->arr_len;
+       htlc_tx_ref.data = MALLOC(htlc_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(htlc_tx_ref.data, htlc_tx->elems, htlc_tx_ref.datalen); FREE(htlc_tx);
+       htlc_tx_ref.data_is_owned = true;
+       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);
+       LDKHTLCOutputInCommitment htlc_conv;
+       htlc_conv.inner = untag_ptr(htlc);
+       htlc_conv.is_owned = ptr_is_owned(htlc);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_conv);
+       htlc_conv.is_owned = false;
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_counterparty_htlc_transaction)(this_arg_conv->this_arg, htlc_tx_ref, input, amount, per_commitment_point_ref, &htlc_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_EcdsaChannelSigner_sign_closing_transaction(int64_t this_arg, int64_t closing_tx) {
+       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;
+       LDKClosingTransaction closing_tx_conv;
+       closing_tx_conv.inner = untag_ptr(closing_tx);
+       closing_tx_conv.is_owned = ptr_is_owned(closing_tx);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(closing_tx_conv);
+       closing_tx_conv.is_owned = false;
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_closing_transaction)(this_arg_conv->this_arg, &closing_tx_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_EcdsaChannelSigner_sign_holder_anchor_input(int64_t this_arg, int8_tArray anchor_tx, int64_t input) {
+       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;
+       LDKTransaction anchor_tx_ref;
+       anchor_tx_ref.datalen = anchor_tx->arr_len;
+       anchor_tx_ref.data = MALLOC(anchor_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(anchor_tx_ref.data, anchor_tx->elems, anchor_tx_ref.datalen); FREE(anchor_tx);
+       anchor_tx_ref.data_is_owned = true;
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_holder_anchor_input)(this_arg_conv->this_arg, anchor_tx_ref, input);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_EcdsaChannelSigner_sign_channel_announcement_with_funding_key(int64_t this_arg, int64_t msg) {
+       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;
+       LDKUnsignedChannelAnnouncement 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;
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_channel_announcement_with_funding_key)(this_arg_conv->this_arg, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+typedef struct LDKWriteableEcdsaChannelSigner_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+       LDKEcdsaChannelSigner_JCalls* EcdsaChannelSigner;
+       LDKChannelSigner_JCalls* ChannelSigner;
+} LDKWriteableEcdsaChannelSigner_JCalls;
+static void LDKWriteableEcdsaChannelSigner_JCalls_free(void* this_arg) {
+       LDKWriteableEcdsaChannelSigner_JCalls *j_calls = (LDKWriteableEcdsaChannelSigner_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCVec_u8Z write_LDKWriteableEcdsaChannelSigner_jcall(const void* this_arg) {
+       LDKWriteableEcdsaChannelSigner_JCalls *j_calls = (LDKWriteableEcdsaChannelSigner_JCalls*) this_arg;
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 15);
+       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;
+}
+static void LDKWriteableEcdsaChannelSigner_JCalls_cloned(LDKWriteableEcdsaChannelSigner* new_obj) {
+       LDKWriteableEcdsaChannelSigner_JCalls *j_calls = (LDKWriteableEcdsaChannelSigner_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->EcdsaChannelSigner->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->EcdsaChannelSigner->ChannelSigner->refcnt, 1, memory_order_release);
+}
+static inline LDKWriteableEcdsaChannelSigner LDKWriteableEcdsaChannelSigner_init (int64_t o, int64_t EcdsaChannelSigner, int64_t ChannelSigner, int64_t pubkeys) {
+       LDKWriteableEcdsaChannelSigner_JCalls *calls = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner_JCalls), "LDKWriteableEcdsaChannelSigner_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKChannelPublicKeys pubkeys_conv;
+       pubkeys_conv.inner = untag_ptr(pubkeys);
+       pubkeys_conv.is_owned = ptr_is_owned(pubkeys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(pubkeys_conv);
+
+       LDKWriteableEcdsaChannelSigner ret = {
+               .this_arg = (void*) calls,
+               .write = write_LDKWriteableEcdsaChannelSigner_jcall,
+               .cloned = LDKWriteableEcdsaChannelSigner_JCalls_cloned,
+               .free = LDKWriteableEcdsaChannelSigner_JCalls_free,
+               .EcdsaChannelSigner = LDKEcdsaChannelSigner_init(EcdsaChannelSigner, ChannelSigner, pubkeys),
+       };
+       calls->EcdsaChannelSigner = ret.EcdsaChannelSigner.this_arg;
+       calls->ChannelSigner = ret.EcdsaChannelSigner.ChannelSigner.this_arg;
+       return ret;
+}
+uint64_t  CS_LDK_LDKWriteableEcdsaChannelSigner_new(int32_t o, int32_t EcdsaChannelSigner, int32_t ChannelSigner, int64_t pubkeys) {
+       LDKWriteableEcdsaChannelSigner *res_ptr = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
+       *res_ptr = LDKWriteableEcdsaChannelSigner_init(o, EcdsaChannelSigner, ChannelSigner, pubkeys);
+       return tag_ptr(res_ptr, true);
+}
+int8_tArray  CS_LDK_WriteableEcdsaChannelSigner_write(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKWriteableEcdsaChannelSigner* this_arg_conv = (LDKWriteableEcdsaChannelSigner*)this_arg_ptr;
+       LDKCVec_u8Z ret_var = (this_arg_conv->write)(this_arg_conv->this_arg);
+       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 struct LDKWriteableEcdsaChannelSigner CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_ok(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return WriteableEcdsaChannelSigner_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* owner_conv = (LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ*)untag_ptr(owner);
+       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
+       *ret_ret = CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_ok(owner_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+static inline struct LDKDecodeError CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_err(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* owner_conv = (LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKCVec_u8Z CResult_CVec_u8ZNoneZ_get_ok(LDKCResult_CVec_u8ZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return CVec_u8Z_clone(&*owner->contents.result);
+}
+int8_tArray  CS_LDK_CResult_CVec_u8ZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_u8ZNoneZ* owner_conv = (LDKCResult_CVec_u8ZNoneZ*)untag_ptr(owner);
+       LDKCVec_u8Z ret_var = CResult_CVec_u8ZNoneZ_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);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+static inline void CResult_CVec_u8ZNoneZ_get_err(LDKCResult_CVec_u8ZNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_CVec_u8ZNoneZ_get_err(int64_t owner) {
+       LDKCResult_CVec_u8ZNoneZ* owner_conv = (LDKCResult_CVec_u8ZNoneZ*)untag_ptr(owner);
+       CResult_CVec_u8ZNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKShutdownScript CResult_ShutdownScriptNoneZ_get_ok(LDKCResult_ShutdownScriptNoneZ *NONNULL_PTR owner){
+       LDKShutdownScript ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ShutdownScriptNoneZ_get_ok(int64_t owner) {
+       LDKCResult_ShutdownScriptNoneZ* owner_conv = (LDKCResult_ShutdownScriptNoneZ*)untag_ptr(owner);
+       LDKShutdownScript ret_var = CResult_ShutdownScriptNoneZ_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_ShutdownScriptNoneZ_get_err(LDKCResult_ShutdownScriptNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_ShutdownScriptNoneZ_get_err(int64_t owner) {
+       LDKCResult_ShutdownScriptNoneZ* owner_conv = (LDKCResult_ShutdownScriptNoneZ*)untag_ptr(owner);
+       CResult_ShutdownScriptNoneZ_get_err(owner_conv);
+}
+
+uint32_t CS_LDK_LDKCOption_u16Z_ty_from_ptr(int64_t ptr) {
+       LDKCOption_u16Z *obj = (LDKCOption_u16Z*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_u16Z_Some: return 0;
+               case LDKCOption_u16Z_None: return 1;
+               default: abort();
+       }
+}
+int16_t CS_LDK_LDKCOption_u16Z_Some_get_some(int64_t ptr) {
+       LDKCOption_u16Z *obj = (LDKCOption_u16Z*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_u16Z_Some);
+       int16_t some_conv = obj->some;
+       return some_conv;
+}
+uint32_t CS_LDK_LDKCOption_boolZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_boolZ *obj = (LDKCOption_boolZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_boolZ_Some: return 0;
+               case LDKCOption_boolZ_None: return 1;
+               default: abort();
+       }
+}
+jboolean CS_LDK_LDKCOption_boolZ_Some_get_some(int64_t ptr) {
+       LDKCOption_boolZ *obj = (LDKCOption_boolZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_boolZ_Some);
+       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){
+CHECK(owner->result_ok);
+       return CVec_CVec_u8ZZ_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);
+       return ret_arr;
+}
+
+static inline void CResult_CVec_CVec_u8ZZNoneZ_get_err(LDKCResult_CVec_CVec_u8ZZNoneZ *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);
+}
+
+static inline struct LDKInMemorySigner CResult_InMemorySignerDecodeErrorZ_get_ok(LDKCResult_InMemorySignerDecodeErrorZ *NONNULL_PTR owner){
+       LDKInMemorySigner ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_InMemorySignerDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_InMemorySignerDecodeErrorZ* owner_conv = (LDKCResult_InMemorySignerDecodeErrorZ*)untag_ptr(owner);
+       LDKInMemorySigner ret_var = CResult_InMemorySignerDecodeErrorZ_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_InMemorySignerDecodeErrorZ_get_err(LDKCResult_InMemorySignerDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_InMemorySignerDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_InMemorySignerDecodeErrorZ* owner_conv = (LDKCResult_InMemorySignerDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_InMemorySignerDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTransaction CResult_TransactionNoneZ_get_ok(LDKCResult_TransactionNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+int8_tArray  CS_LDK_CResult_TransactionNoneZ_get_ok(int64_t owner) {
+       LDKCResult_TransactionNoneZ* owner_conv = (LDKCResult_TransactionNoneZ*)untag_ptr(owner);
+       LDKTransaction ret_var = CResult_TransactionNoneZ_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);
+       return ret_arr;
+}
+
+static inline void CResult_TransactionNoneZ_get_err(LDKCResult_TransactionNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_TransactionNoneZ_get_err(int64_t owner) {
+       LDKCResult_TransactionNoneZ* owner_conv = (LDKCResult_TransactionNoneZ*)untag_ptr(owner);
+       CResult_TransactionNoneZ_get_err(owner_conv);
+}
+
+typedef struct LDKScoreLookUp_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKScoreLookUp_JCalls;
+static void LDKScoreLookUp_JCalls_free(void* this_arg) {
+       LDKScoreLookUp_JCalls *j_calls = (LDKScoreLookUp_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               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) {
+       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);
+       LDKChannelUsage usage_var = usage;
+       int64_t usage_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(usage_var);
+       usage_ref = tag_ptr(usage_var.inner, usage_var.is_owned);
+       LDKProbabilisticScoringFeeParameters score_params_var = *score_params;
+       int64_t score_params_ref = 0;
+       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);
+}
+static void LDKScoreLookUp_JCalls_cloned(LDKScoreLookUp* new_obj) {
+       LDKScoreLookUp_JCalls *j_calls = (LDKScoreLookUp_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKScoreLookUp LDKScoreLookUp_init (int64_t o) {
+       LDKScoreLookUp_JCalls *calls = MALLOC(sizeof(LDKScoreLookUp_JCalls), "LDKScoreLookUp_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKScoreLookUp ret = {
+               .this_arg = (void*) calls,
+               .channel_penalty_msat = channel_penalty_msat_LDKScoreLookUp_jcall,
+               .free = LDKScoreLookUp_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKScoreLookUp_new(int32_t o) {
+       LDKScoreLookUp *res_ptr = MALLOC(sizeof(LDKScoreLookUp), "LDKScoreLookUp");
+       *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) {
+       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;
+       LDKChannelUsage usage_conv;
+       usage_conv.inner = untag_ptr(usage);
+       usage_conv.is_owned = ptr_is_owned(usage);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(usage_conv);
+       usage_conv = ChannelUsage_clone(&usage_conv);
+       LDKProbabilisticScoringFeeParameters score_params_conv;
+       score_params_conv.inner = untag_ptr(score_params);
+       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);
+       return ret_conv;
+}
+
+typedef struct LDKScoreUpdate_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKScoreUpdate_JCalls;
+static void LDKScoreUpdate_JCalls_free(void* this_arg) {
+       LDKScoreUpdate_JCalls *j_calls = (LDKScoreUpdate_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void payment_path_failed_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uint64_t short_channel_id) {
+       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);
+       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);
+}
+void payment_path_successful_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path) {
+       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);
+}
+void probe_failed_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uint64_t short_channel_id) {
+       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);
+       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);
+}
+void probe_successful_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path) {
+       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);
+}
+static void LDKScoreUpdate_JCalls_cloned(LDKScoreUpdate* new_obj) {
+       LDKScoreUpdate_JCalls *j_calls = (LDKScoreUpdate_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKScoreUpdate LDKScoreUpdate_init (int64_t o) {
+       LDKScoreUpdate_JCalls *calls = MALLOC(sizeof(LDKScoreUpdate_JCalls), "LDKScoreUpdate_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKScoreUpdate ret = {
+               .this_arg = (void*) calls,
+               .payment_path_failed = payment_path_failed_LDKScoreUpdate_jcall,
+               .payment_path_successful = payment_path_successful_LDKScoreUpdate_jcall,
+               .probe_failed = probe_failed_LDKScoreUpdate_jcall,
+               .probe_successful = probe_successful_LDKScoreUpdate_jcall,
+               .free = LDKScoreUpdate_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKScoreUpdate_new(int32_t o) {
+       LDKScoreUpdate *res_ptr = MALLOC(sizeof(LDKScoreUpdate), "LDKScoreUpdate");
+       *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* 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;
+       LDKPath 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.is_owned = false;
+       (this_arg_conv->payment_path_failed)(this_arg_conv->this_arg, &path_conv, short_channel_id);
+}
+
+void  CS_LDK_ScoreUpdate_payment_path_successful(int64_t this_arg, int64_t path) {
+       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;
+       LDKPath 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.is_owned = false;
+       (this_arg_conv->payment_path_successful)(this_arg_conv->this_arg, &path_conv);
+}
+
+void  CS_LDK_ScoreUpdate_probe_failed(int64_t this_arg, int64_t path, int64_t short_channel_id) {
+       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;
+       LDKPath 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.is_owned = false;
+       (this_arg_conv->probe_failed)(this_arg_conv->this_arg, &path_conv, short_channel_id);
+}
+
+void  CS_LDK_ScoreUpdate_probe_successful(int64_t this_arg, int64_t path) {
+       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;
+       LDKPath 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.is_owned = false;
+       (this_arg_conv->probe_successful)(this_arg_conv->this_arg, &path_conv);
+}
+
+typedef struct LDKLockableScore_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKLockableScore_JCalls;
+static void LDKLockableScore_JCalls_free(void* this_arg) {
+       LDKLockableScore_JCalls *j_calls = (LDKLockableScore_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKScoreLookUp ret_conv = *(LDKScoreLookUp*)(ret_ptr);
+       if (ret_conv.free == LDKScoreLookUp_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKScoreLookUp_JCalls_cloned(&ret_conv);
+       }// WARNING: we may need a move here but no clone is available for LDKScoreLookUp
+       
+       return ret_conv;
+}
+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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKScoreUpdate ret_conv = *(LDKScoreUpdate*)(ret_ptr);
+       if (ret_conv.free == LDKScoreUpdate_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKScoreUpdate_JCalls_cloned(&ret_conv);
+       }// WARNING: we may need a move here but no clone is available for LDKScoreUpdate
+       
+       return ret_conv;
+}
+static void LDKLockableScore_JCalls_cloned(LDKLockableScore* new_obj) {
+       LDKLockableScore_JCalls *j_calls = (LDKLockableScore_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKLockableScore LDKLockableScore_init (int64_t o) {
+       LDKLockableScore_JCalls *calls = MALLOC(sizeof(LDKLockableScore_JCalls), "LDKLockableScore_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKLockableScore ret = {
+               .this_arg = (void*) calls,
+               .read_lock = read_lock_LDKLockableScore_jcall,
+               .write_lock = write_lock_LDKLockableScore_jcall,
+               .free = LDKLockableScore_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKLockableScore_new(int32_t o) {
+       LDKLockableScore *res_ptr = MALLOC(sizeof(LDKLockableScore), "LDKLockableScore");
+       *res_ptr = LDKLockableScore_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_LockableScore_read_lock(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKLockableScore* this_arg_conv = (LDKLockableScore*)this_arg_ptr;
+       LDKScoreLookUp* ret_ret = MALLOC(sizeof(LDKScoreLookUp), "LDKScoreLookUp");
+       *ret_ret = (this_arg_conv->read_lock)(this_arg_conv->this_arg);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_LockableScore_write_lock(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKLockableScore* this_arg_conv = (LDKLockableScore*)this_arg_ptr;
+       LDKScoreUpdate* ret_ret = MALLOC(sizeof(LDKScoreUpdate), "LDKScoreUpdate");
+       *ret_ret = (this_arg_conv->write_lock)(this_arg_conv->this_arg);
+       return tag_ptr(ret_ret, true);
+}
+
+typedef struct LDKWriteableScore_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+       LDKLockableScore_JCalls* LockableScore;
+} LDKWriteableScore_JCalls;
+static void LDKWriteableScore_JCalls_free(void* this_arg) {
+       LDKWriteableScore_JCalls *j_calls = (LDKWriteableScore_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+       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;
+}
+static void LDKWriteableScore_JCalls_cloned(LDKWriteableScore* new_obj) {
+       LDKWriteableScore_JCalls *j_calls = (LDKWriteableScore_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->LockableScore->refcnt, 1, memory_order_release);
+}
+static inline LDKWriteableScore LDKWriteableScore_init (int64_t o, int64_t LockableScore) {
+       LDKWriteableScore_JCalls *calls = MALLOC(sizeof(LDKWriteableScore_JCalls), "LDKWriteableScore_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKWriteableScore ret = {
+               .this_arg = (void*) calls,
+               .write = write_LDKWriteableScore_jcall,
+               .free = LDKWriteableScore_JCalls_free,
+               .LockableScore = LDKLockableScore_init(LockableScore),
+       };
+       calls->LockableScore = ret.LockableScore.this_arg;
+       return ret;
+}
+uint64_t  CS_LDK_LDKWriteableScore_new(int32_t o, int32_t LockableScore) {
+       LDKWriteableScore *res_ptr = MALLOC(sizeof(LDKWriteableScore), "LDKWriteableScore");
+       *res_ptr = LDKWriteableScore_init(o, LockableScore);
+       return tag_ptr(res_ptr, true);
+}
+int8_tArray  CS_LDK_WriteableScore_write(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKWriteableScore* this_arg_conv = (LDKWriteableScore*)this_arg_ptr;
+       LDKCVec_u8Z ret_var = (this_arg_conv->write)(this_arg_conv->this_arg);
+       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;
+}
+
+uint32_t CS_LDK_LDKCOption_WriteableScoreZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_WriteableScoreZ *obj = (LDKCOption_WriteableScoreZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_WriteableScoreZ_Some: return 0;
+               case LDKCOption_WriteableScoreZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_WriteableScoreZ_Some_get_some(int64_t ptr) {
+       LDKCOption_WriteableScoreZ *obj = (LDKCOption_WriteableScoreZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_WriteableScoreZ_Some);
+       LDKWriteableScore* some_ret = MALLOC(sizeof(LDKWriteableScore), "LDKWriteableScore");
+       *some_ret = obj->some;
+                       // WARNING: We likely need to clone here, but no clone is available, so we just do it for Java instances
+                       if ((*some_ret).free == LDKWriteableScore_JCalls_free) {
+                               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                               LDKWriteableScore_JCalls_cloned(&(*some_ret));
+                       }
+       return tag_ptr(some_ret, true);
+}
+static inline void CResult_NoneIOErrorZ_get_ok(LDKCResult_NoneIOErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NoneIOErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NoneIOErrorZ* owner_conv = (LDKCResult_NoneIOErrorZ*)untag_ptr(owner);
+       CResult_NoneIOErrorZ_get_ok(owner_conv);
+}
+
+static inline enum LDKIOError CResult_NoneIOErrorZ_get_err(LDKCResult_NoneIOErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+int32_t  CS_LDK_CResult_NoneIOErrorZ_get_err(int64_t owner) {
+       LDKCResult_NoneIOErrorZ* owner_conv = (LDKCResult_NoneIOErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKIOError_to_cs(CResult_NoneIOErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline LDKCVec_ChannelDetailsZ CVec_ChannelDetailsZ_clone(const LDKCVec_ChannelDetailsZ *orig) {
+       LDKCVec_ChannelDetailsZ ret = { .data = MALLOC(sizeof(LDKChannelDetails) * orig->datalen, "LDKCVec_ChannelDetailsZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = ChannelDetails_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKRoute CResult_RouteLightningErrorZ_get_ok(LDKCResult_RouteLightningErrorZ *NONNULL_PTR owner){
+       LDKRoute ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RouteLightningErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RouteLightningErrorZ* owner_conv = (LDKCResult_RouteLightningErrorZ*)untag_ptr(owner);
+       LDKRoute ret_var = CResult_RouteLightningErrorZ_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 LDKLightningError CResult_RouteLightningErrorZ_get_err(LDKCResult_RouteLightningErrorZ *NONNULL_PTR owner){
+       LDKLightningError ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RouteLightningErrorZ_get_err(int64_t owner) {
+       LDKCResult_RouteLightningErrorZ* owner_conv = (LDKCResult_RouteLightningErrorZ*)untag_ptr(owner);
+       LDKLightningError ret_var = CResult_RouteLightningErrorZ_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 struct LDKInFlightHtlcs CResult_InFlightHtlcsDecodeErrorZ_get_ok(LDKCResult_InFlightHtlcsDecodeErrorZ *NONNULL_PTR owner){
+       LDKInFlightHtlcs ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_InFlightHtlcsDecodeErrorZ* owner_conv = (LDKCResult_InFlightHtlcsDecodeErrorZ*)untag_ptr(owner);
+       LDKInFlightHtlcs ret_var = CResult_InFlightHtlcsDecodeErrorZ_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_InFlightHtlcsDecodeErrorZ_get_err(LDKCResult_InFlightHtlcsDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_InFlightHtlcsDecodeErrorZ* owner_conv = (LDKCResult_InFlightHtlcsDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_InFlightHtlcsDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKRouteHop CResult_RouteHopDecodeErrorZ_get_ok(LDKCResult_RouteHopDecodeErrorZ *NONNULL_PTR owner){
+       LDKRouteHop ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RouteHopDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RouteHopDecodeErrorZ* owner_conv = (LDKCResult_RouteHopDecodeErrorZ*)untag_ptr(owner);
+       LDKRouteHop ret_var = CResult_RouteHopDecodeErrorZ_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_RouteHopDecodeErrorZ_get_err(LDKCResult_RouteHopDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RouteHopDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RouteHopDecodeErrorZ* owner_conv = (LDKCResult_RouteHopDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RouteHopDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_BlindedHopZ CVec_BlindedHopZ_clone(const LDKCVec_BlindedHopZ *orig) {
+       LDKCVec_BlindedHopZ ret = { .data = MALLOC(sizeof(LDKBlindedHop) * orig->datalen, "LDKCVec_BlindedHopZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = BlindedHop_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKBlindedTail CResult_BlindedTailDecodeErrorZ_get_ok(LDKCResult_BlindedTailDecodeErrorZ *NONNULL_PTR owner){
+       LDKBlindedTail ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BlindedTailDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BlindedTailDecodeErrorZ* owner_conv = (LDKCResult_BlindedTailDecodeErrorZ*)untag_ptr(owner);
+       LDKBlindedTail ret_var = CResult_BlindedTailDecodeErrorZ_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_BlindedTailDecodeErrorZ_get_err(LDKCResult_BlindedTailDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BlindedTailDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BlindedTailDecodeErrorZ* owner_conv = (LDKCResult_BlindedTailDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BlindedTailDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_RouteHopZ CVec_RouteHopZ_clone(const LDKCVec_RouteHopZ *orig) {
+       LDKCVec_RouteHopZ ret = { .data = MALLOC(sizeof(LDKRouteHop) * orig->datalen, "LDKCVec_RouteHopZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = RouteHop_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_PathZ CVec_PathZ_clone(const LDKCVec_PathZ *orig) {
+       LDKCVec_PathZ ret = { .data = MALLOC(sizeof(LDKPath) * orig->datalen, "LDKCVec_PathZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = Path_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKRoute CResult_RouteDecodeErrorZ_get_ok(LDKCResult_RouteDecodeErrorZ *NONNULL_PTR owner){
+       LDKRoute ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RouteDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RouteDecodeErrorZ* owner_conv = (LDKCResult_RouteDecodeErrorZ*)untag_ptr(owner);
+       LDKRoute ret_var = CResult_RouteDecodeErrorZ_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_RouteDecodeErrorZ_get_err(LDKCResult_RouteDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RouteDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RouteDecodeErrorZ* owner_conv = (LDKCResult_RouteDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RouteDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKRouteParameters CResult_RouteParametersDecodeErrorZ_get_ok(LDKCResult_RouteParametersDecodeErrorZ *NONNULL_PTR owner){
+       LDKRouteParameters ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RouteParametersDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RouteParametersDecodeErrorZ* owner_conv = (LDKCResult_RouteParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKRouteParameters ret_var = CResult_RouteParametersDecodeErrorZ_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_RouteParametersDecodeErrorZ_get_err(LDKCResult_RouteParametersDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RouteParametersDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RouteParametersDecodeErrorZ* owner_conv = (LDKCResult_RouteParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RouteParametersDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_u64Z CVec_u64Z_clone(const LDKCVec_u64Z *orig) {
+       LDKCVec_u64Z ret = { .data = MALLOC(sizeof(int64_t) * orig->datalen, "LDKCVec_u64Z clone bytes"), .datalen = orig->datalen };
+       memcpy(ret.data, orig->data, sizeof(int64_t) * ret.datalen);
+       return ret;
+}
+static inline struct LDKPaymentParameters CResult_PaymentParametersDecodeErrorZ_get_ok(LDKCResult_PaymentParametersDecodeErrorZ *NONNULL_PTR owner){
+       LDKPaymentParameters ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PaymentParametersDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PaymentParametersDecodeErrorZ* owner_conv = (LDKCResult_PaymentParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKPaymentParameters ret_var = CResult_PaymentParametersDecodeErrorZ_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_PaymentParametersDecodeErrorZ_get_err(LDKCResult_PaymentParametersDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PaymentParametersDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PaymentParametersDecodeErrorZ* owner_conv = (LDKCResult_PaymentParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PaymentParametersDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       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++) {
+               ret.data[i] = RouteHint_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_RouteHintHopZ CVec_RouteHintHopZ_clone(const LDKCVec_RouteHintHopZ *orig) {
+       LDKCVec_RouteHintHopZ ret = { .data = MALLOC(sizeof(LDKRouteHintHop) * orig->datalen, "LDKCVec_RouteHintHopZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = RouteHintHop_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKRouteHint CResult_RouteHintDecodeErrorZ_get_ok(LDKCResult_RouteHintDecodeErrorZ *NONNULL_PTR owner){
+       LDKRouteHint ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RouteHintDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RouteHintDecodeErrorZ* owner_conv = (LDKCResult_RouteHintDecodeErrorZ*)untag_ptr(owner);
+       LDKRouteHint ret_var = CResult_RouteHintDecodeErrorZ_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_RouteHintDecodeErrorZ_get_err(LDKCResult_RouteHintDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RouteHintDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RouteHintDecodeErrorZ* owner_conv = (LDKCResult_RouteHintDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RouteHintDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKRouteHintHop CResult_RouteHintHopDecodeErrorZ_get_ok(LDKCResult_RouteHintHopDecodeErrorZ *NONNULL_PTR owner){
+       LDKRouteHintHop ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RouteHintHopDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RouteHintHopDecodeErrorZ* owner_conv = (LDKCResult_RouteHintHopDecodeErrorZ*)untag_ptr(owner);
+       LDKRouteHintHop ret_var = CResult_RouteHintHopDecodeErrorZ_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_RouteHintHopDecodeErrorZ_get_err(LDKCResult_RouteHintHopDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RouteHintHopDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RouteHintHopDecodeErrorZ* owner_conv = (LDKCResult_RouteHintHopDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RouteHintHopDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKFixedPenaltyScorer CResult_FixedPenaltyScorerDecodeErrorZ_get_ok(LDKCResult_FixedPenaltyScorerDecodeErrorZ *NONNULL_PTR owner){
+       LDKFixedPenaltyScorer ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* owner_conv = (LDKCResult_FixedPenaltyScorerDecodeErrorZ*)untag_ptr(owner);
+       LDKFixedPenaltyScorer ret_var = CResult_FixedPenaltyScorerDecodeErrorZ_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_FixedPenaltyScorerDecodeErrorZ_get_err(LDKCResult_FixedPenaltyScorerDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* owner_conv = (LDKCResult_FixedPenaltyScorerDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_FixedPenaltyScorerDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_NodeIdZ CVec_NodeIdZ_clone(const LDKCVec_NodeIdZ *orig) {
+       LDKCVec_NodeIdZ ret = { .data = MALLOC(sizeof(LDKNodeId) * orig->datalen, "LDKCVec_NodeIdZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = NodeId_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline uint64_t C2Tuple_u64u64Z_get_a(LDKC2Tuple_u64u64Z *NONNULL_PTR owner){
+       return owner->a;
+}
+int64_t  CS_LDK_C2Tuple_u64u64Z_get_a(int64_t owner) {
+       LDKC2Tuple_u64u64Z* owner_conv = (LDKC2Tuple_u64u64Z*)untag_ptr(owner);
+       int64_t ret_conv = C2Tuple_u64u64Z_get_a(owner_conv);
+       return ret_conv;
+}
+
+static inline uint64_t C2Tuple_u64u64Z_get_b(LDKC2Tuple_u64u64Z *NONNULL_PTR owner){
+       return owner->b;
+}
+int64_t  CS_LDK_C2Tuple_u64u64Z_get_b(int64_t owner) {
+       LDKC2Tuple_u64u64Z* owner_conv = (LDKC2Tuple_u64u64Z*)untag_ptr(owner);
+       int64_t ret_conv = C2Tuple_u64u64Z_get_b(owner_conv);
+       return ret_conv;
+}
+
+uint32_t CS_LDK_LDKCOption_C2Tuple_u64u64ZZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_C2Tuple_u64u64ZZ *obj = (LDKCOption_C2Tuple_u64u64ZZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_C2Tuple_u64u64ZZ_Some: return 0;
+               case LDKCOption_C2Tuple_u64u64ZZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_C2Tuple_u64u64ZZ_Some_get_some(int64_t ptr) {
+       LDKCOption_C2Tuple_u64u64ZZ *obj = (LDKCOption_C2Tuple_u64u64ZZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_C2Tuple_u64u64ZZ_Some);
+       LDKC2Tuple_u64u64Z* some_conv = MALLOC(sizeof(LDKC2Tuple_u64u64Z), "LDKC2Tuple_u64u64Z");
+       *some_conv = obj->some;
+                       *some_conv = C2Tuple_u64u64Z_clone(some_conv);
+       return tag_ptr(some_conv, true);
+}
+static inline struct LDKThirtyTwoU16s C2Tuple_Z_get_a(LDKC2Tuple_Z *NONNULL_PTR owner){
+       return owner->a;
+}
+int16_tArray  CS_LDK_C2Tuple_Z_get_a(int64_t owner) {
+       LDKC2Tuple_Z* owner_conv = (LDKC2Tuple_Z*)untag_ptr(owner);
+       int16_tArray ret_arr = init_int16_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_Z_get_a(owner_conv).data, 32 * 2);
+       return ret_arr;
+}
+
+static inline struct LDKThirtyTwoU16s C2Tuple_Z_get_b(LDKC2Tuple_Z *NONNULL_PTR owner){
+       return owner->b;
+}
+int16_tArray  CS_LDK_C2Tuple_Z_get_b(int64_t owner) {
+       LDKC2Tuple_Z* owner_conv = (LDKC2Tuple_Z*)untag_ptr(owner);
+       int16_tArray ret_arr = init_int16_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_Z_get_b(owner_conv).data, 32 * 2);
+       return ret_arr;
+}
+
+static inline struct LDKThirtyTwoU16s C2Tuple__u1632_u1632Z_get_a(LDKC2Tuple__u1632_u1632Z *NONNULL_PTR owner){
+       return owner->a;
+}
+int16_tArray  CS_LDK_C2Tuple__u1632_u1632Z_get_a(int64_t owner) {
+       LDKC2Tuple__u1632_u1632Z* owner_conv = (LDKC2Tuple__u1632_u1632Z*)untag_ptr(owner);
+       int16_tArray ret_arr = init_int16_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple__u1632_u1632Z_get_a(owner_conv).data, 32 * 2);
+       return ret_arr;
+}
+
+static inline struct LDKThirtyTwoU16s C2Tuple__u1632_u1632Z_get_b(LDKC2Tuple__u1632_u1632Z *NONNULL_PTR owner){
+       return owner->b;
+}
+int16_tArray  CS_LDK_C2Tuple__u1632_u1632Z_get_b(int64_t owner) {
+       LDKC2Tuple__u1632_u1632Z* owner_conv = (LDKC2Tuple__u1632_u1632Z*)untag_ptr(owner);
+       int16_tArray ret_arr = init_int16_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple__u1632_u1632Z_get_b(owner_conv).data, 32 * 2);
+       return ret_arr;
+}
+
+uint32_t CS_LDK_LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ *obj = (LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_Some: return 0;
+               case LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_Some_get_some(int64_t ptr) {
+       LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ *obj = (LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_Some);
+       LDKC2Tuple__u1632_u1632Z* some_conv = &obj->some;
+                       // WARNING: we really need to clone here, but no clone is available for LDKC2Tuple__u1632_u1632Z
+       return tag_ptr(some_conv, false);
+}
+uint32_t CS_LDK_LDKCOption_f64Z_ty_from_ptr(int64_t ptr) {
+       LDKCOption_f64Z *obj = (LDKCOption_f64Z*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_f64Z_Some: return 0;
+               case LDKCOption_f64Z_None: return 1;
+               default: abort();
+       }
+}
+double CS_LDK_LDKCOption_f64Z_Some_get_some(int64_t ptr) {
+       LDKCOption_f64Z *obj = (LDKCOption_f64Z*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_f64Z_Some);
+       double some_conv = obj->some;
+       return some_conv;
+}
+typedef struct LDKLogger_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKLogger_JCalls;
+static void LDKLogger_JCalls_free(void* this_arg) {
+       LDKLogger_JCalls *j_calls = (LDKLogger_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void log_LDKLogger_jcall(const void* this_arg, const LDKRecord * record) {
+       LDKLogger_JCalls *j_calls = (LDKLogger_JCalls*) this_arg;
+       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);
+}
+static void LDKLogger_JCalls_cloned(LDKLogger* new_obj) {
+       LDKLogger_JCalls *j_calls = (LDKLogger_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKLogger LDKLogger_init (int64_t o) {
+       LDKLogger_JCalls *calls = MALLOC(sizeof(LDKLogger_JCalls), "LDKLogger_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKLogger ret = {
+               .this_arg = (void*) calls,
+               .log = log_LDKLogger_jcall,
+               .free = LDKLogger_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKLogger_new(int32_t o) {
+       LDKLogger *res_ptr = MALLOC(sizeof(LDKLogger), "LDKLogger");
+       *res_ptr = LDKLogger_init(o);
+       return tag_ptr(res_ptr, true);
+}
+static inline struct LDKProbabilisticScorer CResult_ProbabilisticScorerDecodeErrorZ_get_ok(LDKCResult_ProbabilisticScorerDecodeErrorZ *NONNULL_PTR owner){
+       LDKProbabilisticScorer ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ProbabilisticScorerDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ProbabilisticScorerDecodeErrorZ* owner_conv = (LDKCResult_ProbabilisticScorerDecodeErrorZ*)untag_ptr(owner);
+       LDKProbabilisticScorer ret_var = CResult_ProbabilisticScorerDecodeErrorZ_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_ProbabilisticScorerDecodeErrorZ_get_err(LDKCResult_ProbabilisticScorerDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ProbabilisticScorerDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ProbabilisticScorerDecodeErrorZ* owner_conv = (LDKCResult_ProbabilisticScorerDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ProbabilisticScorerDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline uintptr_t C2Tuple_usizeTransactionZ_get_a(LDKC2Tuple_usizeTransactionZ *NONNULL_PTR owner){
+       return owner->a;
+}
+int64_t  CS_LDK_C2Tuple_usizeTransactionZ_get_a(int64_t owner) {
+       LDKC2Tuple_usizeTransactionZ* owner_conv = (LDKC2Tuple_usizeTransactionZ*)untag_ptr(owner);
+       int64_t ret_conv = C2Tuple_usizeTransactionZ_get_a(owner_conv);
+       return ret_conv;
+}
+
+static inline struct LDKTransaction C2Tuple_usizeTransactionZ_get_b(LDKC2Tuple_usizeTransactionZ *NONNULL_PTR owner){
+       return owner->b;
+}
+int8_tArray  CS_LDK_C2Tuple_usizeTransactionZ_get_b(int64_t owner) {
+       LDKC2Tuple_usizeTransactionZ* owner_conv = (LDKC2Tuple_usizeTransactionZ*)untag_ptr(owner);
+       LDKTransaction ret_var = C2Tuple_usizeTransactionZ_get_b(owner_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 LDKCVec_C2Tuple_usizeTransactionZZ CVec_C2Tuple_usizeTransactionZZ_clone(const LDKCVec_C2Tuple_usizeTransactionZZ *orig) {
+       LDKCVec_C2Tuple_usizeTransactionZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_usizeTransactionZ) * orig->datalen, "LDKCVec_C2Tuple_usizeTransactionZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_usizeTransactionZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_a(LDKC2Tuple_ThirtyTwoBytesCOption_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 ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesCOption_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);
+}
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_b(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ*)untag_ptr(owner);
+       LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
+       *ret_copy = C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_b(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 };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline enum LDKChannelMonitorUpdateStatus CResult_ChannelMonitorUpdateStatusNoneZ_get_ok(LDKCResult_ChannelMonitorUpdateStatusNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return ChannelMonitorUpdateStatus_clone(&*owner->contents.result);
+}
+int32_t  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* owner_conv = (LDKCResult_ChannelMonitorUpdateStatusNoneZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKChannelMonitorUpdateStatus_to_cs(CResult_ChannelMonitorUpdateStatusNoneZ_get_ok(owner_conv));
+       return ret_conv;
+}
+
+static inline void CResult_ChannelMonitorUpdateStatusNoneZ_get_err(LDKCResult_ChannelMonitorUpdateStatusNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_get_err(int64_t owner) {
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* owner_conv = (LDKCResult_ChannelMonitorUpdateStatusNoneZ*)untag_ptr(owner);
+       CResult_ChannelMonitorUpdateStatusNoneZ_get_err(owner_conv);
+}
+
+uint32_t CS_LDK_LDKMonitorEvent_ty_from_ptr(int64_t ptr) {
+       LDKMonitorEvent *obj = (LDKMonitorEvent*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKMonitorEvent_HTLCEvent: return 0;
+               case LDKMonitorEvent_HolderForceClosed: return 1;
+               case LDKMonitorEvent_Completed: return 2;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKMonitorEvent_HTLCEvent_get_htlc_event(int64_t ptr) {
+       LDKMonitorEvent *obj = (LDKMonitorEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMonitorEvent_HTLCEvent);
+       LDKHTLCUpdate htlc_event_var = obj->htlc_event;
+                       int64_t htlc_event_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_event_var);
+                       htlc_event_ref = tag_ptr(htlc_event_var.inner, false);
+       return htlc_event_ref;
+}
+int64_t CS_LDK_LDKMonitorEvent_HolderForceClosed_get_holder_force_closed(int64_t ptr) {
+       LDKMonitorEvent *obj = (LDKMonitorEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMonitorEvent_HolderForceClosed);
+       LDKOutPoint holder_force_closed_var = obj->holder_force_closed;
+                       int64_t holder_force_closed_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(holder_force_closed_var);
+                       holder_force_closed_ref = tag_ptr(holder_force_closed_var.inner, false);
+       return holder_force_closed_ref;
+}
+int64_t CS_LDK_LDKMonitorEvent_Completed_get_funding_txo(int64_t ptr) {
+       LDKMonitorEvent *obj = (LDKMonitorEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMonitorEvent_Completed);
+       LDKOutPoint funding_txo_var = obj->completed.funding_txo;
+                       int64_t funding_txo_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_var);
+                       funding_txo_ref = tag_ptr(funding_txo_var.inner, false);
+       return funding_txo_ref;
+}
+int64_t CS_LDK_LDKMonitorEvent_Completed_get_monitor_update_id(int64_t ptr) {
+       LDKMonitorEvent *obj = (LDKMonitorEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMonitorEvent_Completed);
+       int64_t monitor_update_id_conv = obj->completed.monitor_update_id;
+       return monitor_update_id_conv;
+}
+static inline LDKCVec_MonitorEventZ CVec_MonitorEventZ_clone(const LDKCVec_MonitorEventZ *orig) {
+       LDKCVec_MonitorEventZ ret = { .data = MALLOC(sizeof(LDKMonitorEvent) * orig->datalen, "LDKCVec_MonitorEventZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = MonitorEvent_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKOutPoint C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_a(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ *NONNULL_PTR owner){
+       LDKOutPoint ret = owner->a;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_a(int64_t owner) {
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* owner_conv = (LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ*)untag_ptr(owner);
+       LDKOutPoint ret_var = C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_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 LDKCVec_MonitorEventZ C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_b(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ *NONNULL_PTR owner){
+       return CVec_MonitorEventZ_clone(&owner->b);
+}
+int64_tArray  CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_b(int64_t owner) {
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* owner_conv = (LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ*)untag_ptr(owner);
+       LDKCVec_MonitorEventZ ret_var = C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_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 o = 0; o < ret_var.datalen; o++) {
+               LDKMonitorEvent *ret_conv_14_copy = MALLOC(sizeof(LDKMonitorEvent), "LDKMonitorEvent");
+               *ret_conv_14_copy = ret_var.data[o];
+               int64_t ret_conv_14_ref = tag_ptr(ret_conv_14_copy, true);
+               ret_arr_ptr[o] = ret_conv_14_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+static inline struct LDKPublicKey C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_c(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ *NONNULL_PTR owner){
+       return owner->c;
+}
+int8_tArray  CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_c(int64_t owner) {
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* owner_conv = (LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_c(owner_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+static inline LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ CVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ_clone(const LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ *orig) {
+       LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ ret = { .data = MALLOC(sizeof(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ) * orig->datalen, "LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKInitFeatures CResult_InitFeaturesDecodeErrorZ_get_ok(LDKCResult_InitFeaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKInitFeatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_InitFeaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_InitFeaturesDecodeErrorZ* owner_conv = (LDKCResult_InitFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKInitFeatures ret_var = CResult_InitFeaturesDecodeErrorZ_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_InitFeaturesDecodeErrorZ_get_err(LDKCResult_InitFeaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_InitFeaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_InitFeaturesDecodeErrorZ* owner_conv = (LDKCResult_InitFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_InitFeaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelFeatures CResult_ChannelFeaturesDecodeErrorZ_get_ok(LDKCResult_ChannelFeaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelFeatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelFeaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelFeaturesDecodeErrorZ* owner_conv = (LDKCResult_ChannelFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelFeatures ret_var = CResult_ChannelFeaturesDecodeErrorZ_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_ChannelFeaturesDecodeErrorZ_get_err(LDKCResult_ChannelFeaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelFeaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelFeaturesDecodeErrorZ* owner_conv = (LDKCResult_ChannelFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelFeaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKNodeFeatures CResult_NodeFeaturesDecodeErrorZ_get_ok(LDKCResult_NodeFeaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKNodeFeatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NodeFeaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NodeFeaturesDecodeErrorZ* owner_conv = (LDKCResult_NodeFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKNodeFeatures ret_var = CResult_NodeFeaturesDecodeErrorZ_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_NodeFeaturesDecodeErrorZ_get_err(LDKCResult_NodeFeaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NodeFeaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_NodeFeaturesDecodeErrorZ* owner_conv = (LDKCResult_NodeFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_NodeFeaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBolt11InvoiceFeatures CResult_Bolt11InvoiceFeaturesDecodeErrorZ_get_ok(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKBolt11InvoiceFeatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceFeaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* owner_conv = (LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKBolt11InvoiceFeatures ret_var = CResult_Bolt11InvoiceFeaturesDecodeErrorZ_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_Bolt11InvoiceFeaturesDecodeErrorZ_get_err(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceFeaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* owner_conv = (LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_Bolt11InvoiceFeaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBolt12InvoiceFeatures CResult_Bolt12InvoiceFeaturesDecodeErrorZ_get_ok(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKBolt12InvoiceFeatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_Bolt12InvoiceFeaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* owner_conv = (LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKBolt12InvoiceFeatures ret_var = CResult_Bolt12InvoiceFeaturesDecodeErrorZ_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_Bolt12InvoiceFeaturesDecodeErrorZ_get_err(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_Bolt12InvoiceFeaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* owner_conv = (LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_Bolt12InvoiceFeaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBlindedHopFeatures CResult_BlindedHopFeaturesDecodeErrorZ_get_ok(LDKCResult_BlindedHopFeaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKBlindedHopFeatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BlindedHopFeaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* owner_conv = (LDKCResult_BlindedHopFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKBlindedHopFeatures ret_var = CResult_BlindedHopFeaturesDecodeErrorZ_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_BlindedHopFeaturesDecodeErrorZ_get_err(LDKCResult_BlindedHopFeaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BlindedHopFeaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* owner_conv = (LDKCResult_BlindedHopFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BlindedHopFeaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelTypeFeatures CResult_ChannelTypeFeaturesDecodeErrorZ_get_ok(LDKCResult_ChannelTypeFeaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelTypeFeatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* owner_conv = (LDKCResult_ChannelTypeFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelTypeFeatures ret_var = CResult_ChannelTypeFeaturesDecodeErrorZ_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_ChannelTypeFeaturesDecodeErrorZ_get_err(LDKCResult_ChannelTypeFeaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* owner_conv = (LDKCResult_ChannelTypeFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelTypeFeaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKOffer CResult_OfferBolt12ParseErrorZ_get_ok(LDKCResult_OfferBolt12ParseErrorZ *NONNULL_PTR owner){
+       LDKOffer ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_OfferBolt12ParseErrorZ_get_ok(int64_t owner) {
+       LDKCResult_OfferBolt12ParseErrorZ* owner_conv = (LDKCResult_OfferBolt12ParseErrorZ*)untag_ptr(owner);
+       LDKOffer ret_var = CResult_OfferBolt12ParseErrorZ_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 LDKBolt12ParseError CResult_OfferBolt12ParseErrorZ_get_err(LDKCResult_OfferBolt12ParseErrorZ *NONNULL_PTR owner){
+       LDKBolt12ParseError ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_OfferBolt12ParseErrorZ_get_err(int64_t owner) {
+       LDKCResult_OfferBolt12ParseErrorZ* owner_conv = (LDKCResult_OfferBolt12ParseErrorZ*)untag_ptr(owner);
+       LDKBolt12ParseError ret_var = CResult_OfferBolt12ParseErrorZ_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 struct LDKPublicKey CResult_PublicKeySecp256k1ErrorZ_get_ok(LDKCResult_PublicKeySecp256k1ErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+int8_tArray  CS_LDK_CResult_PublicKeySecp256k1ErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PublicKeySecp256k1ErrorZ* owner_conv = (LDKCResult_PublicKeySecp256k1ErrorZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, CResult_PublicKeySecp256k1ErrorZ_get_ok(owner_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+static inline enum LDKSecp256k1Error CResult_PublicKeySecp256k1ErrorZ_get_err(LDKCResult_PublicKeySecp256k1ErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+int32_t  CS_LDK_CResult_PublicKeySecp256k1ErrorZ_get_err(int64_t owner) {
+       LDKCResult_PublicKeySecp256k1ErrorZ* owner_conv = (LDKCResult_PublicKeySecp256k1ErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKSecp256k1Error_to_cs(CResult_PublicKeySecp256k1ErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKNodeId CResult_NodeIdDecodeErrorZ_get_ok(LDKCResult_NodeIdDecodeErrorZ *NONNULL_PTR owner){
+       LDKNodeId ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NodeIdDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NodeIdDecodeErrorZ* owner_conv = (LDKCResult_NodeIdDecodeErrorZ*)untag_ptr(owner);
+       LDKNodeId ret_var = CResult_NodeIdDecodeErrorZ_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_NodeIdDecodeErrorZ_get_err(LDKCResult_NodeIdDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NodeIdDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_NodeIdDecodeErrorZ* owner_conv = (LDKCResult_NodeIdDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_NodeIdDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKNetworkUpdate_ty_from_ptr(int64_t ptr) {
+       LDKNetworkUpdate *obj = (LDKNetworkUpdate*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKNetworkUpdate_ChannelUpdateMessage: return 0;
+               case LDKNetworkUpdate_ChannelFailure: return 1;
+               case LDKNetworkUpdate_NodeFailure: return 2;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKNetworkUpdate_ChannelUpdateMessage_get_msg(int64_t ptr) {
+       LDKNetworkUpdate *obj = (LDKNetworkUpdate*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKNetworkUpdate_ChannelUpdateMessage);
+       LDKChannelUpdate msg_var = obj->channel_update_message.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;
+}
+int64_t CS_LDK_LDKNetworkUpdate_ChannelFailure_get_short_channel_id(int64_t ptr) {
+       LDKNetworkUpdate *obj = (LDKNetworkUpdate*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKNetworkUpdate_ChannelFailure);
+       int64_t short_channel_id_conv = obj->channel_failure.short_channel_id;
+       return short_channel_id_conv;
+}
+jboolean CS_LDK_LDKNetworkUpdate_ChannelFailure_get_is_permanent(int64_t ptr) {
+       LDKNetworkUpdate *obj = (LDKNetworkUpdate*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKNetworkUpdate_ChannelFailure);
+       jboolean is_permanent_conv = obj->channel_failure.is_permanent;
+       return is_permanent_conv;
+}
+int8_tArray CS_LDK_LDKNetworkUpdate_NodeFailure_get_node_id(int64_t ptr) {
+       LDKNetworkUpdate *obj = (LDKNetworkUpdate*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKNetworkUpdate_NodeFailure);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->node_failure.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+jboolean CS_LDK_LDKNetworkUpdate_NodeFailure_get_is_permanent(int64_t ptr) {
+       LDKNetworkUpdate *obj = (LDKNetworkUpdate*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKNetworkUpdate_NodeFailure);
+       jboolean is_permanent_conv = obj->node_failure.is_permanent;
+       return is_permanent_conv;
+}
+uint32_t CS_LDK_LDKCOption_NetworkUpdateZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_NetworkUpdateZ *obj = (LDKCOption_NetworkUpdateZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_NetworkUpdateZ_Some: return 0;
+               case LDKCOption_NetworkUpdateZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_NetworkUpdateZ_Some_get_some(int64_t ptr) {
+       LDKCOption_NetworkUpdateZ *obj = (LDKCOption_NetworkUpdateZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_NetworkUpdateZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+static inline struct LDKCOption_NetworkUpdateZ CResult_COption_NetworkUpdateZDecodeErrorZ_get_ok(LDKCResult_COption_NetworkUpdateZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_NetworkUpdateZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_NetworkUpdateZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* owner_conv = (LDKCResult_COption_NetworkUpdateZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_NetworkUpdateZ *ret_copy = MALLOC(sizeof(LDKCOption_NetworkUpdateZ), "LDKCOption_NetworkUpdateZ");
+       *ret_copy = CResult_COption_NetworkUpdateZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_NetworkUpdateZDecodeErrorZ_get_err(LDKCResult_COption_NetworkUpdateZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_NetworkUpdateZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* owner_conv = (LDKCResult_COption_NetworkUpdateZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_NetworkUpdateZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxOut CResult_TxOutUtxoLookupErrorZ_get_ok(LDKCResult_TxOutUtxoLookupErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return TxOut_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_TxOutUtxoLookupErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxOutUtxoLookupErrorZ* owner_conv = (LDKCResult_TxOutUtxoLookupErrorZ*)untag_ptr(owner);
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = CResult_TxOutUtxoLookupErrorZ_get_ok(owner_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+static inline enum LDKUtxoLookupError CResult_TxOutUtxoLookupErrorZ_get_err(LDKCResult_TxOutUtxoLookupErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return UtxoLookupError_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_TxOutUtxoLookupErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxOutUtxoLookupErrorZ* owner_conv = (LDKCResult_TxOutUtxoLookupErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKUtxoLookupError_to_cs(CResult_TxOutUtxoLookupErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+uint32_t CS_LDK_LDKUtxoResult_ty_from_ptr(int64_t ptr) {
+       LDKUtxoResult *obj = (LDKUtxoResult*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKUtxoResult_Sync: return 0;
+               case LDKUtxoResult_Async: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKUtxoResult_Sync_get_sync(int64_t ptr) {
+       LDKUtxoResult *obj = (LDKUtxoResult*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKUtxoResult_Sync);
+       LDKCResult_TxOutUtxoLookupErrorZ* sync_conv = MALLOC(sizeof(LDKCResult_TxOutUtxoLookupErrorZ), "LDKCResult_TxOutUtxoLookupErrorZ");
+       *sync_conv = obj->sync;
+                       *sync_conv = CResult_TxOutUtxoLookupErrorZ_clone(sync_conv);
+       return tag_ptr(sync_conv, true);
+}
+int64_t CS_LDK_LDKUtxoResult_Async_get_async(int64_t ptr) {
+       LDKUtxoResult *obj = (LDKUtxoResult*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKUtxoResult_Async);
+       LDKUtxoFuture async_var = obj->async;
+                       int64_t async_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(async_var);
+                       async_ref = tag_ptr(async_var.inner, false);
+       return async_ref;
+}
+typedef struct LDKUtxoLookup_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKUtxoLookup_JCalls;
+static void LDKUtxoLookup_JCalls_free(void* this_arg) {
+       LDKUtxoLookup_JCalls *j_calls = (LDKUtxoLookup_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKUtxoResult get_utxo_LDKUtxoLookup_jcall(const void* this_arg, const uint8_t (* chain_hash)[32], uint64_t short_channel_id) {
+       LDKUtxoLookup_JCalls *j_calls = (LDKUtxoLookup_JCalls*) this_arg;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKUtxoResult ret_conv = *(LDKUtxoResult*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKUtxoLookup_JCalls_cloned(LDKUtxoLookup* new_obj) {
+       LDKUtxoLookup_JCalls *j_calls = (LDKUtxoLookup_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKUtxoLookup LDKUtxoLookup_init (int64_t o) {
+       LDKUtxoLookup_JCalls *calls = MALLOC(sizeof(LDKUtxoLookup_JCalls), "LDKUtxoLookup_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKUtxoLookup ret = {
+               .this_arg = (void*) calls,
+               .get_utxo = get_utxo_LDKUtxoLookup_jcall,
+               .free = LDKUtxoLookup_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKUtxoLookup_new(int32_t o) {
+       LDKUtxoLookup *res_ptr = MALLOC(sizeof(LDKUtxoLookup), "LDKUtxoLookup");
+       *res_ptr = LDKUtxoLookup_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_UtxoLookup_get_utxo(int64_t this_arg, int8_tArray chain_hash, int64_t short_channel_id) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKUtxoLookup* this_arg_conv = (LDKUtxoLookup*)this_arg_ptr;
+       uint8_t chain_hash_arr[32];
+       CHECK(chain_hash->arr_len == 32);
+       memcpy(chain_hash_arr, chain_hash->elems, 32); FREE(chain_hash);
+       uint8_t (*chain_hash_ref)[32] = &chain_hash_arr;
+       LDKUtxoResult *ret_copy = MALLOC(sizeof(LDKUtxoResult), "LDKUtxoResult");
+       *ret_copy = (this_arg_conv->get_utxo)(this_arg_conv->this_arg, chain_hash_ref, short_channel_id);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKCOption_UtxoLookupZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_UtxoLookupZ *obj = (LDKCOption_UtxoLookupZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_UtxoLookupZ_Some: return 0;
+               case LDKCOption_UtxoLookupZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_UtxoLookupZ_Some_get_some(int64_t ptr) {
+       LDKCOption_UtxoLookupZ *obj = (LDKCOption_UtxoLookupZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_UtxoLookupZ_Some);
+       LDKUtxoLookup* some_ret = MALLOC(sizeof(LDKUtxoLookup), "LDKUtxoLookup");
+       *some_ret = obj->some;
+                       // WARNING: We likely need to clone here, but no clone is available, so we just do it for Java instances
+                       if ((*some_ret).free == LDKUtxoLookup_JCalls_free) {
+                               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                               LDKUtxoLookup_JCalls_cloned(&(*some_ret));
+                       }
+       return tag_ptr(some_ret, true);
+}
+static inline void CResult_NoneLightningErrorZ_get_ok(LDKCResult_NoneLightningErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NoneLightningErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NoneLightningErrorZ* owner_conv = (LDKCResult_NoneLightningErrorZ*)untag_ptr(owner);
+       CResult_NoneLightningErrorZ_get_ok(owner_conv);
+}
+
+static inline struct LDKLightningError CResult_NoneLightningErrorZ_get_err(LDKCResult_NoneLightningErrorZ *NONNULL_PTR owner){
+       LDKLightningError ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NoneLightningErrorZ_get_err(int64_t owner) {
+       LDKCResult_NoneLightningErrorZ* owner_conv = (LDKCResult_NoneLightningErrorZ*)untag_ptr(owner);
+       LDKLightningError ret_var = CResult_NoneLightningErrorZ_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 bool CResult_boolLightningErrorZ_get_ok(LDKCResult_boolLightningErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+jboolean  CS_LDK_CResult_boolLightningErrorZ_get_ok(int64_t owner) {
+       LDKCResult_boolLightningErrorZ* owner_conv = (LDKCResult_boolLightningErrorZ*)untag_ptr(owner);
+       jboolean ret_conv = CResult_boolLightningErrorZ_get_ok(owner_conv);
+       return ret_conv;
+}
+
+static inline struct LDKLightningError CResult_boolLightningErrorZ_get_err(LDKCResult_boolLightningErrorZ *NONNULL_PTR owner){
+       LDKLightningError ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_boolLightningErrorZ_get_err(int64_t owner) {
+       LDKCResult_boolLightningErrorZ* owner_conv = (LDKCResult_boolLightningErrorZ*)untag_ptr(owner);
+       LDKLightningError ret_var = CResult_boolLightningErrorZ_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 struct LDKChannelAnnouncement C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_a(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *NONNULL_PTR owner){
+       LDKChannelAnnouncement ret = owner->a;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_a(int64_t owner) {
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* owner_conv = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)untag_ptr(owner);
+       LDKChannelAnnouncement ret_var = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_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 LDKChannelUpdate C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_b(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *NONNULL_PTR owner){
+       LDKChannelUpdate ret = owner->b;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_b(int64_t owner) {
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* owner_conv = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)untag_ptr(owner);
+       LDKChannelUpdate ret_var = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_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 LDKChannelUpdate C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_c(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *NONNULL_PTR owner){
+       LDKChannelUpdate ret = owner->c;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_c(int64_t owner) {
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* owner_conv = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)untag_ptr(owner);
+       LDKChannelUpdate ret_var = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_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_LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *obj = (LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_Some: return 0;
+               case LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_Some_get_some(int64_t ptr) {
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *obj = (LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_Some);
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* some_conv = MALLOC(sizeof(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ), "LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ");
+       *some_conv = obj->some;
+                       *some_conv = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone(some_conv);
+       return tag_ptr(some_conv, true);
+}
+uint32_t CS_LDK_LDKErrorAction_ty_from_ptr(int64_t ptr) {
+       LDKErrorAction *obj = (LDKErrorAction*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKErrorAction_DisconnectPeer: return 0;
+               case LDKErrorAction_DisconnectPeerWithWarning: return 1;
+               case LDKErrorAction_IgnoreError: return 2;
+               case LDKErrorAction_IgnoreAndLog: return 3;
+               case LDKErrorAction_IgnoreDuplicateGossip: return 4;
+               case LDKErrorAction_SendErrorMessage: return 5;
+               case LDKErrorAction_SendWarningMessage: return 6;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKErrorAction_DisconnectPeer_get_msg(int64_t ptr) {
+       LDKErrorAction *obj = (LDKErrorAction*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKErrorAction_DisconnectPeer);
+       LDKErrorMessage msg_var = obj->disconnect_peer.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;
+}
+int64_t CS_LDK_LDKErrorAction_DisconnectPeerWithWarning_get_msg(int64_t ptr) {
+       LDKErrorAction *obj = (LDKErrorAction*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKErrorAction_DisconnectPeerWithWarning);
+       LDKWarningMessage msg_var = obj->disconnect_peer_with_warning.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;
+}
+int32_t CS_LDK_LDKErrorAction_IgnoreAndLog_get_ignore_and_log(int64_t ptr) {
+       LDKErrorAction *obj = (LDKErrorAction*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKErrorAction_IgnoreAndLog);
+       int32_t ignore_and_log_conv = LDKLevel_to_cs(obj->ignore_and_log);
+       return ignore_and_log_conv;
+}
+int64_t CS_LDK_LDKErrorAction_SendErrorMessage_get_msg(int64_t ptr) {
+       LDKErrorAction *obj = (LDKErrorAction*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKErrorAction_SendErrorMessage);
+       LDKErrorMessage msg_var = obj->send_error_message.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;
+}
+int64_t CS_LDK_LDKErrorAction_SendWarningMessage_get_msg(int64_t ptr) {
+       LDKErrorAction *obj = (LDKErrorAction*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKErrorAction_SendWarningMessage);
+       LDKWarningMessage msg_var = obj->send_warning_message.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;
+}
+int32_t CS_LDK_LDKErrorAction_SendWarningMessage_get_log_level(int64_t ptr) {
+       LDKErrorAction *obj = (LDKErrorAction*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKErrorAction_SendWarningMessage);
+       int32_t log_level_conv = LDKLevel_to_cs(obj->send_warning_message.log_level);
+       return log_level_conv;
+}
+uint32_t CS_LDK_LDKMessageSendEvent_ty_from_ptr(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKMessageSendEvent_SendAcceptChannel: return 0;
+               case LDKMessageSendEvent_SendAcceptChannelV2: return 1;
+               case LDKMessageSendEvent_SendOpenChannel: return 2;
+               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;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKMessageSendEvent_SendAcceptChannel_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendAcceptChannel);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_accept_channel.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendAcceptChannel_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendAcceptChannel);
+       LDKAcceptChannel msg_var = obj->send_accept_channel.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_SendAcceptChannelV2_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendAcceptChannelV2);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_accept_channel_v2.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendAcceptChannelV2_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendAcceptChannelV2);
+       LDKAcceptChannelV2 msg_var = obj->send_accept_channel_v2.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_SendOpenChannel_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendOpenChannel);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_open_channel.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendOpenChannel_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendOpenChannel);
+       LDKOpenChannel msg_var = obj->send_open_channel.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_SendOpenChannelV2_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendOpenChannelV2);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_open_channel_v2.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendOpenChannelV2_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendOpenChannelV2);
+       LDKOpenChannelV2 msg_var = obj->send_open_channel_v2.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_SendFundingCreated_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendFundingCreated);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_funding_created.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendFundingCreated_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendFundingCreated);
+       LDKFundingCreated msg_var = obj->send_funding_created.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_SendFundingSigned_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendFundingSigned);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_funding_signed.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendFundingSigned_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendFundingSigned);
+       LDKFundingSigned msg_var = obj->send_funding_signed.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);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_add_input.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxAddInput_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxAddInput);
+       LDKTxAddInput msg_var = obj->send_tx_add_input.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_SendTxAddOutput_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxAddOutput);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_add_output.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxAddOutput_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxAddOutput);
+       LDKTxAddOutput msg_var = obj->send_tx_add_output.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_SendTxRemoveInput_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxRemoveInput);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_remove_input.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxRemoveInput_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxRemoveInput);
+       LDKTxRemoveInput msg_var = obj->send_tx_remove_input.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_SendTxRemoveOutput_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxRemoveOutput);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_remove_output.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxRemoveOutput_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxRemoveOutput);
+       LDKTxRemoveOutput msg_var = obj->send_tx_remove_output.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_SendTxComplete_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxComplete);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_complete.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxComplete_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxComplete);
+       LDKTxComplete msg_var = obj->send_tx_complete.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_SendTxSignatures_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxSignatures);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_signatures.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxSignatures_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxSignatures);
+       LDKTxSignatures msg_var = obj->send_tx_signatures.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_SendTxInitRbf_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxInitRbf);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_init_rbf.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxInitRbf_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxInitRbf);
+       LDKTxInitRbf msg_var = obj->send_tx_init_rbf.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_SendTxAckRbf_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxAckRbf);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_ack_rbf.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxAckRbf_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxAckRbf);
+       LDKTxAckRbf msg_var = obj->send_tx_ack_rbf.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_SendTxAbort_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxAbort);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_abort.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxAbort_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxAbort);
+       LDKTxAbort msg_var = obj->send_tx_abort.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_SendChannelReady_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelReady);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_channel_ready.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendChannelReady_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelReady);
+       LDKChannelReady msg_var = obj->send_channel_ready.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_SendAnnouncementSignatures_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendAnnouncementSignatures);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_announcement_signatures.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendAnnouncementSignatures_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendAnnouncementSignatures);
+       LDKAnnouncementSignatures msg_var = obj->send_announcement_signatures.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_UpdateHTLCs_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_UpdateHTLCs);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->update_htl_cs.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_UpdateHTLCs_get_updates(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_UpdateHTLCs);
+       LDKCommitmentUpdate updates_var = obj->update_htl_cs.updates;
+                       int64_t updates_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(updates_var);
+                       updates_ref = tag_ptr(updates_var.inner, false);
+       return updates_ref;
+}
+int8_tArray CS_LDK_LDKMessageSendEvent_SendRevokeAndACK_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendRevokeAndACK);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_revoke_and_ack.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendRevokeAndACK_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendRevokeAndACK);
+       LDKRevokeAndACK msg_var = obj->send_revoke_and_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_SendClosingSigned_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendClosingSigned);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_closing_signed.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendClosingSigned_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendClosingSigned);
+       LDKClosingSigned msg_var = obj->send_closing_signed.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_SendShutdown_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendShutdown);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_shutdown.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendShutdown_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendShutdown);
+       LDKShutdown msg_var = obj->send_shutdown.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_SendChannelReestablish_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelReestablish);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_channel_reestablish.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendChannelReestablish_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelReestablish);
+       LDKChannelReestablish msg_var = obj->send_channel_reestablish.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_SendChannelAnnouncement_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelAnnouncement);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_channel_announcement.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendChannelAnnouncement_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelAnnouncement);
+       LDKChannelAnnouncement msg_var = obj->send_channel_announcement.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;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendChannelAnnouncement_get_update_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelAnnouncement);
+       LDKChannelUpdate update_msg_var = obj->send_channel_announcement.update_msg;
+                       int64_t update_msg_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_msg_var);
+                       update_msg_ref = tag_ptr(update_msg_var.inner, false);
+       return update_msg_ref;
+}
+int64_t CS_LDK_LDKMessageSendEvent_BroadcastChannelAnnouncement_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_BroadcastChannelAnnouncement);
+       LDKChannelAnnouncement msg_var = obj->broadcast_channel_announcement.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;
+}
+int64_t CS_LDK_LDKMessageSendEvent_BroadcastChannelAnnouncement_get_update_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_BroadcastChannelAnnouncement);
+       LDKChannelUpdate update_msg_var = obj->broadcast_channel_announcement.update_msg;
+                       int64_t update_msg_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_msg_var);
+                       update_msg_ref = tag_ptr(update_msg_var.inner, false);
+       return update_msg_ref;
+}
+int64_t CS_LDK_LDKMessageSendEvent_BroadcastChannelUpdate_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_BroadcastChannelUpdate);
+       LDKChannelUpdate msg_var = obj->broadcast_channel_update.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;
+}
+int64_t CS_LDK_LDKMessageSendEvent_BroadcastNodeAnnouncement_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_BroadcastNodeAnnouncement);
+       LDKNodeAnnouncement msg_var = obj->broadcast_node_announcement.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_SendChannelUpdate_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelUpdate);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_channel_update.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendChannelUpdate_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelUpdate);
+       LDKChannelUpdate msg_var = obj->send_channel_update.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_HandleError_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_HandleError);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->handle_error.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_HandleError_get_action(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_HandleError);
+       int64_t action_ref = tag_ptr(&obj->handle_error.action, false);
+       return action_ref;
+}
+int8_tArray CS_LDK_LDKMessageSendEvent_SendChannelRangeQuery_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelRangeQuery);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_channel_range_query.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendChannelRangeQuery_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelRangeQuery);
+       LDKQueryChannelRange msg_var = obj->send_channel_range_query.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_SendShortIdsQuery_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendShortIdsQuery);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_short_ids_query.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendShortIdsQuery_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendShortIdsQuery);
+       LDKQueryShortChannelIds msg_var = obj->send_short_ids_query.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_SendReplyChannelRange_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendReplyChannelRange);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_reply_channel_range.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendReplyChannelRange_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendReplyChannelRange);
+       LDKReplyChannelRange msg_var = obj->send_reply_channel_range.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_SendGossipTimestampFilter_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendGossipTimestampFilter);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_gossip_timestamp_filter.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendGossipTimestampFilter_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendGossipTimestampFilter);
+       LDKGossipTimestampFilter msg_var = obj->send_gossip_timestamp_filter.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;
+}
+static inline LDKCVec_MessageSendEventZ CVec_MessageSendEventZ_clone(const LDKCVec_MessageSendEventZ *orig) {
+       LDKCVec_MessageSendEventZ ret = { .data = MALLOC(sizeof(LDKMessageSendEvent) * orig->datalen, "LDKCVec_MessageSendEventZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = MessageSendEvent_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKChannelUpdateInfo CResult_ChannelUpdateInfoDecodeErrorZ_get_ok(LDKCResult_ChannelUpdateInfoDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelUpdateInfo ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* owner_conv = (LDKCResult_ChannelUpdateInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelUpdateInfo ret_var = CResult_ChannelUpdateInfoDecodeErrorZ_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_ChannelUpdateInfoDecodeErrorZ_get_err(LDKCResult_ChannelUpdateInfoDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* owner_conv = (LDKCResult_ChannelUpdateInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelUpdateInfoDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelInfo CResult_ChannelInfoDecodeErrorZ_get_ok(LDKCResult_ChannelInfoDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelInfo ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelInfoDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelInfoDecodeErrorZ* owner_conv = (LDKCResult_ChannelInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelInfo ret_var = CResult_ChannelInfoDecodeErrorZ_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_ChannelInfoDecodeErrorZ_get_err(LDKCResult_ChannelInfoDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelInfoDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelInfoDecodeErrorZ* owner_conv = (LDKCResult_ChannelInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelInfoDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKRoutingFees CResult_RoutingFeesDecodeErrorZ_get_ok(LDKCResult_RoutingFeesDecodeErrorZ *NONNULL_PTR owner){
+       LDKRoutingFees ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RoutingFeesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RoutingFeesDecodeErrorZ* owner_conv = (LDKCResult_RoutingFeesDecodeErrorZ*)untag_ptr(owner);
+       LDKRoutingFees ret_var = CResult_RoutingFeesDecodeErrorZ_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_RoutingFeesDecodeErrorZ_get_err(LDKCResult_RoutingFeesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RoutingFeesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RoutingFeesDecodeErrorZ* owner_conv = (LDKCResult_RoutingFeesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RoutingFeesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKSocketAddress_ty_from_ptr(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKSocketAddress_TcpIpV4: return 0;
+               case LDKSocketAddress_TcpIpV6: return 1;
+               case LDKSocketAddress_OnionV2: return 2;
+               case LDKSocketAddress_OnionV3: return 3;
+               case LDKSocketAddress_Hostname: return 4;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKSocketAddress_TcpIpV4_get_addr(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_TcpIpV4);
+       int8_tArray addr_arr = init_int8_tArray(4, __LINE__);
+       memcpy(addr_arr->elems, obj->tcp_ip_v4.addr.data, 4);
+       return addr_arr;
+}
+int16_t CS_LDK_LDKSocketAddress_TcpIpV4_get_port(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_TcpIpV4);
+       int16_t port_conv = obj->tcp_ip_v4.port;
+       return port_conv;
+}
+int8_tArray CS_LDK_LDKSocketAddress_TcpIpV6_get_addr(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_TcpIpV6);
+       int8_tArray addr_arr = init_int8_tArray(16, __LINE__);
+       memcpy(addr_arr->elems, obj->tcp_ip_v6.addr.data, 16);
+       return addr_arr;
+}
+int16_t CS_LDK_LDKSocketAddress_TcpIpV6_get_port(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_TcpIpV6);
+       int16_t port_conv = obj->tcp_ip_v6.port;
+       return port_conv;
+}
+int8_tArray CS_LDK_LDKSocketAddress_OnionV2_get_onion_v2(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_OnionV2);
+       int8_tArray onion_v2_arr = init_int8_tArray(12, __LINE__);
+       memcpy(onion_v2_arr->elems, obj->onion_v2.data, 12);
+       return onion_v2_arr;
+}
+int8_tArray CS_LDK_LDKSocketAddress_OnionV3_get_ed25519_pubkey(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_OnionV3);
+       int8_tArray ed25519_pubkey_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ed25519_pubkey_arr->elems, obj->onion_v3.ed25519_pubkey.data, 32);
+       return ed25519_pubkey_arr;
+}
+int16_t CS_LDK_LDKSocketAddress_OnionV3_get_checksum(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_OnionV3);
+       int16_t checksum_conv = obj->onion_v3.checksum;
+       return checksum_conv;
+}
+int8_t CS_LDK_LDKSocketAddress_OnionV3_get_version(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_OnionV3);
+       int8_t version_conv = obj->onion_v3.version;
+       return version_conv;
+}
+int16_t CS_LDK_LDKSocketAddress_OnionV3_get_port(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_OnionV3);
+       int16_t port_conv = obj->onion_v3.port;
+       return port_conv;
+}
+int64_t CS_LDK_LDKSocketAddress_Hostname_get_hostname(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_Hostname);
+       LDKHostname hostname_var = obj->hostname.hostname;
+                       int64_t hostname_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(hostname_var);
+                       hostname_ref = tag_ptr(hostname_var.inner, false);
+       return hostname_ref;
+}
+int16_t CS_LDK_LDKSocketAddress_Hostname_get_port(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_Hostname);
+       int16_t port_conv = obj->hostname.port;
+       return port_conv;
+}
+static inline LDKCVec_SocketAddressZ CVec_SocketAddressZ_clone(const LDKCVec_SocketAddressZ *orig) {
+       LDKCVec_SocketAddressZ ret = { .data = MALLOC(sizeof(LDKSocketAddress) * orig->datalen, "LDKCVec_SocketAddressZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = SocketAddress_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKNodeAnnouncementInfo CResult_NodeAnnouncementInfoDecodeErrorZ_get_ok(LDKCResult_NodeAnnouncementInfoDecodeErrorZ *NONNULL_PTR owner){
+       LDKNodeAnnouncementInfo ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* owner_conv = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKNodeAnnouncementInfo ret_var = CResult_NodeAnnouncementInfoDecodeErrorZ_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_NodeAnnouncementInfoDecodeErrorZ_get_err(LDKCResult_NodeAnnouncementInfoDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* owner_conv = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_NodeAnnouncementInfoDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKNodeAlias CResult_NodeAliasDecodeErrorZ_get_ok(LDKCResult_NodeAliasDecodeErrorZ *NONNULL_PTR owner){
+       LDKNodeAlias ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NodeAliasDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NodeAliasDecodeErrorZ* owner_conv = (LDKCResult_NodeAliasDecodeErrorZ*)untag_ptr(owner);
+       LDKNodeAlias ret_var = CResult_NodeAliasDecodeErrorZ_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_NodeAliasDecodeErrorZ_get_err(LDKCResult_NodeAliasDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NodeAliasDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_NodeAliasDecodeErrorZ* owner_conv = (LDKCResult_NodeAliasDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_NodeAliasDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKNodeInfo CResult_NodeInfoDecodeErrorZ_get_ok(LDKCResult_NodeInfoDecodeErrorZ *NONNULL_PTR owner){
+       LDKNodeInfo ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NodeInfoDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NodeInfoDecodeErrorZ* owner_conv = (LDKCResult_NodeInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKNodeInfo ret_var = CResult_NodeInfoDecodeErrorZ_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_NodeInfoDecodeErrorZ_get_err(LDKCResult_NodeInfoDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NodeInfoDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_NodeInfoDecodeErrorZ* owner_conv = (LDKCResult_NodeInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_NodeInfoDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKNetworkGraph CResult_NetworkGraphDecodeErrorZ_get_ok(LDKCResult_NetworkGraphDecodeErrorZ *NONNULL_PTR owner){
+       LDKNetworkGraph ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NetworkGraphDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NetworkGraphDecodeErrorZ* owner_conv = (LDKCResult_NetworkGraphDecodeErrorZ*)untag_ptr(owner);
+       LDKNetworkGraph ret_var = CResult_NetworkGraphDecodeErrorZ_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_NetworkGraphDecodeErrorZ_get_err(LDKCResult_NetworkGraphDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NetworkGraphDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_NetworkGraphDecodeErrorZ* owner_conv = (LDKCResult_NetworkGraphDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_NetworkGraphDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKCOption_CVec_SocketAddressZZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_CVec_SocketAddressZZ *obj = (LDKCOption_CVec_SocketAddressZZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_CVec_SocketAddressZZ_Some: return 0;
+               case LDKCOption_CVec_SocketAddressZZ_None: return 1;
+               default: abort();
+       }
+}
+int64_tArray CS_LDK_LDKCOption_CVec_SocketAddressZZ_Some_get_some(int64_t ptr) {
+       LDKCOption_CVec_SocketAddressZZ *obj = (LDKCOption_CVec_SocketAddressZZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_CVec_SocketAddressZZ_Some);
+       LDKCVec_SocketAddressZ some_var = obj->some;
+                       int64_tArray some_arr = NULL;
+                       some_arr = init_int64_tArray(some_var.datalen, __LINE__);
+                       int64_t *some_arr_ptr = (int64_t*)(((uint8_t*)some_arr) + 8);
+                       for (size_t p = 0; p < some_var.datalen; p++) {
+                               int64_t some_conv_15_ref = tag_ptr(&some_var.data[p], false);
+                               some_arr_ptr[p] = some_conv_15_ref;
+                       }
+                       
+       return some_arr;
+}
+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++) {
+               ret.data[i] = HTLCOutputInCommitment_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_HTLCDescriptorZ CVec_HTLCDescriptorZ_clone(const LDKCVec_HTLCDescriptorZ *orig) {
+       LDKCVec_HTLCDescriptorZ ret = { .data = MALLOC(sizeof(LDKHTLCDescriptor) * orig->datalen, "LDKCVec_HTLCDescriptorZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = HTLCDescriptor_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_UtxoZ CVec_UtxoZ_clone(const LDKCVec_UtxoZ *orig) {
+       LDKCVec_UtxoZ ret = { .data = MALLOC(sizeof(LDKUtxo) * orig->datalen, "LDKCVec_UtxoZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = Utxo_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKCOption_TxOutZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_TxOutZ *obj = (LDKCOption_TxOutZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_TxOutZ_Some: return 0;
+               case LDKCOption_TxOutZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_TxOutZ_Some_get_some(int64_t ptr) {
+       LDKCOption_TxOutZ *obj = (LDKCOption_TxOutZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_TxOutZ_Some);
+       LDKTxOut* some_ref = &obj->some;
+       return tag_ptr(some_ref, false);
+}
+static inline LDKCVec_InputZ CVec_InputZ_clone(const LDKCVec_InputZ *orig) {
+       LDKCVec_InputZ ret = { .data = MALLOC(sizeof(LDKInput) * orig->datalen, "LDKCVec_InputZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = Input_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKCoinSelection CResult_CoinSelectionNoneZ_get_ok(LDKCResult_CoinSelectionNoneZ *NONNULL_PTR owner){
+       LDKCoinSelection ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_CoinSelectionNoneZ_get_ok(int64_t owner) {
+       LDKCResult_CoinSelectionNoneZ* owner_conv = (LDKCResult_CoinSelectionNoneZ*)untag_ptr(owner);
+       LDKCoinSelection ret_var = CResult_CoinSelectionNoneZ_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_CoinSelectionNoneZ_get_err(LDKCResult_CoinSelectionNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_CoinSelectionNoneZ_get_err(int64_t owner) {
+       LDKCResult_CoinSelectionNoneZ* owner_conv = (LDKCResult_CoinSelectionNoneZ*)untag_ptr(owner);
+       CResult_CoinSelectionNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKCVec_UtxoZ CResult_CVec_UtxoZNoneZ_get_ok(LDKCResult_CVec_UtxoZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return CVec_UtxoZ_clone(&*owner->contents.result);
+}
+int64_tArray  CS_LDK_CResult_CVec_UtxoZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_UtxoZNoneZ* owner_conv = (LDKCResult_CVec_UtxoZNoneZ*)untag_ptr(owner);
+       LDKCVec_UtxoZ ret_var = CResult_CVec_UtxoZNoneZ_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 g = 0; g < ret_var.datalen; g++) {
+               LDKUtxo ret_conv_6_var = ret_var.data[g];
+               int64_t ret_conv_6_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_6_var);
+               ret_conv_6_ref = tag_ptr(ret_conv_6_var.inner, ret_conv_6_var.is_owned);
+               ret_arr_ptr[g] = ret_conv_6_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+static inline void CResult_CVec_UtxoZNoneZ_get_err(LDKCResult_CVec_UtxoZNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_CVec_UtxoZNoneZ_get_err(int64_t owner) {
+       LDKCResult_CVec_UtxoZNoneZ* owner_conv = (LDKCResult_CVec_UtxoZNoneZ*)untag_ptr(owner);
+       CResult_CVec_UtxoZNoneZ_get_err(owner_conv);
+}
+
+static inline uint64_t C2Tuple_u64u16Z_get_a(LDKC2Tuple_u64u16Z *NONNULL_PTR owner){
+       return owner->a;
+}
+int64_t  CS_LDK_C2Tuple_u64u16Z_get_a(int64_t owner) {
+       LDKC2Tuple_u64u16Z* owner_conv = (LDKC2Tuple_u64u16Z*)untag_ptr(owner);
+       int64_t ret_conv = C2Tuple_u64u16Z_get_a(owner_conv);
+       return ret_conv;
+}
+
+static inline uint16_t C2Tuple_u64u16Z_get_b(LDKC2Tuple_u64u16Z *NONNULL_PTR owner){
+       return owner->b;
+}
+int16_t  CS_LDK_C2Tuple_u64u16Z_get_b(int64_t owner) {
+       LDKC2Tuple_u64u16Z* owner_conv = (LDKC2Tuple_u64u16Z*)untag_ptr(owner);
+       int16_t ret_conv = C2Tuple_u64u16Z_get_b(owner_conv);
+       return ret_conv;
+}
+
+uint32_t CS_LDK_LDKCOption_C2Tuple_u64u16ZZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_C2Tuple_u64u16ZZ *obj = (LDKCOption_C2Tuple_u64u16ZZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_C2Tuple_u64u16ZZ_Some: return 0;
+               case LDKCOption_C2Tuple_u64u16ZZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_C2Tuple_u64u16ZZ_Some_get_some(int64_t ptr) {
+       LDKCOption_C2Tuple_u64u16ZZ *obj = (LDKCOption_C2Tuple_u64u16ZZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_C2Tuple_u64u16ZZ_Some);
+       LDKC2Tuple_u64u16Z* some_conv = MALLOC(sizeof(LDKC2Tuple_u64u16Z), "LDKC2Tuple_u64u16Z");
+       *some_conv = obj->some;
+                       *some_conv = C2Tuple_u64u16Z_clone(some_conv);
+       return tag_ptr(some_conv, true);
+}
+uint32_t CS_LDK_LDKCOption_ChannelShutdownStateZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_ChannelShutdownStateZ *obj = (LDKCOption_ChannelShutdownStateZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_ChannelShutdownStateZ_Some: return 0;
+               case LDKCOption_ChannelShutdownStateZ_None: return 1;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKCOption_ChannelShutdownStateZ_Some_get_some(int64_t ptr) {
+       LDKCOption_ChannelShutdownStateZ *obj = (LDKCOption_ChannelShutdownStateZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_ChannelShutdownStateZ_Some);
+       int32_t some_conv = LDKChannelShutdownState_to_cs(obj->some);
+       return some_conv;
+}
+static inline struct LDKThirtyTwoBytes CResult_ThirtyTwoBytesAPIErrorZ_get_ok(LDKCResult_ThirtyTwoBytesAPIErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return ThirtyTwoBytes_clone(&*owner->contents.result);
+}
+int8_tArray  CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* owner_conv = (LDKCResult_ThirtyTwoBytesAPIErrorZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, CResult_ThirtyTwoBytesAPIErrorZ_get_ok(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKAPIError CResult_ThirtyTwoBytesAPIErrorZ_get_err(LDKCResult_ThirtyTwoBytesAPIErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return APIError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_get_err(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* owner_conv = (LDKCResult_ThirtyTwoBytesAPIErrorZ*)untag_ptr(owner);
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = CResult_ThirtyTwoBytesAPIErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKRecentPaymentDetails_ty_from_ptr(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKRecentPaymentDetails_AwaitingInvoice: return 0;
+               case LDKRecentPaymentDetails_Pending: return 1;
+               case LDKRecentPaymentDetails_Fulfilled: return 2;
+               case LDKRecentPaymentDetails_Abandoned: return 3;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKRecentPaymentDetails_AwaitingInvoice_get_payment_id(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRecentPaymentDetails_AwaitingInvoice);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->awaiting_invoice.payment_id.data, 32);
+       return payment_id_arr;
+}
+int8_tArray CS_LDK_LDKRecentPaymentDetails_Pending_get_payment_id(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRecentPaymentDetails_Pending);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->pending.payment_id.data, 32);
+       return payment_id_arr;
+}
+int8_tArray CS_LDK_LDKRecentPaymentDetails_Pending_get_payment_hash(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRecentPaymentDetails_Pending);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->pending.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKRecentPaymentDetails_Pending_get_total_msat(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRecentPaymentDetails_Pending);
+       int64_t total_msat_conv = obj->pending.total_msat;
+       return total_msat_conv;
+}
+int8_tArray CS_LDK_LDKRecentPaymentDetails_Fulfilled_get_payment_id(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRecentPaymentDetails_Fulfilled);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->fulfilled.payment_id.data, 32);
+       return payment_id_arr;
+}
+int64_t CS_LDK_LDKRecentPaymentDetails_Fulfilled_get_payment_hash(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRecentPaymentDetails_Fulfilled);
+       int64_t payment_hash_ref = tag_ptr(&obj->fulfilled.payment_hash, false);
+       return payment_hash_ref;
+}
+int8_tArray CS_LDK_LDKRecentPaymentDetails_Abandoned_get_payment_id(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRecentPaymentDetails_Abandoned);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->abandoned.payment_id.data, 32);
+       return payment_id_arr;
+}
+int8_tArray CS_LDK_LDKRecentPaymentDetails_Abandoned_get_payment_hash(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRecentPaymentDetails_Abandoned);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->abandoned.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+static inline LDKCVec_RecentPaymentDetailsZ CVec_RecentPaymentDetailsZ_clone(const LDKCVec_RecentPaymentDetailsZ *orig) {
+       LDKCVec_RecentPaymentDetailsZ ret = { .data = MALLOC(sizeof(LDKRecentPaymentDetails) * orig->datalen, "LDKCVec_RecentPaymentDetailsZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = RecentPaymentDetails_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKPaymentSendFailure_ty_from_ptr(int64_t ptr) {
+       LDKPaymentSendFailure *obj = (LDKPaymentSendFailure*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKPaymentSendFailure_ParameterError: return 0;
+               case LDKPaymentSendFailure_PathParameterError: return 1;
+               case LDKPaymentSendFailure_AllFailedResendSafe: return 2;
+               case LDKPaymentSendFailure_DuplicatePayment: return 3;
+               case LDKPaymentSendFailure_PartialFailure: return 4;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKPaymentSendFailure_ParameterError_get_parameter_error(int64_t ptr) {
+       LDKPaymentSendFailure *obj = (LDKPaymentSendFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentSendFailure_ParameterError);
+       int64_t parameter_error_ref = tag_ptr(&obj->parameter_error, false);
+       return parameter_error_ref;
+}
+int64_tArray CS_LDK_LDKPaymentSendFailure_PathParameterError_get_path_parameter_error(int64_t ptr) {
+       LDKPaymentSendFailure *obj = (LDKPaymentSendFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentSendFailure_PathParameterError);
+       LDKCVec_CResult_NoneAPIErrorZZ path_parameter_error_var = obj->path_parameter_error;
+                       int64_tArray path_parameter_error_arr = NULL;
+                       path_parameter_error_arr = init_int64_tArray(path_parameter_error_var.datalen, __LINE__);
+                       int64_t *path_parameter_error_arr_ptr = (int64_t*)(((uint8_t*)path_parameter_error_arr) + 8);
+                       for (size_t w = 0; w < path_parameter_error_var.datalen; w++) {
+                               LDKCResult_NoneAPIErrorZ* path_parameter_error_conv_22_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+                               *path_parameter_error_conv_22_conv = path_parameter_error_var.data[w];
+                               *path_parameter_error_conv_22_conv = CResult_NoneAPIErrorZ_clone(path_parameter_error_conv_22_conv);
+                               path_parameter_error_arr_ptr[w] = tag_ptr(path_parameter_error_conv_22_conv, true);
+                       }
+                       
+       return path_parameter_error_arr;
+}
+int64_tArray CS_LDK_LDKPaymentSendFailure_AllFailedResendSafe_get_all_failed_resend_safe(int64_t ptr) {
+       LDKPaymentSendFailure *obj = (LDKPaymentSendFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentSendFailure_AllFailedResendSafe);
+       LDKCVec_APIErrorZ all_failed_resend_safe_var = obj->all_failed_resend_safe;
+                       int64_tArray all_failed_resend_safe_arr = NULL;
+                       all_failed_resend_safe_arr = init_int64_tArray(all_failed_resend_safe_var.datalen, __LINE__);
+                       int64_t *all_failed_resend_safe_arr_ptr = (int64_t*)(((uint8_t*)all_failed_resend_safe_arr) + 8);
+                       for (size_t k = 0; k < all_failed_resend_safe_var.datalen; k++) {
+                               int64_t all_failed_resend_safe_conv_10_ref = tag_ptr(&all_failed_resend_safe_var.data[k], false);
+                               all_failed_resend_safe_arr_ptr[k] = all_failed_resend_safe_conv_10_ref;
+                       }
+                       
+       return all_failed_resend_safe_arr;
+}
+int64_tArray CS_LDK_LDKPaymentSendFailure_PartialFailure_get_results(int64_t ptr) {
+       LDKPaymentSendFailure *obj = (LDKPaymentSendFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentSendFailure_PartialFailure);
+       LDKCVec_CResult_NoneAPIErrorZZ results_var = obj->partial_failure.results;
+                       int64_tArray results_arr = NULL;
+                       results_arr = init_int64_tArray(results_var.datalen, __LINE__);
+                       int64_t *results_arr_ptr = (int64_t*)(((uint8_t*)results_arr) + 8);
+                       for (size_t w = 0; w < results_var.datalen; w++) {
+                               LDKCResult_NoneAPIErrorZ* results_conv_22_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+                               *results_conv_22_conv = results_var.data[w];
+                               *results_conv_22_conv = CResult_NoneAPIErrorZ_clone(results_conv_22_conv);
+                               results_arr_ptr[w] = tag_ptr(results_conv_22_conv, true);
+                       }
+                       
+       return results_arr;
+}
+int64_t CS_LDK_LDKPaymentSendFailure_PartialFailure_get_failed_paths_retry(int64_t ptr) {
+       LDKPaymentSendFailure *obj = (LDKPaymentSendFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentSendFailure_PartialFailure);
+       LDKRouteParameters failed_paths_retry_var = obj->partial_failure.failed_paths_retry;
+                       int64_t failed_paths_retry_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(failed_paths_retry_var);
+                       failed_paths_retry_ref = tag_ptr(failed_paths_retry_var.inner, false);
+       return failed_paths_retry_ref;
+}
+int8_tArray CS_LDK_LDKPaymentSendFailure_PartialFailure_get_payment_id(int64_t ptr) {
+       LDKPaymentSendFailure *obj = (LDKPaymentSendFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentSendFailure_PartialFailure);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->partial_failure.payment_id.data, 32);
+       return payment_id_arr;
+}
+static inline void CResult_NonePaymentSendFailureZ_get_ok(LDKCResult_NonePaymentSendFailureZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NonePaymentSendFailureZ_get_ok(int64_t owner) {
+       LDKCResult_NonePaymentSendFailureZ* owner_conv = (LDKCResult_NonePaymentSendFailureZ*)untag_ptr(owner);
+       CResult_NonePaymentSendFailureZ_get_ok(owner_conv);
+}
+
+static inline struct LDKPaymentSendFailure CResult_NonePaymentSendFailureZ_get_err(LDKCResult_NonePaymentSendFailureZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return PaymentSendFailure_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NonePaymentSendFailureZ_get_err(int64_t owner) {
+       LDKCResult_NonePaymentSendFailureZ* owner_conv = (LDKCResult_NonePaymentSendFailureZ*)untag_ptr(owner);
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = CResult_NonePaymentSendFailureZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline void CResult_NoneRetryableSendFailureZ_get_ok(LDKCResult_NoneRetryableSendFailureZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NoneRetryableSendFailureZ_get_ok(int64_t owner) {
+       LDKCResult_NoneRetryableSendFailureZ* owner_conv = (LDKCResult_NoneRetryableSendFailureZ*)untag_ptr(owner);
+       CResult_NoneRetryableSendFailureZ_get_ok(owner_conv);
+}
+
+static inline enum LDKRetryableSendFailure CResult_NoneRetryableSendFailureZ_get_err(LDKCResult_NoneRetryableSendFailureZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return RetryableSendFailure_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_NoneRetryableSendFailureZ_get_err(int64_t owner) {
+       LDKCResult_NoneRetryableSendFailureZ* owner_conv = (LDKCResult_NoneRetryableSendFailureZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKRetryableSendFailure_to_cs(CResult_NoneRetryableSendFailureZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKThirtyTwoBytes CResult_ThirtyTwoBytesPaymentSendFailureZ_get_ok(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return ThirtyTwoBytes_clone(&*owner->contents.result);
+}
+int8_tArray  CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_get_ok(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* owner_conv = (LDKCResult_ThirtyTwoBytesPaymentSendFailureZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, CResult_ThirtyTwoBytesPaymentSendFailureZ_get_ok(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKPaymentSendFailure CResult_ThirtyTwoBytesPaymentSendFailureZ_get_err(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return PaymentSendFailure_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_get_err(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* owner_conv = (LDKCResult_ThirtyTwoBytesPaymentSendFailureZ*)untag_ptr(owner);
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = CResult_ThirtyTwoBytesPaymentSendFailureZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKThirtyTwoBytes CResult_ThirtyTwoBytesRetryableSendFailureZ_get_ok(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return ThirtyTwoBytes_clone(&*owner->contents.result);
+}
+int8_tArray  CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_get_ok(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* owner_conv = (LDKCResult_ThirtyTwoBytesRetryableSendFailureZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, CResult_ThirtyTwoBytesRetryableSendFailureZ_get_ok(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline enum LDKRetryableSendFailure CResult_ThirtyTwoBytesRetryableSendFailureZ_get_err(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return RetryableSendFailure_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_get_err(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* owner_conv = (LDKCResult_ThirtyTwoBytesRetryableSendFailureZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKRetryableSendFailure_to_cs(CResult_ThirtyTwoBytesRetryableSendFailureZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_a(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->a);
+}
+int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_a(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_a(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_b(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->b);
+}
+int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_b(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_b(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_ok(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_ok(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ*)untag_ptr(owner);
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ), "LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_ok(owner_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline struct LDKPaymentSendFailure CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_err(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return PaymentSendFailure_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_err(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ*)untag_ptr(owner);
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ_clone(const LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ *orig) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ) * orig->datalen, "LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKProbeSendFailure_ty_from_ptr(int64_t ptr) {
+       LDKProbeSendFailure *obj = (LDKProbeSendFailure*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKProbeSendFailure_RouteNotFound: return 0;
+               case LDKProbeSendFailure_SendingFailed: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKProbeSendFailure_SendingFailed_get_sending_failed(int64_t ptr) {
+       LDKProbeSendFailure *obj = (LDKProbeSendFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKProbeSendFailure_SendingFailed);
+       int64_t sending_failed_ref = tag_ptr(&obj->sending_failed, false);
+       return sending_failed_ref;
+}
+static inline struct LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_ok(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ_clone(&*owner->contents.result);
+}
+int64_tArray  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* owner_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ*)untag_ptr(owner);
+       LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ ret_var = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_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;
+}
+
+static inline struct LDKProbeSendFailure CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_err(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return ProbeSendFailure_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_err(int64_t owner) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* owner_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ*)untag_ptr(owner);
+       LDKProbeSendFailure *ret_copy = MALLOC(sizeof(LDKProbeSendFailure), "LDKProbeSendFailure");
+       *ret_copy = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesPublicKeyZ_get_a(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->a);
+}
+int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_get_a(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesPublicKeyZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesPublicKeyZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesPublicKeyZ_get_a(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKPublicKey C2Tuple_ThirtyTwoBytesPublicKeyZ_get_b(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ *NONNULL_PTR owner){
+       return owner->b;
+}
+int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_get_b(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesPublicKeyZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesPublicKeyZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesPublicKeyZ_get_b(owner_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+static inline LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ CVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ_clone(const LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ *orig) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ) * orig->datalen, "LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_ThirtyTwoBytesPublicKeyZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKCOption_StrZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_StrZ *obj = (LDKCOption_StrZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_StrZ_Some: return 0;
+               case LDKCOption_StrZ_None: return 1;
+               default: abort();
+       }
+}
+jstring CS_LDK_LDKCOption_StrZ_Some_get_some(int64_t ptr) {
+       LDKCOption_StrZ *obj = (LDKCOption_StrZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_StrZ_Some);
+       LDKStr some_str = obj->some;
+                       jstring some_conv = str_ref_to_cs(some_str.chars, some_str.len);
+       return some_conv;
+}
+static inline void CResult_NoneBolt12SemanticErrorZ_get_ok(LDKCResult_NoneBolt12SemanticErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NoneBolt12SemanticErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NoneBolt12SemanticErrorZ* owner_conv = (LDKCResult_NoneBolt12SemanticErrorZ*)untag_ptr(owner);
+       CResult_NoneBolt12SemanticErrorZ_get_ok(owner_conv);
+}
+
+static inline enum LDKBolt12SemanticError CResult_NoneBolt12SemanticErrorZ_get_err(LDKCResult_NoneBolt12SemanticErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return Bolt12SemanticError_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_NoneBolt12SemanticErrorZ_get_err(int64_t owner) {
+       LDKCResult_NoneBolt12SemanticErrorZ* owner_conv = (LDKCResult_NoneBolt12SemanticErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(CResult_NoneBolt12SemanticErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_ok(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ*)untag_ptr(owner);
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ), "LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_ok(owner_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline void CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_err(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_err(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ*)untag_ptr(owner);
+       CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_err(owner_conv);
+}
+
+uint32_t CS_LDK_LDKOffersMessage_ty_from_ptr(int64_t ptr) {
+       LDKOffersMessage *obj = (LDKOffersMessage*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKOffersMessage_InvoiceRequest: return 0;
+               case LDKOffersMessage_Invoice: return 1;
+               case LDKOffersMessage_InvoiceError: return 2;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKOffersMessage_InvoiceRequest_get_invoice_request(int64_t ptr) {
+       LDKOffersMessage *obj = (LDKOffersMessage*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKOffersMessage_InvoiceRequest);
+       LDKInvoiceRequest invoice_request_var = obj->invoice_request;
+                       int64_t invoice_request_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_request_var);
+                       invoice_request_ref = tag_ptr(invoice_request_var.inner, false);
+       return invoice_request_ref;
+}
+int64_t CS_LDK_LDKOffersMessage_Invoice_get_invoice(int64_t ptr) {
+       LDKOffersMessage *obj = (LDKOffersMessage*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKOffersMessage_Invoice);
+       LDKBolt12Invoice invoice_var = obj->invoice;
+                       int64_t invoice_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_var);
+                       invoice_ref = tag_ptr(invoice_var.inner, false);
+       return invoice_ref;
+}
+int64_t CS_LDK_LDKOffersMessage_InvoiceError_get_invoice_error(int64_t ptr) {
+       LDKOffersMessage *obj = (LDKOffersMessage*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKOffersMessage_InvoiceError);
+       LDKInvoiceError invoice_error_var = obj->invoice_error;
+                       int64_t invoice_error_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_error_var);
+                       invoice_error_ref = tag_ptr(invoice_error_var.inner, false);
+       return invoice_error_ref;
+}
+uint32_t CS_LDK_LDKCOption_OffersMessageZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_OffersMessageZ *obj = (LDKCOption_OffersMessageZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_OffersMessageZ_Some: return 0;
+               case LDKCOption_OffersMessageZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_OffersMessageZ_Some_get_some(int64_t ptr) {
+       LDKCOption_OffersMessageZ *obj = (LDKCOption_OffersMessageZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_OffersMessageZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+uint32_t CS_LDK_LDKDestination_ty_from_ptr(int64_t ptr) {
+       LDKDestination *obj = (LDKDestination*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKDestination_Node: return 0;
+               case LDKDestination_BlindedPath: return 1;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKDestination_Node_get_node(int64_t ptr) {
+       LDKDestination *obj = (LDKDestination*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKDestination_Node);
+       int8_tArray node_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_arr->elems, obj->node.compressed_form, 33);
+       return node_arr;
+}
+int64_t CS_LDK_LDKDestination_BlindedPath_get_blinded_path(int64_t ptr) {
+       LDKDestination *obj = (LDKDestination*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKDestination_BlindedPath);
+       LDKBlindedPath blinded_path_var = obj->blinded_path;
+                       int64_t blinded_path_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(blinded_path_var);
+                       blinded_path_ref = tag_ptr(blinded_path_var.inner, false);
+       return blinded_path_ref;
+}
+static inline struct LDKOffersMessage C3Tuple_OffersMessageDestinationBlindedPathZ_get_a(LDKC3Tuple_OffersMessageDestinationBlindedPathZ *NONNULL_PTR owner){
+       return OffersMessage_clone(&owner->a);
+}
+int64_t  CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_get_a(int64_t owner) {
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ* owner_conv = (LDKC3Tuple_OffersMessageDestinationBlindedPathZ*)untag_ptr(owner);
+       LDKOffersMessage *ret_copy = MALLOC(sizeof(LDKOffersMessage), "LDKOffersMessage");
+       *ret_copy = C3Tuple_OffersMessageDestinationBlindedPathZ_get_a(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDestination C3Tuple_OffersMessageDestinationBlindedPathZ_get_b(LDKC3Tuple_OffersMessageDestinationBlindedPathZ *NONNULL_PTR owner){
+       return Destination_clone(&owner->b);
+}
+int64_t  CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_get_b(int64_t owner) {
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ* owner_conv = (LDKC3Tuple_OffersMessageDestinationBlindedPathZ*)untag_ptr(owner);
+       LDKDestination *ret_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
+       *ret_copy = C3Tuple_OffersMessageDestinationBlindedPathZ_get_b(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBlindedPath C3Tuple_OffersMessageDestinationBlindedPathZ_get_c(LDKC3Tuple_OffersMessageDestinationBlindedPathZ *NONNULL_PTR owner){
+       LDKBlindedPath ret = owner->c;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_get_c(int64_t owner) {
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ* owner_conv = (LDKC3Tuple_OffersMessageDestinationBlindedPathZ*)untag_ptr(owner);
+       LDKBlindedPath ret_var = C3Tuple_OffersMessageDestinationBlindedPathZ_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;
+}
+
+static inline LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ CVec_C3Tuple_OffersMessageDestinationBlindedPathZZ_clone(const LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ *orig) {
+       LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ ret = { .data = MALLOC(sizeof(LDKC3Tuple_OffersMessageDestinationBlindedPathZ) * orig->datalen, "LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C3Tuple_OffersMessageDestinationBlindedPathZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKCounterpartyForwardingInfo CResult_CounterpartyForwardingInfoDecodeErrorZ_get_ok(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ *NONNULL_PTR owner){
+       LDKCounterpartyForwardingInfo ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* owner_conv = (LDKCResult_CounterpartyForwardingInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKCounterpartyForwardingInfo ret_var = CResult_CounterpartyForwardingInfoDecodeErrorZ_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_CounterpartyForwardingInfoDecodeErrorZ_get_err(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* owner_conv = (LDKCResult_CounterpartyForwardingInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_CounterpartyForwardingInfoDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelCounterparty CResult_ChannelCounterpartyDecodeErrorZ_get_ok(LDKCResult_ChannelCounterpartyDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelCounterparty ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelCounterpartyDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* owner_conv = (LDKCResult_ChannelCounterpartyDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelCounterparty ret_var = CResult_ChannelCounterpartyDecodeErrorZ_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_ChannelCounterpartyDecodeErrorZ_get_err(LDKCResult_ChannelCounterpartyDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelCounterpartyDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* owner_conv = (LDKCResult_ChannelCounterpartyDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelCounterpartyDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelDetails CResult_ChannelDetailsDecodeErrorZ_get_ok(LDKCResult_ChannelDetailsDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelDetails ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelDetailsDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelDetailsDecodeErrorZ* owner_conv = (LDKCResult_ChannelDetailsDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelDetails ret_var = CResult_ChannelDetailsDecodeErrorZ_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_ChannelDetailsDecodeErrorZ_get_err(LDKCResult_ChannelDetailsDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelDetailsDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelDetailsDecodeErrorZ* owner_conv = (LDKCResult_ChannelDetailsDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelDetailsDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKPhantomRouteHints CResult_PhantomRouteHintsDecodeErrorZ_get_ok(LDKCResult_PhantomRouteHintsDecodeErrorZ *NONNULL_PTR owner){
+       LDKPhantomRouteHints ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* owner_conv = (LDKCResult_PhantomRouteHintsDecodeErrorZ*)untag_ptr(owner);
+       LDKPhantomRouteHints ret_var = CResult_PhantomRouteHintsDecodeErrorZ_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_PhantomRouteHintsDecodeErrorZ_get_err(LDKCResult_PhantomRouteHintsDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* owner_conv = (LDKCResult_PhantomRouteHintsDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PhantomRouteHintsDecodeErrorZ_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);
+}
+int32_t  CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelShutdownStateDecodeErrorZ* owner_conv = (LDKCResult_ChannelShutdownStateDecodeErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKChannelShutdownState_to_cs(CResult_ChannelShutdownStateDecodeErrorZ_get_ok(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKDecodeError CResult_ChannelShutdownStateDecodeErrorZ_get_err(LDKCResult_ChannelShutdownStateDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelShutdownStateDecodeErrorZ* owner_conv = (LDKCResult_ChannelShutdownStateDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelShutdownStateDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_ChannelMonitorZ CVec_ChannelMonitorZ_clone(const LDKCVec_ChannelMonitorZ *orig) {
+       LDKCVec_ChannelMonitorZ ret = { .data = MALLOC(sizeof(LDKChannelMonitor) * orig->datalen, "LDKCVec_ChannelMonitorZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = ChannelMonitor_clone(&orig->data[i]);
+       }
+       return ret;
+}
+typedef struct LDKWatch_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKWatch_JCalls;
+static void LDKWatch_JCalls_free(void* this_arg) {
+       LDKWatch_JCalls *j_calls = (LDKWatch_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_ChannelMonitorUpdateStatusNoneZ watch_channel_LDKWatch_jcall(const void* this_arg, LDKOutPoint funding_txo, LDKChannelMonitor monitor) {
+       LDKWatch_JCalls *j_calls = (LDKWatch_JCalls*) this_arg;
+       LDKOutPoint funding_txo_var = funding_txo;
+       int64_t funding_txo_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_var);
+       funding_txo_ref = tag_ptr(funding_txo_var.inner, funding_txo_var.is_owned);
+       LDKChannelMonitor monitor_var = monitor;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ ret_conv = *(LDKCResult_ChannelMonitorUpdateStatusNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKChannelMonitorUpdateStatus update_channel_LDKWatch_jcall(const void* this_arg, LDKOutPoint funding_txo, const LDKChannelMonitorUpdate * update) {
+       LDKWatch_JCalls *j_calls = (LDKWatch_JCalls*) this_arg;
+       LDKOutPoint funding_txo_var = funding_txo;
+       int64_t funding_txo_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_var);
+       funding_txo_ref = tag_ptr(funding_txo_var.inner, funding_txo_var.is_owned);
+       LDKChannelMonitorUpdate update_var = *update;
+       int64_t update_ref = 0;
+       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);
+       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);
+       LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ ret_constr;
+       ret_constr.datalen = ret->arr_len;
+       if (ret_constr.datalen > 0)
+               ret_constr.data = MALLOC(ret_constr.datalen * sizeof(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ), "LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ 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);
+               LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ ret_conv_49_conv = *(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ*)(ret_conv_49_ptr);
+               FREE(untag_ptr(ret_conv_49));
+               ret_constr.data[x] = ret_conv_49_conv;
+       }
+       FREE(ret);
+       return ret_constr;
+}
+static void LDKWatch_JCalls_cloned(LDKWatch* new_obj) {
+       LDKWatch_JCalls *j_calls = (LDKWatch_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKWatch LDKWatch_init (int64_t o) {
+       LDKWatch_JCalls *calls = MALLOC(sizeof(LDKWatch_JCalls), "LDKWatch_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKWatch ret = {
+               .this_arg = (void*) calls,
+               .watch_channel = watch_channel_LDKWatch_jcall,
+               .update_channel = update_channel_LDKWatch_jcall,
+               .release_pending_monitor_events = release_pending_monitor_events_LDKWatch_jcall,
+               .free = LDKWatch_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKWatch_new(int32_t o) {
+       LDKWatch *res_ptr = MALLOC(sizeof(LDKWatch), "LDKWatch");
+       *res_ptr = LDKWatch_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_Watch_watch_channel(int64_t this_arg, int64_t funding_txo, int64_t monitor) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKWatch* this_arg_conv = (LDKWatch*)this_arg_ptr;
+       LDKOutPoint funding_txo_conv;
+       funding_txo_conv.inner = untag_ptr(funding_txo);
+       funding_txo_conv.is_owned = ptr_is_owned(funding_txo);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       LDKChannelMonitor monitor_conv;
+       monitor_conv.inner = untag_ptr(monitor);
+       monitor_conv.is_owned = ptr_is_owned(monitor);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(monitor_conv);
+       monitor_conv = ChannelMonitor_clone(&monitor_conv);
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateStatusNoneZ), "LDKCResult_ChannelMonitorUpdateStatusNoneZ");
+       *ret_conv = (this_arg_conv->watch_channel)(this_arg_conv->this_arg, funding_txo_conv, monitor_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int32_t  CS_LDK_Watch_update_channel(int64_t this_arg, int64_t funding_txo, int64_t update) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKWatch* this_arg_conv = (LDKWatch*)this_arg_ptr;
+       LDKOutPoint funding_txo_conv;
+       funding_txo_conv.inner = untag_ptr(funding_txo);
+       funding_txo_conv.is_owned = ptr_is_owned(funding_txo);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       LDKChannelMonitorUpdate update_conv;
+       update_conv.inner = untag_ptr(update);
+       update_conv.is_owned = ptr_is_owned(update);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_conv);
+       update_conv.is_owned = false;
+       int32_t ret_conv = LDKChannelMonitorUpdateStatus_to_cs((this_arg_conv->update_channel)(this_arg_conv->this_arg, funding_txo_conv, &update_conv));
+       return ret_conv;
+}
+
+int64_tArray  CS_LDK_Watch_release_pending_monitor_events(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKWatch* this_arg_conv = (LDKWatch*)this_arg_ptr;
+       LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ ret_var = (this_arg_conv->release_pending_monitor_events)(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++) {
+               LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* ret_conv_49_conv = MALLOC(sizeof(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ), "LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ");
+               *ret_conv_49_conv = ret_var.data[x];
+               ret_arr_ptr[x] = tag_ptr(ret_conv_49_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+typedef struct LDKBroadcasterInterface_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKBroadcasterInterface_JCalls;
+static void LDKBroadcasterInterface_JCalls_free(void* this_arg) {
+       LDKBroadcasterInterface_JCalls *j_calls = (LDKBroadcasterInterface_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void broadcast_transactions_LDKBroadcasterInterface_jcall(const void* this_arg, LDKCVec_TransactionZ txs) {
+       LDKBroadcasterInterface_JCalls *j_calls = (LDKBroadcasterInterface_JCalls*) this_arg;
+       LDKCVec_TransactionZ txs_var = txs;
+       ptrArray txs_arr = NULL;
+       txs_arr = init_ptrArray(txs_var.datalen, __LINE__);
+       int8_tArray *txs_arr_ptr = (int8_tArray*)(((uint8_t*)txs_arr) + 8);
+       for (size_t i = 0; i < txs_var.datalen; i++) {
+               LDKTransaction txs_conv_8_var = txs_var.data[i];
+               int8_tArray txs_conv_8_arr = init_int8_tArray(txs_conv_8_var.datalen, __LINE__);
+               memcpy(txs_conv_8_arr->elems, txs_conv_8_var.data, txs_conv_8_var.datalen);
+               Transaction_free(txs_conv_8_var);
+               txs_arr_ptr[i] = txs_conv_8_arr;
+       }
+       
+       FREE(txs_var.data);
+       js_invoke_function_void_l(j_calls->instance_ptr, 29, (int64_t)txs_arr);
+}
+static void LDKBroadcasterInterface_JCalls_cloned(LDKBroadcasterInterface* new_obj) {
+       LDKBroadcasterInterface_JCalls *j_calls = (LDKBroadcasterInterface_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKBroadcasterInterface LDKBroadcasterInterface_init (int64_t o) {
+       LDKBroadcasterInterface_JCalls *calls = MALLOC(sizeof(LDKBroadcasterInterface_JCalls), "LDKBroadcasterInterface_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKBroadcasterInterface ret = {
+               .this_arg = (void*) calls,
+               .broadcast_transactions = broadcast_transactions_LDKBroadcasterInterface_jcall,
+               .free = LDKBroadcasterInterface_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKBroadcasterInterface_new(int32_t o) {
+       LDKBroadcasterInterface *res_ptr = MALLOC(sizeof(LDKBroadcasterInterface), "LDKBroadcasterInterface");
+       *res_ptr = LDKBroadcasterInterface_init(o);
+       return tag_ptr(res_ptr, true);
+}
+void  CS_LDK_BroadcasterInterface_broadcast_transactions(int64_t this_arg, ptrArray txs) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKBroadcasterInterface* this_arg_conv = (LDKBroadcasterInterface*)this_arg_ptr;
+       LDKCVec_TransactionZ txs_constr;
+       txs_constr.datalen = txs->arr_len;
+       if (txs_constr.datalen > 0)
+               txs_constr.data = MALLOC(txs_constr.datalen * sizeof(LDKTransaction), "LDKCVec_TransactionZ Elements");
+       else
+               txs_constr.data = NULL;
+       int8_tArray* txs_vals = (void*) txs->elems;
+       for (size_t i = 0; i < txs_constr.datalen; i++) {
+               int8_tArray txs_conv_8 = txs_vals[i];
+               LDKTransaction txs_conv_8_ref;
+               txs_conv_8_ref.datalen = txs_conv_8->arr_len;
+               txs_conv_8_ref.data = MALLOC(txs_conv_8_ref.datalen, "LDKTransaction Bytes");
+               memcpy(txs_conv_8_ref.data, txs_conv_8->elems, txs_conv_8_ref.datalen); FREE(txs_conv_8);
+               txs_conv_8_ref.data_is_owned = true;
+               txs_constr.data[i] = txs_conv_8_ref;
+       }
+       FREE(txs);
+       (this_arg_conv->broadcast_transactions)(this_arg_conv->this_arg, txs_constr);
+}
+
+typedef struct LDKEntropySource_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKEntropySource_JCalls;
+static void LDKEntropySource_JCalls_free(void* this_arg) {
+       LDKEntropySource_JCalls *j_calls = (LDKEntropySource_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+       LDKThirtyTwoBytes ret_ref;
+       CHECK(ret->arr_len == 32);
+       memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
+       return ret_ref;
+}
+static void LDKEntropySource_JCalls_cloned(LDKEntropySource* new_obj) {
+       LDKEntropySource_JCalls *j_calls = (LDKEntropySource_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKEntropySource LDKEntropySource_init (int64_t o) {
+       LDKEntropySource_JCalls *calls = MALLOC(sizeof(LDKEntropySource_JCalls), "LDKEntropySource_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKEntropySource ret = {
+               .this_arg = (void*) calls,
+               .get_secure_random_bytes = get_secure_random_bytes_LDKEntropySource_jcall,
+               .free = LDKEntropySource_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKEntropySource_new(int32_t o) {
+       LDKEntropySource *res_ptr = MALLOC(sizeof(LDKEntropySource), "LDKEntropySource");
+       *res_ptr = LDKEntropySource_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int8_tArray  CS_LDK_EntropySource_get_secure_random_bytes(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKEntropySource* this_arg_conv = (LDKEntropySource*)this_arg_ptr;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, (this_arg_conv->get_secure_random_bytes)(this_arg_conv->this_arg).data, 32);
+       return ret_arr;
+}
+
+uint32_t CS_LDK_LDKUnsignedGossipMessage_ty_from_ptr(int64_t ptr) {
+       LDKUnsignedGossipMessage *obj = (LDKUnsignedGossipMessage*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKUnsignedGossipMessage_ChannelAnnouncement: return 0;
+               case LDKUnsignedGossipMessage_ChannelUpdate: return 1;
+               case LDKUnsignedGossipMessage_NodeAnnouncement: return 2;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKUnsignedGossipMessage_ChannelAnnouncement_get_channel_announcement(int64_t ptr) {
+       LDKUnsignedGossipMessage *obj = (LDKUnsignedGossipMessage*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKUnsignedGossipMessage_ChannelAnnouncement);
+       LDKUnsignedChannelAnnouncement channel_announcement_var = obj->channel_announcement;
+                       int64_t channel_announcement_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_announcement_var);
+                       channel_announcement_ref = tag_ptr(channel_announcement_var.inner, false);
+       return channel_announcement_ref;
+}
+int64_t CS_LDK_LDKUnsignedGossipMessage_ChannelUpdate_get_channel_update(int64_t ptr) {
+       LDKUnsignedGossipMessage *obj = (LDKUnsignedGossipMessage*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKUnsignedGossipMessage_ChannelUpdate);
+       LDKUnsignedChannelUpdate channel_update_var = obj->channel_update;
+                       int64_t channel_update_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_update_var);
+                       channel_update_ref = tag_ptr(channel_update_var.inner, false);
+       return channel_update_ref;
+}
+int64_t CS_LDK_LDKUnsignedGossipMessage_NodeAnnouncement_get_node_announcement(int64_t ptr) {
+       LDKUnsignedGossipMessage *obj = (LDKUnsignedGossipMessage*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKUnsignedGossipMessage_NodeAnnouncement);
+       LDKUnsignedNodeAnnouncement node_announcement_var = obj->node_announcement;
+                       int64_t node_announcement_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_announcement_var);
+                       node_announcement_ref = tag_ptr(node_announcement_var.inner, false);
+       return node_announcement_ref;
+}
+typedef struct LDKNodeSigner_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKNodeSigner_JCalls;
+static void LDKNodeSigner_JCalls_free(void* this_arg) {
+       LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+       LDKThirtyTwoBytes ret_ref;
+       CHECK(ret->arr_len == 32);
+       memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
+       return ret_ref;
+}
+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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_PublicKeyNoneZ ret_conv = *(LDKCResult_PublicKeyNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ThirtyTwoBytesNoneZ ecdh_LDKNodeSigner_jcall(const void* this_arg, LDKRecipient recipient, LDKPublicKey other_key, LDKCOption_BigEndianScalarZ tweak) {
+       LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) this_arg;
+       int32_t recipient_conv = LDKRecipient_to_cs(recipient);
+       int8_tArray other_key_arr = init_int8_tArray(33, __LINE__);
+       memcpy(other_key_arr->elems, other_key.compressed_form, 33);
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ThirtyTwoBytesNoneZ ret_conv = *(LDKCResult_ThirtyTwoBytesNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_RecoverableSignatureNoneZ sign_invoice_LDKNodeSigner_jcall(const void* this_arg, LDKu8slice hrp_bytes, LDKCVec_U5Z invoice_data, LDKRecipient recipient) {
+       LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) this_arg;
+       LDKu8slice hrp_bytes_var = hrp_bytes;
+       int8_tArray hrp_bytes_arr = init_int8_tArray(hrp_bytes_var.datalen, __LINE__);
+       memcpy(hrp_bytes_arr->elems, hrp_bytes_var.data, hrp_bytes_var.datalen);
+       LDKCVec_U5Z invoice_data_var = invoice_data;
+       ptrArray invoice_data_arr = NULL;
+       invoice_data_arr = init_ptrArray(invoice_data_var.datalen, __LINE__);
+       int8_t *invoice_data_arr_ptr = (int8_t*)(((uint8_t*)invoice_data_arr) + 8);
+       for (size_t h = 0; h < invoice_data_var.datalen; h++) {
+               uint8_t invoice_data_conv_7_val = invoice_data_var.data[h]._0;
+               invoice_data_arr_ptr[h] = invoice_data_conv_7_val;
+       }
+       
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_RecoverableSignatureNoneZ ret_conv = *(LDKCResult_RecoverableSignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_SchnorrSignatureNoneZ sign_bolt12_invoice_request_LDKNodeSigner_jcall(const void* this_arg, const LDKUnsignedInvoiceRequest * invoice_request) {
+       LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) this_arg;
+       LDKUnsignedInvoiceRequest invoice_request_var = *invoice_request;
+       int64_t invoice_request_ref = 0;
+       // 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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_SchnorrSignatureNoneZ ret_conv = *(LDKCResult_SchnorrSignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_SchnorrSignatureNoneZ sign_bolt12_invoice_LDKNodeSigner_jcall(const void* this_arg, const LDKUnsignedBolt12Invoice * invoice) {
+       LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) this_arg;
+       LDKUnsignedBolt12Invoice invoice_var = *invoice;
+       int64_t invoice_ref = 0;
+       // 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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_SchnorrSignatureNoneZ ret_conv = *(LDKCResult_SchnorrSignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ECDSASignatureNoneZ sign_gossip_message_LDKNodeSigner_jcall(const void* this_arg, LDKUnsignedGossipMessage msg) {
+       LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) this_arg;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKNodeSigner_JCalls_cloned(LDKNodeSigner* new_obj) {
+       LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKNodeSigner LDKNodeSigner_init (int64_t o) {
+       LDKNodeSigner_JCalls *calls = MALLOC(sizeof(LDKNodeSigner_JCalls), "LDKNodeSigner_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKNodeSigner ret = {
+               .this_arg = (void*) calls,
+               .get_inbound_payment_key_material = get_inbound_payment_key_material_LDKNodeSigner_jcall,
+               .get_node_id = get_node_id_LDKNodeSigner_jcall,
+               .ecdh = ecdh_LDKNodeSigner_jcall,
+               .sign_invoice = sign_invoice_LDKNodeSigner_jcall,
+               .sign_bolt12_invoice_request = sign_bolt12_invoice_request_LDKNodeSigner_jcall,
+               .sign_bolt12_invoice = sign_bolt12_invoice_LDKNodeSigner_jcall,
+               .sign_gossip_message = sign_gossip_message_LDKNodeSigner_jcall,
+               .free = LDKNodeSigner_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKNodeSigner_new(int32_t o) {
+       LDKNodeSigner *res_ptr = MALLOC(sizeof(LDKNodeSigner), "LDKNodeSigner");
+       *res_ptr = LDKNodeSigner_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int8_tArray  CS_LDK_NodeSigner_get_inbound_payment_key_material(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKNodeSigner* this_arg_conv = (LDKNodeSigner*)this_arg_ptr;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, (this_arg_conv->get_inbound_payment_key_material)(this_arg_conv->this_arg).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_NodeSigner_get_node_id(int64_t this_arg, int32_t recipient) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKNodeSigner* this_arg_conv = (LDKNodeSigner*)this_arg_ptr;
+       LDKRecipient recipient_conv = LDKRecipient_from_cs(recipient);
+       LDKCResult_PublicKeyNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeyNoneZ), "LDKCResult_PublicKeyNoneZ");
+       *ret_conv = (this_arg_conv->get_node_id)(this_arg_conv->this_arg, recipient_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeSigner_ecdh(int64_t this_arg, int32_t recipient, int8_tArray other_key, int64_t tweak) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKNodeSigner* this_arg_conv = (LDKNodeSigner*)this_arg_ptr;
+       LDKRecipient recipient_conv = LDKRecipient_from_cs(recipient);
+       LDKPublicKey other_key_ref;
+       CHECK(other_key->arr_len == 33);
+       memcpy(other_key_ref.compressed_form, other_key->elems, 33); FREE(other_key);
+       void* tweak_ptr = untag_ptr(tweak);
+       CHECK_ACCESS(tweak_ptr);
+       LDKCOption_BigEndianScalarZ tweak_conv = *(LDKCOption_BigEndianScalarZ*)(tweak_ptr);
+       tweak_conv = COption_BigEndianScalarZ_clone((LDKCOption_BigEndianScalarZ*)untag_ptr(tweak));
+       LDKCResult_ThirtyTwoBytesNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesNoneZ), "LDKCResult_ThirtyTwoBytesNoneZ");
+       *ret_conv = (this_arg_conv->ecdh)(this_arg_conv->this_arg, recipient_conv, other_key_ref, tweak_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeSigner_sign_invoice(int64_t this_arg, int8_tArray hrp_bytes, ptrArray invoice_data, int32_t recipient) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKNodeSigner* this_arg_conv = (LDKNodeSigner*)this_arg_ptr;
+       LDKu8slice hrp_bytes_ref;
+       hrp_bytes_ref.datalen = hrp_bytes->arr_len;
+       hrp_bytes_ref.data = hrp_bytes->elems;
+       LDKCVec_U5Z invoice_data_constr;
+       invoice_data_constr.datalen = invoice_data->arr_len;
+       if (invoice_data_constr.datalen > 0)
+               invoice_data_constr.data = MALLOC(invoice_data_constr.datalen * sizeof(LDKU5), "LDKCVec_U5Z Elements");
+       else
+               invoice_data_constr.data = NULL;
+       int8_t* invoice_data_vals = (void*) invoice_data->elems;
+       for (size_t h = 0; h < invoice_data_constr.datalen; h++) {
+               int8_t invoice_data_conv_7 = invoice_data_vals[h];
+               
+               invoice_data_constr.data[h] = (LDKU5){ ._0 = invoice_data_conv_7 };
+       }
+       FREE(invoice_data);
+       LDKRecipient recipient_conv = LDKRecipient_from_cs(recipient);
+       LDKCResult_RecoverableSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecoverableSignatureNoneZ), "LDKCResult_RecoverableSignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_invoice)(this_arg_conv->this_arg, hrp_bytes_ref, invoice_data_constr, recipient_conv);
+       FREE(hrp_bytes);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeSigner_sign_bolt12_invoice_request(int64_t this_arg, int64_t invoice_request) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKNodeSigner* this_arg_conv = (LDKNodeSigner*)this_arg_ptr;
+       LDKUnsignedInvoiceRequest invoice_request_conv;
+       invoice_request_conv.inner = untag_ptr(invoice_request);
+       invoice_request_conv.is_owned = ptr_is_owned(invoice_request);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_request_conv);
+       invoice_request_conv.is_owned = false;
+       LDKCResult_SchnorrSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_SchnorrSignatureNoneZ), "LDKCResult_SchnorrSignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_bolt12_invoice_request)(this_arg_conv->this_arg, &invoice_request_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeSigner_sign_bolt12_invoice(int64_t this_arg, int64_t invoice) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKNodeSigner* this_arg_conv = (LDKNodeSigner*)this_arg_ptr;
+       LDKUnsignedBolt12Invoice 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;
+       LDKCResult_SchnorrSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_SchnorrSignatureNoneZ), "LDKCResult_SchnorrSignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_bolt12_invoice)(this_arg_conv->this_arg, &invoice_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeSigner_sign_gossip_message(int64_t this_arg, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKNodeSigner* this_arg_conv = (LDKNodeSigner*)this_arg_ptr;
+       void* msg_ptr = untag_ptr(msg);
+       CHECK_ACCESS(msg_ptr);
+       LDKUnsignedGossipMessage msg_conv = *(LDKUnsignedGossipMessage*)(msg_ptr);
+       msg_conv = UnsignedGossipMessage_clone((LDKUnsignedGossipMessage*)untag_ptr(msg));
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_gossip_message)(this_arg_conv->this_arg, msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+typedef struct LDKSignerProvider_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKSignerProvider_JCalls;
+static void LDKSignerProvider_JCalls_free(void* this_arg) {
+       LDKSignerProvider_JCalls *j_calls = (LDKSignerProvider_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKThirtyTwoBytes generate_channel_keys_id_LDKSignerProvider_jcall(const void* this_arg, bool inbound, uint64_t channel_value_satoshis, LDKU128 user_channel_id) {
+       LDKSignerProvider_JCalls *j_calls = (LDKSignerProvider_JCalls*) this_arg;
+       jboolean inbound_conv = inbound;
+       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);
+       LDKThirtyTwoBytes ret_ref;
+       CHECK(ret->arr_len == 32);
+       memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
+       return ret_ref;
+}
+LDKWriteableEcdsaChannelSigner derive_channel_signer_LDKSignerProvider_jcall(const void* this_arg, uint64_t channel_value_satoshis, LDKThirtyTwoBytes channel_keys_id) {
+       LDKSignerProvider_JCalls *j_calls = (LDKSignerProvider_JCalls*) this_arg;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKWriteableEcdsaChannelSigner ret_conv = *(LDKWriteableEcdsaChannelSigner*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ read_chan_signer_LDKSignerProvider_jcall(const void* this_arg, LDKu8slice reader) {
+       LDKSignerProvider_JCalls *j_calls = (LDKSignerProvider_JCalls*) this_arg;
+       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);
+       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) {
+       LDKSignerProvider_JCalls *j_calls = (LDKSignerProvider_JCalls*) this_arg;
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 41);
+       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_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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ShutdownScriptNoneZ ret_conv = *(LDKCResult_ShutdownScriptNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKSignerProvider_JCalls_cloned(LDKSignerProvider* new_obj) {
+       LDKSignerProvider_JCalls *j_calls = (LDKSignerProvider_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKSignerProvider LDKSignerProvider_init (int64_t o) {
+       LDKSignerProvider_JCalls *calls = MALLOC(sizeof(LDKSignerProvider_JCalls), "LDKSignerProvider_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKSignerProvider ret = {
+               .this_arg = (void*) calls,
+               .generate_channel_keys_id = generate_channel_keys_id_LDKSignerProvider_jcall,
+               .derive_channel_signer = derive_channel_signer_LDKSignerProvider_jcall,
+               .read_chan_signer = read_chan_signer_LDKSignerProvider_jcall,
+               .get_destination_script = get_destination_script_LDKSignerProvider_jcall,
+               .get_shutdown_scriptpubkey = get_shutdown_scriptpubkey_LDKSignerProvider_jcall,
+               .free = LDKSignerProvider_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKSignerProvider_new(int32_t o) {
+       LDKSignerProvider *res_ptr = MALLOC(sizeof(LDKSignerProvider), "LDKSignerProvider");
+       *res_ptr = LDKSignerProvider_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int8_tArray  CS_LDK_SignerProvider_generate_channel_keys_id(int64_t this_arg, jboolean inbound, int64_t channel_value_satoshis, int8_tArray user_channel_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;
+       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);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, (this_arg_conv->generate_channel_keys_id)(this_arg_conv->this_arg, inbound, channel_value_satoshis, user_channel_id_ref).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_SignerProvider_derive_channel_signer(int64_t this_arg, int64_t channel_value_satoshis, 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);
+       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
+       *ret_ret = (this_arg_conv->derive_channel_signer)(this_arg_conv->this_arg, channel_value_satoshis, channel_keys_id_ref);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_SignerProvider_read_chan_signer(int64_t this_arg, int8_tArray reader) {
+       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;
+       LDKu8slice reader_ref;
+       reader_ref.datalen = reader->arr_len;
+       reader_ref.data = reader->elems;
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ), "LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ");
+       *ret_conv = (this_arg_conv->read_chan_signer)(this_arg_conv->this_arg, reader_ref);
+       FREE(reader);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_SignerProvider_get_destination_script(int64_t this_arg) {
+       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;
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_SignerProvider_get_shutdown_scriptpubkey(int64_t this_arg) {
+       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;
+       LDKCResult_ShutdownScriptNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptNoneZ), "LDKCResult_ShutdownScriptNoneZ");
+       *ret_conv = (this_arg_conv->get_shutdown_scriptpubkey)(this_arg_conv->this_arg);
+       return tag_ptr(ret_conv, true);
+}
+
+typedef struct LDKFeeEstimator_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKFeeEstimator_JCalls;
+static void LDKFeeEstimator_JCalls_free(void* this_arg) {
+       LDKFeeEstimator_JCalls *j_calls = (LDKFeeEstimator_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+}
+static void LDKFeeEstimator_JCalls_cloned(LDKFeeEstimator* new_obj) {
+       LDKFeeEstimator_JCalls *j_calls = (LDKFeeEstimator_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKFeeEstimator LDKFeeEstimator_init (int64_t o) {
+       LDKFeeEstimator_JCalls *calls = MALLOC(sizeof(LDKFeeEstimator_JCalls), "LDKFeeEstimator_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKFeeEstimator ret = {
+               .this_arg = (void*) calls,
+               .get_est_sat_per_1000_weight = get_est_sat_per_1000_weight_LDKFeeEstimator_jcall,
+               .free = LDKFeeEstimator_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKFeeEstimator_new(int32_t o) {
+       LDKFeeEstimator *res_ptr = MALLOC(sizeof(LDKFeeEstimator), "LDKFeeEstimator");
+       *res_ptr = LDKFeeEstimator_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int32_t  CS_LDK_FeeEstimator_get_est_sat_per_1000_weight(int64_t this_arg, int32_t confirmation_target) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKFeeEstimator* this_arg_conv = (LDKFeeEstimator*)this_arg_ptr;
+       LDKConfirmationTarget confirmation_target_conv = LDKConfirmationTarget_from_cs(confirmation_target);
+       int32_t ret_conv = (this_arg_conv->get_est_sat_per_1000_weight)(this_arg_conv->this_arg, confirmation_target_conv);
+       return ret_conv;
+}
+
+typedef struct LDKRouter_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKRouter_JCalls;
+static void LDKRouter_JCalls_free(void* this_arg) {
+       LDKRouter_JCalls *j_calls = (LDKRouter_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_RouteLightningErrorZ find_route_LDKRouter_jcall(const void* this_arg, LDKPublicKey payer, const LDKRouteParameters * route_params, LDKCVec_ChannelDetailsZ * first_hops, LDKInFlightHtlcs inflight_htlcs) {
+       LDKRouter_JCalls *j_calls = (LDKRouter_JCalls*) this_arg;
+       int8_tArray payer_arr = init_int8_tArray(33, __LINE__);
+       memcpy(payer_arr->elems, payer.compressed_form, 33);
+       LDKRouteParameters route_params_var = *route_params;
+       int64_t route_params_ref = 0;
+       route_params_var = RouteParameters_clone(&route_params_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_var);
+       route_params_ref = tag_ptr(route_params_var.inner, route_params_var.is_owned);
+       LDKCVec_ChannelDetailsZ *first_hops_var_ptr = first_hops;
+       int64_tArray first_hops_arr = NULL;
+       if (first_hops != NULL) {
+               LDKCVec_ChannelDetailsZ first_hops_var = *first_hops_var_ptr;
+               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;
+               }
+       
+       }
+       LDKInFlightHtlcs inflight_htlcs_var = inflight_htlcs;
+       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);
+       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_RouteLightningErrorZ find_route_with_id_LDKRouter_jcall(const void* this_arg, LDKPublicKey payer, const LDKRouteParameters * route_params, LDKCVec_ChannelDetailsZ * first_hops, LDKInFlightHtlcs inflight_htlcs, LDKThirtyTwoBytes _payment_hash, LDKThirtyTwoBytes _payment_id) {
+       LDKRouter_JCalls *j_calls = (LDKRouter_JCalls*) this_arg;
+       int8_tArray payer_arr = init_int8_tArray(33, __LINE__);
+       memcpy(payer_arr->elems, payer.compressed_form, 33);
+       LDKRouteParameters route_params_var = *route_params;
+       int64_t route_params_ref = 0;
+       route_params_var = RouteParameters_clone(&route_params_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_var);
+       route_params_ref = tag_ptr(route_params_var.inner, route_params_var.is_owned);
+       LDKCVec_ChannelDetailsZ *first_hops_var_ptr = first_hops;
+       int64_tArray first_hops_arr = NULL;
+       if (first_hops != NULL) {
+               LDKCVec_ChannelDetailsZ first_hops_var = *first_hops_var_ptr;
+               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;
+               }
+       
+       }
+       LDKInFlightHtlcs inflight_htlcs_var = inflight_htlcs;
+       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);
+       int8_tArray _payment_hash_arr = init_int8_tArray(32, __LINE__);
+       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);
+       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;
+}
+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);
+}
+static inline LDKRouter LDKRouter_init (int64_t o) {
+       LDKRouter_JCalls *calls = MALLOC(sizeof(LDKRouter_JCalls), "LDKRouter_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKRouter ret = {
+               .this_arg = (void*) calls,
+               .find_route = find_route_LDKRouter_jcall,
+               .find_route_with_id = find_route_with_id_LDKRouter_jcall,
+               .free = LDKRouter_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKRouter_new(int32_t o) {
+       LDKRouter *res_ptr = MALLOC(sizeof(LDKRouter), "LDKRouter");
+       *res_ptr = LDKRouter_init(o);
+       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) {
+       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 payer_ref;
+       CHECK(payer->arr_len == 33);
+       memcpy(payer_ref.compressed_form, payer->elems, 33); FREE(payer);
+       LDKRouteParameters route_params_conv;
+       route_params_conv.inner = untag_ptr(route_params);
+       route_params_conv.is_owned = ptr_is_owned(route_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_conv);
+       route_params_conv.is_owned = false;
+       LDKCVec_ChannelDetailsZ first_hops_constr;
+       LDKCVec_ChannelDetailsZ *first_hops_ptr = NULL;
+       if (first_hops != NULL) {
+               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.is_owned = false;
+                       first_hops_constr.data[q] = first_hops_conv_16_conv;
+               }
+               FREE(first_hops);
+               first_hops_ptr = &first_hops_constr;
+       }
+       LDKInFlightHtlcs inflight_htlcs_conv;
+       inflight_htlcs_conv.inner = untag_ptr(inflight_htlcs);
+       inflight_htlcs_conv.is_owned = ptr_is_owned(inflight_htlcs);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(inflight_htlcs_conv);
+       inflight_htlcs_conv = InFlightHtlcs_clone(&inflight_htlcs_conv);
+       LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
+       *ret_conv = (this_arg_conv->find_route)(this_arg_conv->this_arg, payer_ref, &route_params_conv, first_hops_ptr, inflight_htlcs_conv);
+       if (first_hops_ptr != NULL) { FREE(first_hops_constr.data); }
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Router_find_route_with_id(int64_t this_arg, int8_tArray payer, int64_t route_params, int64_tArray first_hops, int64_t inflight_htlcs, int8_tArray _payment_hash, int8_tArray _payment_id) {
+       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 payer_ref;
+       CHECK(payer->arr_len == 33);
+       memcpy(payer_ref.compressed_form, payer->elems, 33); FREE(payer);
+       LDKRouteParameters route_params_conv;
+       route_params_conv.inner = untag_ptr(route_params);
+       route_params_conv.is_owned = ptr_is_owned(route_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_conv);
+       route_params_conv.is_owned = false;
+       LDKCVec_ChannelDetailsZ first_hops_constr;
+       LDKCVec_ChannelDetailsZ *first_hops_ptr = NULL;
+       if (first_hops != NULL) {
+               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.is_owned = false;
+                       first_hops_constr.data[q] = first_hops_conv_16_conv;
+               }
+               FREE(first_hops);
+               first_hops_ptr = &first_hops_constr;
+       }
+       LDKInFlightHtlcs inflight_htlcs_conv;
+       inflight_htlcs_conv.inner = untag_ptr(inflight_htlcs);
+       inflight_htlcs_conv.is_owned = ptr_is_owned(inflight_htlcs);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(inflight_htlcs_conv);
+       inflight_htlcs_conv = InFlightHtlcs_clone(&inflight_htlcs_conv);
+       LDKThirtyTwoBytes _payment_hash_ref;
+       CHECK(_payment_hash->arr_len == 32);
+       memcpy(_payment_hash_ref.data, _payment_hash->elems, 32); FREE(_payment_hash);
+       LDKThirtyTwoBytes _payment_id_ref;
+       CHECK(_payment_id->arr_len == 32);
+       memcpy(_payment_id_ref.data, _payment_id->elems, 32); FREE(_payment_id);
+       LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
+       *ret_conv = (this_arg_conv->find_route_with_id)(this_arg_conv->this_arg, payer_ref, &route_params_conv, first_hops_ptr, inflight_htlcs_conv, _payment_hash_ref, _payment_id_ref);
+       if (first_hops_ptr != NULL) { FREE(first_hops_constr.data); }
+       return tag_ptr(ret_conv, true);
+}
+
+static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesChannelManagerZ_get_a(LDKC2Tuple_ThirtyTwoBytesChannelManagerZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->a);
+}
+int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_get_a(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesChannelManagerZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesChannelManagerZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesChannelManagerZ_get_a(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKChannelManager C2Tuple_ThirtyTwoBytesChannelManagerZ_get_b(LDKC2Tuple_ThirtyTwoBytesChannelManagerZ *NONNULL_PTR owner){
+       LDKChannelManager ret = owner->b;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_get_b(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesChannelManagerZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesChannelManagerZ*)untag_ptr(owner);
+       LDKChannelManager ret_var = C2Tuple_ThirtyTwoBytesChannelManagerZ_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 LDKC2Tuple_ThirtyTwoBytesChannelManagerZ *CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_ok(LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return &*owner->contents.result;
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ*)untag_ptr(owner);
+       int64_t ret_ret = tag_ptr(CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_ok(owner_conv), false);
+       return ret_ret;
+}
+
+static inline struct LDKDecodeError CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_err(LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKMaxDustHTLCExposure_ty_from_ptr(int64_t ptr) {
+       LDKMaxDustHTLCExposure *obj = (LDKMaxDustHTLCExposure*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKMaxDustHTLCExposure_FixedLimitMsat: return 0;
+               case LDKMaxDustHTLCExposure_FeeRateMultiplier: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKMaxDustHTLCExposure_FixedLimitMsat_get_fixed_limit_msat(int64_t ptr) {
+       LDKMaxDustHTLCExposure *obj = (LDKMaxDustHTLCExposure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMaxDustHTLCExposure_FixedLimitMsat);
+       int64_t fixed_limit_msat_conv = obj->fixed_limit_msat;
+       return fixed_limit_msat_conv;
+}
+int64_t CS_LDK_LDKMaxDustHTLCExposure_FeeRateMultiplier_get_fee_rate_multiplier(int64_t ptr) {
+       LDKMaxDustHTLCExposure *obj = (LDKMaxDustHTLCExposure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMaxDustHTLCExposure_FeeRateMultiplier);
+       int64_t fee_rate_multiplier_conv = obj->fee_rate_multiplier;
+       return fee_rate_multiplier_conv;
+}
+static inline struct LDKMaxDustHTLCExposure CResult_MaxDustHTLCExposureDecodeErrorZ_get_ok(LDKCResult_MaxDustHTLCExposureDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return MaxDustHTLCExposure_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* owner_conv = (LDKCResult_MaxDustHTLCExposureDecodeErrorZ*)untag_ptr(owner);
+       LDKMaxDustHTLCExposure *ret_copy = MALLOC(sizeof(LDKMaxDustHTLCExposure), "LDKMaxDustHTLCExposure");
+       *ret_copy = CResult_MaxDustHTLCExposureDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_MaxDustHTLCExposureDecodeErrorZ_get_err(LDKCResult_MaxDustHTLCExposureDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* owner_conv = (LDKCResult_MaxDustHTLCExposureDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_MaxDustHTLCExposureDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelConfig CResult_ChannelConfigDecodeErrorZ_get_ok(LDKCResult_ChannelConfigDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelConfig ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelConfigDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelConfigDecodeErrorZ* owner_conv = (LDKCResult_ChannelConfigDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelConfig ret_var = CResult_ChannelConfigDecodeErrorZ_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_ChannelConfigDecodeErrorZ_get_err(LDKCResult_ChannelConfigDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelConfigDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelConfigDecodeErrorZ* owner_conv = (LDKCResult_ChannelConfigDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelConfigDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKCOption_MaxDustHTLCExposureZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_MaxDustHTLCExposureZ *obj = (LDKCOption_MaxDustHTLCExposureZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_MaxDustHTLCExposureZ_Some: return 0;
+               case LDKCOption_MaxDustHTLCExposureZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_MaxDustHTLCExposureZ_Some_get_some(int64_t ptr) {
+       LDKCOption_MaxDustHTLCExposureZ *obj = (LDKCOption_MaxDustHTLCExposureZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_MaxDustHTLCExposureZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+uint32_t CS_LDK_LDKCOption_APIErrorZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_APIErrorZ *obj = (LDKCOption_APIErrorZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_APIErrorZ_Some: return 0;
+               case LDKCOption_APIErrorZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_APIErrorZ_Some_get_some(int64_t ptr) {
+       LDKCOption_APIErrorZ *obj = (LDKCOption_APIErrorZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_APIErrorZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+static inline struct LDKCOption_APIErrorZ CResult_COption_APIErrorZDecodeErrorZ_get_ok(LDKCResult_COption_APIErrorZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_APIErrorZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_APIErrorZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_APIErrorZDecodeErrorZ* owner_conv = (LDKCResult_COption_APIErrorZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_APIErrorZ *ret_copy = MALLOC(sizeof(LDKCOption_APIErrorZ), "LDKCOption_APIErrorZ");
+       *ret_copy = CResult_COption_APIErrorZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_APIErrorZDecodeErrorZ_get_err(LDKCResult_COption_APIErrorZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_APIErrorZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_APIErrorZDecodeErrorZ* owner_conv = (LDKCResult_COption_APIErrorZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_APIErrorZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelMonitorUpdate CResult_ChannelMonitorUpdateDecodeErrorZ_get_ok(LDKCResult_ChannelMonitorUpdateDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelMonitorUpdate ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* owner_conv = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelMonitorUpdate ret_var = CResult_ChannelMonitorUpdateDecodeErrorZ_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_ChannelMonitorUpdateDecodeErrorZ_get_err(LDKCResult_ChannelMonitorUpdateDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* owner_conv = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelMonitorUpdateDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKCOption_MonitorEventZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_MonitorEventZ *obj = (LDKCOption_MonitorEventZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_MonitorEventZ_Some: return 0;
+               case LDKCOption_MonitorEventZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_MonitorEventZ_Some_get_some(int64_t ptr) {
+       LDKCOption_MonitorEventZ *obj = (LDKCOption_MonitorEventZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_MonitorEventZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+static inline struct LDKCOption_MonitorEventZ CResult_COption_MonitorEventZDecodeErrorZ_get_ok(LDKCResult_COption_MonitorEventZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_MonitorEventZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_MonitorEventZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* owner_conv = (LDKCResult_COption_MonitorEventZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_MonitorEventZ *ret_copy = MALLOC(sizeof(LDKCOption_MonitorEventZ), "LDKCOption_MonitorEventZ");
+       *ret_copy = CResult_COption_MonitorEventZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_MonitorEventZDecodeErrorZ_get_err(LDKCResult_COption_MonitorEventZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_MonitorEventZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* owner_conv = (LDKCResult_COption_MonitorEventZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_MonitorEventZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKHTLCUpdate CResult_HTLCUpdateDecodeErrorZ_get_ok(LDKCResult_HTLCUpdateDecodeErrorZ *NONNULL_PTR owner){
+       LDKHTLCUpdate ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_HTLCUpdateDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_HTLCUpdateDecodeErrorZ* owner_conv = (LDKCResult_HTLCUpdateDecodeErrorZ*)untag_ptr(owner);
+       LDKHTLCUpdate ret_var = CResult_HTLCUpdateDecodeErrorZ_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_HTLCUpdateDecodeErrorZ_get_err(LDKCResult_HTLCUpdateDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_HTLCUpdateDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_HTLCUpdateDecodeErrorZ* owner_conv = (LDKCResult_HTLCUpdateDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_HTLCUpdateDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKOutPoint C2Tuple_OutPointCVec_u8ZZ_get_a(LDKC2Tuple_OutPointCVec_u8ZZ *NONNULL_PTR owner){
+       LDKOutPoint ret = owner->a;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C2Tuple_OutPointCVec_u8ZZ_get_a(int64_t owner) {
+       LDKC2Tuple_OutPointCVec_u8ZZ* owner_conv = (LDKC2Tuple_OutPointCVec_u8ZZ*)untag_ptr(owner);
+       LDKOutPoint ret_var = C2Tuple_OutPointCVec_u8ZZ_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 LDKCVec_u8Z C2Tuple_OutPointCVec_u8ZZ_get_b(LDKC2Tuple_OutPointCVec_u8ZZ *NONNULL_PTR owner){
+       return CVec_u8Z_clone(&owner->b);
+}
+int8_tArray  CS_LDK_C2Tuple_OutPointCVec_u8ZZ_get_b(int64_t owner) {
+       LDKC2Tuple_OutPointCVec_u8ZZ* owner_conv = (LDKC2Tuple_OutPointCVec_u8ZZ*)untag_ptr(owner);
+       LDKCVec_u8Z ret_var = C2Tuple_OutPointCVec_u8ZZ_get_b(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 uint32_t C2Tuple_u32CVec_u8ZZ_get_a(LDKC2Tuple_u32CVec_u8ZZ *NONNULL_PTR owner){
+       return owner->a;
+}
+int32_t  CS_LDK_C2Tuple_u32CVec_u8ZZ_get_a(int64_t owner) {
+       LDKC2Tuple_u32CVec_u8ZZ* owner_conv = (LDKC2Tuple_u32CVec_u8ZZ*)untag_ptr(owner);
+       int32_t ret_conv = C2Tuple_u32CVec_u8ZZ_get_a(owner_conv);
+       return ret_conv;
+}
+
+static inline struct LDKCVec_u8Z C2Tuple_u32CVec_u8ZZ_get_b(LDKC2Tuple_u32CVec_u8ZZ *NONNULL_PTR owner){
+       return CVec_u8Z_clone(&owner->b);
+}
+int8_tArray  CS_LDK_C2Tuple_u32CVec_u8ZZ_get_b(int64_t owner) {
+       LDKC2Tuple_u32CVec_u8ZZ* owner_conv = (LDKC2Tuple_u32CVec_u8ZZ*)untag_ptr(owner);
+       LDKCVec_u8Z ret_var = C2Tuple_u32CVec_u8ZZ_get_b(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 LDKCVec_C2Tuple_u32CVec_u8ZZZ CVec_C2Tuple_u32CVec_u8ZZZ_clone(const LDKCVec_C2Tuple_u32CVec_u8ZZZ *orig) {
+       LDKCVec_C2Tuple_u32CVec_u8ZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_u32CVec_u8ZZ) * orig->datalen, "LDKCVec_C2Tuple_u32CVec_u8ZZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_u32CVec_u8ZZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_a(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->a);
+}
+int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_a(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_a(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKCVec_C2Tuple_u32CVec_u8ZZZ C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_b(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ *NONNULL_PTR owner){
+       return CVec_C2Tuple_u32CVec_u8ZZZ_clone(&owner->b);
+}
+int64_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_b(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ*)untag_ptr(owner);
+       LDKCVec_C2Tuple_u32CVec_u8ZZZ ret_var = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_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 x = 0; x < ret_var.datalen; x++) {
+               LDKC2Tuple_u32CVec_u8ZZ* ret_conv_23_conv = MALLOC(sizeof(LDKC2Tuple_u32CVec_u8ZZ), "LDKC2Tuple_u32CVec_u8ZZ");
+               *ret_conv_23_conv = ret_var.data[x];
+               ret_arr_ptr[x] = tag_ptr(ret_conv_23_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+static inline LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ_clone(const LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ *orig) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ) * orig->datalen, "LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_CommitmentTransactionZ CVec_CommitmentTransactionZ_clone(const LDKCVec_CommitmentTransactionZ *orig) {
+       LDKCVec_CommitmentTransactionZ ret = { .data = MALLOC(sizeof(LDKCommitmentTransaction) * orig->datalen, "LDKCVec_CommitmentTransactionZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = CommitmentTransaction_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline uint32_t C2Tuple_u32TxOutZ_get_a(LDKC2Tuple_u32TxOutZ *NONNULL_PTR owner){
+       return owner->a;
+}
+int32_t  CS_LDK_C2Tuple_u32TxOutZ_get_a(int64_t owner) {
+       LDKC2Tuple_u32TxOutZ* owner_conv = (LDKC2Tuple_u32TxOutZ*)untag_ptr(owner);
+       int32_t ret_conv = C2Tuple_u32TxOutZ_get_a(owner_conv);
+       return ret_conv;
+}
+
+static inline struct LDKTxOut C2Tuple_u32TxOutZ_get_b(LDKC2Tuple_u32TxOutZ *NONNULL_PTR owner){
+       return TxOut_clone(&owner->b);
+}
+int64_t  CS_LDK_C2Tuple_u32TxOutZ_get_b(int64_t owner) {
+       LDKC2Tuple_u32TxOutZ* owner_conv = (LDKC2Tuple_u32TxOutZ*)untag_ptr(owner);
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = C2Tuple_u32TxOutZ_get_b(owner_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+static inline LDKCVec_C2Tuple_u32TxOutZZ CVec_C2Tuple_u32TxOutZZ_clone(const LDKCVec_C2Tuple_u32TxOutZZ *orig) {
+       LDKCVec_C2Tuple_u32TxOutZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_u32TxOutZ) * orig->datalen, "LDKCVec_C2Tuple_u32TxOutZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_u32TxOutZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_a(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->a);
+}
+int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_a(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_a(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKCVec_C2Tuple_u32TxOutZZ C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_b(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ *NONNULL_PTR owner){
+       return CVec_C2Tuple_u32TxOutZZ_clone(&owner->b);
+}
+int64_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_b(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ*)untag_ptr(owner);
+       LDKCVec_C2Tuple_u32TxOutZZ ret_var = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_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 u = 0; u < ret_var.datalen; u++) {
+               LDKC2Tuple_u32TxOutZ* ret_conv_20_conv = MALLOC(sizeof(LDKC2Tuple_u32TxOutZ), "LDKC2Tuple_u32TxOutZ");
+               *ret_conv_20_conv = ret_var.data[u];
+               ret_arr_ptr[u] = tag_ptr(ret_conv_20_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+static inline LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ_clone(const LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ *orig) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ) * orig->datalen, "LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKBalance_ty_from_ptr(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKBalance_ClaimableOnChannelClose: return 0;
+               case LDKBalance_ClaimableAwaitingConfirmations: return 1;
+               case LDKBalance_ContentiousClaimable: return 2;
+               case LDKBalance_MaybeTimeoutClaimableHTLC: return 3;
+               case LDKBalance_MaybePreimageClaimableHTLC: return 4;
+               case LDKBalance_CounterpartyRevokedOutputClaimable: return 5;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKBalance_ClaimableOnChannelClose_get_amount_satoshis(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_ClaimableOnChannelClose);
+       int64_t amount_satoshis_conv = obj->claimable_on_channel_close.amount_satoshis;
+       return amount_satoshis_conv;
+}
+int64_t CS_LDK_LDKBalance_ClaimableAwaitingConfirmations_get_amount_satoshis(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_ClaimableAwaitingConfirmations);
+       int64_t amount_satoshis_conv = obj->claimable_awaiting_confirmations.amount_satoshis;
+       return amount_satoshis_conv;
+}
+int32_t CS_LDK_LDKBalance_ClaimableAwaitingConfirmations_get_confirmation_height(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_ClaimableAwaitingConfirmations);
+       int32_t confirmation_height_conv = obj->claimable_awaiting_confirmations.confirmation_height;
+       return confirmation_height_conv;
+}
+int64_t CS_LDK_LDKBalance_ContentiousClaimable_get_amount_satoshis(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_ContentiousClaimable);
+       int64_t amount_satoshis_conv = obj->contentious_claimable.amount_satoshis;
+       return amount_satoshis_conv;
+}
+int32_t CS_LDK_LDKBalance_ContentiousClaimable_get_timeout_height(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_ContentiousClaimable);
+       int32_t timeout_height_conv = obj->contentious_claimable.timeout_height;
+       return timeout_height_conv;
+}
+int8_tArray CS_LDK_LDKBalance_ContentiousClaimable_get_payment_hash(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_ContentiousClaimable);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->contentious_claimable.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int8_tArray CS_LDK_LDKBalance_ContentiousClaimable_get_payment_preimage(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_ContentiousClaimable);
+       int8_tArray payment_preimage_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_preimage_arr->elems, obj->contentious_claimable.payment_preimage.data, 32);
+       return payment_preimage_arr;
+}
+int64_t CS_LDK_LDKBalance_MaybeTimeoutClaimableHTLC_get_amount_satoshis(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_MaybeTimeoutClaimableHTLC);
+       int64_t amount_satoshis_conv = obj->maybe_timeout_claimable_htlc.amount_satoshis;
+       return amount_satoshis_conv;
+}
+int32_t CS_LDK_LDKBalance_MaybeTimeoutClaimableHTLC_get_claimable_height(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_MaybeTimeoutClaimableHTLC);
+       int32_t claimable_height_conv = obj->maybe_timeout_claimable_htlc.claimable_height;
+       return claimable_height_conv;
+}
+int8_tArray CS_LDK_LDKBalance_MaybeTimeoutClaimableHTLC_get_payment_hash(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_MaybeTimeoutClaimableHTLC);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->maybe_timeout_claimable_htlc.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKBalance_MaybePreimageClaimableHTLC_get_amount_satoshis(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_MaybePreimageClaimableHTLC);
+       int64_t amount_satoshis_conv = obj->maybe_preimage_claimable_htlc.amount_satoshis;
+       return amount_satoshis_conv;
+}
+int32_t CS_LDK_LDKBalance_MaybePreimageClaimableHTLC_get_expiry_height(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_MaybePreimageClaimableHTLC);
+       int32_t expiry_height_conv = obj->maybe_preimage_claimable_htlc.expiry_height;
+       return expiry_height_conv;
+}
+int8_tArray CS_LDK_LDKBalance_MaybePreimageClaimableHTLC_get_payment_hash(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_MaybePreimageClaimableHTLC);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->maybe_preimage_claimable_htlc.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKBalance_CounterpartyRevokedOutputClaimable_get_amount_satoshis(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_CounterpartyRevokedOutputClaimable);
+       int64_t amount_satoshis_conv = obj->counterparty_revoked_output_claimable.amount_satoshis;
+       return amount_satoshis_conv;
+}
+static inline LDKCVec_BalanceZ CVec_BalanceZ_clone(const LDKCVec_BalanceZ *orig) {
+       LDKCVec_BalanceZ ret = { .data = MALLOC(sizeof(LDKBalance) * orig->datalen, "LDKCVec_BalanceZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = Balance_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_a(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->a);
+}
+int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_a(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_a(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKChannelMonitor C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_b(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ *NONNULL_PTR owner){
+       LDKChannelMonitor ret = owner->b;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_b(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)untag_ptr(owner);
+       LDKChannelMonitor ret_var = C2Tuple_ThirtyTwoBytesChannelMonitorZ_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 LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_ok(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ*)untag_ptr(owner);
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ), "LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_ok(owner_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline struct LDKDecodeError CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_err(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+typedef struct LDKType_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKType_JCalls;
+static void LDKType_JCalls_free(void* this_arg) {
+       LDKType_JCalls *j_calls = (LDKType_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+}
+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);
+       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);
+       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;
+}
+static void LDKType_JCalls_cloned(LDKType* new_obj) {
+       LDKType_JCalls *j_calls = (LDKType_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKType LDKType_init (int64_t o) {
+       LDKType_JCalls *calls = MALLOC(sizeof(LDKType_JCalls), "LDKType_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKType ret = {
+               .this_arg = (void*) calls,
+               .type_id = type_id_LDKType_jcall,
+               .debug_str = debug_str_LDKType_jcall,
+               .write = write_LDKType_jcall,
+               .cloned = LDKType_JCalls_cloned,
+               .free = LDKType_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKType_new(int32_t o) {
+       LDKType *res_ptr = MALLOC(sizeof(LDKType), "LDKType");
+       *res_ptr = LDKType_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int16_t  CS_LDK_Type_type_id(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKType* this_arg_conv = (LDKType*)this_arg_ptr;
+       int16_t ret_conv = (this_arg_conv->type_id)(this_arg_conv->this_arg);
+       return ret_conv;
+}
+
+jstring  CS_LDK_Type_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); }
+       LDKType* this_arg_conv = (LDKType*)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;
+}
+
+int8_tArray  CS_LDK_Type_write(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKType* this_arg_conv = (LDKType*)this_arg_ptr;
+       LDKCVec_u8Z ret_var = (this_arg_conv->write)(this_arg_conv->this_arg);
+       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 struct LDKPublicKey C2Tuple_PublicKeyTypeZ_get_a(LDKC2Tuple_PublicKeyTypeZ *NONNULL_PTR owner){
+       return owner->a;
+}
+int8_tArray  CS_LDK_C2Tuple_PublicKeyTypeZ_get_a(int64_t owner) {
+       LDKC2Tuple_PublicKeyTypeZ* owner_conv = (LDKC2Tuple_PublicKeyTypeZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_PublicKeyTypeZ_get_a(owner_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+static inline struct LDKType C2Tuple_PublicKeyTypeZ_get_b(LDKC2Tuple_PublicKeyTypeZ *NONNULL_PTR owner){
+       return Type_clone(&owner->b);
+}
+int64_t  CS_LDK_C2Tuple_PublicKeyTypeZ_get_b(int64_t owner) {
+       LDKC2Tuple_PublicKeyTypeZ* owner_conv = (LDKC2Tuple_PublicKeyTypeZ*)untag_ptr(owner);
+       LDKType* ret_ret = MALLOC(sizeof(LDKType), "LDKType");
+       *ret_ret = C2Tuple_PublicKeyTypeZ_get_b(owner_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+static inline LDKCVec_C2Tuple_PublicKeyTypeZZ CVec_C2Tuple_PublicKeyTypeZZ_clone(const LDKCVec_C2Tuple_PublicKeyTypeZZ *orig) {
+       LDKCVec_C2Tuple_PublicKeyTypeZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_PublicKeyTypeZ) * orig->datalen, "LDKCVec_C2Tuple_PublicKeyTypeZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_PublicKeyTypeZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+typedef struct LDKOnionMessageContents_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKOnionMessageContents_JCalls;
+static void LDKOnionMessageContents_JCalls_free(void* this_arg) {
+       LDKOnionMessageContents_JCalls *j_calls = (LDKOnionMessageContents_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+}
+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);
+       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;
+}
+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);
+}
+static inline LDKOnionMessageContents LDKOnionMessageContents_init (int64_t o) {
+       LDKOnionMessageContents_JCalls *calls = MALLOC(sizeof(LDKOnionMessageContents_JCalls), "LDKOnionMessageContents_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKOnionMessageContents ret = {
+               .this_arg = (void*) calls,
+               .tlv_type = tlv_type_LDKOnionMessageContents_jcall,
+               .write = write_LDKOnionMessageContents_jcall,
+               .cloned = LDKOnionMessageContents_JCalls_cloned,
+               .free = LDKOnionMessageContents_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKOnionMessageContents_new(int32_t o) {
+       LDKOnionMessageContents *res_ptr = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
+       *res_ptr = LDKOnionMessageContents_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_OnionMessageContents_tlv_type(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;
+       int64_t ret_conv = (this_arg_conv->tlv_type)(this_arg_conv->this_arg);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_OnionMessageContents_write(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;
+       LDKCVec_u8Z ret_var = (this_arg_conv->write)(this_arg_conv->this_arg);
+       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;
+}
+
+uint32_t CS_LDK_LDKCOption_OnionMessageContentsZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_OnionMessageContentsZ *obj = (LDKCOption_OnionMessageContentsZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_OnionMessageContentsZ_Some: return 0;
+               case LDKCOption_OnionMessageContentsZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_OnionMessageContentsZ_Some_get_some(int64_t ptr) {
+       LDKCOption_OnionMessageContentsZ *obj = (LDKCOption_OnionMessageContentsZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_OnionMessageContentsZ_Some);
+       LDKOnionMessageContents* some_ret = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
+       *some_ret = OnionMessageContents_clone(&obj->some);
+       return tag_ptr(some_ret, true);
+}
+static inline struct LDKCOption_OnionMessageContentsZ CResult_COption_OnionMessageContentsZDecodeErrorZ_get_ok(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_OnionMessageContentsZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* owner_conv = (LDKCResult_COption_OnionMessageContentsZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_OnionMessageContentsZ *ret_copy = MALLOC(sizeof(LDKCOption_OnionMessageContentsZ), "LDKCOption_OnionMessageContentsZ");
+       *ret_copy = CResult_COption_OnionMessageContentsZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_OnionMessageContentsZDecodeErrorZ_get_err(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* owner_conv = (LDKCResult_COption_OnionMessageContentsZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_OnionMessageContentsZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKOnionMessageContents C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_a(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ *NONNULL_PTR owner){
+       return OnionMessageContents_clone(&owner->a);
+}
+int64_t  CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_a(int64_t owner) {
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* owner_conv = (LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ*)untag_ptr(owner);
+       LDKOnionMessageContents* ret_ret = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
+       *ret_ret = C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_a(owner_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+static inline struct LDKDestination C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_b(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ *NONNULL_PTR owner){
+       return Destination_clone(&owner->b);
+}
+int64_t  CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_b(int64_t owner) {
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* owner_conv = (LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ*)untag_ptr(owner);
+       LDKDestination *ret_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
+       *ret_copy = C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_b(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBlindedPath C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_c(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ *NONNULL_PTR owner){
+       LDKBlindedPath ret = owner->c;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_c(int64_t owner) {
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* owner_conv = (LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ*)untag_ptr(owner);
+       LDKBlindedPath ret_var = C3Tuple_OnionMessageContentsDestinationBlindedPathZ_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;
+}
+
+static inline LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ CVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ_clone(const LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ *orig) {
+       LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ ret = { .data = MALLOC(sizeof(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ) * orig->datalen, "LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKCOption_TypeZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_TypeZ *obj = (LDKCOption_TypeZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_TypeZ_Some: return 0;
+               case LDKCOption_TypeZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_TypeZ_Some_get_some(int64_t ptr) {
+       LDKCOption_TypeZ *obj = (LDKCOption_TypeZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_TypeZ_Some);
+       LDKType* some_ret = MALLOC(sizeof(LDKType), "LDKType");
+       *some_ret = Type_clone(&obj->some);
+       return tag_ptr(some_ret, true);
+}
+static inline struct LDKCOption_TypeZ CResult_COption_TypeZDecodeErrorZ_get_ok(LDKCResult_COption_TypeZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_TypeZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_TypeZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_TypeZDecodeErrorZ* owner_conv = (LDKCResult_COption_TypeZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_TypeZ *ret_copy = MALLOC(sizeof(LDKCOption_TypeZ), "LDKCOption_TypeZ");
+       *ret_copy = CResult_COption_TypeZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_TypeZDecodeErrorZ_get_err(LDKCResult_COption_TypeZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_TypeZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_TypeZDecodeErrorZ* owner_conv = (LDKCResult_COption_TypeZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_TypeZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKCOption_SocketAddressZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_SocketAddressZ *obj = (LDKCOption_SocketAddressZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_SocketAddressZ_Some: return 0;
+               case LDKCOption_SocketAddressZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_SocketAddressZ_Some_get_some(int64_t ptr) {
+       LDKCOption_SocketAddressZ *obj = (LDKCOption_SocketAddressZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_SocketAddressZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+static inline struct LDKPublicKey C2Tuple_PublicKeyCOption_SocketAddressZZ_get_a(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ *NONNULL_PTR owner){
+       return owner->a;
+}
+int8_tArray  CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_get_a(int64_t owner) {
+       LDKC2Tuple_PublicKeyCOption_SocketAddressZZ* owner_conv = (LDKC2Tuple_PublicKeyCOption_SocketAddressZZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_PublicKeyCOption_SocketAddressZZ_get_a(owner_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+static inline struct LDKCOption_SocketAddressZ C2Tuple_PublicKeyCOption_SocketAddressZZ_get_b(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ *NONNULL_PTR owner){
+       return COption_SocketAddressZ_clone(&owner->b);
+}
+int64_t  CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_get_b(int64_t owner) {
+       LDKC2Tuple_PublicKeyCOption_SocketAddressZZ* owner_conv = (LDKC2Tuple_PublicKeyCOption_SocketAddressZZ*)untag_ptr(owner);
+       LDKCOption_SocketAddressZ *ret_copy = MALLOC(sizeof(LDKCOption_SocketAddressZ), "LDKCOption_SocketAddressZ");
+       *ret_copy = C2Tuple_PublicKeyCOption_SocketAddressZZ_get_b(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ CVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ_clone(const LDKCVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ *orig) {
+       LDKCVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ) * orig->datalen, "LDKCVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_PublicKeyCOption_SocketAddressZZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKCVec_u8Z CResult_CVec_u8ZPeerHandleErrorZ_get_ok(LDKCResult_CVec_u8ZPeerHandleErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return CVec_u8Z_clone(&*owner->contents.result);
+}
+int8_tArray  CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* owner_conv = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)untag_ptr(owner);
+       LDKCVec_u8Z ret_var = CResult_CVec_u8ZPeerHandleErrorZ_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);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+static inline struct LDKPeerHandleError CResult_CVec_u8ZPeerHandleErrorZ_get_err(LDKCResult_CVec_u8ZPeerHandleErrorZ *NONNULL_PTR owner){
+       LDKPeerHandleError ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_get_err(int64_t owner) {
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* owner_conv = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)untag_ptr(owner);
+       LDKPeerHandleError ret_var = CResult_CVec_u8ZPeerHandleErrorZ_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 void CResult_NonePeerHandleErrorZ_get_ok(LDKCResult_NonePeerHandleErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NonePeerHandleErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NonePeerHandleErrorZ* owner_conv = (LDKCResult_NonePeerHandleErrorZ*)untag_ptr(owner);
+       CResult_NonePeerHandleErrorZ_get_ok(owner_conv);
+}
+
+static inline struct LDKPeerHandleError CResult_NonePeerHandleErrorZ_get_err(LDKCResult_NonePeerHandleErrorZ *NONNULL_PTR owner){
+       LDKPeerHandleError ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NonePeerHandleErrorZ_get_err(int64_t owner) {
+       LDKCResult_NonePeerHandleErrorZ* owner_conv = (LDKCResult_NonePeerHandleErrorZ*)untag_ptr(owner);
+       LDKPeerHandleError ret_var = CResult_NonePeerHandleErrorZ_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 bool CResult_boolPeerHandleErrorZ_get_ok(LDKCResult_boolPeerHandleErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+jboolean  CS_LDK_CResult_boolPeerHandleErrorZ_get_ok(int64_t owner) {
+       LDKCResult_boolPeerHandleErrorZ* owner_conv = (LDKCResult_boolPeerHandleErrorZ*)untag_ptr(owner);
+       jboolean ret_conv = CResult_boolPeerHandleErrorZ_get_ok(owner_conv);
+       return ret_conv;
+}
+
+static inline struct LDKPeerHandleError CResult_boolPeerHandleErrorZ_get_err(LDKCResult_boolPeerHandleErrorZ *NONNULL_PTR owner){
+       LDKPeerHandleError ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_boolPeerHandleErrorZ_get_err(int64_t owner) {
+       LDKCResult_boolPeerHandleErrorZ* owner_conv = (LDKCResult_boolPeerHandleErrorZ*)untag_ptr(owner);
+       LDKPeerHandleError ret_var = CResult_boolPeerHandleErrorZ_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;
+}
+
+uint32_t CS_LDK_LDKGraphSyncError_ty_from_ptr(int64_t ptr) {
+       LDKGraphSyncError *obj = (LDKGraphSyncError*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKGraphSyncError_DecodeError: return 0;
+               case LDKGraphSyncError_LightningError: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKGraphSyncError_DecodeError_get_decode_error(int64_t ptr) {
+       LDKGraphSyncError *obj = (LDKGraphSyncError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKGraphSyncError_DecodeError);
+       int64_t decode_error_ref = tag_ptr(&obj->decode_error, false);
+       return decode_error_ref;
+}
+int64_t CS_LDK_LDKGraphSyncError_LightningError_get_lightning_error(int64_t ptr) {
+       LDKGraphSyncError *obj = (LDKGraphSyncError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKGraphSyncError_LightningError);
+       LDKLightningError lightning_error_var = obj->lightning_error;
+                       int64_t lightning_error_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(lightning_error_var);
+                       lightning_error_ref = tag_ptr(lightning_error_var.inner, false);
+       return lightning_error_ref;
+}
+static inline uint32_t CResult_u32GraphSyncErrorZ_get_ok(LDKCResult_u32GraphSyncErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+int32_t  CS_LDK_CResult_u32GraphSyncErrorZ_get_ok(int64_t owner) {
+       LDKCResult_u32GraphSyncErrorZ* owner_conv = (LDKCResult_u32GraphSyncErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = CResult_u32GraphSyncErrorZ_get_ok(owner_conv);
+       return ret_conv;
+}
+
+static inline struct LDKGraphSyncError CResult_u32GraphSyncErrorZ_get_err(LDKCResult_u32GraphSyncErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return GraphSyncError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_u32GraphSyncErrorZ_get_err(int64_t owner) {
+       LDKCResult_u32GraphSyncErrorZ* owner_conv = (LDKCResult_u32GraphSyncErrorZ*)untag_ptr(owner);
+       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
+       *ret_copy = CResult_u32GraphSyncErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKCVec_u8Z CResult_CVec_u8ZIOErrorZ_get_ok(LDKCResult_CVec_u8ZIOErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return CVec_u8Z_clone(&*owner->contents.result);
+}
+int8_tArray  CS_LDK_CResult_CVec_u8ZIOErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_u8ZIOErrorZ* owner_conv = (LDKCResult_CVec_u8ZIOErrorZ*)untag_ptr(owner);
+       LDKCVec_u8Z ret_var = CResult_CVec_u8ZIOErrorZ_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);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+static inline enum LDKIOError CResult_CVec_u8ZIOErrorZ_get_err(LDKCResult_CVec_u8ZIOErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+int32_t  CS_LDK_CResult_CVec_u8ZIOErrorZ_get_err(int64_t owner) {
+       LDKCResult_CVec_u8ZIOErrorZ* owner_conv = (LDKCResult_CVec_u8ZIOErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKIOError_to_cs(CResult_CVec_u8ZIOErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKCVec_StrZ CResult_CVec_StrZIOErrorZ_get_ok(LDKCResult_CVec_StrZIOErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+ptrArray  CS_LDK_CResult_CVec_StrZIOErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_StrZIOErrorZ* owner_conv = (LDKCResult_CVec_StrZIOErrorZ*)untag_ptr(owner);
+       LDKCVec_StrZ ret_var = CResult_CVec_StrZIOErrorZ_get_ok(owner_conv);
+       ptrArray ret_arr = NULL;
+       ret_arr = init_ptrArray(ret_var.datalen, __LINE__);
+       jstring *ret_arr_ptr = (jstring*)(((uint8_t*)ret_arr) + 8);
+       for (size_t i = 0; i < ret_var.datalen; i++) {
+               LDKStr ret_conv_8_str = ret_var.data[i];
+               jstring ret_conv_8_conv = str_ref_to_cs(ret_conv_8_str.chars, ret_conv_8_str.len);
+               ret_arr_ptr[i] = ret_conv_8_conv;
+       }
+       
+       return ret_arr;
+}
+
+static inline enum LDKIOError CResult_CVec_StrZIOErrorZ_get_err(LDKCResult_CVec_StrZIOErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+int32_t  CS_LDK_CResult_CVec_StrZIOErrorZ_get_err(int64_t owner) {
+       LDKCResult_CVec_StrZIOErrorZ* owner_conv = (LDKCResult_CVec_StrZIOErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKIOError_to_cs(CResult_CVec_StrZIOErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ_clone(const LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ *orig) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ) * orig->datalen, "LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_ok(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ_clone(&*owner->contents.result);
+}
+int64_tArray  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* owner_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ*)untag_ptr(owner);
+       LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ ret_var = CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_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_ThirtyTwoBytesChannelMonitorZ* ret_conv_40_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ), "LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ");
+               *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;
+}
+
+static inline enum LDKIOError CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_err(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+int32_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_err(int64_t owner) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* owner_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKIOError_to_cs(CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_ok(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_ok(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ*)untag_ptr(owner);
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ), "LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_ok(owner_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline enum LDKIOError CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_err(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+int32_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_err(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKIOError_to_cs(CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+uint32_t CS_LDK_LDKCOption_SecretKeyZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_SecretKeyZ *obj = (LDKCOption_SecretKeyZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_SecretKeyZ_Some: return 0;
+               case LDKCOption_SecretKeyZ_None: return 1;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKCOption_SecretKeyZ_Some_get_some(int64_t ptr) {
+       LDKCOption_SecretKeyZ *obj = (LDKCOption_SecretKeyZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_SecretKeyZ_Some);
+       int8_tArray some_arr = init_int8_tArray(32, __LINE__);
+       memcpy(some_arr->elems, obj->some.bytes, 32);
+       return some_arr;
+}
+static inline struct LDKVerifiedInvoiceRequest CResult_VerifiedInvoiceRequestNoneZ_get_ok(LDKCResult_VerifiedInvoiceRequestNoneZ *NONNULL_PTR owner){
+       LDKVerifiedInvoiceRequest ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_get_ok(int64_t owner) {
+       LDKCResult_VerifiedInvoiceRequestNoneZ* owner_conv = (LDKCResult_VerifiedInvoiceRequestNoneZ*)untag_ptr(owner);
+       LDKVerifiedInvoiceRequest ret_var = CResult_VerifiedInvoiceRequestNoneZ_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_VerifiedInvoiceRequestNoneZ_get_err(LDKCResult_VerifiedInvoiceRequestNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_get_err(int64_t owner) {
+       LDKCResult_VerifiedInvoiceRequestNoneZ* owner_conv = (LDKCResult_VerifiedInvoiceRequestNoneZ*)untag_ptr(owner);
+       CResult_VerifiedInvoiceRequestNoneZ_get_err(owner_conv);
+}
+
+static inline LDKCVec_WitnessZ CVec_WitnessZ_clone(const LDKCVec_WitnessZ *orig) {
+       LDKCVec_WitnessZ ret = { .data = MALLOC(sizeof(LDKWitness) * orig->datalen, "LDKCVec_WitnessZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = Witness_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKCOption_i64Z_ty_from_ptr(int64_t ptr) {
+       LDKCOption_i64Z *obj = (LDKCOption_i64Z*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_i64Z_Some: return 0;
+               case LDKCOption_i64Z_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_i64Z_Some_get_some(int64_t ptr) {
+       LDKCOption_i64Z *obj = (LDKCOption_i64Z*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_i64Z_Some);
+       int64_t some_conv = obj->some;
+       return some_conv;
+}
+static inline struct LDKSocketAddress CResult_SocketAddressDecodeErrorZ_get_ok(LDKCResult_SocketAddressDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return SocketAddress_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_SocketAddressDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SocketAddressDecodeErrorZ* owner_conv = (LDKCResult_SocketAddressDecodeErrorZ*)untag_ptr(owner);
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = CResult_SocketAddressDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_SocketAddressDecodeErrorZ_get_err(LDKCResult_SocketAddressDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_SocketAddressDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_SocketAddressDecodeErrorZ* owner_conv = (LDKCResult_SocketAddressDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_SocketAddressDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKSocketAddress CResult_SocketAddressSocketAddressParseErrorZ_get_ok(LDKCResult_SocketAddressSocketAddressParseErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return SocketAddress_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* owner_conv = (LDKCResult_SocketAddressSocketAddressParseErrorZ*)untag_ptr(owner);
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = CResult_SocketAddressSocketAddressParseErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline enum LDKSocketAddressParseError CResult_SocketAddressSocketAddressParseErrorZ_get_err(LDKCResult_SocketAddressSocketAddressParseErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return SocketAddressParseError_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_get_err(int64_t owner) {
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* owner_conv = (LDKCResult_SocketAddressSocketAddressParseErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKSocketAddressParseError_to_cs(CResult_SocketAddressSocketAddressParseErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline LDKCVec_UpdateAddHTLCZ CVec_UpdateAddHTLCZ_clone(const LDKCVec_UpdateAddHTLCZ *orig) {
+       LDKCVec_UpdateAddHTLCZ ret = { .data = MALLOC(sizeof(LDKUpdateAddHTLC) * orig->datalen, "LDKCVec_UpdateAddHTLCZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = UpdateAddHTLC_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_UpdateFulfillHTLCZ CVec_UpdateFulfillHTLCZ_clone(const LDKCVec_UpdateFulfillHTLCZ *orig) {
+       LDKCVec_UpdateFulfillHTLCZ ret = { .data = MALLOC(sizeof(LDKUpdateFulfillHTLC) * orig->datalen, "LDKCVec_UpdateFulfillHTLCZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = UpdateFulfillHTLC_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_UpdateFailHTLCZ CVec_UpdateFailHTLCZ_clone(const LDKCVec_UpdateFailHTLCZ *orig) {
+       LDKCVec_UpdateFailHTLCZ ret = { .data = MALLOC(sizeof(LDKUpdateFailHTLC) * orig->datalen, "LDKCVec_UpdateFailHTLCZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = UpdateFailHTLC_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_UpdateFailMalformedHTLCZ CVec_UpdateFailMalformedHTLCZ_clone(const LDKCVec_UpdateFailMalformedHTLCZ *orig) {
+       LDKCVec_UpdateFailMalformedHTLCZ ret = { .data = MALLOC(sizeof(LDKUpdateFailMalformedHTLC) * orig->datalen, "LDKCVec_UpdateFailMalformedHTLCZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = UpdateFailMalformedHTLC_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKAcceptChannel CResult_AcceptChannelDecodeErrorZ_get_ok(LDKCResult_AcceptChannelDecodeErrorZ *NONNULL_PTR owner){
+       LDKAcceptChannel ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_AcceptChannelDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_AcceptChannelDecodeErrorZ* owner_conv = (LDKCResult_AcceptChannelDecodeErrorZ*)untag_ptr(owner);
+       LDKAcceptChannel ret_var = CResult_AcceptChannelDecodeErrorZ_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_AcceptChannelDecodeErrorZ_get_err(LDKCResult_AcceptChannelDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_AcceptChannelDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_AcceptChannelDecodeErrorZ* owner_conv = (LDKCResult_AcceptChannelDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_AcceptChannelDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKAcceptChannelV2 CResult_AcceptChannelV2DecodeErrorZ_get_ok(LDKCResult_AcceptChannelV2DecodeErrorZ *NONNULL_PTR owner){
+       LDKAcceptChannelV2 ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_AcceptChannelV2DecodeErrorZ* owner_conv = (LDKCResult_AcceptChannelV2DecodeErrorZ*)untag_ptr(owner);
+       LDKAcceptChannelV2 ret_var = CResult_AcceptChannelV2DecodeErrorZ_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_AcceptChannelV2DecodeErrorZ_get_err(LDKCResult_AcceptChannelV2DecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_AcceptChannelV2DecodeErrorZ* owner_conv = (LDKCResult_AcceptChannelV2DecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_AcceptChannelV2DecodeErrorZ_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;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxAddInputDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxAddInputDecodeErrorZ* owner_conv = (LDKCResult_TxAddInputDecodeErrorZ*)untag_ptr(owner);
+       LDKTxAddInput ret_var = CResult_TxAddInputDecodeErrorZ_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_TxAddInputDecodeErrorZ_get_err(LDKCResult_TxAddInputDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxAddInputDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxAddInputDecodeErrorZ* owner_conv = (LDKCResult_TxAddInputDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxAddInputDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxAddOutput CResult_TxAddOutputDecodeErrorZ_get_ok(LDKCResult_TxAddOutputDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxAddOutput ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxAddOutputDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxAddOutputDecodeErrorZ* owner_conv = (LDKCResult_TxAddOutputDecodeErrorZ*)untag_ptr(owner);
+       LDKTxAddOutput ret_var = CResult_TxAddOutputDecodeErrorZ_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_TxAddOutputDecodeErrorZ_get_err(LDKCResult_TxAddOutputDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxAddOutputDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxAddOutputDecodeErrorZ* owner_conv = (LDKCResult_TxAddOutputDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxAddOutputDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxRemoveInput CResult_TxRemoveInputDecodeErrorZ_get_ok(LDKCResult_TxRemoveInputDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxRemoveInput ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxRemoveInputDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxRemoveInputDecodeErrorZ* owner_conv = (LDKCResult_TxRemoveInputDecodeErrorZ*)untag_ptr(owner);
+       LDKTxRemoveInput ret_var = CResult_TxRemoveInputDecodeErrorZ_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_TxRemoveInputDecodeErrorZ_get_err(LDKCResult_TxRemoveInputDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxRemoveInputDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxRemoveInputDecodeErrorZ* owner_conv = (LDKCResult_TxRemoveInputDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxRemoveInputDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxRemoveOutput CResult_TxRemoveOutputDecodeErrorZ_get_ok(LDKCResult_TxRemoveOutputDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxRemoveOutput ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxRemoveOutputDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxRemoveOutputDecodeErrorZ* owner_conv = (LDKCResult_TxRemoveOutputDecodeErrorZ*)untag_ptr(owner);
+       LDKTxRemoveOutput ret_var = CResult_TxRemoveOutputDecodeErrorZ_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_TxRemoveOutputDecodeErrorZ_get_err(LDKCResult_TxRemoveOutputDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxRemoveOutputDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxRemoveOutputDecodeErrorZ* owner_conv = (LDKCResult_TxRemoveOutputDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxRemoveOutputDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxComplete CResult_TxCompleteDecodeErrorZ_get_ok(LDKCResult_TxCompleteDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxComplete ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxCompleteDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxCompleteDecodeErrorZ* owner_conv = (LDKCResult_TxCompleteDecodeErrorZ*)untag_ptr(owner);
+       LDKTxComplete ret_var = CResult_TxCompleteDecodeErrorZ_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_TxCompleteDecodeErrorZ_get_err(LDKCResult_TxCompleteDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxCompleteDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxCompleteDecodeErrorZ* owner_conv = (LDKCResult_TxCompleteDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxCompleteDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxSignatures CResult_TxSignaturesDecodeErrorZ_get_ok(LDKCResult_TxSignaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxSignatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxSignaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxSignaturesDecodeErrorZ* owner_conv = (LDKCResult_TxSignaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKTxSignatures ret_var = CResult_TxSignaturesDecodeErrorZ_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_TxSignaturesDecodeErrorZ_get_err(LDKCResult_TxSignaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxSignaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxSignaturesDecodeErrorZ* owner_conv = (LDKCResult_TxSignaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxSignaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxInitRbf CResult_TxInitRbfDecodeErrorZ_get_ok(LDKCResult_TxInitRbfDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxInitRbf ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxInitRbfDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxInitRbfDecodeErrorZ* owner_conv = (LDKCResult_TxInitRbfDecodeErrorZ*)untag_ptr(owner);
+       LDKTxInitRbf ret_var = CResult_TxInitRbfDecodeErrorZ_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_TxInitRbfDecodeErrorZ_get_err(LDKCResult_TxInitRbfDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxInitRbfDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxInitRbfDecodeErrorZ* owner_conv = (LDKCResult_TxInitRbfDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxInitRbfDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxAckRbf CResult_TxAckRbfDecodeErrorZ_get_ok(LDKCResult_TxAckRbfDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxAckRbf ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxAckRbfDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxAckRbfDecodeErrorZ* owner_conv = (LDKCResult_TxAckRbfDecodeErrorZ*)untag_ptr(owner);
+       LDKTxAckRbf ret_var = CResult_TxAckRbfDecodeErrorZ_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_TxAckRbfDecodeErrorZ_get_err(LDKCResult_TxAckRbfDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxAckRbfDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxAckRbfDecodeErrorZ* owner_conv = (LDKCResult_TxAckRbfDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxAckRbfDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxAbort CResult_TxAbortDecodeErrorZ_get_ok(LDKCResult_TxAbortDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxAbort ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxAbortDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxAbortDecodeErrorZ* owner_conv = (LDKCResult_TxAbortDecodeErrorZ*)untag_ptr(owner);
+       LDKTxAbort ret_var = CResult_TxAbortDecodeErrorZ_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_TxAbortDecodeErrorZ_get_err(LDKCResult_TxAbortDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxAbortDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxAbortDecodeErrorZ* owner_conv = (LDKCResult_TxAbortDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxAbortDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKAnnouncementSignatures CResult_AnnouncementSignaturesDecodeErrorZ_get_ok(LDKCResult_AnnouncementSignaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKAnnouncementSignatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_AnnouncementSignaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* owner_conv = (LDKCResult_AnnouncementSignaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKAnnouncementSignatures ret_var = CResult_AnnouncementSignaturesDecodeErrorZ_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_AnnouncementSignaturesDecodeErrorZ_get_err(LDKCResult_AnnouncementSignaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_AnnouncementSignaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* owner_conv = (LDKCResult_AnnouncementSignaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_AnnouncementSignaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelReestablish CResult_ChannelReestablishDecodeErrorZ_get_ok(LDKCResult_ChannelReestablishDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelReestablish ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelReestablishDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelReestablishDecodeErrorZ* owner_conv = (LDKCResult_ChannelReestablishDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelReestablish ret_var = CResult_ChannelReestablishDecodeErrorZ_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_ChannelReestablishDecodeErrorZ_get_err(LDKCResult_ChannelReestablishDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelReestablishDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelReestablishDecodeErrorZ* owner_conv = (LDKCResult_ChannelReestablishDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelReestablishDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKClosingSigned CResult_ClosingSignedDecodeErrorZ_get_ok(LDKCResult_ClosingSignedDecodeErrorZ *NONNULL_PTR owner){
+       LDKClosingSigned ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ClosingSignedDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ClosingSignedDecodeErrorZ* owner_conv = (LDKCResult_ClosingSignedDecodeErrorZ*)untag_ptr(owner);
+       LDKClosingSigned ret_var = CResult_ClosingSignedDecodeErrorZ_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_ClosingSignedDecodeErrorZ_get_err(LDKCResult_ClosingSignedDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ClosingSignedDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ClosingSignedDecodeErrorZ* owner_conv = (LDKCResult_ClosingSignedDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ClosingSignedDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKClosingSignedFeeRange CResult_ClosingSignedFeeRangeDecodeErrorZ_get_ok(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ *NONNULL_PTR owner){
+       LDKClosingSignedFeeRange ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ClosingSignedFeeRangeDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* owner_conv = (LDKCResult_ClosingSignedFeeRangeDecodeErrorZ*)untag_ptr(owner);
+       LDKClosingSignedFeeRange ret_var = CResult_ClosingSignedFeeRangeDecodeErrorZ_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_ClosingSignedFeeRangeDecodeErrorZ_get_err(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ClosingSignedFeeRangeDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* owner_conv = (LDKCResult_ClosingSignedFeeRangeDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ClosingSignedFeeRangeDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKCommitmentSigned CResult_CommitmentSignedDecodeErrorZ_get_ok(LDKCResult_CommitmentSignedDecodeErrorZ *NONNULL_PTR owner){
+       LDKCommitmentSigned ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_CommitmentSignedDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CommitmentSignedDecodeErrorZ* owner_conv = (LDKCResult_CommitmentSignedDecodeErrorZ*)untag_ptr(owner);
+       LDKCommitmentSigned ret_var = CResult_CommitmentSignedDecodeErrorZ_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_CommitmentSignedDecodeErrorZ_get_err(LDKCResult_CommitmentSignedDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_CommitmentSignedDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_CommitmentSignedDecodeErrorZ* owner_conv = (LDKCResult_CommitmentSignedDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_CommitmentSignedDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKFundingCreated CResult_FundingCreatedDecodeErrorZ_get_ok(LDKCResult_FundingCreatedDecodeErrorZ *NONNULL_PTR owner){
+       LDKFundingCreated ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_FundingCreatedDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_FundingCreatedDecodeErrorZ* owner_conv = (LDKCResult_FundingCreatedDecodeErrorZ*)untag_ptr(owner);
+       LDKFundingCreated ret_var = CResult_FundingCreatedDecodeErrorZ_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_FundingCreatedDecodeErrorZ_get_err(LDKCResult_FundingCreatedDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_FundingCreatedDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_FundingCreatedDecodeErrorZ* owner_conv = (LDKCResult_FundingCreatedDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_FundingCreatedDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKFundingSigned CResult_FundingSignedDecodeErrorZ_get_ok(LDKCResult_FundingSignedDecodeErrorZ *NONNULL_PTR owner){
+       LDKFundingSigned ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_FundingSignedDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_FundingSignedDecodeErrorZ* owner_conv = (LDKCResult_FundingSignedDecodeErrorZ*)untag_ptr(owner);
+       LDKFundingSigned ret_var = CResult_FundingSignedDecodeErrorZ_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_FundingSignedDecodeErrorZ_get_err(LDKCResult_FundingSignedDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_FundingSignedDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_FundingSignedDecodeErrorZ* owner_conv = (LDKCResult_FundingSignedDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_FundingSignedDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelReady CResult_ChannelReadyDecodeErrorZ_get_ok(LDKCResult_ChannelReadyDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelReady ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelReadyDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelReadyDecodeErrorZ* owner_conv = (LDKCResult_ChannelReadyDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelReady ret_var = CResult_ChannelReadyDecodeErrorZ_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_ChannelReadyDecodeErrorZ_get_err(LDKCResult_ChannelReadyDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelReadyDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelReadyDecodeErrorZ* owner_conv = (LDKCResult_ChannelReadyDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelReadyDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKInit CResult_InitDecodeErrorZ_get_ok(LDKCResult_InitDecodeErrorZ *NONNULL_PTR owner){
+       LDKInit ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_InitDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_InitDecodeErrorZ* owner_conv = (LDKCResult_InitDecodeErrorZ*)untag_ptr(owner);
+       LDKInit ret_var = CResult_InitDecodeErrorZ_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_InitDecodeErrorZ_get_err(LDKCResult_InitDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_InitDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_InitDecodeErrorZ* owner_conv = (LDKCResult_InitDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_InitDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKOpenChannel CResult_OpenChannelDecodeErrorZ_get_ok(LDKCResult_OpenChannelDecodeErrorZ *NONNULL_PTR owner){
+       LDKOpenChannel ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_OpenChannelDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_OpenChannelDecodeErrorZ* owner_conv = (LDKCResult_OpenChannelDecodeErrorZ*)untag_ptr(owner);
+       LDKOpenChannel ret_var = CResult_OpenChannelDecodeErrorZ_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_OpenChannelDecodeErrorZ_get_err(LDKCResult_OpenChannelDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_OpenChannelDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_OpenChannelDecodeErrorZ* owner_conv = (LDKCResult_OpenChannelDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_OpenChannelDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKOpenChannelV2 CResult_OpenChannelV2DecodeErrorZ_get_ok(LDKCResult_OpenChannelV2DecodeErrorZ *NONNULL_PTR owner){
+       LDKOpenChannelV2 ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_OpenChannelV2DecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_OpenChannelV2DecodeErrorZ* owner_conv = (LDKCResult_OpenChannelV2DecodeErrorZ*)untag_ptr(owner);
+       LDKOpenChannelV2 ret_var = CResult_OpenChannelV2DecodeErrorZ_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_OpenChannelV2DecodeErrorZ_get_err(LDKCResult_OpenChannelV2DecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_OpenChannelV2DecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_OpenChannelV2DecodeErrorZ* owner_conv = (LDKCResult_OpenChannelV2DecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_OpenChannelV2DecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKRevokeAndACK CResult_RevokeAndACKDecodeErrorZ_get_ok(LDKCResult_RevokeAndACKDecodeErrorZ *NONNULL_PTR owner){
+       LDKRevokeAndACK ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RevokeAndACKDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RevokeAndACKDecodeErrorZ* owner_conv = (LDKCResult_RevokeAndACKDecodeErrorZ*)untag_ptr(owner);
+       LDKRevokeAndACK ret_var = CResult_RevokeAndACKDecodeErrorZ_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_RevokeAndACKDecodeErrorZ_get_err(LDKCResult_RevokeAndACKDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RevokeAndACKDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RevokeAndACKDecodeErrorZ* owner_conv = (LDKCResult_RevokeAndACKDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RevokeAndACKDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKShutdown CResult_ShutdownDecodeErrorZ_get_ok(LDKCResult_ShutdownDecodeErrorZ *NONNULL_PTR owner){
+       LDKShutdown ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ShutdownDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ShutdownDecodeErrorZ* owner_conv = (LDKCResult_ShutdownDecodeErrorZ*)untag_ptr(owner);
+       LDKShutdown ret_var = CResult_ShutdownDecodeErrorZ_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_ShutdownDecodeErrorZ_get_err(LDKCResult_ShutdownDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ShutdownDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ShutdownDecodeErrorZ* owner_conv = (LDKCResult_ShutdownDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ShutdownDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKUpdateFailHTLC CResult_UpdateFailHTLCDecodeErrorZ_get_ok(LDKCResult_UpdateFailHTLCDecodeErrorZ *NONNULL_PTR owner){
+       LDKUpdateFailHTLC ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UpdateFailHTLCDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* owner_conv = (LDKCResult_UpdateFailHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKUpdateFailHTLC ret_var = CResult_UpdateFailHTLCDecodeErrorZ_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_UpdateFailHTLCDecodeErrorZ_get_err(LDKCResult_UpdateFailHTLCDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UpdateFailHTLCDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* owner_conv = (LDKCResult_UpdateFailHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UpdateFailHTLCDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKUpdateFailMalformedHTLC CResult_UpdateFailMalformedHTLCDecodeErrorZ_get_ok(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ *NONNULL_PTR owner){
+       LDKUpdateFailMalformedHTLC ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UpdateFailMalformedHTLCDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* owner_conv = (LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKUpdateFailMalformedHTLC ret_var = CResult_UpdateFailMalformedHTLCDecodeErrorZ_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_UpdateFailMalformedHTLCDecodeErrorZ_get_err(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UpdateFailMalformedHTLCDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* owner_conv = (LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UpdateFailMalformedHTLCDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKUpdateFee CResult_UpdateFeeDecodeErrorZ_get_ok(LDKCResult_UpdateFeeDecodeErrorZ *NONNULL_PTR owner){
+       LDKUpdateFee ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UpdateFeeDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UpdateFeeDecodeErrorZ* owner_conv = (LDKCResult_UpdateFeeDecodeErrorZ*)untag_ptr(owner);
+       LDKUpdateFee ret_var = CResult_UpdateFeeDecodeErrorZ_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_UpdateFeeDecodeErrorZ_get_err(LDKCResult_UpdateFeeDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UpdateFeeDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UpdateFeeDecodeErrorZ* owner_conv = (LDKCResult_UpdateFeeDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UpdateFeeDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKUpdateFulfillHTLC CResult_UpdateFulfillHTLCDecodeErrorZ_get_ok(LDKCResult_UpdateFulfillHTLCDecodeErrorZ *NONNULL_PTR owner){
+       LDKUpdateFulfillHTLC ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* owner_conv = (LDKCResult_UpdateFulfillHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKUpdateFulfillHTLC ret_var = CResult_UpdateFulfillHTLCDecodeErrorZ_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_UpdateFulfillHTLCDecodeErrorZ_get_err(LDKCResult_UpdateFulfillHTLCDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* owner_conv = (LDKCResult_UpdateFulfillHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UpdateFulfillHTLCDecodeErrorZ_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;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* owner_conv = (LDKCResult_UpdateAddHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKUpdateAddHTLC ret_var = CResult_UpdateAddHTLCDecodeErrorZ_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_UpdateAddHTLCDecodeErrorZ_get_err(LDKCResult_UpdateAddHTLCDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* owner_conv = (LDKCResult_UpdateAddHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UpdateAddHTLCDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKOnionMessage CResult_OnionMessageDecodeErrorZ_get_ok(LDKCResult_OnionMessageDecodeErrorZ *NONNULL_PTR owner){
+       LDKOnionMessage ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_OnionMessageDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_OnionMessageDecodeErrorZ* owner_conv = (LDKCResult_OnionMessageDecodeErrorZ*)untag_ptr(owner);
+       LDKOnionMessage ret_var = CResult_OnionMessageDecodeErrorZ_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_OnionMessageDecodeErrorZ_get_err(LDKCResult_OnionMessageDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_OnionMessageDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_OnionMessageDecodeErrorZ* owner_conv = (LDKCResult_OnionMessageDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_OnionMessageDecodeErrorZ_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;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PingDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PingDecodeErrorZ* owner_conv = (LDKCResult_PingDecodeErrorZ*)untag_ptr(owner);
+       LDKPing ret_var = CResult_PingDecodeErrorZ_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_PingDecodeErrorZ_get_err(LDKCResult_PingDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PingDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PingDecodeErrorZ* owner_conv = (LDKCResult_PingDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PingDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKPong CResult_PongDecodeErrorZ_get_ok(LDKCResult_PongDecodeErrorZ *NONNULL_PTR owner){
+       LDKPong ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PongDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PongDecodeErrorZ* owner_conv = (LDKCResult_PongDecodeErrorZ*)untag_ptr(owner);
+       LDKPong ret_var = CResult_PongDecodeErrorZ_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_PongDecodeErrorZ_get_err(LDKCResult_PongDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PongDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PongDecodeErrorZ* owner_conv = (LDKCResult_PongDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PongDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKUnsignedChannelAnnouncement CResult_UnsignedChannelAnnouncementDecodeErrorZ_get_ok(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ *NONNULL_PTR owner){
+       LDKUnsignedChannelAnnouncement ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UnsignedChannelAnnouncementDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* owner_conv = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)untag_ptr(owner);
+       LDKUnsignedChannelAnnouncement ret_var = CResult_UnsignedChannelAnnouncementDecodeErrorZ_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_UnsignedChannelAnnouncementDecodeErrorZ_get_err(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UnsignedChannelAnnouncementDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* owner_conv = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UnsignedChannelAnnouncementDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelAnnouncement CResult_ChannelAnnouncementDecodeErrorZ_get_ok(LDKCResult_ChannelAnnouncementDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelAnnouncement ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelAnnouncementDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* owner_conv = (LDKCResult_ChannelAnnouncementDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelAnnouncement ret_var = CResult_ChannelAnnouncementDecodeErrorZ_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_ChannelAnnouncementDecodeErrorZ_get_err(LDKCResult_ChannelAnnouncementDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelAnnouncementDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* owner_conv = (LDKCResult_ChannelAnnouncementDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelAnnouncementDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKUnsignedChannelUpdate CResult_UnsignedChannelUpdateDecodeErrorZ_get_ok(LDKCResult_UnsignedChannelUpdateDecodeErrorZ *NONNULL_PTR owner){
+       LDKUnsignedChannelUpdate ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UnsignedChannelUpdateDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* owner_conv = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)untag_ptr(owner);
+       LDKUnsignedChannelUpdate ret_var = CResult_UnsignedChannelUpdateDecodeErrorZ_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_UnsignedChannelUpdateDecodeErrorZ_get_err(LDKCResult_UnsignedChannelUpdateDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UnsignedChannelUpdateDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* owner_conv = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UnsignedChannelUpdateDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelUpdate CResult_ChannelUpdateDecodeErrorZ_get_ok(LDKCResult_ChannelUpdateDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelUpdate ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelUpdateDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelUpdateDecodeErrorZ* owner_conv = (LDKCResult_ChannelUpdateDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelUpdate ret_var = CResult_ChannelUpdateDecodeErrorZ_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_ChannelUpdateDecodeErrorZ_get_err(LDKCResult_ChannelUpdateDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelUpdateDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelUpdateDecodeErrorZ* owner_conv = (LDKCResult_ChannelUpdateDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelUpdateDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKErrorMessage CResult_ErrorMessageDecodeErrorZ_get_ok(LDKCResult_ErrorMessageDecodeErrorZ *NONNULL_PTR owner){
+       LDKErrorMessage ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ErrorMessageDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ErrorMessageDecodeErrorZ* owner_conv = (LDKCResult_ErrorMessageDecodeErrorZ*)untag_ptr(owner);
+       LDKErrorMessage ret_var = CResult_ErrorMessageDecodeErrorZ_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_ErrorMessageDecodeErrorZ_get_err(LDKCResult_ErrorMessageDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ErrorMessageDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ErrorMessageDecodeErrorZ* owner_conv = (LDKCResult_ErrorMessageDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ErrorMessageDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKWarningMessage CResult_WarningMessageDecodeErrorZ_get_ok(LDKCResult_WarningMessageDecodeErrorZ *NONNULL_PTR owner){
+       LDKWarningMessage ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_WarningMessageDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_WarningMessageDecodeErrorZ* owner_conv = (LDKCResult_WarningMessageDecodeErrorZ*)untag_ptr(owner);
+       LDKWarningMessage ret_var = CResult_WarningMessageDecodeErrorZ_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_WarningMessageDecodeErrorZ_get_err(LDKCResult_WarningMessageDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_WarningMessageDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_WarningMessageDecodeErrorZ* owner_conv = (LDKCResult_WarningMessageDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_WarningMessageDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKUnsignedNodeAnnouncement CResult_UnsignedNodeAnnouncementDecodeErrorZ_get_ok(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ *NONNULL_PTR owner){
+       LDKUnsignedNodeAnnouncement ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UnsignedNodeAnnouncementDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* owner_conv = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)untag_ptr(owner);
+       LDKUnsignedNodeAnnouncement ret_var = CResult_UnsignedNodeAnnouncementDecodeErrorZ_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_UnsignedNodeAnnouncementDecodeErrorZ_get_err(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UnsignedNodeAnnouncementDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* owner_conv = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UnsignedNodeAnnouncementDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKNodeAnnouncement CResult_NodeAnnouncementDecodeErrorZ_get_ok(LDKCResult_NodeAnnouncementDecodeErrorZ *NONNULL_PTR owner){
+       LDKNodeAnnouncement ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NodeAnnouncementDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NodeAnnouncementDecodeErrorZ* owner_conv = (LDKCResult_NodeAnnouncementDecodeErrorZ*)untag_ptr(owner);
+       LDKNodeAnnouncement ret_var = CResult_NodeAnnouncementDecodeErrorZ_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_NodeAnnouncementDecodeErrorZ_get_err(LDKCResult_NodeAnnouncementDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NodeAnnouncementDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_NodeAnnouncementDecodeErrorZ* owner_conv = (LDKCResult_NodeAnnouncementDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_NodeAnnouncementDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKQueryShortChannelIds CResult_QueryShortChannelIdsDecodeErrorZ_get_ok(LDKCResult_QueryShortChannelIdsDecodeErrorZ *NONNULL_PTR owner){
+       LDKQueryShortChannelIds ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_QueryShortChannelIdsDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* owner_conv = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)untag_ptr(owner);
+       LDKQueryShortChannelIds ret_var = CResult_QueryShortChannelIdsDecodeErrorZ_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_QueryShortChannelIdsDecodeErrorZ_get_err(LDKCResult_QueryShortChannelIdsDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_QueryShortChannelIdsDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* owner_conv = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_QueryShortChannelIdsDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKReplyShortChannelIdsEnd CResult_ReplyShortChannelIdsEndDecodeErrorZ_get_ok(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ *NONNULL_PTR owner){
+       LDKReplyShortChannelIdsEnd ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ReplyShortChannelIdsEndDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* owner_conv = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)untag_ptr(owner);
+       LDKReplyShortChannelIdsEnd ret_var = CResult_ReplyShortChannelIdsEndDecodeErrorZ_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_ReplyShortChannelIdsEndDecodeErrorZ_get_err(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ReplyShortChannelIdsEndDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* owner_conv = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ReplyShortChannelIdsEndDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKQueryChannelRange CResult_QueryChannelRangeDecodeErrorZ_get_ok(LDKCResult_QueryChannelRangeDecodeErrorZ *NONNULL_PTR owner){
+       LDKQueryChannelRange ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_QueryChannelRangeDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_QueryChannelRangeDecodeErrorZ* owner_conv = (LDKCResult_QueryChannelRangeDecodeErrorZ*)untag_ptr(owner);
+       LDKQueryChannelRange ret_var = CResult_QueryChannelRangeDecodeErrorZ_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_QueryChannelRangeDecodeErrorZ_get_err(LDKCResult_QueryChannelRangeDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_QueryChannelRangeDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_QueryChannelRangeDecodeErrorZ* owner_conv = (LDKCResult_QueryChannelRangeDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_QueryChannelRangeDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKReplyChannelRange CResult_ReplyChannelRangeDecodeErrorZ_get_ok(LDKCResult_ReplyChannelRangeDecodeErrorZ *NONNULL_PTR owner){
+       LDKReplyChannelRange ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ReplyChannelRangeDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* owner_conv = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)untag_ptr(owner);
+       LDKReplyChannelRange ret_var = CResult_ReplyChannelRangeDecodeErrorZ_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_ReplyChannelRangeDecodeErrorZ_get_err(LDKCResult_ReplyChannelRangeDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ReplyChannelRangeDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* owner_conv = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ReplyChannelRangeDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKGossipTimestampFilter CResult_GossipTimestampFilterDecodeErrorZ_get_ok(LDKCResult_GossipTimestampFilterDecodeErrorZ *NONNULL_PTR owner){
+       LDKGossipTimestampFilter ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* owner_conv = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)untag_ptr(owner);
+       LDKGossipTimestampFilter ret_var = CResult_GossipTimestampFilterDecodeErrorZ_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_GossipTimestampFilterDecodeErrorZ_get_err(LDKCResult_GossipTimestampFilterDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* owner_conv = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_GossipTimestampFilterDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_PhantomRouteHintsZ CVec_PhantomRouteHintsZ_clone(const LDKCVec_PhantomRouteHintsZ *orig) {
+       LDKCVec_PhantomRouteHintsZ ret = { .data = MALLOC(sizeof(LDKPhantomRouteHints) * orig->datalen, "LDKCVec_PhantomRouteHintsZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = PhantomRouteHints_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKSignOrCreationError_ty_from_ptr(int64_t ptr) {
+       LDKSignOrCreationError *obj = (LDKSignOrCreationError*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKSignOrCreationError_SignError: return 0;
+               case LDKSignOrCreationError_CreationError: return 1;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKSignOrCreationError_CreationError_get_creation_error(int64_t ptr) {
+       LDKSignOrCreationError *obj = (LDKSignOrCreationError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSignOrCreationError_CreationError);
+       int32_t creation_error_conv = LDKCreationError_to_cs(obj->creation_error);
+       return creation_error_conv;
+}
+static inline struct LDKBolt11Invoice CResult_Bolt11InvoiceSignOrCreationErrorZ_get_ok(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ *NONNULL_PTR owner){
+       LDKBolt11Invoice ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_get_ok(int64_t owner) {
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* owner_conv = (LDKCResult_Bolt11InvoiceSignOrCreationErrorZ*)untag_ptr(owner);
+       LDKBolt11Invoice ret_var = CResult_Bolt11InvoiceSignOrCreationErrorZ_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 LDKSignOrCreationError CResult_Bolt11InvoiceSignOrCreationErrorZ_get_err(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return SignOrCreationError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_get_err(int64_t owner) {
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* owner_conv = (LDKCResult_Bolt11InvoiceSignOrCreationErrorZ*)untag_ptr(owner);
+       LDKSignOrCreationError *ret_copy = MALLOC(sizeof(LDKSignOrCreationError), "LDKSignOrCreationError");
+       *ret_copy = CResult_Bolt11InvoiceSignOrCreationErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_FutureZ CVec_FutureZ_clone(const LDKCVec_FutureZ *orig) {
+       LDKCVec_FutureZ ret = { .data = MALLOC(sizeof(LDKFuture) * orig->datalen, "LDKCVec_FutureZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = Future_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKOffersMessage CResult_OffersMessageDecodeErrorZ_get_ok(LDKCResult_OffersMessageDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return OffersMessage_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_OffersMessageDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_OffersMessageDecodeErrorZ* owner_conv = (LDKCResult_OffersMessageDecodeErrorZ*)untag_ptr(owner);
+       LDKOffersMessage *ret_copy = MALLOC(sizeof(LDKOffersMessage), "LDKOffersMessage");
+       *ret_copy = CResult_OffersMessageDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_OffersMessageDecodeErrorZ_get_err(LDKCResult_OffersMessageDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_OffersMessageDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_OffersMessageDecodeErrorZ* owner_conv = (LDKCResult_OffersMessageDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_OffersMessageDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKCOption_HTLCClaimZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_HTLCClaimZ *obj = (LDKCOption_HTLCClaimZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_HTLCClaimZ_Some: return 0;
+               case LDKCOption_HTLCClaimZ_None: return 1;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKCOption_HTLCClaimZ_Some_get_some(int64_t ptr) {
+       LDKCOption_HTLCClaimZ *obj = (LDKCOption_HTLCClaimZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_HTLCClaimZ_Some);
+       int32_t some_conv = LDKHTLCClaim_to_cs(obj->some);
+       return some_conv;
+}
+static inline struct LDKCounterpartyCommitmentSecrets CResult_CounterpartyCommitmentSecretsDecodeErrorZ_get_ok(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ *NONNULL_PTR owner){
+       LDKCounterpartyCommitmentSecrets ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_CounterpartyCommitmentSecretsDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* owner_conv = (LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ*)untag_ptr(owner);
+       LDKCounterpartyCommitmentSecrets ret_var = CResult_CounterpartyCommitmentSecretsDecodeErrorZ_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_CounterpartyCommitmentSecretsDecodeErrorZ_get_err(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_CounterpartyCommitmentSecretsDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* owner_conv = (LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_CounterpartyCommitmentSecretsDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxCreationKeys CResult_TxCreationKeysDecodeErrorZ_get_ok(LDKCResult_TxCreationKeysDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxCreationKeys ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxCreationKeysDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxCreationKeysDecodeErrorZ* owner_conv = (LDKCResult_TxCreationKeysDecodeErrorZ*)untag_ptr(owner);
+       LDKTxCreationKeys ret_var = CResult_TxCreationKeysDecodeErrorZ_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_TxCreationKeysDecodeErrorZ_get_err(LDKCResult_TxCreationKeysDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxCreationKeysDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxCreationKeysDecodeErrorZ* owner_conv = (LDKCResult_TxCreationKeysDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxCreationKeysDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelPublicKeys CResult_ChannelPublicKeysDecodeErrorZ_get_ok(LDKCResult_ChannelPublicKeysDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelPublicKeys ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelPublicKeysDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* owner_conv = (LDKCResult_ChannelPublicKeysDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelPublicKeys ret_var = CResult_ChannelPublicKeysDecodeErrorZ_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_ChannelPublicKeysDecodeErrorZ_get_err(LDKCResult_ChannelPublicKeysDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelPublicKeysDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* owner_conv = (LDKCResult_ChannelPublicKeysDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelPublicKeysDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKHTLCOutputInCommitment CResult_HTLCOutputInCommitmentDecodeErrorZ_get_ok(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ *NONNULL_PTR owner){
+       LDKHTLCOutputInCommitment ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_HTLCOutputInCommitmentDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* owner_conv = (LDKCResult_HTLCOutputInCommitmentDecodeErrorZ*)untag_ptr(owner);
+       LDKHTLCOutputInCommitment ret_var = CResult_HTLCOutputInCommitmentDecodeErrorZ_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_HTLCOutputInCommitmentDecodeErrorZ_get_err(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_HTLCOutputInCommitmentDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* owner_conv = (LDKCResult_HTLCOutputInCommitmentDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_HTLCOutputInCommitmentDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKCounterpartyChannelTransactionParameters CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_get_ok(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ *NONNULL_PTR owner){
+       LDKCounterpartyChannelTransactionParameters ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* owner_conv = (LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKCounterpartyChannelTransactionParameters ret_var = CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_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_CounterpartyChannelTransactionParametersDecodeErrorZ_get_err(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* owner_conv = (LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelTransactionParameters CResult_ChannelTransactionParametersDecodeErrorZ_get_ok(LDKCResult_ChannelTransactionParametersDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelTransactionParameters ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelTransactionParametersDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* owner_conv = (LDKCResult_ChannelTransactionParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelTransactionParameters ret_var = CResult_ChannelTransactionParametersDecodeErrorZ_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_ChannelTransactionParametersDecodeErrorZ_get_err(LDKCResult_ChannelTransactionParametersDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelTransactionParametersDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* owner_conv = (LDKCResult_ChannelTransactionParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelTransactionParametersDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKHolderCommitmentTransaction CResult_HolderCommitmentTransactionDecodeErrorZ_get_ok(LDKCResult_HolderCommitmentTransactionDecodeErrorZ *NONNULL_PTR owner){
+       LDKHolderCommitmentTransaction ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_HolderCommitmentTransactionDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* owner_conv = (LDKCResult_HolderCommitmentTransactionDecodeErrorZ*)untag_ptr(owner);
+       LDKHolderCommitmentTransaction ret_var = CResult_HolderCommitmentTransactionDecodeErrorZ_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_HolderCommitmentTransactionDecodeErrorZ_get_err(LDKCResult_HolderCommitmentTransactionDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_HolderCommitmentTransactionDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* owner_conv = (LDKCResult_HolderCommitmentTransactionDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_HolderCommitmentTransactionDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBuiltCommitmentTransaction CResult_BuiltCommitmentTransactionDecodeErrorZ_get_ok(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ *NONNULL_PTR owner){
+       LDKBuiltCommitmentTransaction ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BuiltCommitmentTransactionDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* owner_conv = (LDKCResult_BuiltCommitmentTransactionDecodeErrorZ*)untag_ptr(owner);
+       LDKBuiltCommitmentTransaction ret_var = CResult_BuiltCommitmentTransactionDecodeErrorZ_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_BuiltCommitmentTransactionDecodeErrorZ_get_err(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BuiltCommitmentTransactionDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* owner_conv = (LDKCResult_BuiltCommitmentTransactionDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BuiltCommitmentTransactionDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTrustedClosingTransaction CResult_TrustedClosingTransactionNoneZ_get_ok(LDKCResult_TrustedClosingTransactionNoneZ *NONNULL_PTR owner){
+       LDKTrustedClosingTransaction ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TrustedClosingTransactionNoneZ_get_ok(int64_t owner) {
+       LDKCResult_TrustedClosingTransactionNoneZ* owner_conv = (LDKCResult_TrustedClosingTransactionNoneZ*)untag_ptr(owner);
+       LDKTrustedClosingTransaction ret_var = CResult_TrustedClosingTransactionNoneZ_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_TrustedClosingTransactionNoneZ_get_err(LDKCResult_TrustedClosingTransactionNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_TrustedClosingTransactionNoneZ_get_err(int64_t owner) {
+       LDKCResult_TrustedClosingTransactionNoneZ* owner_conv = (LDKCResult_TrustedClosingTransactionNoneZ*)untag_ptr(owner);
+       CResult_TrustedClosingTransactionNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKCommitmentTransaction CResult_CommitmentTransactionDecodeErrorZ_get_ok(LDKCResult_CommitmentTransactionDecodeErrorZ *NONNULL_PTR owner){
+       LDKCommitmentTransaction ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_CommitmentTransactionDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CommitmentTransactionDecodeErrorZ* owner_conv = (LDKCResult_CommitmentTransactionDecodeErrorZ*)untag_ptr(owner);
+       LDKCommitmentTransaction ret_var = CResult_CommitmentTransactionDecodeErrorZ_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_CommitmentTransactionDecodeErrorZ_get_err(LDKCResult_CommitmentTransactionDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_CommitmentTransactionDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_CommitmentTransactionDecodeErrorZ* owner_conv = (LDKCResult_CommitmentTransactionDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_CommitmentTransactionDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTrustedCommitmentTransaction CResult_TrustedCommitmentTransactionNoneZ_get_ok(LDKCResult_TrustedCommitmentTransactionNoneZ *NONNULL_PTR owner){
+       LDKTrustedCommitmentTransaction ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TrustedCommitmentTransactionNoneZ_get_ok(int64_t owner) {
+       LDKCResult_TrustedCommitmentTransactionNoneZ* owner_conv = (LDKCResult_TrustedCommitmentTransactionNoneZ*)untag_ptr(owner);
+       LDKTrustedCommitmentTransaction ret_var = CResult_TrustedCommitmentTransactionNoneZ_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_TrustedCommitmentTransactionNoneZ_get_err(LDKCResult_TrustedCommitmentTransactionNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_TrustedCommitmentTransactionNoneZ_get_err(int64_t owner) {
+       LDKCResult_TrustedCommitmentTransactionNoneZ* owner_conv = (LDKCResult_TrustedCommitmentTransactionNoneZ*)untag_ptr(owner);
+       CResult_TrustedCommitmentTransactionNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKCVec_ECDSASignatureZ CResult_CVec_ECDSASignatureZNoneZ_get_ok(LDKCResult_CVec_ECDSASignatureZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+ptrArray  CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_ECDSASignatureZNoneZ* owner_conv = (LDKCResult_CVec_ECDSASignatureZNoneZ*)untag_ptr(owner);
+       LDKCVec_ECDSASignatureZ ret_var = CResult_CVec_ECDSASignatureZNoneZ_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++) {
+               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 void CResult_CVec_ECDSASignatureZNoneZ_get_err(LDKCResult_CVec_ECDSASignatureZNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_get_err(int64_t owner) {
+       LDKCResult_CVec_ECDSASignatureZNoneZ* owner_conv = (LDKCResult_CVec_ECDSASignatureZNoneZ*)untag_ptr(owner);
+       CResult_CVec_ECDSASignatureZNoneZ_get_err(owner_conv);
+}
+
+uint32_t CS_LDK_LDKCOption_usizeZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_usizeZ *obj = (LDKCOption_usizeZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_usizeZ_Some: return 0;
+               case LDKCOption_usizeZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_usizeZ_Some_get_some(int64_t ptr) {
+       LDKCOption_usizeZ *obj = (LDKCOption_usizeZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_usizeZ_Some);
+       int64_t some_conv = obj->some;
+       return some_conv;
+}
+static inline struct LDKShutdownScript CResult_ShutdownScriptDecodeErrorZ_get_ok(LDKCResult_ShutdownScriptDecodeErrorZ *NONNULL_PTR owner){
+       LDKShutdownScript ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ShutdownScriptDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ShutdownScriptDecodeErrorZ* owner_conv = (LDKCResult_ShutdownScriptDecodeErrorZ*)untag_ptr(owner);
+       LDKShutdownScript ret_var = CResult_ShutdownScriptDecodeErrorZ_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_ShutdownScriptDecodeErrorZ_get_err(LDKCResult_ShutdownScriptDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ShutdownScriptDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ShutdownScriptDecodeErrorZ* owner_conv = (LDKCResult_ShutdownScriptDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ShutdownScriptDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKShutdownScript CResult_ShutdownScriptInvalidShutdownScriptZ_get_ok(LDKCResult_ShutdownScriptInvalidShutdownScriptZ *NONNULL_PTR owner){
+       LDKShutdownScript ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_get_ok(int64_t owner) {
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* owner_conv = (LDKCResult_ShutdownScriptInvalidShutdownScriptZ*)untag_ptr(owner);
+       LDKShutdownScript ret_var = CResult_ShutdownScriptInvalidShutdownScriptZ_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 LDKInvalidShutdownScript CResult_ShutdownScriptInvalidShutdownScriptZ_get_err(LDKCResult_ShutdownScriptInvalidShutdownScriptZ *NONNULL_PTR owner){
+       LDKInvalidShutdownScript ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_get_err(int64_t owner) {
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* owner_conv = (LDKCResult_ShutdownScriptInvalidShutdownScriptZ*)untag_ptr(owner);
+       LDKInvalidShutdownScript ret_var = CResult_ShutdownScriptInvalidShutdownScriptZ_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;
+}
+
+uint32_t CS_LDK_LDKPaymentPurpose_ty_from_ptr(int64_t ptr) {
+       LDKPaymentPurpose *obj = (LDKPaymentPurpose*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKPaymentPurpose_InvoicePayment: return 0;
+               case LDKPaymentPurpose_SpontaneousPayment: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKPaymentPurpose_InvoicePayment_get_payment_preimage(int64_t ptr) {
+       LDKPaymentPurpose *obj = (LDKPaymentPurpose*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentPurpose_InvoicePayment);
+       int64_t payment_preimage_ref = tag_ptr(&obj->invoice_payment.payment_preimage, false);
+       return payment_preimage_ref;
+}
+int8_tArray CS_LDK_LDKPaymentPurpose_InvoicePayment_get_payment_secret(int64_t ptr) {
+       LDKPaymentPurpose *obj = (LDKPaymentPurpose*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentPurpose_InvoicePayment);
+       int8_tArray payment_secret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_secret_arr->elems, obj->invoice_payment.payment_secret.data, 32);
+       return payment_secret_arr;
+}
+int8_tArray CS_LDK_LDKPaymentPurpose_SpontaneousPayment_get_spontaneous_payment(int64_t ptr) {
+       LDKPaymentPurpose *obj = (LDKPaymentPurpose*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentPurpose_SpontaneousPayment);
+       int8_tArray spontaneous_payment_arr = init_int8_tArray(32, __LINE__);
+       memcpy(spontaneous_payment_arr->elems, obj->spontaneous_payment.data, 32);
+       return spontaneous_payment_arr;
+}
+static inline struct LDKPaymentPurpose CResult_PaymentPurposeDecodeErrorZ_get_ok(LDKCResult_PaymentPurposeDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return PaymentPurpose_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_PaymentPurposeDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PaymentPurposeDecodeErrorZ* owner_conv = (LDKCResult_PaymentPurposeDecodeErrorZ*)untag_ptr(owner);
+       LDKPaymentPurpose *ret_copy = MALLOC(sizeof(LDKPaymentPurpose), "LDKPaymentPurpose");
+       *ret_copy = CResult_PaymentPurposeDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_PaymentPurposeDecodeErrorZ_get_err(LDKCResult_PaymentPurposeDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PaymentPurposeDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PaymentPurposeDecodeErrorZ* owner_conv = (LDKCResult_PaymentPurposeDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PaymentPurposeDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKClaimedHTLC CResult_ClaimedHTLCDecodeErrorZ_get_ok(LDKCResult_ClaimedHTLCDecodeErrorZ *NONNULL_PTR owner){
+       LDKClaimedHTLC ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ClaimedHTLCDecodeErrorZ* owner_conv = (LDKCResult_ClaimedHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKClaimedHTLC ret_var = CResult_ClaimedHTLCDecodeErrorZ_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_ClaimedHTLCDecodeErrorZ_get_err(LDKCResult_ClaimedHTLCDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ClaimedHTLCDecodeErrorZ* owner_conv = (LDKCResult_ClaimedHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ClaimedHTLCDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKPathFailure_ty_from_ptr(int64_t ptr) {
+       LDKPathFailure *obj = (LDKPathFailure*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKPathFailure_InitialSend: return 0;
+               case LDKPathFailure_OnPath: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKPathFailure_InitialSend_get_err(int64_t ptr) {
+       LDKPathFailure *obj = (LDKPathFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPathFailure_InitialSend);
+       int64_t err_ref = tag_ptr(&obj->initial_send.err, false);
+       return err_ref;
+}
+int64_t CS_LDK_LDKPathFailure_OnPath_get_network_update(int64_t ptr) {
+       LDKPathFailure *obj = (LDKPathFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPathFailure_OnPath);
+       int64_t network_update_ref = tag_ptr(&obj->on_path.network_update, false);
+       return network_update_ref;
+}
+uint32_t CS_LDK_LDKCOption_PathFailureZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_PathFailureZ *obj = (LDKCOption_PathFailureZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_PathFailureZ_Some: return 0;
+               case LDKCOption_PathFailureZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_PathFailureZ_Some_get_some(int64_t ptr) {
+       LDKCOption_PathFailureZ *obj = (LDKCOption_PathFailureZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_PathFailureZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+static inline struct LDKCOption_PathFailureZ CResult_COption_PathFailureZDecodeErrorZ_get_ok(LDKCResult_COption_PathFailureZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_PathFailureZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_PathFailureZDecodeErrorZ* owner_conv = (LDKCResult_COption_PathFailureZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_PathFailureZ *ret_copy = MALLOC(sizeof(LDKCOption_PathFailureZ), "LDKCOption_PathFailureZ");
+       *ret_copy = CResult_COption_PathFailureZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_PathFailureZDecodeErrorZ_get_err(LDKCResult_COption_PathFailureZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_PathFailureZDecodeErrorZ* owner_conv = (LDKCResult_COption_PathFailureZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_PathFailureZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKClosureReason_ty_from_ptr(int64_t ptr) {
+       LDKClosureReason *obj = (LDKClosureReason*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKClosureReason_CounterpartyForceClosed: return 0;
+               case LDKClosureReason_HolderForceClosed: return 1;
+               case LDKClosureReason_CooperativeClosure: return 2;
+               case LDKClosureReason_CommitmentTxConfirmed: return 3;
+               case LDKClosureReason_FundingTimedOut: return 4;
+               case LDKClosureReason_ProcessingError: return 5;
+               case LDKClosureReason_DisconnectedPeer: return 6;
+               case LDKClosureReason_OutdatedChannelManager: return 7;
+               case LDKClosureReason_CounterpartyCoopClosedUnfundedChannel: return 8;
+               case LDKClosureReason_FundingBatchClosure: return 9;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKClosureReason_CounterpartyForceClosed_get_peer_msg(int64_t ptr) {
+       LDKClosureReason *obj = (LDKClosureReason*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKClosureReason_CounterpartyForceClosed);
+       LDKUntrustedString peer_msg_var = obj->counterparty_force_closed.peer_msg;
+                       int64_t peer_msg_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(peer_msg_var);
+                       peer_msg_ref = tag_ptr(peer_msg_var.inner, false);
+       return peer_msg_ref;
+}
+jstring CS_LDK_LDKClosureReason_ProcessingError_get_err(int64_t ptr) {
+       LDKClosureReason *obj = (LDKClosureReason*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKClosureReason_ProcessingError);
+       LDKStr err_str = obj->processing_error.err;
+                       jstring err_conv = str_ref_to_cs(err_str.chars, err_str.len);
+       return err_conv;
+}
+uint32_t CS_LDK_LDKCOption_ClosureReasonZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_ClosureReasonZ *obj = (LDKCOption_ClosureReasonZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_ClosureReasonZ_Some: return 0;
+               case LDKCOption_ClosureReasonZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_ClosureReasonZ_Some_get_some(int64_t ptr) {
+       LDKCOption_ClosureReasonZ *obj = (LDKCOption_ClosureReasonZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_ClosureReasonZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+static inline struct LDKCOption_ClosureReasonZ CResult_COption_ClosureReasonZDecodeErrorZ_get_ok(LDKCResult_COption_ClosureReasonZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_ClosureReasonZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* owner_conv = (LDKCResult_COption_ClosureReasonZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_ClosureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_ClosureReasonZ), "LDKCOption_ClosureReasonZ");
+       *ret_copy = CResult_COption_ClosureReasonZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_ClosureReasonZDecodeErrorZ_get_err(LDKCResult_COption_ClosureReasonZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* owner_conv = (LDKCResult_COption_ClosureReasonZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_ClosureReasonZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKHTLCDestination_ty_from_ptr(int64_t ptr) {
+       LDKHTLCDestination *obj = (LDKHTLCDestination*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKHTLCDestination_NextHopChannel: return 0;
+               case LDKHTLCDestination_UnknownNextHop: return 1;
+               case LDKHTLCDestination_InvalidForward: return 2;
+               case LDKHTLCDestination_FailedPayment: return 3;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKHTLCDestination_NextHopChannel_get_node_id(int64_t ptr) {
+       LDKHTLCDestination *obj = (LDKHTLCDestination*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKHTLCDestination_NextHopChannel);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->next_hop_channel.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int8_tArray CS_LDK_LDKHTLCDestination_NextHopChannel_get_channel_id(int64_t ptr) {
+       LDKHTLCDestination *obj = (LDKHTLCDestination*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKHTLCDestination_NextHopChannel);
+       int8_tArray channel_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(channel_id_arr->elems, obj->next_hop_channel.channel_id.data, 32);
+       return channel_id_arr;
+}
+int64_t CS_LDK_LDKHTLCDestination_UnknownNextHop_get_requested_forward_scid(int64_t ptr) {
+       LDKHTLCDestination *obj = (LDKHTLCDestination*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKHTLCDestination_UnknownNextHop);
+       int64_t requested_forward_scid_conv = obj->unknown_next_hop.requested_forward_scid;
+       return requested_forward_scid_conv;
+}
+int64_t CS_LDK_LDKHTLCDestination_InvalidForward_get_requested_forward_scid(int64_t ptr) {
+       LDKHTLCDestination *obj = (LDKHTLCDestination*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKHTLCDestination_InvalidForward);
+       int64_t requested_forward_scid_conv = obj->invalid_forward.requested_forward_scid;
+       return requested_forward_scid_conv;
+}
+int8_tArray CS_LDK_LDKHTLCDestination_FailedPayment_get_payment_hash(int64_t ptr) {
+       LDKHTLCDestination *obj = (LDKHTLCDestination*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKHTLCDestination_FailedPayment);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->failed_payment.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+uint32_t CS_LDK_LDKCOption_HTLCDestinationZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_HTLCDestinationZ *obj = (LDKCOption_HTLCDestinationZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_HTLCDestinationZ_Some: return 0;
+               case LDKCOption_HTLCDestinationZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_HTLCDestinationZ_Some_get_some(int64_t ptr) {
+       LDKCOption_HTLCDestinationZ *obj = (LDKCOption_HTLCDestinationZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_HTLCDestinationZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+static inline struct LDKCOption_HTLCDestinationZ CResult_COption_HTLCDestinationZDecodeErrorZ_get_ok(LDKCResult_COption_HTLCDestinationZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_HTLCDestinationZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_HTLCDestinationZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* owner_conv = (LDKCResult_COption_HTLCDestinationZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_HTLCDestinationZ *ret_copy = MALLOC(sizeof(LDKCOption_HTLCDestinationZ), "LDKCOption_HTLCDestinationZ");
+       *ret_copy = CResult_COption_HTLCDestinationZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_HTLCDestinationZDecodeErrorZ_get_err(LDKCResult_COption_HTLCDestinationZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_HTLCDestinationZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* owner_conv = (LDKCResult_COption_HTLCDestinationZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_HTLCDestinationZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline enum LDKPaymentFailureReason CResult_PaymentFailureReasonDecodeErrorZ_get_ok(LDKCResult_PaymentFailureReasonDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return PaymentFailureReason_clone(&*owner->contents.result);
+}
+int32_t  CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* owner_conv = (LDKCResult_PaymentFailureReasonDecodeErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKPaymentFailureReason_to_cs(CResult_PaymentFailureReasonDecodeErrorZ_get_ok(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKDecodeError CResult_PaymentFailureReasonDecodeErrorZ_get_err(LDKCResult_PaymentFailureReasonDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* owner_conv = (LDKCResult_PaymentFailureReasonDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PaymentFailureReasonDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKCOption_U128Z_ty_from_ptr(int64_t ptr) {
+       LDKCOption_U128Z *obj = (LDKCOption_U128Z*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_U128Z_Some: return 0;
+               case LDKCOption_U128Z_None: return 1;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKCOption_U128Z_Some_get_some(int64_t ptr) {
+       LDKCOption_U128Z *obj = (LDKCOption_U128Z*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_U128Z_Some);
+       int8_tArray some_arr = init_int8_tArray(16, __LINE__);
+       memcpy(some_arr->elems, obj->some.le_bytes, 16);
+       return some_arr;
+}
+static inline LDKCVec_ClaimedHTLCZ CVec_ClaimedHTLCZ_clone(const LDKCVec_ClaimedHTLCZ *orig) {
+       LDKCVec_ClaimedHTLCZ ret = { .data = MALLOC(sizeof(LDKClaimedHTLC) * orig->datalen, "LDKCVec_ClaimedHTLCZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = ClaimedHTLC_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKCOption_PaymentFailureReasonZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_PaymentFailureReasonZ *obj = (LDKCOption_PaymentFailureReasonZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_PaymentFailureReasonZ_Some: return 0;
+               case LDKCOption_PaymentFailureReasonZ_None: return 1;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKCOption_PaymentFailureReasonZ_Some_get_some(int64_t ptr) {
+       LDKCOption_PaymentFailureReasonZ *obj = (LDKCOption_PaymentFailureReasonZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_PaymentFailureReasonZ_Some);
+       int32_t some_conv = LDKPaymentFailureReason_to_cs(obj->some);
+       return some_conv;
+}
+uint32_t CS_LDK_LDKBumpTransactionEvent_ty_from_ptr(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKBumpTransactionEvent_ChannelClose: return 0;
+               case LDKBumpTransactionEvent_HTLCResolution: return 1;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_claim_id(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_ChannelClose);
+       int8_tArray claim_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(claim_id_arr->elems, obj->channel_close.claim_id.data, 32);
+       return claim_id_arr;
+}
+int32_t CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_package_target_feerate_sat_per_1000_weight(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_ChannelClose);
+       int32_t package_target_feerate_sat_per_1000_weight_conv = obj->channel_close.package_target_feerate_sat_per_1000_weight;
+       return package_target_feerate_sat_per_1000_weight_conv;
+}
+int8_tArray CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_commitment_tx(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_ChannelClose);
+       LDKTransaction commitment_tx_var = obj->channel_close.commitment_tx;
+                       int8_tArray commitment_tx_arr = init_int8_tArray(commitment_tx_var.datalen, __LINE__);
+                       memcpy(commitment_tx_arr->elems, commitment_tx_var.data, commitment_tx_var.datalen);
+       return commitment_tx_arr;
+}
+int64_t CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_commitment_tx_fee_satoshis(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_ChannelClose);
+       int64_t commitment_tx_fee_satoshis_conv = obj->channel_close.commitment_tx_fee_satoshis;
+       return commitment_tx_fee_satoshis_conv;
+}
+int64_t CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_anchor_descriptor(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_ChannelClose);
+       LDKAnchorDescriptor anchor_descriptor_var = obj->channel_close.anchor_descriptor;
+                       int64_t anchor_descriptor_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(anchor_descriptor_var);
+                       anchor_descriptor_ref = tag_ptr(anchor_descriptor_var.inner, false);
+       return anchor_descriptor_ref;
+}
+int64_tArray CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_pending_htlcs(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_ChannelClose);
+       LDKCVec_HTLCOutputInCommitmentZ pending_htlcs_var = obj->channel_close.pending_htlcs;
+                       int64_tArray pending_htlcs_arr = NULL;
+                       pending_htlcs_arr = init_int64_tArray(pending_htlcs_var.datalen, __LINE__);
+                       int64_t *pending_htlcs_arr_ptr = (int64_t*)(((uint8_t*)pending_htlcs_arr) + 8);
+                       for (size_t y = 0; y < pending_htlcs_var.datalen; y++) {
+                               LDKHTLCOutputInCommitment pending_htlcs_conv_24_var = pending_htlcs_var.data[y];
+                               int64_t pending_htlcs_conv_24_ref = 0;
+                               CHECK_INNER_FIELD_ACCESS_OR_NULL(pending_htlcs_conv_24_var);
+                               pending_htlcs_conv_24_ref = tag_ptr(pending_htlcs_conv_24_var.inner, false);
+                               pending_htlcs_arr_ptr[y] = pending_htlcs_conv_24_ref;
+                       }
+                       
+       return pending_htlcs_arr;
+}
+int8_tArray CS_LDK_LDKBumpTransactionEvent_HTLCResolution_get_claim_id(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_HTLCResolution);
+       int8_tArray claim_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(claim_id_arr->elems, obj->htlc_resolution.claim_id.data, 32);
+       return claim_id_arr;
+}
+int32_t CS_LDK_LDKBumpTransactionEvent_HTLCResolution_get_target_feerate_sat_per_1000_weight(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_HTLCResolution);
+       int32_t target_feerate_sat_per_1000_weight_conv = obj->htlc_resolution.target_feerate_sat_per_1000_weight;
+       return target_feerate_sat_per_1000_weight_conv;
+}
+int64_tArray CS_LDK_LDKBumpTransactionEvent_HTLCResolution_get_htlc_descriptors(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_HTLCResolution);
+       LDKCVec_HTLCDescriptorZ htlc_descriptors_var = obj->htlc_resolution.htlc_descriptors;
+                       int64_tArray htlc_descriptors_arr = NULL;
+                       htlc_descriptors_arr = init_int64_tArray(htlc_descriptors_var.datalen, __LINE__);
+                       int64_t *htlc_descriptors_arr_ptr = (int64_t*)(((uint8_t*)htlc_descriptors_arr) + 8);
+                       for (size_t q = 0; q < htlc_descriptors_var.datalen; q++) {
+                               LDKHTLCDescriptor htlc_descriptors_conv_16_var = htlc_descriptors_var.data[q];
+                               int64_t htlc_descriptors_conv_16_ref = 0;
+                               CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_descriptors_conv_16_var);
+                               htlc_descriptors_conv_16_ref = tag_ptr(htlc_descriptors_conv_16_var.inner, false);
+                               htlc_descriptors_arr_ptr[q] = htlc_descriptors_conv_16_ref;
+                       }
+                       
+       return htlc_descriptors_arr;
+}
+int32_t CS_LDK_LDKBumpTransactionEvent_HTLCResolution_get_tx_lock_time(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_HTLCResolution);
+       int32_t tx_lock_time_conv = obj->htlc_resolution.tx_lock_time;
+       return tx_lock_time_conv;
+}
+uint32_t CS_LDK_LDKEvent_ty_from_ptr(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       switch(obj->tag) {
+               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;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKEvent_FundingGenerationReady_get_temporary_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_FundingGenerationReady);
+       int8_tArray temporary_channel_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(temporary_channel_id_arr->elems, obj->funding_generation_ready.temporary_channel_id.data, 32);
+       return temporary_channel_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_FundingGenerationReady_get_counterparty_node_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_FundingGenerationReady);
+       int8_tArray counterparty_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(counterparty_node_id_arr->elems, obj->funding_generation_ready.counterparty_node_id.compressed_form, 33);
+       return counterparty_node_id_arr;
+}
+int64_t CS_LDK_LDKEvent_FundingGenerationReady_get_channel_value_satoshis(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_FundingGenerationReady);
+       int64_t channel_value_satoshis_conv = obj->funding_generation_ready.channel_value_satoshis;
+       return channel_value_satoshis_conv;
+}
+int8_tArray CS_LDK_LDKEvent_FundingGenerationReady_get_output_script(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_FundingGenerationReady);
+       LDKCVec_u8Z output_script_var = obj->funding_generation_ready.output_script;
+                       int8_tArray output_script_arr = init_int8_tArray(output_script_var.datalen, __LINE__);
+                       memcpy(output_script_arr->elems, output_script_var.data, output_script_var.datalen);
+       return output_script_arr;
+}
+int8_tArray CS_LDK_LDKEvent_FundingGenerationReady_get_user_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_FundingGenerationReady);
+       int8_tArray user_channel_id_arr = init_int8_tArray(16, __LINE__);
+       memcpy(user_channel_id_arr->elems, obj->funding_generation_ready.user_channel_id.le_bytes, 16);
+       return user_channel_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentClaimable_get_receiver_node_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       int8_tArray receiver_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(receiver_node_id_arr->elems, obj->payment_claimable.receiver_node_id.compressed_form, 33);
+       return receiver_node_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentClaimable_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->payment_claimable.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimable_get_onion_fields(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       LDKRecipientOnionFields onion_fields_var = obj->payment_claimable.onion_fields;
+                       int64_t onion_fields_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(onion_fields_var);
+                       onion_fields_ref = tag_ptr(onion_fields_var.inner, false);
+       return onion_fields_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimable_get_amount_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       int64_t amount_msat_conv = obj->payment_claimable.amount_msat;
+       return amount_msat_conv;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimable_get_counterparty_skimmed_fee_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       int64_t counterparty_skimmed_fee_msat_conv = obj->payment_claimable.counterparty_skimmed_fee_msat;
+       return counterparty_skimmed_fee_msat_conv;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimable_get_purpose(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       int64_t purpose_ref = tag_ptr(&obj->payment_claimable.purpose, false);
+       return purpose_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimable_get_via_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       int64_t via_channel_id_ref = tag_ptr(&obj->payment_claimable.via_channel_id, false);
+       return via_channel_id_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimable_get_via_user_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       int64_t via_user_channel_id_ref = tag_ptr(&obj->payment_claimable.via_user_channel_id, false);
+       return via_user_channel_id_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimable_get_claim_deadline(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       int64_t claim_deadline_ref = tag_ptr(&obj->payment_claimable.claim_deadline, false);
+       return claim_deadline_ref;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentClaimed_get_receiver_node_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimed);
+       int8_tArray receiver_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(receiver_node_id_arr->elems, obj->payment_claimed.receiver_node_id.compressed_form, 33);
+       return receiver_node_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentClaimed_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimed);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->payment_claimed.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimed_get_amount_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimed);
+       int64_t amount_msat_conv = obj->payment_claimed.amount_msat;
+       return amount_msat_conv;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimed_get_purpose(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimed);
+       int64_t purpose_ref = tag_ptr(&obj->payment_claimed.purpose, false);
+       return purpose_ref;
+}
+int64_tArray CS_LDK_LDKEvent_PaymentClaimed_get_htlcs(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimed);
+       LDKCVec_ClaimedHTLCZ htlcs_var = obj->payment_claimed.htlcs;
+                       int64_tArray htlcs_arr = NULL;
+                       htlcs_arr = init_int64_tArray(htlcs_var.datalen, __LINE__);
+                       int64_t *htlcs_arr_ptr = (int64_t*)(((uint8_t*)htlcs_arr) + 8);
+                       for (size_t n = 0; n < htlcs_var.datalen; n++) {
+                               LDKClaimedHTLC htlcs_conv_13_var = htlcs_var.data[n];
+                               int64_t htlcs_conv_13_ref = 0;
+                               CHECK_INNER_FIELD_ACCESS_OR_NULL(htlcs_conv_13_var);
+                               htlcs_conv_13_ref = tag_ptr(htlcs_conv_13_var.inner, false);
+                               htlcs_arr_ptr[n] = htlcs_conv_13_ref;
+                       }
+                       
+       return htlcs_arr;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimed_get_sender_intended_total_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimed);
+       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_InvoiceRequestFailed_get_payment_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_InvoiceRequestFailed);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->invoice_request_failed.payment_id.data, 32);
+       return payment_id_arr;
+}
+int64_t CS_LDK_LDKEvent_PaymentSent_get_payment_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentSent);
+       int64_t payment_id_ref = tag_ptr(&obj->payment_sent.payment_id, false);
+       return payment_id_ref;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentSent_get_payment_preimage(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentSent);
+       int8_tArray payment_preimage_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_preimage_arr->elems, obj->payment_sent.payment_preimage.data, 32);
+       return payment_preimage_arr;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentSent_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentSent);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->payment_sent.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKEvent_PaymentSent_get_fee_paid_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentSent);
+       int64_t fee_paid_msat_ref = tag_ptr(&obj->payment_sent.fee_paid_msat, false);
+       return fee_paid_msat_ref;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentFailed_get_payment_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentFailed);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->payment_failed.payment_id.data, 32);
+       return payment_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentFailed_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentFailed);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->payment_failed.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKEvent_PaymentFailed_get_reason(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentFailed);
+       int64_t reason_ref = tag_ptr(&obj->payment_failed.reason, false);
+       return reason_ref;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentPathSuccessful_get_payment_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathSuccessful);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->payment_path_successful.payment_id.data, 32);
+       return payment_id_arr;
+}
+int64_t CS_LDK_LDKEvent_PaymentPathSuccessful_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathSuccessful);
+       int64_t payment_hash_ref = tag_ptr(&obj->payment_path_successful.payment_hash, false);
+       return payment_hash_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentPathSuccessful_get_path(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathSuccessful);
+       LDKPath path_var = obj->payment_path_successful.path;
+                       int64_t path_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(path_var);
+                       path_ref = tag_ptr(path_var.inner, false);
+       return path_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentPathFailed_get_payment_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathFailed);
+       int64_t payment_id_ref = tag_ptr(&obj->payment_path_failed.payment_id, false);
+       return payment_id_ref;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentPathFailed_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathFailed);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->payment_path_failed.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+jboolean CS_LDK_LDKEvent_PaymentPathFailed_get_payment_failed_permanently(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathFailed);
+       jboolean payment_failed_permanently_conv = obj->payment_path_failed.payment_failed_permanently;
+       return payment_failed_permanently_conv;
+}
+int64_t CS_LDK_LDKEvent_PaymentPathFailed_get_failure(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathFailed);
+       int64_t failure_ref = tag_ptr(&obj->payment_path_failed.failure, false);
+       return failure_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentPathFailed_get_path(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathFailed);
+       LDKPath path_var = obj->payment_path_failed.path;
+                       int64_t path_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(path_var);
+                       path_ref = tag_ptr(path_var.inner, false);
+       return path_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentPathFailed_get_short_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathFailed);
+       int64_t short_channel_id_ref = tag_ptr(&obj->payment_path_failed.short_channel_id, false);
+       return short_channel_id_ref;
+}
+int8_tArray CS_LDK_LDKEvent_ProbeSuccessful_get_payment_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ProbeSuccessful);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->probe_successful.payment_id.data, 32);
+       return payment_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_ProbeSuccessful_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ProbeSuccessful);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->probe_successful.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKEvent_ProbeSuccessful_get_path(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ProbeSuccessful);
+       LDKPath path_var = obj->probe_successful.path;
+                       int64_t path_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(path_var);
+                       path_ref = tag_ptr(path_var.inner, false);
+       return path_ref;
+}
+int8_tArray CS_LDK_LDKEvent_ProbeFailed_get_payment_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ProbeFailed);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->probe_failed.payment_id.data, 32);
+       return payment_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_ProbeFailed_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ProbeFailed);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->probe_failed.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKEvent_ProbeFailed_get_path(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ProbeFailed);
+       LDKPath path_var = obj->probe_failed.path;
+                       int64_t path_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(path_var);
+                       path_ref = tag_ptr(path_var.inner, false);
+       return path_ref;
+}
+int64_t CS_LDK_LDKEvent_ProbeFailed_get_short_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ProbeFailed);
+       int64_t short_channel_id_ref = tag_ptr(&obj->probe_failed.short_channel_id, false);
+       return short_channel_id_ref;
+}
+int64_t CS_LDK_LDKEvent_PendingHTLCsForwardable_get_time_forwardable(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PendingHTLCsForwardable);
+       int64_t time_forwardable_conv = obj->pending_htl_cs_forwardable.time_forwardable;
+       return time_forwardable_conv;
+}
+int8_tArray CS_LDK_LDKEvent_HTLCIntercepted_get_intercept_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_HTLCIntercepted);
+       int8_tArray intercept_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(intercept_id_arr->elems, obj->htlc_intercepted.intercept_id.data, 32);
+       return intercept_id_arr;
+}
+int64_t CS_LDK_LDKEvent_HTLCIntercepted_get_requested_next_hop_scid(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_HTLCIntercepted);
+       int64_t requested_next_hop_scid_conv = obj->htlc_intercepted.requested_next_hop_scid;
+       return requested_next_hop_scid_conv;
+}
+int8_tArray CS_LDK_LDKEvent_HTLCIntercepted_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_HTLCIntercepted);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->htlc_intercepted.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKEvent_HTLCIntercepted_get_inbound_amount_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_HTLCIntercepted);
+       int64_t inbound_amount_msat_conv = obj->htlc_intercepted.inbound_amount_msat;
+       return inbound_amount_msat_conv;
+}
+int64_t CS_LDK_LDKEvent_HTLCIntercepted_get_expected_outbound_amount_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_HTLCIntercepted);
+       int64_t expected_outbound_amount_msat_conv = obj->htlc_intercepted.expected_outbound_amount_msat;
+       return expected_outbound_amount_msat_conv;
+}
+int64_tArray CS_LDK_LDKEvent_SpendableOutputs_get_outputs(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_SpendableOutputs);
+       LDKCVec_SpendableOutputDescriptorZ outputs_var = obj->spendable_outputs.outputs;
+                       int64_tArray outputs_arr = NULL;
+                       outputs_arr = init_int64_tArray(outputs_var.datalen, __LINE__);
+                       int64_t *outputs_arr_ptr = (int64_t*)(((uint8_t*)outputs_arr) + 8);
+                       for (size_t b = 0; b < outputs_var.datalen; b++) {
+                               int64_t outputs_conv_27_ref = tag_ptr(&outputs_var.data[b], false);
+                               outputs_arr_ptr[b] = outputs_conv_27_ref;
+                       }
+                       
+       return outputs_arr;
+}
+int64_t CS_LDK_LDKEvent_SpendableOutputs_get_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_SpendableOutputs);
+       int64_t channel_id_ref = tag_ptr(&obj->spendable_outputs.channel_id, false);
+       return channel_id_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentForwarded_get_prev_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentForwarded);
+       int64_t prev_channel_id_ref = tag_ptr(&obj->payment_forwarded.prev_channel_id, false);
+       return prev_channel_id_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentForwarded_get_next_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentForwarded);
+       int64_t next_channel_id_ref = tag_ptr(&obj->payment_forwarded.next_channel_id, false);
+       return next_channel_id_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentForwarded_get_fee_earned_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentForwarded);
+       int64_t fee_earned_msat_ref = tag_ptr(&obj->payment_forwarded.fee_earned_msat, false);
+       return fee_earned_msat_ref;
+}
+jboolean CS_LDK_LDKEvent_PaymentForwarded_get_claim_from_onchain_tx(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentForwarded);
+       jboolean claim_from_onchain_tx_conv = obj->payment_forwarded.claim_from_onchain_tx;
+       return claim_from_onchain_tx_conv;
+}
+int64_t CS_LDK_LDKEvent_PaymentForwarded_get_outbound_amount_forwarded_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentForwarded);
+       int64_t outbound_amount_forwarded_msat_ref = tag_ptr(&obj->payment_forwarded.outbound_amount_forwarded_msat, false);
+       return outbound_amount_forwarded_msat_ref;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelPending_get_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelPending);
+       int8_tArray channel_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(channel_id_arr->elems, obj->channel_pending.channel_id.data, 32);
+       return channel_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelPending_get_user_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelPending);
+       int8_tArray user_channel_id_arr = init_int8_tArray(16, __LINE__);
+       memcpy(user_channel_id_arr->elems, obj->channel_pending.user_channel_id.le_bytes, 16);
+       return user_channel_id_arr;
+}
+int64_t CS_LDK_LDKEvent_ChannelPending_get_former_temporary_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelPending);
+       int64_t former_temporary_channel_id_ref = tag_ptr(&obj->channel_pending.former_temporary_channel_id, false);
+       return former_temporary_channel_id_ref;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelPending_get_counterparty_node_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelPending);
+       int8_tArray counterparty_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(counterparty_node_id_arr->elems, obj->channel_pending.counterparty_node_id.compressed_form, 33);
+       return counterparty_node_id_arr;
+}
+int64_t CS_LDK_LDKEvent_ChannelPending_get_funding_txo(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelPending);
+       LDKOutPoint funding_txo_var = obj->channel_pending.funding_txo;
+                       int64_t funding_txo_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_var);
+                       funding_txo_ref = tag_ptr(funding_txo_var.inner, false);
+       return funding_txo_ref;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelReady_get_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelReady);
+       int8_tArray channel_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(channel_id_arr->elems, obj->channel_ready.channel_id.data, 32);
+       return channel_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelReady_get_user_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelReady);
+       int8_tArray user_channel_id_arr = init_int8_tArray(16, __LINE__);
+       memcpy(user_channel_id_arr->elems, obj->channel_ready.user_channel_id.le_bytes, 16);
+       return user_channel_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelReady_get_counterparty_node_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelReady);
+       int8_tArray counterparty_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(counterparty_node_id_arr->elems, obj->channel_ready.counterparty_node_id.compressed_form, 33);
+       return counterparty_node_id_arr;
+}
+int64_t CS_LDK_LDKEvent_ChannelReady_get_channel_type(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelReady);
+       LDKChannelTypeFeatures channel_type_var = obj->channel_ready.channel_type;
+                       int64_t channel_type_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_var);
+                       channel_type_ref = tag_ptr(channel_type_var.inner, false);
+       return channel_type_ref;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelClosed_get_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelClosed);
+       int8_tArray channel_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(channel_id_arr->elems, obj->channel_closed.channel_id.data, 32);
+       return channel_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelClosed_get_user_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelClosed);
+       int8_tArray user_channel_id_arr = init_int8_tArray(16, __LINE__);
+       memcpy(user_channel_id_arr->elems, obj->channel_closed.user_channel_id.le_bytes, 16);
+       return user_channel_id_arr;
+}
+int64_t CS_LDK_LDKEvent_ChannelClosed_get_reason(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelClosed);
+       int64_t reason_ref = tag_ptr(&obj->channel_closed.reason, false);
+       return reason_ref;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelClosed_get_counterparty_node_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelClosed);
+       int8_tArray counterparty_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(counterparty_node_id_arr->elems, obj->channel_closed.counterparty_node_id.compressed_form, 33);
+       return counterparty_node_id_arr;
+}
+int64_t CS_LDK_LDKEvent_ChannelClosed_get_channel_capacity_sats(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelClosed);
+       int64_t channel_capacity_sats_ref = tag_ptr(&obj->channel_closed.channel_capacity_sats, false);
+       return channel_capacity_sats_ref;
+}
+int8_tArray CS_LDK_LDKEvent_DiscardFunding_get_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_DiscardFunding);
+       int8_tArray channel_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(channel_id_arr->elems, obj->discard_funding.channel_id.data, 32);
+       return channel_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_DiscardFunding_get_transaction(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_DiscardFunding);
+       LDKTransaction transaction_var = obj->discard_funding.transaction;
+                       int8_tArray transaction_arr = init_int8_tArray(transaction_var.datalen, __LINE__);
+                       memcpy(transaction_arr->elems, transaction_var.data, transaction_var.datalen);
+       return transaction_arr;
+}
+int8_tArray CS_LDK_LDKEvent_OpenChannelRequest_get_temporary_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_OpenChannelRequest);
+       int8_tArray temporary_channel_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(temporary_channel_id_arr->elems, obj->open_channel_request.temporary_channel_id.data, 32);
+       return temporary_channel_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_OpenChannelRequest_get_counterparty_node_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_OpenChannelRequest);
+       int8_tArray counterparty_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(counterparty_node_id_arr->elems, obj->open_channel_request.counterparty_node_id.compressed_form, 33);
+       return counterparty_node_id_arr;
+}
+int64_t CS_LDK_LDKEvent_OpenChannelRequest_get_funding_satoshis(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_OpenChannelRequest);
+       int64_t funding_satoshis_conv = obj->open_channel_request.funding_satoshis;
+       return funding_satoshis_conv;
+}
+int64_t CS_LDK_LDKEvent_OpenChannelRequest_get_push_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_OpenChannelRequest);
+       int64_t push_msat_conv = obj->open_channel_request.push_msat;
+       return push_msat_conv;
+}
+int64_t CS_LDK_LDKEvent_OpenChannelRequest_get_channel_type(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_OpenChannelRequest);
+       LDKChannelTypeFeatures channel_type_var = obj->open_channel_request.channel_type;
+                       int64_t channel_type_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_var);
+                       channel_type_ref = tag_ptr(channel_type_var.inner, false);
+       return channel_type_ref;
+}
+int8_tArray CS_LDK_LDKEvent_HTLCHandlingFailed_get_prev_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_HTLCHandlingFailed);
+       int8_tArray prev_channel_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(prev_channel_id_arr->elems, obj->htlc_handling_failed.prev_channel_id.data, 32);
+       return prev_channel_id_arr;
+}
+int64_t CS_LDK_LDKEvent_HTLCHandlingFailed_get_failed_next_destination(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_HTLCHandlingFailed);
+       int64_t failed_next_destination_ref = tag_ptr(&obj->htlc_handling_failed.failed_next_destination, false);
+       return failed_next_destination_ref;
+}
+int64_t CS_LDK_LDKEvent_BumpTransaction_get_bump_transaction(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_BumpTransaction);
+       int64_t bump_transaction_ref = tag_ptr(&obj->bump_transaction, false);
+       return bump_transaction_ref;
+}
+uint32_t CS_LDK_LDKCOption_EventZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_EventZ *obj = (LDKCOption_EventZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_EventZ_Some: return 0;
+               case LDKCOption_EventZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_EventZ_Some_get_some(int64_t ptr) {
+       LDKCOption_EventZ *obj = (LDKCOption_EventZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_EventZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+static inline struct LDKCOption_EventZ CResult_COption_EventZDecodeErrorZ_get_ok(LDKCResult_COption_EventZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_EventZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_EventZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_EventZDecodeErrorZ* owner_conv = (LDKCResult_COption_EventZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_EventZ *ret_copy = MALLOC(sizeof(LDKCOption_EventZ), "LDKCOption_EventZ");
+       *ret_copy = CResult_COption_EventZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_EventZDecodeErrorZ_get_err(LDKCResult_COption_EventZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_EventZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_EventZDecodeErrorZ* owner_conv = (LDKCResult_COption_EventZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_EventZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKBolt11ParseError_ty_from_ptr(int64_t ptr) {
+       LDKBolt11ParseError *obj = (LDKBolt11ParseError*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKBolt11ParseError_Bech32Error: return 0;
+               case LDKBolt11ParseError_ParseAmountError: return 1;
+               case LDKBolt11ParseError_MalformedSignature: return 2;
+               case LDKBolt11ParseError_BadPrefix: return 3;
+               case LDKBolt11ParseError_UnknownCurrency: return 4;
+               case LDKBolt11ParseError_UnknownSiPrefix: return 5;
+               case LDKBolt11ParseError_MalformedHRP: return 6;
+               case LDKBolt11ParseError_TooShortDataPart: return 7;
+               case LDKBolt11ParseError_UnexpectedEndOfTaggedFields: return 8;
+               case LDKBolt11ParseError_DescriptionDecodeError: return 9;
+               case LDKBolt11ParseError_PaddingError: return 10;
+               case LDKBolt11ParseError_IntegerOverflowError: return 11;
+               case LDKBolt11ParseError_InvalidSegWitProgramLength: return 12;
+               case LDKBolt11ParseError_InvalidPubKeyHashLength: return 13;
+               case LDKBolt11ParseError_InvalidScriptHashLength: return 14;
+               case LDKBolt11ParseError_InvalidRecoveryId: return 15;
+               case LDKBolt11ParseError_InvalidSliceLength: return 16;
+               case LDKBolt11ParseError_Skip: return 17;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKBolt11ParseError_Bech32Error_get_bech32_error(int64_t ptr) {
+       LDKBolt11ParseError *obj = (LDKBolt11ParseError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBolt11ParseError_Bech32Error);
+       int64_t bech32_error_ref = tag_ptr(&obj->bech32_error, false);
+       return bech32_error_ref;
+}
+int32_t CS_LDK_LDKBolt11ParseError_ParseAmountError_get_parse_amount_error(int64_t ptr) {
+       LDKBolt11ParseError *obj = (LDKBolt11ParseError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBolt11ParseError_ParseAmountError);
+       /*obj->parse_amount_error*/
+       return 0;
+}
+int32_t CS_LDK_LDKBolt11ParseError_MalformedSignature_get_malformed_signature(int64_t ptr) {
+       LDKBolt11ParseError *obj = (LDKBolt11ParseError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBolt11ParseError_MalformedSignature);
+       int32_t malformed_signature_conv = LDKSecp256k1Error_to_cs(obj->malformed_signature);
+       return malformed_signature_conv;
+}
+int32_t CS_LDK_LDKBolt11ParseError_DescriptionDecodeError_get_description_decode_error(int64_t ptr) {
+       LDKBolt11ParseError *obj = (LDKBolt11ParseError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBolt11ParseError_DescriptionDecodeError);
+       /*obj->description_decode_error*/
+       return 0;
+}
+jstring CS_LDK_LDKBolt11ParseError_InvalidSliceLength_get_invalid_slice_length(int64_t ptr) {
+       LDKBolt11ParseError *obj = (LDKBolt11ParseError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBolt11ParseError_InvalidSliceLength);
+       LDKStr invalid_slice_length_str = obj->invalid_slice_length;
+                       jstring invalid_slice_length_conv = str_ref_to_cs(invalid_slice_length_str.chars, invalid_slice_length_str.len);
+       return invalid_slice_length_conv;
+}
+static inline enum LDKSiPrefix CResult_SiPrefixBolt11ParseErrorZ_get_ok(LDKCResult_SiPrefixBolt11ParseErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return SiPrefix_clone(&*owner->contents.result);
+}
+int32_t  CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SiPrefixBolt11ParseErrorZ* owner_conv = (LDKCResult_SiPrefixBolt11ParseErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKSiPrefix_to_cs(CResult_SiPrefixBolt11ParseErrorZ_get_ok(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKBolt11ParseError CResult_SiPrefixBolt11ParseErrorZ_get_err(LDKCResult_SiPrefixBolt11ParseErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return Bolt11ParseError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_get_err(int64_t owner) {
+       LDKCResult_SiPrefixBolt11ParseErrorZ* owner_conv = (LDKCResult_SiPrefixBolt11ParseErrorZ*)untag_ptr(owner);
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = CResult_SiPrefixBolt11ParseErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKParseOrSemanticError_ty_from_ptr(int64_t ptr) {
+       LDKParseOrSemanticError *obj = (LDKParseOrSemanticError*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKParseOrSemanticError_ParseError: return 0;
+               case LDKParseOrSemanticError_SemanticError: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKParseOrSemanticError_ParseError_get_parse_error(int64_t ptr) {
+       LDKParseOrSemanticError *obj = (LDKParseOrSemanticError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKParseOrSemanticError_ParseError);
+       int64_t parse_error_ref = tag_ptr(&obj->parse_error, false);
+       return parse_error_ref;
+}
+int32_t CS_LDK_LDKParseOrSemanticError_SemanticError_get_semantic_error(int64_t ptr) {
+       LDKParseOrSemanticError *obj = (LDKParseOrSemanticError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKParseOrSemanticError_SemanticError);
+       int32_t semantic_error_conv = LDKBolt11SemanticError_to_cs(obj->semantic_error);
+       return semantic_error_conv;
+}
+static inline struct LDKBolt11Invoice CResult_Bolt11InvoiceParseOrSemanticErrorZ_get_ok(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ *NONNULL_PTR owner){
+       LDKBolt11Invoice ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceParseOrSemanticErrorZ_get_ok(int64_t owner) {
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* owner_conv = (LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ*)untag_ptr(owner);
+       LDKBolt11Invoice ret_var = CResult_Bolt11InvoiceParseOrSemanticErrorZ_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 LDKParseOrSemanticError CResult_Bolt11InvoiceParseOrSemanticErrorZ_get_err(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return ParseOrSemanticError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceParseOrSemanticErrorZ_get_err(int64_t owner) {
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* owner_conv = (LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ*)untag_ptr(owner);
+       LDKParseOrSemanticError *ret_copy = MALLOC(sizeof(LDKParseOrSemanticError), "LDKParseOrSemanticError");
+       *ret_copy = CResult_Bolt11InvoiceParseOrSemanticErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKSignedRawBolt11Invoice CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_get_ok(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ *NONNULL_PTR owner){
+       LDKSignedRawBolt11Invoice ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* owner_conv = (LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ*)untag_ptr(owner);
+       LDKSignedRawBolt11Invoice ret_var = CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_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 LDKBolt11ParseError CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_get_err(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return Bolt11ParseError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_get_err(int64_t owner) {
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* owner_conv = (LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ*)untag_ptr(owner);
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKRawBolt11Invoice C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_a(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ *NONNULL_PTR owner){
+       LDKRawBolt11Invoice ret = owner->a;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_a(int64_t owner) {
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* owner_conv = (LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ*)untag_ptr(owner);
+       LDKRawBolt11Invoice ret_var = C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_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 LDKThirtyTwoBytes C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_b(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->b);
+}
+int8_tArray  CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_b(int64_t owner) {
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* owner_conv = (LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_b(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKBolt11InvoiceSignature C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_c(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ *NONNULL_PTR owner){
+       LDKBolt11InvoiceSignature ret = owner->c;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_c(int64_t owner) {
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* owner_conv = (LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ*)untag_ptr(owner);
+       LDKBolt11InvoiceSignature ret_var = C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_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;
+}
+
+static inline struct LDKPayeePubKey CResult_PayeePubKeySecp256k1ErrorZ_get_ok(LDKCResult_PayeePubKeySecp256k1ErrorZ *NONNULL_PTR owner){
+       LDKPayeePubKey ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* owner_conv = (LDKCResult_PayeePubKeySecp256k1ErrorZ*)untag_ptr(owner);
+       LDKPayeePubKey ret_var = CResult_PayeePubKeySecp256k1ErrorZ_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 enum LDKSecp256k1Error CResult_PayeePubKeySecp256k1ErrorZ_get_err(LDKCResult_PayeePubKeySecp256k1ErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+int32_t  CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_get_err(int64_t owner) {
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* owner_conv = (LDKCResult_PayeePubKeySecp256k1ErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKSecp256k1Error_to_cs(CResult_PayeePubKeySecp256k1ErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline LDKCVec_PrivateRouteZ CVec_PrivateRouteZ_clone(const LDKCVec_PrivateRouteZ *orig) {
+       LDKCVec_PrivateRouteZ ret = { .data = MALLOC(sizeof(LDKPrivateRoute) * orig->datalen, "LDKCVec_PrivateRouteZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = PrivateRoute_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKPositiveTimestamp CResult_PositiveTimestampCreationErrorZ_get_ok(LDKCResult_PositiveTimestampCreationErrorZ *NONNULL_PTR owner){
+       LDKPositiveTimestamp ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PositiveTimestampCreationErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PositiveTimestampCreationErrorZ* owner_conv = (LDKCResult_PositiveTimestampCreationErrorZ*)untag_ptr(owner);
+       LDKPositiveTimestamp ret_var = CResult_PositiveTimestampCreationErrorZ_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 enum LDKCreationError CResult_PositiveTimestampCreationErrorZ_get_err(LDKCResult_PositiveTimestampCreationErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return CreationError_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_PositiveTimestampCreationErrorZ_get_err(int64_t owner) {
+       LDKCResult_PositiveTimestampCreationErrorZ* owner_conv = (LDKCResult_PositiveTimestampCreationErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKCreationError_to_cs(CResult_PositiveTimestampCreationErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline void CResult_NoneBolt11SemanticErrorZ_get_ok(LDKCResult_NoneBolt11SemanticErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NoneBolt11SemanticErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NoneBolt11SemanticErrorZ* owner_conv = (LDKCResult_NoneBolt11SemanticErrorZ*)untag_ptr(owner);
+       CResult_NoneBolt11SemanticErrorZ_get_ok(owner_conv);
+}
+
+static inline enum LDKBolt11SemanticError CResult_NoneBolt11SemanticErrorZ_get_err(LDKCResult_NoneBolt11SemanticErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return Bolt11SemanticError_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_NoneBolt11SemanticErrorZ_get_err(int64_t owner) {
+       LDKCResult_NoneBolt11SemanticErrorZ* owner_conv = (LDKCResult_NoneBolt11SemanticErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(CResult_NoneBolt11SemanticErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKBolt11Invoice CResult_Bolt11InvoiceBolt11SemanticErrorZ_get_ok(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ *NONNULL_PTR owner){
+       LDKBolt11Invoice ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_get_ok(int64_t owner) {
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* owner_conv = (LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ*)untag_ptr(owner);
+       LDKBolt11Invoice ret_var = CResult_Bolt11InvoiceBolt11SemanticErrorZ_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 enum LDKBolt11SemanticError CResult_Bolt11InvoiceBolt11SemanticErrorZ_get_err(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return Bolt11SemanticError_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_get_err(int64_t owner) {
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* owner_conv = (LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(CResult_Bolt11InvoiceBolt11SemanticErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKDescription CResult_DescriptionCreationErrorZ_get_ok(LDKCResult_DescriptionCreationErrorZ *NONNULL_PTR owner){
+       LDKDescription ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_DescriptionCreationErrorZ_get_ok(int64_t owner) {
+       LDKCResult_DescriptionCreationErrorZ* owner_conv = (LDKCResult_DescriptionCreationErrorZ*)untag_ptr(owner);
+       LDKDescription ret_var = CResult_DescriptionCreationErrorZ_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 enum LDKCreationError CResult_DescriptionCreationErrorZ_get_err(LDKCResult_DescriptionCreationErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return CreationError_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_DescriptionCreationErrorZ_get_err(int64_t owner) {
+       LDKCResult_DescriptionCreationErrorZ* owner_conv = (LDKCResult_DescriptionCreationErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKCreationError_to_cs(CResult_DescriptionCreationErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKPrivateRoute CResult_PrivateRouteCreationErrorZ_get_ok(LDKCResult_PrivateRouteCreationErrorZ *NONNULL_PTR owner){
+       LDKPrivateRoute ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PrivateRouteCreationErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PrivateRouteCreationErrorZ* owner_conv = (LDKCResult_PrivateRouteCreationErrorZ*)untag_ptr(owner);
+       LDKPrivateRoute ret_var = CResult_PrivateRouteCreationErrorZ_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 enum LDKCreationError CResult_PrivateRouteCreationErrorZ_get_err(LDKCResult_PrivateRouteCreationErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return CreationError_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_PrivateRouteCreationErrorZ_get_err(int64_t owner) {
+       LDKCResult_PrivateRouteCreationErrorZ* owner_conv = (LDKCResult_PrivateRouteCreationErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKCreationError_to_cs(CResult_PrivateRouteCreationErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKOutPoint CResult_OutPointDecodeErrorZ_get_ok(LDKCResult_OutPointDecodeErrorZ *NONNULL_PTR owner){
+       LDKOutPoint ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_OutPointDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_OutPointDecodeErrorZ* owner_conv = (LDKCResult_OutPointDecodeErrorZ*)untag_ptr(owner);
+       LDKOutPoint ret_var = CResult_OutPointDecodeErrorZ_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_OutPointDecodeErrorZ_get_err(LDKCResult_OutPointDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_OutPointDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_OutPointDecodeErrorZ* owner_conv = (LDKCResult_OutPointDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_OutPointDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBigSize CResult_BigSizeDecodeErrorZ_get_ok(LDKCResult_BigSizeDecodeErrorZ *NONNULL_PTR owner){
+       LDKBigSize ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BigSizeDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BigSizeDecodeErrorZ* owner_conv = (LDKCResult_BigSizeDecodeErrorZ*)untag_ptr(owner);
+       LDKBigSize ret_var = CResult_BigSizeDecodeErrorZ_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_BigSizeDecodeErrorZ_get_err(LDKCResult_BigSizeDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BigSizeDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BigSizeDecodeErrorZ* owner_conv = (LDKCResult_BigSizeDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BigSizeDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKHostname CResult_HostnameDecodeErrorZ_get_ok(LDKCResult_HostnameDecodeErrorZ *NONNULL_PTR owner){
+       LDKHostname ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_HostnameDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_HostnameDecodeErrorZ* owner_conv = (LDKCResult_HostnameDecodeErrorZ*)untag_ptr(owner);
+       LDKHostname ret_var = CResult_HostnameDecodeErrorZ_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_HostnameDecodeErrorZ_get_err(LDKCResult_HostnameDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_HostnameDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_HostnameDecodeErrorZ* owner_conv = (LDKCResult_HostnameDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_HostnameDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTransactionU16LenLimited CResult_TransactionU16LenLimitedNoneZ_get_ok(LDKCResult_TransactionU16LenLimitedNoneZ *NONNULL_PTR owner){
+       LDKTransactionU16LenLimited ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedNoneZ_get_ok(int64_t owner) {
+       LDKCResult_TransactionU16LenLimitedNoneZ* owner_conv = (LDKCResult_TransactionU16LenLimitedNoneZ*)untag_ptr(owner);
+       LDKTransactionU16LenLimited ret_var = CResult_TransactionU16LenLimitedNoneZ_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_TransactionU16LenLimitedNoneZ_get_err(LDKCResult_TransactionU16LenLimitedNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_TransactionU16LenLimitedNoneZ_get_err(int64_t owner) {
+       LDKCResult_TransactionU16LenLimitedNoneZ* owner_conv = (LDKCResult_TransactionU16LenLimitedNoneZ*)untag_ptr(owner);
+       CResult_TransactionU16LenLimitedNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKTransactionU16LenLimited CResult_TransactionU16LenLimitedDecodeErrorZ_get_ok(LDKCResult_TransactionU16LenLimitedDecodeErrorZ *NONNULL_PTR owner){
+       LDKTransactionU16LenLimited ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* owner_conv = (LDKCResult_TransactionU16LenLimitedDecodeErrorZ*)untag_ptr(owner);
+       LDKTransactionU16LenLimited ret_var = CResult_TransactionU16LenLimitedDecodeErrorZ_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_TransactionU16LenLimitedDecodeErrorZ_get_err(LDKCResult_TransactionU16LenLimitedDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* owner_conv = (LDKCResult_TransactionU16LenLimitedDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TransactionU16LenLimitedDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKUntrustedString CResult_UntrustedStringDecodeErrorZ_get_ok(LDKCResult_UntrustedStringDecodeErrorZ *NONNULL_PTR owner){
+       LDKUntrustedString ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UntrustedStringDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UntrustedStringDecodeErrorZ* owner_conv = (LDKCResult_UntrustedStringDecodeErrorZ*)untag_ptr(owner);
+       LDKUntrustedString ret_var = CResult_UntrustedStringDecodeErrorZ_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_UntrustedStringDecodeErrorZ_get_err(LDKCResult_UntrustedStringDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UntrustedStringDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UntrustedStringDecodeErrorZ* owner_conv = (LDKCResult_UntrustedStringDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UntrustedStringDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       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;
+}
+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;
+}
+
+static inline struct LDKDecodeError CResult_ReceiveTlvsDecodeErrorZ_get_err(LDKCResult_ReceiveTlvsDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+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;
+}
+
+static inline struct LDKPaymentRelay CResult_PaymentRelayDecodeErrorZ_get_ok(LDKCResult_PaymentRelayDecodeErrorZ *NONNULL_PTR owner){
+       LDKPaymentRelay ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PaymentRelayDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PaymentRelayDecodeErrorZ* owner_conv = (LDKCResult_PaymentRelayDecodeErrorZ*)untag_ptr(owner);
+       LDKPaymentRelay ret_var = CResult_PaymentRelayDecodeErrorZ_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_PaymentRelayDecodeErrorZ_get_err(LDKCResult_PaymentRelayDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PaymentRelayDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PaymentRelayDecodeErrorZ* owner_conv = (LDKCResult_PaymentRelayDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PaymentRelayDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKPaymentConstraints CResult_PaymentConstraintsDecodeErrorZ_get_ok(LDKCResult_PaymentConstraintsDecodeErrorZ *NONNULL_PTR owner){
+       LDKPaymentConstraints ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PaymentConstraintsDecodeErrorZ* owner_conv = (LDKCResult_PaymentConstraintsDecodeErrorZ*)untag_ptr(owner);
+       LDKPaymentConstraints ret_var = CResult_PaymentConstraintsDecodeErrorZ_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_PaymentConstraintsDecodeErrorZ_get_err(LDKCResult_PaymentConstraintsDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PaymentConstraintsDecodeErrorZ* owner_conv = (LDKCResult_PaymentConstraintsDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PaymentConstraintsDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       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);
+}
+int8_tArray  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesPaymentErrorZ* owner_conv = (LDKCResult_ThirtyTwoBytesPaymentErrorZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, CResult_ThirtyTwoBytesPaymentErrorZ_get_ok(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);
+}
+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);
+       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);
+}
+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);
+       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){
+CHECK(owner->result_ok);
+       return CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ_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;
+}
+
+static inline struct LDKProbingError CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_err(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return ProbingError_clone(&*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;
+}
+
+static inline struct LDKStr CResult_StrSecp256k1ErrorZ_get_ok(LDKCResult_StrSecp256k1ErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+jstring  CS_LDK_CResult_StrSecp256k1ErrorZ_get_ok(int64_t owner) {
+       LDKCResult_StrSecp256k1ErrorZ* owner_conv = (LDKCResult_StrSecp256k1ErrorZ*)untag_ptr(owner);
+       LDKStr ret_str = CResult_StrSecp256k1ErrorZ_get_ok(owner_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       return ret_conv;
+}
+
+static inline enum LDKSecp256k1Error CResult_StrSecp256k1ErrorZ_get_err(LDKCResult_StrSecp256k1ErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+int32_t  CS_LDK_CResult_StrSecp256k1ErrorZ_get_err(int64_t owner) {
+       LDKCResult_StrSecp256k1ErrorZ* owner_conv = (LDKCResult_StrSecp256k1ErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKSecp256k1Error_to_cs(CResult_StrSecp256k1ErrorZ_get_err(owner_conv));
+       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){
+       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 ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_PublicKeyOnionMessageZ_get_a(owner_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+static inline struct LDKOnionMessage C2Tuple_PublicKeyOnionMessageZ_get_b(LDKC2Tuple_PublicKeyOnionMessageZ *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 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_LDKSendError_ty_from_ptr(int64_t ptr) {
+       LDKSendError *obj = (LDKSendError*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKSendError_Secp256k1: return 0;
+               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;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKSendError_Secp256k1_get_secp256k1(int64_t ptr) {
+       LDKSendError *obj = (LDKSendError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSendError_Secp256k1);
+       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){
+CHECK(owner->result_ok);
+       return C2Tuple_PublicKeyOnionMessageZ_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);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline struct LDKSendError CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_err(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ *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);
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKParsedOnionMessageContents_ty_from_ptr(int64_t ptr) {
+       LDKParsedOnionMessageContents *obj = (LDKParsedOnionMessageContents*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKParsedOnionMessageContents_Offers: return 0;
+               case LDKParsedOnionMessageContents_Custom: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKParsedOnionMessageContents_Offers_get_offers(int64_t ptr) {
+       LDKParsedOnionMessageContents *obj = (LDKParsedOnionMessageContents*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKParsedOnionMessageContents_Offers);
+       int64_t offers_ref = tag_ptr(&obj->offers, false);
+       return offers_ref;
+}
+int64_t CS_LDK_LDKParsedOnionMessageContents_Custom_get_custom(int64_t ptr) {
+       LDKParsedOnionMessageContents *obj = (LDKParsedOnionMessageContents*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKParsedOnionMessageContents_Custom);
+       LDKOnionMessageContents* custom_ret = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
+       *custom_ret = OnionMessageContents_clone(&obj->custom);
+       return tag_ptr(custom_ret, true);
+}
+uint32_t CS_LDK_LDKPeeledOnion_ty_from_ptr(int64_t ptr) {
+       LDKPeeledOnion *obj = (LDKPeeledOnion*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKPeeledOnion_Forward: return 0;
+               case LDKPeeledOnion_Receive: return 1;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKPeeledOnion_Forward_get__0(int64_t ptr) {
+       LDKPeeledOnion *obj = (LDKPeeledOnion*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPeeledOnion_Forward);
+       int8_tArray _0_arr = init_int8_tArray(33, __LINE__);
+       memcpy(_0_arr->elems, obj->forward._0.compressed_form, 33);
+       return _0_arr;
+}
+int64_t CS_LDK_LDKPeeledOnion_Forward_get__1(int64_t ptr) {
+       LDKPeeledOnion *obj = (LDKPeeledOnion*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPeeledOnion_Forward);
+       LDKOnionMessage _1_var = obj->forward._1;
+                       int64_t _1_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(_1_var);
+                       _1_ref = tag_ptr(_1_var.inner, false);
+       return _1_ref;
+}
+int64_t CS_LDK_LDKPeeledOnion_Receive_get__0(int64_t ptr) {
+       LDKPeeledOnion *obj = (LDKPeeledOnion*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPeeledOnion_Receive);
+       int64_t _0_ref = tag_ptr(&obj->receive._0, false);
+       return _0_ref;
+}
+int8_tArray CS_LDK_LDKPeeledOnion_Receive_get__1(int64_t ptr) {
+       LDKPeeledOnion *obj = (LDKPeeledOnion*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPeeledOnion_Receive);
+       int8_tArray _1_arr = init_int8_tArray(32, __LINE__);
+       memcpy(_1_arr->elems, obj->receive._1.data, 32);
+       return _1_arr;
+}
+int64_t CS_LDK_LDKPeeledOnion_Receive_get__2(int64_t ptr) {
+       LDKPeeledOnion *obj = (LDKPeeledOnion*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPeeledOnion_Receive);
+       LDKBlindedPath _2_var = obj->receive._2;
+                       int64_t _2_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(_2_var);
+                       _2_ref = tag_ptr(_2_var.inner, false);
+       return _2_ref;
+}
+static inline struct LDKPeeledOnion CResult_PeeledOnionNoneZ_get_ok(LDKCResult_PeeledOnionNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return PeeledOnion_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_PeeledOnionNoneZ_get_ok(int64_t owner) {
+       LDKCResult_PeeledOnionNoneZ* owner_conv = (LDKCResult_PeeledOnionNoneZ*)untag_ptr(owner);
+       LDKPeeledOnion *ret_copy = MALLOC(sizeof(LDKPeeledOnion), "LDKPeeledOnion");
+       *ret_copy = CResult_PeeledOnionNoneZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline void CResult_PeeledOnionNoneZ_get_err(LDKCResult_PeeledOnionNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_PeeledOnionNoneZ_get_err(int64_t owner) {
+       LDKCResult_PeeledOnionNoneZ* owner_conv = (LDKCResult_PeeledOnionNoneZ*)untag_ptr(owner);
+       CResult_PeeledOnionNoneZ_get_err(owner_conv);
+}
+
+static inline void CResult_NoneSendErrorZ_get_ok(LDKCResult_NoneSendErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *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);
+}
+
+static inline struct LDKSendError CResult_NoneSendErrorZ_get_err(LDKCResult_NoneSendErrorZ *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);
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = CResult_NoneSendErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBlindedPath CResult_BlindedPathNoneZ_get_ok(LDKCResult_BlindedPathNoneZ *NONNULL_PTR owner){
+       LDKBlindedPath ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BlindedPathNoneZ_get_ok(int64_t owner) {
+       LDKCResult_BlindedPathNoneZ* owner_conv = (LDKCResult_BlindedPathNoneZ*)untag_ptr(owner);
+       LDKBlindedPath ret_var = CResult_BlindedPathNoneZ_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_BlindedPathNoneZ_get_err(LDKCResult_BlindedPathNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_BlindedPathNoneZ_get_err(int64_t owner) {
+       LDKCResult_BlindedPathNoneZ* owner_conv = (LDKCResult_BlindedPathNoneZ*)untag_ptr(owner);
+       CResult_BlindedPathNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKC2Tuple_BlindedPayInfoBlindedPathZ CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_ok(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return C2Tuple_BlindedPayInfoBlindedPathZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* owner_conv = (LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ*)untag_ptr(owner);
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
+       *ret_conv = CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_ok(owner_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline void CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_err(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_err(int64_t owner) {
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* owner_conv = (LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ*)untag_ptr(owner);
+       CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKBlindedPath CResult_BlindedPathDecodeErrorZ_get_ok(LDKCResult_BlindedPathDecodeErrorZ *NONNULL_PTR owner){
+       LDKBlindedPath ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BlindedPathDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BlindedPathDecodeErrorZ* owner_conv = (LDKCResult_BlindedPathDecodeErrorZ*)untag_ptr(owner);
+       LDKBlindedPath ret_var = CResult_BlindedPathDecodeErrorZ_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_BlindedPathDecodeErrorZ_get_err(LDKCResult_BlindedPathDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BlindedPathDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BlindedPathDecodeErrorZ* owner_conv = (LDKCResult_BlindedPathDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BlindedPathDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBlindedHop CResult_BlindedHopDecodeErrorZ_get_ok(LDKCResult_BlindedHopDecodeErrorZ *NONNULL_PTR owner){
+       LDKBlindedHop ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BlindedHopDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BlindedHopDecodeErrorZ* owner_conv = (LDKCResult_BlindedHopDecodeErrorZ*)untag_ptr(owner);
+       LDKBlindedHop ret_var = CResult_BlindedHopDecodeErrorZ_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_BlindedHopDecodeErrorZ_get_err(LDKCResult_BlindedHopDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BlindedHopDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BlindedHopDecodeErrorZ* owner_conv = (LDKCResult_BlindedHopDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BlindedHopDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKInvoiceError CResult_InvoiceErrorDecodeErrorZ_get_ok(LDKCResult_InvoiceErrorDecodeErrorZ *NONNULL_PTR owner){
+       LDKInvoiceError ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_InvoiceErrorDecodeErrorZ* owner_conv = (LDKCResult_InvoiceErrorDecodeErrorZ*)untag_ptr(owner);
+       LDKInvoiceError ret_var = CResult_InvoiceErrorDecodeErrorZ_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_InvoiceErrorDecodeErrorZ_get_err(LDKCResult_InvoiceErrorDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_InvoiceErrorDecodeErrorZ* owner_conv = (LDKCResult_InvoiceErrorDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_InvoiceErrorDecodeErrorZ_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;
+} LDKFilter_JCalls;
+static void LDKFilter_JCalls_free(void* this_arg) {
+       LDKFilter_JCalls *j_calls = (LDKFilter_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void register_tx_LDKFilter_jcall(const void* this_arg, const uint8_t (* txid)[32], LDKu8slice script_pubkey) {
+       LDKFilter_JCalls *j_calls = (LDKFilter_JCalls*) this_arg;
+       int8_tArray txid_arr = init_int8_tArray(32, __LINE__);
+       memcpy(txid_arr->elems, *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);
+}
+void register_output_LDKFilter_jcall(const void* this_arg, LDKWatchedOutput output) {
+       LDKFilter_JCalls *j_calls = (LDKFilter_JCalls*) this_arg;
+       LDKWatchedOutput output_var = output;
+       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);
+}
+static void LDKFilter_JCalls_cloned(LDKFilter* new_obj) {
+       LDKFilter_JCalls *j_calls = (LDKFilter_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKFilter LDKFilter_init (int64_t o) {
+       LDKFilter_JCalls *calls = MALLOC(sizeof(LDKFilter_JCalls), "LDKFilter_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKFilter ret = {
+               .this_arg = (void*) calls,
+               .register_tx = register_tx_LDKFilter_jcall,
+               .register_output = register_output_LDKFilter_jcall,
+               .free = LDKFilter_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKFilter_new(int32_t o) {
+       LDKFilter *res_ptr = MALLOC(sizeof(LDKFilter), "LDKFilter");
+       *res_ptr = LDKFilter_init(o);
+       return tag_ptr(res_ptr, true);
+}
+void  CS_LDK_Filter_register_tx(int64_t this_arg, int8_tArray txid, int8_tArray script_pubkey) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKFilter* this_arg_conv = (LDKFilter*)this_arg_ptr;
+       uint8_t txid_arr[32];
+       CHECK(txid->arr_len == 32);
+       memcpy(txid_arr, txid->elems, 32); FREE(txid);
+       uint8_t (*txid_ref)[32] = &txid_arr;
+       LDKu8slice script_pubkey_ref;
+       script_pubkey_ref.datalen = script_pubkey->arr_len;
+       script_pubkey_ref.data = script_pubkey->elems;
+       (this_arg_conv->register_tx)(this_arg_conv->this_arg, txid_ref, script_pubkey_ref);
+       FREE(script_pubkey);
+}
+
+void  CS_LDK_Filter_register_output(int64_t this_arg, int64_t output) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKFilter* this_arg_conv = (LDKFilter*)this_arg_ptr;
+       LDKWatchedOutput output_conv;
+       output_conv.inner = untag_ptr(output);
+       output_conv.is_owned = ptr_is_owned(output);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(output_conv);
+       output_conv = WatchedOutput_clone(&output_conv);
+       (this_arg_conv->register_output)(this_arg_conv->this_arg, output_conv);
+}
+
+uint32_t CS_LDK_LDKCOption_FilterZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_FilterZ *obj = (LDKCOption_FilterZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_FilterZ_Some: return 0;
+               case LDKCOption_FilterZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_FilterZ_Some_get_some(int64_t ptr) {
+       LDKCOption_FilterZ *obj = (LDKCOption_FilterZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_FilterZ_Some);
+       LDKFilter* some_ret = MALLOC(sizeof(LDKFilter), "LDKFilter");
+       *some_ret = obj->some;
+                       // WARNING: We likely need to clone here, but no clone is available, so we just do it for Java instances
+                       if ((*some_ret).free == LDKFilter_JCalls_free) {
+                               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                               LDKFilter_JCalls_cloned(&(*some_ret));
+                       }
+       return tag_ptr(some_ret, true);
+}
+static inline struct LDKLockedChannelMonitor CResult_LockedChannelMonitorNoneZ_get_ok(LDKCResult_LockedChannelMonitorNoneZ *NONNULL_PTR owner){
+       LDKLockedChannelMonitor ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_LockedChannelMonitorNoneZ_get_ok(int64_t owner) {
+       LDKCResult_LockedChannelMonitorNoneZ* owner_conv = (LDKCResult_LockedChannelMonitorNoneZ*)untag_ptr(owner);
+       LDKLockedChannelMonitor ret_var = CResult_LockedChannelMonitorNoneZ_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_LockedChannelMonitorNoneZ_get_err(LDKCResult_LockedChannelMonitorNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_LockedChannelMonitorNoneZ_get_err(int64_t owner) {
+       LDKCResult_LockedChannelMonitorNoneZ* owner_conv = (LDKCResult_LockedChannelMonitorNoneZ*)untag_ptr(owner);
+       CResult_LockedChannelMonitorNoneZ_get_err(owner_conv);
+}
+
+static inline LDKCVec_OutPointZ CVec_OutPointZ_clone(const LDKCVec_OutPointZ *orig) {
+       LDKCVec_OutPointZ ret = { .data = MALLOC(sizeof(LDKOutPoint) * orig->datalen, "LDKCVec_OutPointZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = OutPoint_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_MonitorUpdateIdZ CVec_MonitorUpdateIdZ_clone(const LDKCVec_MonitorUpdateIdZ *orig) {
+       LDKCVec_MonitorUpdateIdZ ret = { .data = MALLOC(sizeof(LDKMonitorUpdateId) * orig->datalen, "LDKCVec_MonitorUpdateIdZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = MonitorUpdateId_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKOutPoint C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_a(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ *NONNULL_PTR owner){
+       LDKOutPoint ret = owner->a;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_a(int64_t owner) {
+       LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ* owner_conv = (LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ*)untag_ptr(owner);
+       LDKOutPoint ret_var = C2Tuple_OutPointCVec_MonitorUpdateIdZZ_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 LDKCVec_MonitorUpdateIdZ C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_b(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ *NONNULL_PTR owner){
+       return CVec_MonitorUpdateIdZ_clone(&owner->b);
+}
+int64_tArray  CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_b(int64_t owner) {
+       LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ* owner_conv = (LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ*)untag_ptr(owner);
+       LDKCVec_MonitorUpdateIdZ ret_var = C2Tuple_OutPointCVec_MonitorUpdateIdZZ_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 r = 0; r < ret_var.datalen; r++) {
+               LDKMonitorUpdateId ret_conv_17_var = ret_var.data[r];
+               int64_t ret_conv_17_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_17_var);
+               ret_conv_17_ref = tag_ptr(ret_conv_17_var.inner, ret_conv_17_var.is_owned);
+               ret_arr_ptr[r] = ret_conv_17_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+static inline LDKCVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ CVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ_clone(const LDKCVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ *orig) {
+       LDKCVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ) * orig->datalen, "LDKCVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+typedef struct LDKKVStore_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKKVStore_JCalls;
+static void LDKKVStore_JCalls_free(void* this_arg) {
+       LDKKVStore_JCalls *j_calls = (LDKKVStore_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_CVec_u8ZIOErrorZ read_LDKKVStore_jcall(const void* this_arg, LDKStr primary_namespace, LDKStr secondary_namespace, LDKStr key) {
+       LDKKVStore_JCalls *j_calls = (LDKKVStore_JCalls*) this_arg;
+       LDKStr primary_namespace_str = primary_namespace;
+       jstring primary_namespace_conv = str_ref_to_cs(primary_namespace_str.chars, primary_namespace_str.len);
+       Str_free(primary_namespace_str);
+       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);
+       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, primary_namespace_conv, secondary_namespace_conv, key_conv);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_CVec_u8ZIOErrorZ ret_conv = *(LDKCResult_CVec_u8ZIOErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_NoneIOErrorZ write_LDKKVStore_jcall(const void* this_arg, LDKStr primary_namespace, LDKStr secondary_namespace, LDKStr key, LDKu8slice buf) {
+       LDKKVStore_JCalls *j_calls = (LDKKVStore_JCalls*) this_arg;
+       LDKStr primary_namespace_str = primary_namespace;
+       jstring primary_namespace_conv = str_ref_to_cs(primary_namespace_str.chars, primary_namespace_str.len);
+       Str_free(primary_namespace_str);
+       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);
+       LDKStr key_str = key;
+       jstring key_conv = str_ref_to_cs(key_str.chars, key_str.len);
+       Str_free(key_str);
+       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, primary_namespace_conv, secondary_namespace_conv, key_conv, (int64_t)buf_arr);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_NoneIOErrorZ remove_LDKKVStore_jcall(const void* this_arg, LDKStr primary_namespace, LDKStr secondary_namespace, LDKStr key, bool lazy) {
+       LDKKVStore_JCalls *j_calls = (LDKKVStore_JCalls*) this_arg;
+       LDKStr primary_namespace_str = primary_namespace;
+       jstring primary_namespace_conv = str_ref_to_cs(primary_namespace_str.chars, primary_namespace_str.len);
+       Str_free(primary_namespace_str);
+       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);
+       LDKStr key_str = key;
+       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, primary_namespace_conv, secondary_namespace_conv, key_conv, lazy_conv);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_CVec_StrZIOErrorZ list_LDKKVStore_jcall(const void* this_arg, LDKStr primary_namespace, LDKStr secondary_namespace) {
+       LDKKVStore_JCalls *j_calls = (LDKKVStore_JCalls*) this_arg;
+       LDKStr primary_namespace_str = primary_namespace;
+       jstring primary_namespace_conv = str_ref_to_cs(primary_namespace_str.chars, primary_namespace_str.len);
+       Str_free(primary_namespace_str);
+       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, primary_namespace_conv, secondary_namespace_conv);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_CVec_StrZIOErrorZ ret_conv = *(LDKCResult_CVec_StrZIOErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKKVStore_JCalls_cloned(LDKKVStore* new_obj) {
+       LDKKVStore_JCalls *j_calls = (LDKKVStore_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKKVStore LDKKVStore_init (int64_t o) {
+       LDKKVStore_JCalls *calls = MALLOC(sizeof(LDKKVStore_JCalls), "LDKKVStore_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKKVStore ret = {
+               .this_arg = (void*) calls,
+               .read = read_LDKKVStore_jcall,
+               .write = write_LDKKVStore_jcall,
+               .remove = remove_LDKKVStore_jcall,
+               .list = list_LDKKVStore_jcall,
+               .free = LDKKVStore_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKKVStore_new(int32_t o) {
+       LDKKVStore *res_ptr = MALLOC(sizeof(LDKKVStore), "LDKKVStore");
+       *res_ptr = LDKKVStore_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_KVStore_read(int64_t this_arg, jstring primary_namespace, jstring secondary_namespace, jstring key) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKKVStore* this_arg_conv = (LDKKVStore*)this_arg_ptr;
+       LDKStr primary_namespace_conv = str_ref_to_owned_c(primary_namespace);
+       LDKStr secondary_namespace_conv = str_ref_to_owned_c(secondary_namespace);
+       LDKStr key_conv = str_ref_to_owned_c(key);
+       LDKCResult_CVec_u8ZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZIOErrorZ), "LDKCResult_CVec_u8ZIOErrorZ");
+       *ret_conv = (this_arg_conv->read)(this_arg_conv->this_arg, primary_namespace_conv, secondary_namespace_conv, key_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_KVStore_write(int64_t this_arg, jstring primary_namespace, jstring secondary_namespace, jstring key, int8_tArray buf) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKKVStore* this_arg_conv = (LDKKVStore*)this_arg_ptr;
+       LDKStr primary_namespace_conv = str_ref_to_owned_c(primary_namespace);
+       LDKStr secondary_namespace_conv = str_ref_to_owned_c(secondary_namespace);
+       LDKStr key_conv = str_ref_to_owned_c(key);
+       LDKu8slice buf_ref;
+       buf_ref.datalen = buf->arr_len;
+       buf_ref.data = buf->elems;
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = (this_arg_conv->write)(this_arg_conv->this_arg, primary_namespace_conv, secondary_namespace_conv, key_conv, buf_ref);
+       FREE(buf);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_KVStore_remove(int64_t this_arg, jstring primary_namespace, jstring secondary_namespace, jstring key, jboolean lazy) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKKVStore* this_arg_conv = (LDKKVStore*)this_arg_ptr;
+       LDKStr primary_namespace_conv = str_ref_to_owned_c(primary_namespace);
+       LDKStr secondary_namespace_conv = str_ref_to_owned_c(secondary_namespace);
+       LDKStr key_conv = str_ref_to_owned_c(key);
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = (this_arg_conv->remove)(this_arg_conv->this_arg, primary_namespace_conv, secondary_namespace_conv, key_conv, lazy);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_KVStore_list(int64_t this_arg, jstring primary_namespace, jstring secondary_namespace) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKKVStore* this_arg_conv = (LDKKVStore*)this_arg_ptr;
+       LDKStr primary_namespace_conv = str_ref_to_owned_c(primary_namespace);
+       LDKStr secondary_namespace_conv = str_ref_to_owned_c(secondary_namespace);
+       LDKCResult_CVec_StrZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_StrZIOErrorZ), "LDKCResult_CVec_StrZIOErrorZ");
+       *ret_conv = (this_arg_conv->list)(this_arg_conv->this_arg, primary_namespace_conv, secondary_namespace_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+typedef struct LDKPersister_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKPersister_JCalls;
+static void LDKPersister_JCalls_free(void* this_arg) {
+       LDKPersister_JCalls *j_calls = (LDKPersister_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_NoneIOErrorZ persist_manager_LDKPersister_jcall(const void* this_arg, const LDKChannelManager * channel_manager) {
+       LDKPersister_JCalls *j_calls = (LDKPersister_JCalls*) this_arg;
+       LDKChannelManager channel_manager_var = *channel_manager;
+       int64_t channel_manager_ref = 0;
+       // 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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_NoneIOErrorZ persist_graph_LDKPersister_jcall(const void* this_arg, const LDKNetworkGraph * network_graph) {
+       LDKPersister_JCalls *j_calls = (LDKPersister_JCalls*) this_arg;
+       LDKNetworkGraph network_graph_var = *network_graph;
+       int64_t network_graph_ref = 0;
+       // 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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_NoneIOErrorZ persist_scorer_LDKPersister_jcall(const void* this_arg, const LDKWriteableScore * scorer) {
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKPersister_JCalls_cloned(LDKPersister* new_obj) {
+       LDKPersister_JCalls *j_calls = (LDKPersister_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKPersister LDKPersister_init (int64_t o) {
+       LDKPersister_JCalls *calls = MALLOC(sizeof(LDKPersister_JCalls), "LDKPersister_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKPersister ret = {
+               .this_arg = (void*) calls,
+               .persist_manager = persist_manager_LDKPersister_jcall,
+               .persist_graph = persist_graph_LDKPersister_jcall,
+               .persist_scorer = persist_scorer_LDKPersister_jcall,
+               .free = LDKPersister_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKPersister_new(int32_t o) {
+       LDKPersister *res_ptr = MALLOC(sizeof(LDKPersister), "LDKPersister");
+       *res_ptr = LDKPersister_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_Persister_persist_manager(int64_t this_arg, int64_t channel_manager) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKPersister* this_arg_conv = (LDKPersister*)this_arg_ptr;
+       LDKChannelManager channel_manager_conv;
+       channel_manager_conv.inner = untag_ptr(channel_manager);
+       channel_manager_conv.is_owned = ptr_is_owned(channel_manager);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_manager_conv);
+       channel_manager_conv.is_owned = false;
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = (this_arg_conv->persist_manager)(this_arg_conv->this_arg, &channel_manager_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Persister_persist_graph(int64_t this_arg, int64_t network_graph) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKPersister* this_arg_conv = (LDKPersister*)this_arg_ptr;
+       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;
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = (this_arg_conv->persist_graph)(this_arg_conv->this_arg, &network_graph_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Persister_persist_scorer(int64_t this_arg, int64_t scorer) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKPersister* this_arg_conv = (LDKPersister*)this_arg_ptr;
+       void* scorer_ptr = untag_ptr(scorer);
+       if (ptr_is_owned(scorer)) { CHECK_ACCESS(scorer_ptr); }
+       LDKWriteableScore* scorer_conv = (LDKWriteableScore*)scorer_ptr;
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = (this_arg_conv->persist_scorer)(this_arg_conv->this_arg, scorer_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+typedef struct LDKPersist_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKPersist_JCalls;
+static void LDKPersist_JCalls_free(void* this_arg) {
+       LDKPersist_JCalls *j_calls = (LDKPersist_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKChannelMonitorUpdateStatus persist_new_channel_LDKPersist_jcall(const void* this_arg, LDKOutPoint channel_id, const LDKChannelMonitor * data, LDKMonitorUpdateId update_id) {
+       LDKPersist_JCalls *j_calls = (LDKPersist_JCalls*) this_arg;
+       LDKOutPoint channel_id_var = channel_id;
+       int64_t channel_id_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_id_var);
+       channel_id_ref = tag_ptr(channel_id_var.inner, channel_id_var.is_owned);
+       LDKChannelMonitor data_var = *data;
+       int64_t data_ref = 0;
+       data_var = ChannelMonitor_clone(&data_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(data_var);
+       data_ref = tag_ptr(data_var.inner, data_var.is_owned);
+       LDKMonitorUpdateId update_id_var = update_id;
+       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);
+       LDKChannelMonitorUpdateStatus ret_conv = LDKChannelMonitorUpdateStatus_from_cs(ret);
+       return ret_conv;
+}
+LDKChannelMonitorUpdateStatus update_persisted_channel_LDKPersist_jcall(const void* this_arg, LDKOutPoint channel_id, LDKChannelMonitorUpdate update, const LDKChannelMonitor * data, LDKMonitorUpdateId update_id) {
+       LDKPersist_JCalls *j_calls = (LDKPersist_JCalls*) this_arg;
+       LDKOutPoint channel_id_var = channel_id;
+       int64_t channel_id_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_id_var);
+       channel_id_ref = tag_ptr(channel_id_var.inner, channel_id_var.is_owned);
+       LDKChannelMonitorUpdate update_var = update;
+       int64_t update_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_var);
+       update_ref = tag_ptr(update_var.inner, update_var.is_owned);
+       LDKChannelMonitor data_var = *data;
+       int64_t data_ref = 0;
+       data_var = ChannelMonitor_clone(&data_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(data_var);
+       data_ref = tag_ptr(data_var.inner, data_var.is_owned);
+       LDKMonitorUpdateId update_id_var = update_id;
+       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);
+       LDKChannelMonitorUpdateStatus ret_conv = LDKChannelMonitorUpdateStatus_from_cs(ret);
+       return ret_conv;
+}
+static void LDKPersist_JCalls_cloned(LDKPersist* new_obj) {
+       LDKPersist_JCalls *j_calls = (LDKPersist_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKPersist LDKPersist_init (int64_t o) {
+       LDKPersist_JCalls *calls = MALLOC(sizeof(LDKPersist_JCalls), "LDKPersist_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKPersist ret = {
+               .this_arg = (void*) calls,
+               .persist_new_channel = persist_new_channel_LDKPersist_jcall,
+               .update_persisted_channel = update_persisted_channel_LDKPersist_jcall,
+               .free = LDKPersist_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKPersist_new(int32_t o) {
+       LDKPersist *res_ptr = MALLOC(sizeof(LDKPersist), "LDKPersist");
+       *res_ptr = LDKPersist_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int32_t  CS_LDK_Persist_persist_new_channel(int64_t this_arg, int64_t channel_id, int64_t data, int64_t update_id) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKPersist* this_arg_conv = (LDKPersist*)this_arg_ptr;
+       LDKOutPoint channel_id_conv;
+       channel_id_conv.inner = untag_ptr(channel_id);
+       channel_id_conv.is_owned = ptr_is_owned(channel_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_id_conv);
+       channel_id_conv = OutPoint_clone(&channel_id_conv);
+       LDKChannelMonitor data_conv;
+       data_conv.inner = untag_ptr(data);
+       data_conv.is_owned = ptr_is_owned(data);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(data_conv);
+       data_conv.is_owned = false;
+       LDKMonitorUpdateId update_id_conv;
+       update_id_conv.inner = untag_ptr(update_id);
+       update_id_conv.is_owned = ptr_is_owned(update_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_id_conv);
+       update_id_conv = MonitorUpdateId_clone(&update_id_conv);
+       int32_t ret_conv = LDKChannelMonitorUpdateStatus_to_cs((this_arg_conv->persist_new_channel)(this_arg_conv->this_arg, channel_id_conv, &data_conv, update_id_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Persist_update_persisted_channel(int64_t this_arg, int64_t channel_id, int64_t update, int64_t data, int64_t update_id) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKPersist* this_arg_conv = (LDKPersist*)this_arg_ptr;
+       LDKOutPoint channel_id_conv;
+       channel_id_conv.inner = untag_ptr(channel_id);
+       channel_id_conv.is_owned = ptr_is_owned(channel_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_id_conv);
+       channel_id_conv = OutPoint_clone(&channel_id_conv);
+       LDKChannelMonitorUpdate update_conv;
+       update_conv.inner = untag_ptr(update);
+       update_conv.is_owned = ptr_is_owned(update);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_conv);
+       update_conv = ChannelMonitorUpdate_clone(&update_conv);
+       LDKChannelMonitor data_conv;
+       data_conv.inner = untag_ptr(data);
+       data_conv.is_owned = ptr_is_owned(data);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(data_conv);
+       data_conv.is_owned = false;
+       LDKMonitorUpdateId update_id_conv;
+       update_id_conv.inner = untag_ptr(update_id);
+       update_id_conv.is_owned = ptr_is_owned(update_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_id_conv);
+       update_id_conv = MonitorUpdateId_clone(&update_id_conv);
+       int32_t ret_conv = LDKChannelMonitorUpdateStatus_to_cs((this_arg_conv->update_persisted_channel)(this_arg_conv->this_arg, channel_id_conv, update_conv, &data_conv, update_id_conv));
+       return ret_conv;
+}
+
+typedef struct LDKFutureCallback_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKFutureCallback_JCalls;
+static void LDKFutureCallback_JCalls_free(void* this_arg) {
+       LDKFutureCallback_JCalls *j_calls = (LDKFutureCallback_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+}
+static void LDKFutureCallback_JCalls_cloned(LDKFutureCallback* new_obj) {
+       LDKFutureCallback_JCalls *j_calls = (LDKFutureCallback_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKFutureCallback LDKFutureCallback_init (int64_t o) {
+       LDKFutureCallback_JCalls *calls = MALLOC(sizeof(LDKFutureCallback_JCalls), "LDKFutureCallback_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKFutureCallback ret = {
+               .this_arg = (void*) calls,
+               .call = call_LDKFutureCallback_jcall,
+               .free = LDKFutureCallback_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKFutureCallback_new(int32_t o) {
+       LDKFutureCallback *res_ptr = MALLOC(sizeof(LDKFutureCallback), "LDKFutureCallback");
+       *res_ptr = LDKFutureCallback_init(o);
+       return tag_ptr(res_ptr, true);
+}
+void  CS_LDK_FutureCallback_call(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKFutureCallback* this_arg_conv = (LDKFutureCallback*)this_arg_ptr;
+       (this_arg_conv->call)(this_arg_conv->this_arg);
+}
+
+typedef struct LDKListen_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKListen_JCalls;
+static void LDKListen_JCalls_free(void* this_arg) {
+       LDKListen_JCalls *j_calls = (LDKListen_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void filtered_block_connected_LDKListen_jcall(const void* this_arg, const uint8_t (* header)[80], LDKCVec_C2Tuple_usizeTransactionZZ txdata, 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);
+       LDKCVec_C2Tuple_usizeTransactionZZ txdata_var = txdata;
+       int64_tArray txdata_arr = NULL;
+       txdata_arr = init_int64_tArray(txdata_var.datalen, __LINE__);
+       int64_t *txdata_arr_ptr = (int64_t*)(((uint8_t*)txdata_arr) + 8);
+       for (size_t c = 0; c < txdata_var.datalen; c++) {
+               LDKC2Tuple_usizeTransactionZ* txdata_conv_28_conv = MALLOC(sizeof(LDKC2Tuple_usizeTransactionZ), "LDKC2Tuple_usizeTransactionZ");
+               *txdata_conv_28_conv = txdata_var.data[c];
+               txdata_arr_ptr[c] = tag_ptr(txdata_conv_28_conv, true);
+       }
+       
+       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);
+}
+void block_connected_LDKListen_jcall(const void* this_arg, LDKu8slice block, uint32_t height) {
+       LDKListen_JCalls *j_calls = (LDKListen_JCalls*) this_arg;
+       LDKu8slice block_var = block;
+       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);
+}
+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);
+}
+static void LDKListen_JCalls_cloned(LDKListen* new_obj) {
+       LDKListen_JCalls *j_calls = (LDKListen_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKListen LDKListen_init (int64_t o) {
+       LDKListen_JCalls *calls = MALLOC(sizeof(LDKListen_JCalls), "LDKListen_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKListen ret = {
+               .this_arg = (void*) calls,
+               .filtered_block_connected = filtered_block_connected_LDKListen_jcall,
+               .block_connected = block_connected_LDKListen_jcall,
+               .block_disconnected = block_disconnected_LDKListen_jcall,
+               .free = LDKListen_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKListen_new(int32_t o) {
+       LDKListen *res_ptr = MALLOC(sizeof(LDKListen), "LDKListen");
+       *res_ptr = LDKListen_init(o);
+       return tag_ptr(res_ptr, true);
+}
+void  CS_LDK_Listen_filtered_block_connected(int64_t this_arg, int8_tArray header, int64_tArray txdata, int32_t height) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKListen* this_arg_conv = (LDKListen*)this_arg_ptr;
+       uint8_t header_arr[80];
+       CHECK(header->arr_len == 80);
+       memcpy(header_arr, header->elems, 80); FREE(header);
+       uint8_t (*header_ref)[80] = &header_arr;
+       LDKCVec_C2Tuple_usizeTransactionZZ txdata_constr;
+       txdata_constr.datalen = txdata->arr_len;
+       if (txdata_constr.datalen > 0)
+               txdata_constr.data = MALLOC(txdata_constr.datalen * sizeof(LDKC2Tuple_usizeTransactionZ), "LDKCVec_C2Tuple_usizeTransactionZZ Elements");
+       else
+               txdata_constr.data = NULL;
+       int64_t* txdata_vals = txdata->elems;
+       for (size_t c = 0; c < txdata_constr.datalen; c++) {
+               int64_t txdata_conv_28 = txdata_vals[c];
+               void* txdata_conv_28_ptr = untag_ptr(txdata_conv_28);
+               CHECK_ACCESS(txdata_conv_28_ptr);
+               LDKC2Tuple_usizeTransactionZ txdata_conv_28_conv = *(LDKC2Tuple_usizeTransactionZ*)(txdata_conv_28_ptr);
+               txdata_conv_28_conv = C2Tuple_usizeTransactionZ_clone((LDKC2Tuple_usizeTransactionZ*)untag_ptr(txdata_conv_28));
+               txdata_constr.data[c] = txdata_conv_28_conv;
+       }
+       FREE(txdata);
+       (this_arg_conv->filtered_block_connected)(this_arg_conv->this_arg, header_ref, txdata_constr, height);
+}
+
+void  CS_LDK_Listen_block_connected(int64_t this_arg, int8_tArray block, int32_t height) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKListen* this_arg_conv = (LDKListen*)this_arg_ptr;
+       LDKu8slice block_ref;
+       block_ref.datalen = block->arr_len;
+       block_ref.data = block->elems;
+       (this_arg_conv->block_connected)(this_arg_conv->this_arg, block_ref, height);
+       FREE(block);
+}
+
+void  CS_LDK_Listen_block_disconnected(int64_t this_arg, int8_tArray header, int32_t height) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKListen* this_arg_conv = (LDKListen*)this_arg_ptr;
+       uint8_t header_arr[80];
+       CHECK(header->arr_len == 80);
+       memcpy(header_arr, header->elems, 80); FREE(header);
+       uint8_t (*header_ref)[80] = &header_arr;
+       (this_arg_conv->block_disconnected)(this_arg_conv->this_arg, header_ref, height);
+}
+
+typedef struct LDKConfirm_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKConfirm_JCalls;
+static void LDKConfirm_JCalls_free(void* this_arg) {
+       LDKConfirm_JCalls *j_calls = (LDKConfirm_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void transactions_confirmed_LDKConfirm_jcall(const void* this_arg, const uint8_t (* header)[80], LDKCVec_C2Tuple_usizeTransactionZZ txdata, 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);
+       LDKCVec_C2Tuple_usizeTransactionZZ txdata_var = txdata;
+       int64_tArray txdata_arr = NULL;
+       txdata_arr = init_int64_tArray(txdata_var.datalen, __LINE__);
+       int64_t *txdata_arr_ptr = (int64_t*)(((uint8_t*)txdata_arr) + 8);
+       for (size_t c = 0; c < txdata_var.datalen; c++) {
+               LDKC2Tuple_usizeTransactionZ* txdata_conv_28_conv = MALLOC(sizeof(LDKC2Tuple_usizeTransactionZ), "LDKC2Tuple_usizeTransactionZ");
+               *txdata_conv_28_conv = txdata_var.data[c];
+               txdata_arr_ptr[c] = tag_ptr(txdata_conv_28_conv, true);
+       }
+       
+       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);
+}
+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);
+}
+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);
+}
+LDKCVec_C2Tuple_ThirtyTwoBytesCOption_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;
+       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");
+       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;
+       }
+       FREE(ret);
+       return ret_constr;
+}
+static void LDKConfirm_JCalls_cloned(LDKConfirm* new_obj) {
+       LDKConfirm_JCalls *j_calls = (LDKConfirm_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKConfirm LDKConfirm_init (int64_t o) {
+       LDKConfirm_JCalls *calls = MALLOC(sizeof(LDKConfirm_JCalls), "LDKConfirm_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKConfirm ret = {
+               .this_arg = (void*) calls,
+               .transactions_confirmed = transactions_confirmed_LDKConfirm_jcall,
+               .transaction_unconfirmed = transaction_unconfirmed_LDKConfirm_jcall,
+               .best_block_updated = best_block_updated_LDKConfirm_jcall,
+               .get_relevant_txids = get_relevant_txids_LDKConfirm_jcall,
+               .free = LDKConfirm_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKConfirm_new(int32_t o) {
+       LDKConfirm *res_ptr = MALLOC(sizeof(LDKConfirm), "LDKConfirm");
+       *res_ptr = LDKConfirm_init(o);
+       return tag_ptr(res_ptr, true);
+}
+void  CS_LDK_Confirm_transactions_confirmed(int64_t this_arg, int8_tArray header, int64_tArray txdata, int32_t height) {
+       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;
+       uint8_t header_arr[80];
+       CHECK(header->arr_len == 80);
+       memcpy(header_arr, header->elems, 80); FREE(header);
+       uint8_t (*header_ref)[80] = &header_arr;
+       LDKCVec_C2Tuple_usizeTransactionZZ txdata_constr;
+       txdata_constr.datalen = txdata->arr_len;
+       if (txdata_constr.datalen > 0)
+               txdata_constr.data = MALLOC(txdata_constr.datalen * sizeof(LDKC2Tuple_usizeTransactionZ), "LDKCVec_C2Tuple_usizeTransactionZZ Elements");
+       else
+               txdata_constr.data = NULL;
+       int64_t* txdata_vals = txdata->elems;
+       for (size_t c = 0; c < txdata_constr.datalen; c++) {
+               int64_t txdata_conv_28 = txdata_vals[c];
+               void* txdata_conv_28_ptr = untag_ptr(txdata_conv_28);
+               CHECK_ACCESS(txdata_conv_28_ptr);
+               LDKC2Tuple_usizeTransactionZ txdata_conv_28_conv = *(LDKC2Tuple_usizeTransactionZ*)(txdata_conv_28_ptr);
+               txdata_conv_28_conv = C2Tuple_usizeTransactionZ_clone((LDKC2Tuple_usizeTransactionZ*)untag_ptr(txdata_conv_28));
+               txdata_constr.data[c] = txdata_conv_28_conv;
+       }
+       FREE(txdata);
+       (this_arg_conv->transactions_confirmed)(this_arg_conv->this_arg, header_ref, txdata_constr, height);
+}
+
+void  CS_LDK_Confirm_transaction_unconfirmed(int64_t this_arg, int8_tArray txid) {
+       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;
+       uint8_t txid_arr[32];
+       CHECK(txid->arr_len == 32);
+       memcpy(txid_arr, txid->elems, 32); FREE(txid);
+       uint8_t (*txid_ref)[32] = &txid_arr;
+       (this_arg_conv->transaction_unconfirmed)(this_arg_conv->this_arg, txid_ref);
+}
+
+void  CS_LDK_Confirm_best_block_updated(int64_t this_arg, int8_tArray header, int32_t height) {
+       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;
+       uint8_t header_arr[80];
+       CHECK(header->arr_len == 80);
+       memcpy(header_arr, header->elems, 80); FREE(header);
+       uint8_t (*header_ref)[80] = &header_arr;
+       (this_arg_conv->best_block_updated)(this_arg_conv->this_arg, header_ref, height);
+}
+
+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);
+       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);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+typedef struct LDKEventHandler_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKEventHandler_JCalls;
+static void LDKEventHandler_JCalls_free(void* this_arg) {
+       LDKEventHandler_JCalls *j_calls = (LDKEventHandler_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void handle_event_LDKEventHandler_jcall(const void* this_arg, LDKEvent event) {
+       LDKEventHandler_JCalls *j_calls = (LDKEventHandler_JCalls*) this_arg;
+       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);
+}
+static void LDKEventHandler_JCalls_cloned(LDKEventHandler* new_obj) {
+       LDKEventHandler_JCalls *j_calls = (LDKEventHandler_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKEventHandler LDKEventHandler_init (int64_t o) {
+       LDKEventHandler_JCalls *calls = MALLOC(sizeof(LDKEventHandler_JCalls), "LDKEventHandler_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKEventHandler ret = {
+               .this_arg = (void*) calls,
+               .handle_event = handle_event_LDKEventHandler_jcall,
+               .free = LDKEventHandler_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKEventHandler_new(int32_t o) {
+       LDKEventHandler *res_ptr = MALLOC(sizeof(LDKEventHandler), "LDKEventHandler");
+       *res_ptr = LDKEventHandler_init(o);
+       return tag_ptr(res_ptr, true);
+}
+void  CS_LDK_EventHandler_handle_event(int64_t this_arg, int64_t event) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKEventHandler* this_arg_conv = (LDKEventHandler*)this_arg_ptr;
+       void* event_ptr = untag_ptr(event);
+       CHECK_ACCESS(event_ptr);
+       LDKEvent event_conv = *(LDKEvent*)(event_ptr);
+       event_conv = Event_clone((LDKEvent*)untag_ptr(event));
+       (this_arg_conv->handle_event)(this_arg_conv->this_arg, event_conv);
+}
+
+typedef struct LDKEventsProvider_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKEventsProvider_JCalls;
+static void LDKEventsProvider_JCalls_free(void* this_arg) {
+       LDKEventsProvider_JCalls *j_calls = (LDKEventsProvider_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void process_pending_events_LDKEventsProvider_jcall(const void* this_arg, LDKEventHandler handler) {
+       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));
+}
+static void LDKEventsProvider_JCalls_cloned(LDKEventsProvider* new_obj) {
+       LDKEventsProvider_JCalls *j_calls = (LDKEventsProvider_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKEventsProvider LDKEventsProvider_init (int64_t o) {
+       LDKEventsProvider_JCalls *calls = MALLOC(sizeof(LDKEventsProvider_JCalls), "LDKEventsProvider_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKEventsProvider ret = {
+               .this_arg = (void*) calls,
+               .process_pending_events = process_pending_events_LDKEventsProvider_jcall,
+               .free = LDKEventsProvider_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKEventsProvider_new(int32_t o) {
+       LDKEventsProvider *res_ptr = MALLOC(sizeof(LDKEventsProvider), "LDKEventsProvider");
+       *res_ptr = LDKEventsProvider_init(o);
+       return tag_ptr(res_ptr, true);
+}
+void  CS_LDK_EventsProvider_process_pending_events(int64_t this_arg, int64_t handler) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKEventsProvider* this_arg_conv = (LDKEventsProvider*)this_arg_ptr;
+       void* handler_ptr = untag_ptr(handler);
+       CHECK_ACCESS(handler_ptr);
+       LDKEventHandler handler_conv = *(LDKEventHandler*)(handler_ptr);
+       if (handler_conv.free == LDKEventHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKEventHandler_JCalls_cloned(&handler_conv);
+       }
+       (this_arg_conv->process_pending_events)(this_arg_conv->this_arg, handler_conv);
+}
+
+uint32_t CS_LDK_LDKFailureCode_ty_from_ptr(int64_t ptr) {
+       LDKFailureCode *obj = (LDKFailureCode*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKFailureCode_TemporaryNodeFailure: return 0;
+               case LDKFailureCode_RequiredNodeFeatureMissing: return 1;
+               case LDKFailureCode_IncorrectOrUnknownPaymentDetails: return 2;
+               case LDKFailureCode_InvalidOnionPayload: return 3;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKFailureCode_InvalidOnionPayload_get_invalid_onion_payload(int64_t ptr) {
+       LDKFailureCode *obj = (LDKFailureCode*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKFailureCode_InvalidOnionPayload);
+       int64_t invalid_onion_payload_ref = tag_ptr(&obj->invalid_onion_payload, false);
+       return invalid_onion_payload_ref;
+}
+typedef struct LDKMessageSendEventsProvider_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKMessageSendEventsProvider_JCalls;
+static void LDKMessageSendEventsProvider_JCalls_free(void* this_arg) {
+       LDKMessageSendEventsProvider_JCalls *j_calls = (LDKMessageSendEventsProvider_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+       LDKCVec_MessageSendEventZ ret_constr;
+       ret_constr.datalen = ret->arr_len;
+       if (ret_constr.datalen > 0)
+               ret_constr.data = MALLOC(ret_constr.datalen * sizeof(LDKMessageSendEvent), "LDKCVec_MessageSendEventZ Elements");
+       else
+               ret_constr.data = NULL;
+       int64_t* ret_vals = ret->elems;
+       for (size_t s = 0; s < ret_constr.datalen; s++) {
+               int64_t ret_conv_18 = ret_vals[s];
+               void* ret_conv_18_ptr = untag_ptr(ret_conv_18);
+               CHECK_ACCESS(ret_conv_18_ptr);
+               LDKMessageSendEvent ret_conv_18_conv = *(LDKMessageSendEvent*)(ret_conv_18_ptr);
+               FREE(untag_ptr(ret_conv_18));
+               ret_constr.data[s] = ret_conv_18_conv;
+       }
+       FREE(ret);
+       return ret_constr;
+}
+static void LDKMessageSendEventsProvider_JCalls_cloned(LDKMessageSendEventsProvider* new_obj) {
+       LDKMessageSendEventsProvider_JCalls *j_calls = (LDKMessageSendEventsProvider_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKMessageSendEventsProvider LDKMessageSendEventsProvider_init (int64_t o) {
+       LDKMessageSendEventsProvider_JCalls *calls = MALLOC(sizeof(LDKMessageSendEventsProvider_JCalls), "LDKMessageSendEventsProvider_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKMessageSendEventsProvider ret = {
+               .this_arg = (void*) calls,
+               .get_and_clear_pending_msg_events = get_and_clear_pending_msg_events_LDKMessageSendEventsProvider_jcall,
+               .free = LDKMessageSendEventsProvider_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKMessageSendEventsProvider_new(int32_t o) {
+       LDKMessageSendEventsProvider *res_ptr = MALLOC(sizeof(LDKMessageSendEventsProvider), "LDKMessageSendEventsProvider");
+       *res_ptr = LDKMessageSendEventsProvider_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_tArray  CS_LDK_MessageSendEventsProvider_get_and_clear_pending_msg_events(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKMessageSendEventsProvider* this_arg_conv = (LDKMessageSendEventsProvider*)this_arg_ptr;
+       LDKCVec_MessageSendEventZ ret_var = (this_arg_conv->get_and_clear_pending_msg_events)(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 s = 0; s < ret_var.datalen; s++) {
+               LDKMessageSendEvent *ret_conv_18_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+               *ret_conv_18_copy = ret_var.data[s];
+               int64_t ret_conv_18_ref = tag_ptr(ret_conv_18_copy, true);
+               ret_arr_ptr[s] = ret_conv_18_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+typedef struct LDKChannelMessageHandler_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+       LDKMessageSendEventsProvider_JCalls* MessageSendEventsProvider;
+} LDKChannelMessageHandler_JCalls;
+static void LDKChannelMessageHandler_JCalls_free(void* this_arg) {
+       LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void handle_open_channel_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKOpenChannel * 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);
+       LDKOpenChannel msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKOpenChannelV2 msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKAcceptChannel msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKAcceptChannelV2 msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKFundingCreated msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKFundingSigned msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKChannelReady msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+void handle_shutdown_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKShutdown * 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);
+       LDKShutdown msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKClosingSigned msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxAddInput msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxAddOutput msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxRemoveInput msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxRemoveOutput msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxComplete msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxSignatures msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxInitRbf msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxAckRbf msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxAbort msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKUpdateAddHTLC msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKUpdateFulfillHTLC msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKUpdateFailHTLC msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKUpdateFailMalformedHTLC msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKCommitmentSigned msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKRevokeAndACK msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKUpdateFee msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKAnnouncementSignatures msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKInit msg_var = *msg;
+       int64_t msg_ref = 0;
+       msg_var = Init_clone(&msg_var);
+       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);
+       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;
+}
+void handle_channel_reestablish_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKChannelReestablish * 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);
+       LDKChannelReestablish msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKChannelUpdate msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+void handle_error_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKErrorMessage * 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);
+       LDKErrorMessage msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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);
+       LDKNodeFeatures ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+LDKInitFeatures provided_init_features_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);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 105, (int64_t)their_node_id_arr);
+       LDKInitFeatures ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCOption_CVec_ThirtyTwoBytesZZ ret_conv = *(LDKCOption_CVec_ThirtyTwoBytesZZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKChannelMessageHandler_JCalls_cloned(LDKChannelMessageHandler* new_obj) {
+       LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->MessageSendEventsProvider->refcnt, 1, memory_order_release);
+}
+static inline LDKChannelMessageHandler LDKChannelMessageHandler_init (int64_t o, int64_t MessageSendEventsProvider) {
+       LDKChannelMessageHandler_JCalls *calls = MALLOC(sizeof(LDKChannelMessageHandler_JCalls), "LDKChannelMessageHandler_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKChannelMessageHandler ret = {
+               .this_arg = (void*) calls,
+               .handle_open_channel = handle_open_channel_LDKChannelMessageHandler_jcall,
+               .handle_open_channel_v2 = handle_open_channel_v2_LDKChannelMessageHandler_jcall,
+               .handle_accept_channel = handle_accept_channel_LDKChannelMessageHandler_jcall,
+               .handle_accept_channel_v2 = handle_accept_channel_v2_LDKChannelMessageHandler_jcall,
+               .handle_funding_created = handle_funding_created_LDKChannelMessageHandler_jcall,
+               .handle_funding_signed = handle_funding_signed_LDKChannelMessageHandler_jcall,
+               .handle_channel_ready = handle_channel_ready_LDKChannelMessageHandler_jcall,
+               .handle_shutdown = handle_shutdown_LDKChannelMessageHandler_jcall,
+               .handle_closing_signed = handle_closing_signed_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,
+               .handle_tx_remove_output = handle_tx_remove_output_LDKChannelMessageHandler_jcall,
+               .handle_tx_complete = handle_tx_complete_LDKChannelMessageHandler_jcall,
+               .handle_tx_signatures = handle_tx_signatures_LDKChannelMessageHandler_jcall,
+               .handle_tx_init_rbf = handle_tx_init_rbf_LDKChannelMessageHandler_jcall,
+               .handle_tx_ack_rbf = handle_tx_ack_rbf_LDKChannelMessageHandler_jcall,
+               .handle_tx_abort = handle_tx_abort_LDKChannelMessageHandler_jcall,
+               .handle_update_add_htlc = handle_update_add_htlc_LDKChannelMessageHandler_jcall,
+               .handle_update_fulfill_htlc = handle_update_fulfill_htlc_LDKChannelMessageHandler_jcall,
+               .handle_update_fail_htlc = handle_update_fail_htlc_LDKChannelMessageHandler_jcall,
+               .handle_update_fail_malformed_htlc = handle_update_fail_malformed_htlc_LDKChannelMessageHandler_jcall,
+               .handle_commitment_signed = handle_commitment_signed_LDKChannelMessageHandler_jcall,
+               .handle_revoke_and_ack = handle_revoke_and_ack_LDKChannelMessageHandler_jcall,
+               .handle_update_fee = handle_update_fee_LDKChannelMessageHandler_jcall,
+               .handle_announcement_signatures = handle_announcement_signatures_LDKChannelMessageHandler_jcall,
+               .peer_disconnected = peer_disconnected_LDKChannelMessageHandler_jcall,
+               .peer_connected = peer_connected_LDKChannelMessageHandler_jcall,
+               .handle_channel_reestablish = handle_channel_reestablish_LDKChannelMessageHandler_jcall,
+               .handle_channel_update = handle_channel_update_LDKChannelMessageHandler_jcall,
+               .handle_error = handle_error_LDKChannelMessageHandler_jcall,
+               .provided_node_features = provided_node_features_LDKChannelMessageHandler_jcall,
+               .provided_init_features = provided_init_features_LDKChannelMessageHandler_jcall,
+               .get_chain_hashes = get_chain_hashes_LDKChannelMessageHandler_jcall,
+               .free = LDKChannelMessageHandler_JCalls_free,
+               .MessageSendEventsProvider = LDKMessageSendEventsProvider_init(MessageSendEventsProvider),
+       };
+       calls->MessageSendEventsProvider = ret.MessageSendEventsProvider.this_arg;
+       return ret;
+}
+uint64_t  CS_LDK_LDKChannelMessageHandler_new(int32_t o, int32_t MessageSendEventsProvider) {
+       LDKChannelMessageHandler *res_ptr = MALLOC(sizeof(LDKChannelMessageHandler), "LDKChannelMessageHandler");
+       *res_ptr = LDKChannelMessageHandler_init(o, MessageSendEventsProvider);
+       return tag_ptr(res_ptr, true);
+}
+void  CS_LDK_ChannelMessageHandler_handle_open_channel(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);
+       LDKOpenChannel 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_open_channel)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_open_channel_v2(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);
+       LDKOpenChannelV2 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_open_channel_v2)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_accept_channel(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);
+       LDKAcceptChannel 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_accept_channel)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_accept_channel_v2(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);
+       LDKAcceptChannelV2 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_accept_channel_v2)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_funding_created(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);
+       LDKFundingCreated 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_funding_created)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_funding_signed(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);
+       LDKFundingSigned 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_funding_signed)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_channel_ready(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);
+       LDKChannelReady 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_channel_ready)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_shutdown(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);
+       LDKShutdown 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_shutdown)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_closing_signed(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);
+       LDKClosingSigned 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_closing_signed)(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); }
+       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);
+       LDKTxAddInput 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_tx_add_input)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_tx_add_output(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);
+       LDKTxAddOutput 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_tx_add_output)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_tx_remove_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); }
+       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);
+       LDKTxRemoveInput 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_tx_remove_input)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_tx_remove_output(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);
+       LDKTxRemoveOutput 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_tx_remove_output)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_tx_complete(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);
+       LDKTxComplete 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_tx_complete)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_tx_signatures(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);
+       LDKTxSignatures 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_tx_signatures)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_tx_init_rbf(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);
+       LDKTxInitRbf 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_tx_init_rbf)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_tx_ack_rbf(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);
+       LDKTxAckRbf 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_tx_ack_rbf)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_tx_abort(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);
+       LDKTxAbort 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_tx_abort)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_update_add_htlc(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);
+       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;
+       (this_arg_conv->handle_update_add_htlc)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_update_fulfill_htlc(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);
+       LDKUpdateFulfillHTLC 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_update_fulfill_htlc)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_update_fail_htlc(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);
+       LDKUpdateFailHTLC 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_update_fail_htlc)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_update_fail_malformed_htlc(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);
+       LDKUpdateFailMalformedHTLC 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_update_fail_malformed_htlc)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_commitment_signed(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);
+       LDKCommitmentSigned 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_commitment_signed)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_revoke_and_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);
+       LDKRevokeAndACK 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_revoke_and_ack)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_update_fee(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);
+       LDKUpdateFee 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_update_fee)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_announcement_signatures(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);
+       LDKAnnouncementSignatures 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_announcement_signatures)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_peer_disconnected(int64_t this_arg, int8_tArray their_node_id) {
+       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);
+       (this_arg_conv->peer_disconnected)(this_arg_conv->this_arg, their_node_id_ref);
+}
+
+int64_t  CS_LDK_ChannelMessageHandler_peer_connected(int64_t this_arg, int8_tArray their_node_id, int64_t msg, jboolean inbound) {
+       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);
+       LDKInit 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = (this_arg_conv->peer_connected)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv, inbound);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_channel_reestablish(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);
+       LDKChannelReestablish 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_channel_reestablish)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_channel_update(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);
+       LDKChannelUpdate 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_channel_update)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_error(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);
+       LDKErrorMessage 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_error)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+int64_t  CS_LDK_ChannelMessageHandler_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); }
+       LDKChannelMessageHandler* this_arg_conv = (LDKChannelMessageHandler*)this_arg_ptr;
+       LDKNodeFeatures ret_var = (this_arg_conv->provided_node_features)(this_arg_conv->this_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_ChannelMessageHandler_provided_init_features(int64_t this_arg, int8_tArray their_node_id) {
+       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);
+       LDKInitFeatures ret_var = (this_arg_conv->provided_init_features)(this_arg_conv->this_arg, their_node_id_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_ChannelMessageHandler_get_chain_hashes(int64_t this_arg) {
+       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;
+       LDKCOption_CVec_ThirtyTwoBytesZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_ThirtyTwoBytesZZ), "LDKCOption_CVec_ThirtyTwoBytesZZ");
+       *ret_copy = (this_arg_conv->get_chain_hashes)(this_arg_conv->this_arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+typedef struct LDKOffersMessageHandler_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKOffersMessageHandler_JCalls;
+static void LDKOffersMessageHandler_JCalls_free(void* this_arg) {
+       LDKOffersMessageHandler_JCalls *j_calls = (LDKOffersMessageHandler_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCOption_OffersMessageZ handle_message_LDKOffersMessageHandler_jcall(const void* this_arg, LDKOffersMessage message) {
+       LDKOffersMessageHandler_JCalls *j_calls = (LDKOffersMessageHandler_JCalls*) this_arg;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCOption_OffersMessageZ ret_conv = *(LDKCOption_OffersMessageZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+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);
+       LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ ret_constr;
+       ret_constr.datalen = ret->arr_len;
+       if (ret_constr.datalen > 0)
+               ret_constr.data = MALLOC(ret_constr.datalen * sizeof(LDKC3Tuple_OffersMessageDestinationBlindedPathZ), "LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ 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);
+               LDKC3Tuple_OffersMessageDestinationBlindedPathZ ret_conv_49_conv = *(LDKC3Tuple_OffersMessageDestinationBlindedPathZ*)(ret_conv_49_ptr);
+               FREE(untag_ptr(ret_conv_49));
+               ret_constr.data[x] = ret_conv_49_conv;
+       }
+       FREE(ret);
+       return ret_constr;
+}
+static void LDKOffersMessageHandler_JCalls_cloned(LDKOffersMessageHandler* new_obj) {
+       LDKOffersMessageHandler_JCalls *j_calls = (LDKOffersMessageHandler_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKOffersMessageHandler LDKOffersMessageHandler_init (int64_t o) {
+       LDKOffersMessageHandler_JCalls *calls = MALLOC(sizeof(LDKOffersMessageHandler_JCalls), "LDKOffersMessageHandler_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKOffersMessageHandler ret = {
+               .this_arg = (void*) calls,
+               .handle_message = handle_message_LDKOffersMessageHandler_jcall,
+               .release_pending_messages = release_pending_messages_LDKOffersMessageHandler_jcall,
+               .free = LDKOffersMessageHandler_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKOffersMessageHandler_new(int32_t o) {
+       LDKOffersMessageHandler *res_ptr = MALLOC(sizeof(LDKOffersMessageHandler), "LDKOffersMessageHandler");
+       *res_ptr = LDKOffersMessageHandler_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_OffersMessageHandler_handle_message(int64_t this_arg, int64_t message) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKOffersMessageHandler* this_arg_conv = (LDKOffersMessageHandler*)this_arg_ptr;
+       void* message_ptr = untag_ptr(message);
+       CHECK_ACCESS(message_ptr);
+       LDKOffersMessage message_conv = *(LDKOffersMessage*)(message_ptr);
+       message_conv = OffersMessage_clone((LDKOffersMessage*)untag_ptr(message));
+       LDKCOption_OffersMessageZ *ret_copy = MALLOC(sizeof(LDKCOption_OffersMessageZ), "LDKCOption_OffersMessageZ");
+       *ret_copy = (this_arg_conv->handle_message)(this_arg_conv->this_arg, message_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_tArray  CS_LDK_OffersMessageHandler_release_pending_messages(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKOffersMessageHandler* this_arg_conv = (LDKOffersMessageHandler*)this_arg_ptr;
+       LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ ret_var = (this_arg_conv->release_pending_messages)(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++) {
+               LDKC3Tuple_OffersMessageDestinationBlindedPathZ* ret_conv_49_conv = MALLOC(sizeof(LDKC3Tuple_OffersMessageDestinationBlindedPathZ), "LDKC3Tuple_OffersMessageDestinationBlindedPathZ");
+               *ret_conv_49_conv = ret_var.data[x];
+               ret_arr_ptr[x] = tag_ptr(ret_conv_49_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+typedef struct LDKRoutingMessageHandler_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+       LDKMessageSendEventsProvider_JCalls* MessageSendEventsProvider;
+} LDKRoutingMessageHandler_JCalls;
+static void LDKRoutingMessageHandler_JCalls_free(void* this_arg) {
+       LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_boolLightningErrorZ handle_node_announcement_LDKRoutingMessageHandler_jcall(const void* this_arg, const LDKNodeAnnouncement * msg) {
+       LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
+       LDKNodeAnnouncement msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_boolLightningErrorZ handle_channel_announcement_LDKRoutingMessageHandler_jcall(const void* this_arg, const LDKChannelAnnouncement * msg) {
+       LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
+       LDKChannelAnnouncement msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_boolLightningErrorZ handle_channel_update_LDKRoutingMessageHandler_jcall(const void* this_arg, const LDKChannelUpdate * msg) {
+       LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
+       LDKChannelUpdate msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ ret_conv = *(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKNodeAnnouncement get_next_node_announcement_LDKRoutingMessageHandler_jcall(const void* this_arg, LDKNodeId starting_point) {
+       LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
+       LDKNodeId starting_point_var = starting_point;
+       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);
+       LDKNodeAnnouncement ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+LDKCResult_NoneNoneZ peer_connected_LDKRoutingMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKInit * init, bool inbound) {
+       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);
+       LDKInit init_var = *init;
+       int64_t init_ref = 0;
+       init_var = Init_clone(&init_var);
+       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);
+       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_NoneLightningErrorZ handle_reply_channel_range_LDKRoutingMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, LDKReplyChannelRange msg) {
+       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);
+       LDKReplyChannelRange msg_var = msg;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_NoneLightningErrorZ handle_reply_short_channel_ids_end_LDKRoutingMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, LDKReplyShortChannelIdsEnd msg) {
+       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);
+       LDKReplyShortChannelIdsEnd msg_var = msg;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_NoneLightningErrorZ handle_query_channel_range_LDKRoutingMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, LDKQueryChannelRange msg) {
+       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);
+       LDKQueryChannelRange msg_var = msg;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_NoneLightningErrorZ handle_query_short_channel_ids_LDKRoutingMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, LDKQueryShortChannelIds msg) {
+       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);
+       LDKQueryShortChannelIds msg_var = msg;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+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);
+}
+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);
+       LDKNodeFeatures ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+LDKInitFeatures provided_init_features_LDKRoutingMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id) {
+       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);
+       LDKInitFeatures ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+static void LDKRoutingMessageHandler_JCalls_cloned(LDKRoutingMessageHandler* new_obj) {
+       LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->MessageSendEventsProvider->refcnt, 1, memory_order_release);
+}
+static inline LDKRoutingMessageHandler LDKRoutingMessageHandler_init (int64_t o, int64_t MessageSendEventsProvider) {
+       LDKRoutingMessageHandler_JCalls *calls = MALLOC(sizeof(LDKRoutingMessageHandler_JCalls), "LDKRoutingMessageHandler_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKRoutingMessageHandler ret = {
+               .this_arg = (void*) calls,
+               .handle_node_announcement = handle_node_announcement_LDKRoutingMessageHandler_jcall,
+               .handle_channel_announcement = handle_channel_announcement_LDKRoutingMessageHandler_jcall,
+               .handle_channel_update = handle_channel_update_LDKRoutingMessageHandler_jcall,
+               .get_next_channel_announcement = get_next_channel_announcement_LDKRoutingMessageHandler_jcall,
+               .get_next_node_announcement = get_next_node_announcement_LDKRoutingMessageHandler_jcall,
+               .peer_connected = peer_connected_LDKRoutingMessageHandler_jcall,
+               .handle_reply_channel_range = handle_reply_channel_range_LDKRoutingMessageHandler_jcall,
+               .handle_reply_short_channel_ids_end = handle_reply_short_channel_ids_end_LDKRoutingMessageHandler_jcall,
+               .handle_query_channel_range = handle_query_channel_range_LDKRoutingMessageHandler_jcall,
+               .handle_query_short_channel_ids = handle_query_short_channel_ids_LDKRoutingMessageHandler_jcall,
+               .processing_queue_high = processing_queue_high_LDKRoutingMessageHandler_jcall,
+               .provided_node_features = provided_node_features_LDKRoutingMessageHandler_jcall,
+               .provided_init_features = provided_init_features_LDKRoutingMessageHandler_jcall,
+               .free = LDKRoutingMessageHandler_JCalls_free,
+               .MessageSendEventsProvider = LDKMessageSendEventsProvider_init(MessageSendEventsProvider),
+       };
+       calls->MessageSendEventsProvider = ret.MessageSendEventsProvider.this_arg;
+       return ret;
+}
+uint64_t  CS_LDK_LDKRoutingMessageHandler_new(int32_t o, int32_t MessageSendEventsProvider) {
+       LDKRoutingMessageHandler *res_ptr = MALLOC(sizeof(LDKRoutingMessageHandler), "LDKRoutingMessageHandler");
+       *res_ptr = LDKRoutingMessageHandler_init(o, MessageSendEventsProvider);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_RoutingMessageHandler_handle_node_announcement(int64_t this_arg, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)this_arg_ptr;
+       LDKNodeAnnouncement 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;
+       LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
+       *ret_conv = (this_arg_conv->handle_node_announcement)(this_arg_conv->this_arg, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_handle_channel_announcement(int64_t this_arg, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)this_arg_ptr;
+       LDKChannelAnnouncement 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;
+       LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
+       *ret_conv = (this_arg_conv->handle_channel_announcement)(this_arg_conv->this_arg, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_handle_channel_update(int64_t this_arg, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)this_arg_ptr;
+       LDKChannelUpdate 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;
+       LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
+       *ret_conv = (this_arg_conv->handle_channel_update)(this_arg_conv->this_arg, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_get_next_channel_announcement(int64_t this_arg, int64_t starting_point) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)this_arg_ptr;
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *ret_copy = MALLOC(sizeof(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ), "LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ");
+       *ret_copy = (this_arg_conv->get_next_channel_announcement)(this_arg_conv->this_arg, starting_point);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_get_next_node_announcement(int64_t this_arg, int64_t starting_point) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)this_arg_ptr;
+       LDKNodeId starting_point_conv;
+       starting_point_conv.inner = untag_ptr(starting_point);
+       starting_point_conv.is_owned = ptr_is_owned(starting_point);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(starting_point_conv);
+       starting_point_conv = NodeId_clone(&starting_point_conv);
+       LDKNodeAnnouncement ret_var = (this_arg_conv->get_next_node_announcement)(this_arg_conv->this_arg, starting_point_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_RoutingMessageHandler_peer_connected(int64_t this_arg, int8_tArray their_node_id, int64_t init, jboolean inbound) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)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);
+       LDKInit init_conv;
+       init_conv.inner = untag_ptr(init);
+       init_conv.is_owned = ptr_is_owned(init);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(init_conv);
+       init_conv.is_owned = false;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = (this_arg_conv->peer_connected)(this_arg_conv->this_arg, their_node_id_ref, &init_conv, inbound);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_handle_reply_channel_range(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); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)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);
+       LDKReplyChannelRange 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 = ReplyChannelRange_clone(&msg_conv);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = (this_arg_conv->handle_reply_channel_range)(this_arg_conv->this_arg, their_node_id_ref, msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_handle_reply_short_channel_ids_end(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); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)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);
+       LDKReplyShortChannelIdsEnd 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 = ReplyShortChannelIdsEnd_clone(&msg_conv);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = (this_arg_conv->handle_reply_short_channel_ids_end)(this_arg_conv->this_arg, their_node_id_ref, msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_handle_query_channel_range(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); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)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);
+       LDKQueryChannelRange 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 = QueryChannelRange_clone(&msg_conv);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = (this_arg_conv->handle_query_channel_range)(this_arg_conv->this_arg, their_node_id_ref, msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_handle_query_short_channel_ids(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); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)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);
+       LDKQueryShortChannelIds 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 = QueryShortChannelIds_clone(&msg_conv);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = (this_arg_conv->handle_query_short_channel_ids)(this_arg_conv->this_arg, their_node_id_ref, msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_RoutingMessageHandler_processing_queue_high(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)this_arg_ptr;
+       jboolean ret_conv = (this_arg_conv->processing_queue_high)(this_arg_conv->this_arg);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_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); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)this_arg_ptr;
+       LDKNodeFeatures ret_var = (this_arg_conv->provided_node_features)(this_arg_conv->this_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_RoutingMessageHandler_provided_init_features(int64_t this_arg, int8_tArray their_node_id) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)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);
+       LDKInitFeatures ret_var = (this_arg_conv->provided_init_features)(this_arg_conv->this_arg, their_node_id_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;
+}
+
+typedef struct LDKOnionMessageHandler_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKOnionMessageHandler_JCalls;
+static void LDKOnionMessageHandler_JCalls_free(void* this_arg) {
+       LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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__);
+       memcpy(peer_node_id_arr->elems, peer_node_id.compressed_form, 33);
+       LDKOnionMessage msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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);
+       LDKOnionMessage ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+LDKCResult_NoneNoneZ peer_connected_LDKOnionMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKInit * init, bool inbound) {
+       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);
+       LDKInit init_var = *init;
+       int64_t init_ref = 0;
+       init_var = Init_clone(&init_var);
+       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);
+       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;
+}
+void peer_disconnected_LDKOnionMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id) {
+       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);
+}
+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);
+       LDKNodeFeatures ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+LDKInitFeatures provided_init_features_LDKOnionMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id) {
+       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);
+       LDKInitFeatures ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+static void LDKOnionMessageHandler_JCalls_cloned(LDKOnionMessageHandler* new_obj) {
+       LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKOnionMessageHandler LDKOnionMessageHandler_init (int64_t o) {
+       LDKOnionMessageHandler_JCalls *calls = MALLOC(sizeof(LDKOnionMessageHandler_JCalls), "LDKOnionMessageHandler_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKOnionMessageHandler ret = {
+               .this_arg = (void*) calls,
+               .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,
+               .provided_node_features = provided_node_features_LDKOnionMessageHandler_jcall,
+               .provided_init_features = provided_init_features_LDKOnionMessageHandler_jcall,
+               .free = LDKOnionMessageHandler_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKOnionMessageHandler_new(int32_t o) {
+       LDKOnionMessageHandler *res_ptr = MALLOC(sizeof(LDKOnionMessageHandler), "LDKOnionMessageHandler");
+       *res_ptr = LDKOnionMessageHandler_init(o);
+       return tag_ptr(res_ptr, true);
+}
+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); }
+       LDKOnionMessageHandler* this_arg_conv = (LDKOnionMessageHandler*)this_arg_ptr;
+       LDKPublicKey peer_node_id_ref;
+       CHECK(peer_node_id->arr_len == 33);
+       memcpy(peer_node_id_ref.compressed_form, peer_node_id->elems, 33); FREE(peer_node_id);
+       LDKOnionMessage 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_onion_message)(this_arg_conv->this_arg, peer_node_id_ref, &msg_conv);
+}
+
+int64_t  CS_LDK_OnionMessageHandler_next_onion_message_for_peer(int64_t this_arg, int8_tArray peer_node_id) {
+       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;
+       LDKPublicKey peer_node_id_ref;
+       CHECK(peer_node_id->arr_len == 33);
+       memcpy(peer_node_id_ref.compressed_form, peer_node_id->elems, 33); FREE(peer_node_id);
+       LDKOnionMessage ret_var = (this_arg_conv->next_onion_message_for_peer)(this_arg_conv->this_arg, peer_node_id_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_OnionMessageHandler_peer_connected(int64_t this_arg, int8_tArray their_node_id, int64_t init, jboolean inbound) {
+       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;
+       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);
+       LDKInit init_conv;
+       init_conv.inner = untag_ptr(init);
+       init_conv.is_owned = ptr_is_owned(init);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(init_conv);
+       init_conv.is_owned = false;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = (this_arg_conv->peer_connected)(this_arg_conv->this_arg, their_node_id_ref, &init_conv, inbound);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_OnionMessageHandler_peer_disconnected(int64_t this_arg, int8_tArray their_node_id) {
+       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;
+       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);
+       (this_arg_conv->peer_disconnected)(this_arg_conv->this_arg, their_node_id_ref);
+}
+
+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); }
+       LDKOnionMessageHandler* this_arg_conv = (LDKOnionMessageHandler*)this_arg_ptr;
+       LDKNodeFeatures ret_var = (this_arg_conv->provided_node_features)(this_arg_conv->this_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_OnionMessageHandler_provided_init_features(int64_t this_arg, int8_tArray their_node_id) {
+       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;
+       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);
+       LDKInitFeatures ret_var = (this_arg_conv->provided_init_features)(this_arg_conv->this_arg, their_node_id_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;
+}
+
+typedef struct LDKCustomMessageReader_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKCustomMessageReader_JCalls;
+static void LDKCustomMessageReader_JCalls_free(void* this_arg) {
+       LDKCustomMessageReader_JCalls *j_calls = (LDKCustomMessageReader_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_COption_TypeZDecodeErrorZ read_LDKCustomMessageReader_jcall(const void* this_arg, uint16_t message_type, LDKu8slice buffer) {
+       LDKCustomMessageReader_JCalls *j_calls = (LDKCustomMessageReader_JCalls*) this_arg;
+       int16_t message_type_conv = message_type;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_COption_TypeZDecodeErrorZ ret_conv = *(LDKCResult_COption_TypeZDecodeErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKCustomMessageReader_JCalls_cloned(LDKCustomMessageReader* new_obj) {
+       LDKCustomMessageReader_JCalls *j_calls = (LDKCustomMessageReader_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKCustomMessageReader LDKCustomMessageReader_init (int64_t o) {
+       LDKCustomMessageReader_JCalls *calls = MALLOC(sizeof(LDKCustomMessageReader_JCalls), "LDKCustomMessageReader_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKCustomMessageReader ret = {
+               .this_arg = (void*) calls,
+               .read = read_LDKCustomMessageReader_jcall,
+               .free = LDKCustomMessageReader_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKCustomMessageReader_new(int32_t o) {
+       LDKCustomMessageReader *res_ptr = MALLOC(sizeof(LDKCustomMessageReader), "LDKCustomMessageReader");
+       *res_ptr = LDKCustomMessageReader_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_CustomMessageReader_read(int64_t this_arg, int16_t message_type, int8_tArray buffer) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKCustomMessageReader* this_arg_conv = (LDKCustomMessageReader*)this_arg_ptr;
+       LDKu8slice buffer_ref;
+       buffer_ref.datalen = buffer->arr_len;
+       buffer_ref.data = buffer->elems;
+       LDKCResult_COption_TypeZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_TypeZDecodeErrorZ), "LDKCResult_COption_TypeZDecodeErrorZ");
+       *ret_conv = (this_arg_conv->read)(this_arg_conv->this_arg, message_type, buffer_ref);
+       FREE(buffer);
+       return tag_ptr(ret_conv, true);
+}
+
+typedef struct LDKCustomMessageHandler_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+       LDKCustomMessageReader_JCalls* CustomMessageReader;
+} LDKCustomMessageHandler_JCalls;
+static void LDKCustomMessageHandler_JCalls_free(void* this_arg) {
+       LDKCustomMessageHandler_JCalls *j_calls = (LDKCustomMessageHandler_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_NoneLightningErrorZ handle_custom_message_LDKCustomMessageHandler_jcall(const void* this_arg, LDKType msg, LDKPublicKey sender_node_id) {
+       LDKCustomMessageHandler_JCalls *j_calls = (LDKCustomMessageHandler_JCalls*) this_arg;
+       LDKType* msg_ret = MALLOC(sizeof(LDKType), "LDKType");
+       *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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+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);
+       LDKCVec_C2Tuple_PublicKeyTypeZZ ret_constr;
+       ret_constr.datalen = ret->arr_len;
+       if (ret_constr.datalen > 0)
+               ret_constr.data = MALLOC(ret_constr.datalen * sizeof(LDKC2Tuple_PublicKeyTypeZ), "LDKCVec_C2Tuple_PublicKeyTypeZZ Elements");
+       else
+               ret_constr.data = NULL;
+       int64_t* ret_vals = ret->elems;
+       for (size_t z = 0; z < ret_constr.datalen; z++) {
+               int64_t ret_conv_25 = ret_vals[z];
+               void* ret_conv_25_ptr = untag_ptr(ret_conv_25);
+               CHECK_ACCESS(ret_conv_25_ptr);
+               LDKC2Tuple_PublicKeyTypeZ ret_conv_25_conv = *(LDKC2Tuple_PublicKeyTypeZ*)(ret_conv_25_ptr);
+               FREE(untag_ptr(ret_conv_25));
+               ret_constr.data[z] = ret_conv_25_conv;
+       }
+       FREE(ret);
+       return ret_constr;
+}
+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);
+       LDKNodeFeatures ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+LDKInitFeatures provided_init_features_LDKCustomMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id) {
+       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);
+       LDKInitFeatures ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+static void LDKCustomMessageHandler_JCalls_cloned(LDKCustomMessageHandler* new_obj) {
+       LDKCustomMessageHandler_JCalls *j_calls = (LDKCustomMessageHandler_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->CustomMessageReader->refcnt, 1, memory_order_release);
+}
+static inline LDKCustomMessageHandler LDKCustomMessageHandler_init (int64_t o, int64_t CustomMessageReader) {
+       LDKCustomMessageHandler_JCalls *calls = MALLOC(sizeof(LDKCustomMessageHandler_JCalls), "LDKCustomMessageHandler_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKCustomMessageHandler ret = {
+               .this_arg = (void*) calls,
+               .handle_custom_message = handle_custom_message_LDKCustomMessageHandler_jcall,
+               .get_and_clear_pending_msg = get_and_clear_pending_msg_LDKCustomMessageHandler_jcall,
+               .provided_node_features = provided_node_features_LDKCustomMessageHandler_jcall,
+               .provided_init_features = provided_init_features_LDKCustomMessageHandler_jcall,
+               .free = LDKCustomMessageHandler_JCalls_free,
+               .CustomMessageReader = LDKCustomMessageReader_init(CustomMessageReader),
+       };
+       calls->CustomMessageReader = ret.CustomMessageReader.this_arg;
+       return ret;
+}
+uint64_t  CS_LDK_LDKCustomMessageHandler_new(int32_t o, int32_t CustomMessageReader) {
+       LDKCustomMessageHandler *res_ptr = MALLOC(sizeof(LDKCustomMessageHandler), "LDKCustomMessageHandler");
+       *res_ptr = LDKCustomMessageHandler_init(o, CustomMessageReader);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_CustomMessageHandler_handle_custom_message(int64_t this_arg, int64_t msg, int8_tArray sender_node_id) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKCustomMessageHandler* this_arg_conv = (LDKCustomMessageHandler*)this_arg_ptr;
+       void* msg_ptr = untag_ptr(msg);
+       CHECK_ACCESS(msg_ptr);
+       LDKType msg_conv = *(LDKType*)(msg_ptr);
+       if (msg_conv.free == LDKType_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKType_JCalls_cloned(&msg_conv);
+       }
+       LDKPublicKey sender_node_id_ref;
+       CHECK(sender_node_id->arr_len == 33);
+       memcpy(sender_node_id_ref.compressed_form, sender_node_id->elems, 33); FREE(sender_node_id);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = (this_arg_conv->handle_custom_message)(this_arg_conv->this_arg, msg_conv, sender_node_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_tArray  CS_LDK_CustomMessageHandler_get_and_clear_pending_msg(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKCustomMessageHandler* this_arg_conv = (LDKCustomMessageHandler*)this_arg_ptr;
+       LDKCVec_C2Tuple_PublicKeyTypeZZ ret_var = (this_arg_conv->get_and_clear_pending_msg)(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 z = 0; z < ret_var.datalen; z++) {
+               LDKC2Tuple_PublicKeyTypeZ* ret_conv_25_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyTypeZ), "LDKC2Tuple_PublicKeyTypeZ");
+               *ret_conv_25_conv = ret_var.data[z];
+               ret_arr_ptr[z] = tag_ptr(ret_conv_25_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_CustomMessageHandler_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); }
+       LDKCustomMessageHandler* this_arg_conv = (LDKCustomMessageHandler*)this_arg_ptr;
+       LDKNodeFeatures ret_var = (this_arg_conv->provided_node_features)(this_arg_conv->this_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_CustomMessageHandler_provided_init_features(int64_t this_arg, int8_tArray their_node_id) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKCustomMessageHandler* this_arg_conv = (LDKCustomMessageHandler*)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);
+       LDKInitFeatures ret_var = (this_arg_conv->provided_init_features)(this_arg_conv->this_arg, their_node_id_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;
+}
+
+typedef struct LDKCustomOnionMessageHandler_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKCustomOnionMessageHandler_JCalls;
+static void LDKCustomOnionMessageHandler_JCalls_free(void* this_arg) {
+       LDKCustomOnionMessageHandler_JCalls *j_calls = (LDKCustomOnionMessageHandler_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCOption_OnionMessageContentsZ handle_custom_message_LDKCustomOnionMessageHandler_jcall(const void* this_arg, LDKOnionMessageContents msg) {
+       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));
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCOption_OnionMessageContentsZ ret_conv = *(LDKCOption_OnionMessageContentsZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_COption_OnionMessageContentsZDecodeErrorZ read_custom_message_LDKCustomOnionMessageHandler_jcall(const void* this_arg, uint64_t message_type, LDKu8slice buffer) {
+       LDKCustomOnionMessageHandler_JCalls *j_calls = (LDKCustomOnionMessageHandler_JCalls*) this_arg;
+       int64_t message_type_conv = message_type;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ ret_conv = *(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+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);
+       LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ ret_constr;
+       ret_constr.datalen = ret->arr_len;
+       if (ret_constr.datalen > 0)
+               ret_constr.data = MALLOC(ret_constr.datalen * sizeof(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ), "LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ Elements");
+       else
+               ret_constr.data = NULL;
+       int64_t* ret_vals = ret->elems;
+       for (size_t e = 0; e < ret_constr.datalen; e++) {
+               int64_t ret_conv_56 = ret_vals[e];
+               void* ret_conv_56_ptr = untag_ptr(ret_conv_56);
+               CHECK_ACCESS(ret_conv_56_ptr);
+               LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ ret_conv_56_conv = *(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ*)(ret_conv_56_ptr);
+               FREE(untag_ptr(ret_conv_56));
+               ret_constr.data[e] = ret_conv_56_conv;
+       }
+       FREE(ret);
+       return ret_constr;
+}
+static void LDKCustomOnionMessageHandler_JCalls_cloned(LDKCustomOnionMessageHandler* new_obj) {
+       LDKCustomOnionMessageHandler_JCalls *j_calls = (LDKCustomOnionMessageHandler_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKCustomOnionMessageHandler LDKCustomOnionMessageHandler_init (int64_t o) {
+       LDKCustomOnionMessageHandler_JCalls *calls = MALLOC(sizeof(LDKCustomOnionMessageHandler_JCalls), "LDKCustomOnionMessageHandler_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKCustomOnionMessageHandler ret = {
+               .this_arg = (void*) calls,
+               .handle_custom_message = handle_custom_message_LDKCustomOnionMessageHandler_jcall,
+               .read_custom_message = read_custom_message_LDKCustomOnionMessageHandler_jcall,
+               .release_pending_custom_messages = release_pending_custom_messages_LDKCustomOnionMessageHandler_jcall,
+               .free = LDKCustomOnionMessageHandler_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKCustomOnionMessageHandler_new(int32_t o) {
+       LDKCustomOnionMessageHandler *res_ptr = MALLOC(sizeof(LDKCustomOnionMessageHandler), "LDKCustomOnionMessageHandler");
+       *res_ptr = LDKCustomOnionMessageHandler_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_CustomOnionMessageHandler_handle_custom_message(int64_t this_arg, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKCustomOnionMessageHandler* this_arg_conv = (LDKCustomOnionMessageHandler*)this_arg_ptr;
+       void* msg_ptr = untag_ptr(msg);
+       CHECK_ACCESS(msg_ptr);
+       LDKOnionMessageContents msg_conv = *(LDKOnionMessageContents*)(msg_ptr);
+       if (msg_conv.free == LDKOnionMessageContents_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOnionMessageContents_JCalls_cloned(&msg_conv);
+       }
+       LDKCOption_OnionMessageContentsZ *ret_copy = MALLOC(sizeof(LDKCOption_OnionMessageContentsZ), "LDKCOption_OnionMessageContentsZ");
+       *ret_copy = (this_arg_conv->handle_custom_message)(this_arg_conv->this_arg, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CustomOnionMessageHandler_read_custom_message(int64_t this_arg, int64_t message_type, int8_tArray buffer) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKCustomOnionMessageHandler* this_arg_conv = (LDKCustomOnionMessageHandler*)this_arg_ptr;
+       LDKu8slice buffer_ref;
+       buffer_ref.datalen = buffer->arr_len;
+       buffer_ref.data = buffer->elems;
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ), "LDKCResult_COption_OnionMessageContentsZDecodeErrorZ");
+       *ret_conv = (this_arg_conv->read_custom_message)(this_arg_conv->this_arg, message_type, buffer_ref);
+       FREE(buffer);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_tArray  CS_LDK_CustomOnionMessageHandler_release_pending_custom_messages(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKCustomOnionMessageHandler* this_arg_conv = (LDKCustomOnionMessageHandler*)this_arg_ptr;
+       LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ ret_var = (this_arg_conv->release_pending_custom_messages)(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 e = 0; e < ret_var.datalen; e++) {
+               LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* ret_conv_56_conv = MALLOC(sizeof(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ), "LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ");
+               *ret_conv_56_conv = ret_var.data[e];
+               ret_arr_ptr[e] = tag_ptr(ret_conv_56_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+typedef struct LDKSocketDescriptor_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKSocketDescriptor_JCalls;
+static void LDKSocketDescriptor_JCalls_free(void* this_arg) {
+       LDKSocketDescriptor_JCalls *j_calls = (LDKSocketDescriptor_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+uintptr_t send_data_LDKSocketDescriptor_jcall(void* this_arg, LDKu8slice data, bool resume_read) {
+       LDKSocketDescriptor_JCalls *j_calls = (LDKSocketDescriptor_JCalls*) this_arg;
+       LDKu8slice data_var = data;
+       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);
+}
+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);
+}
+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));
+}
+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);
+}
+static void LDKSocketDescriptor_JCalls_cloned(LDKSocketDescriptor* new_obj) {
+       LDKSocketDescriptor_JCalls *j_calls = (LDKSocketDescriptor_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKSocketDescriptor LDKSocketDescriptor_init (int64_t o) {
+       LDKSocketDescriptor_JCalls *calls = MALLOC(sizeof(LDKSocketDescriptor_JCalls), "LDKSocketDescriptor_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKSocketDescriptor ret = {
+               .this_arg = (void*) calls,
+               .send_data = send_data_LDKSocketDescriptor_jcall,
+               .disconnect_socket = disconnect_socket_LDKSocketDescriptor_jcall,
+               .eq = eq_LDKSocketDescriptor_jcall,
+               .hash = hash_LDKSocketDescriptor_jcall,
+               .cloned = LDKSocketDescriptor_JCalls_cloned,
+               .free = LDKSocketDescriptor_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKSocketDescriptor_new(int32_t o) {
+       LDKSocketDescriptor *res_ptr = MALLOC(sizeof(LDKSocketDescriptor), "LDKSocketDescriptor");
+       *res_ptr = LDKSocketDescriptor_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_SocketDescriptor_send_data(int64_t this_arg, int8_tArray data, jboolean resume_read) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKSocketDescriptor* this_arg_conv = (LDKSocketDescriptor*)this_arg_ptr;
+       LDKu8slice data_ref;
+       data_ref.datalen = data->arr_len;
+       data_ref.data = data->elems;
+       int64_t ret_conv = (this_arg_conv->send_data)(this_arg_conv->this_arg, data_ref, resume_read);
+       FREE(data);
+       return ret_conv;
+}
+
+void  CS_LDK_SocketDescriptor_disconnect_socket(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKSocketDescriptor* this_arg_conv = (LDKSocketDescriptor*)this_arg_ptr;
+       (this_arg_conv->disconnect_socket)(this_arg_conv->this_arg);
+}
+
+int64_t  CS_LDK_SocketDescriptor_hash(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKSocketDescriptor* this_arg_conv = (LDKSocketDescriptor*)this_arg_ptr;
+       int64_t ret_conv = (this_arg_conv->hash)(this_arg_conv->this_arg);
+       return ret_conv;
+}
+
+uint32_t CS_LDK_LDKEffectiveCapacity_ty_from_ptr(int64_t ptr) {
+       LDKEffectiveCapacity *obj = (LDKEffectiveCapacity*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKEffectiveCapacity_ExactLiquidity: return 0;
+               case LDKEffectiveCapacity_AdvertisedMaxHTLC: return 1;
+               case LDKEffectiveCapacity_Total: return 2;
+               case LDKEffectiveCapacity_Infinite: return 3;
+               case LDKEffectiveCapacity_HintMaxHTLC: return 4;
+               case LDKEffectiveCapacity_Unknown: return 5;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKEffectiveCapacity_ExactLiquidity_get_liquidity_msat(int64_t ptr) {
+       LDKEffectiveCapacity *obj = (LDKEffectiveCapacity*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEffectiveCapacity_ExactLiquidity);
+       int64_t liquidity_msat_conv = obj->exact_liquidity.liquidity_msat;
+       return liquidity_msat_conv;
+}
+int64_t CS_LDK_LDKEffectiveCapacity_AdvertisedMaxHTLC_get_amount_msat(int64_t ptr) {
+       LDKEffectiveCapacity *obj = (LDKEffectiveCapacity*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEffectiveCapacity_AdvertisedMaxHTLC);
+       int64_t amount_msat_conv = obj->advertised_max_htlc.amount_msat;
+       return amount_msat_conv;
+}
+int64_t CS_LDK_LDKEffectiveCapacity_Total_get_capacity_msat(int64_t ptr) {
+       LDKEffectiveCapacity *obj = (LDKEffectiveCapacity*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEffectiveCapacity_Total);
+       int64_t capacity_msat_conv = obj->total.capacity_msat;
+       return capacity_msat_conv;
+}
+int64_t CS_LDK_LDKEffectiveCapacity_Total_get_htlc_maximum_msat(int64_t ptr) {
+       LDKEffectiveCapacity *obj = (LDKEffectiveCapacity*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEffectiveCapacity_Total);
+       int64_t htlc_maximum_msat_conv = obj->total.htlc_maximum_msat;
+       return htlc_maximum_msat_conv;
+}
+int64_t CS_LDK_LDKEffectiveCapacity_HintMaxHTLC_get_amount_msat(int64_t ptr) {
+       LDKEffectiveCapacity *obj = (LDKEffectiveCapacity*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEffectiveCapacity_HintMaxHTLC);
+       int64_t amount_msat_conv = obj->hint_max_htlc.amount_msat;
+       return amount_msat_conv;
+}
+uint32_t CS_LDK_LDKPayee_ty_from_ptr(int64_t ptr) {
+       LDKPayee *obj = (LDKPayee*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKPayee_Blinded: return 0;
+               case LDKPayee_Clear: return 1;
+               default: abort();
+       }
+}
+int64_tArray CS_LDK_LDKPayee_Blinded_get_route_hints(int64_t ptr) {
+       LDKPayee *obj = (LDKPayee*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPayee_Blinded);
+       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ route_hints_var = obj->blinded.route_hints;
+                       int64_tArray route_hints_arr = NULL;
+                       route_hints_arr = init_int64_tArray(route_hints_var.datalen, __LINE__);
+                       int64_t *route_hints_arr_ptr = (int64_t*)(((uint8_t*)route_hints_arr) + 8);
+                       for (size_t l = 0; l < route_hints_var.datalen; l++) {
+                               LDKC2Tuple_BlindedPayInfoBlindedPathZ* route_hints_conv_37_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
+                               *route_hints_conv_37_conv = route_hints_var.data[l];
+                               *route_hints_conv_37_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone(route_hints_conv_37_conv);
+                               route_hints_arr_ptr[l] = tag_ptr(route_hints_conv_37_conv, true);
+                       }
+                       
+       return route_hints_arr;
+}
+int64_t CS_LDK_LDKPayee_Blinded_get_features(int64_t ptr) {
+       LDKPayee *obj = (LDKPayee*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPayee_Blinded);
+       LDKBolt12InvoiceFeatures features_var = obj->blinded.features;
+                       int64_t features_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_var);
+                       features_ref = tag_ptr(features_var.inner, false);
+       return features_ref;
+}
+int8_tArray CS_LDK_LDKPayee_Clear_get_node_id(int64_t ptr) {
+       LDKPayee *obj = (LDKPayee*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPayee_Clear);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->clear.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_tArray CS_LDK_LDKPayee_Clear_get_route_hints(int64_t ptr) {
+       LDKPayee *obj = (LDKPayee*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPayee_Clear);
+       LDKCVec_RouteHintZ route_hints_var = obj->clear.route_hints;
+                       int64_tArray route_hints_arr = NULL;
+                       route_hints_arr = init_int64_tArray(route_hints_var.datalen, __LINE__);
+                       int64_t *route_hints_arr_ptr = (int64_t*)(((uint8_t*)route_hints_arr) + 8);
+                       for (size_t l = 0; l < route_hints_var.datalen; l++) {
+                               LDKRouteHint route_hints_conv_11_var = route_hints_var.data[l];
+                               int64_t route_hints_conv_11_ref = 0;
+                               CHECK_INNER_FIELD_ACCESS_OR_NULL(route_hints_conv_11_var);
+                               route_hints_conv_11_ref = tag_ptr(route_hints_conv_11_var.inner, false);
+                               route_hints_arr_ptr[l] = route_hints_conv_11_ref;
+                       }
+                       
+       return route_hints_arr;
+}
+int64_t CS_LDK_LDKPayee_Clear_get_features(int64_t ptr) {
+       LDKPayee *obj = (LDKPayee*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPayee_Clear);
+       LDKBolt11InvoiceFeatures features_var = obj->clear.features;
+                       int64_t features_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_var);
+                       features_ref = tag_ptr(features_var.inner, false);
+       return features_ref;
+}
+int32_t CS_LDK_LDKPayee_Clear_get_final_cltv_expiry_delta(int64_t ptr) {
+       LDKPayee *obj = (LDKPayee*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPayee_Clear);
+       int32_t final_cltv_expiry_delta_conv = obj->clear.final_cltv_expiry_delta;
+       return final_cltv_expiry_delta_conv;
+}
+typedef struct LDKScore_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+       LDKScoreLookUp_JCalls* ScoreLookUp;
+       LDKScoreUpdate_JCalls* ScoreUpdate;
+} LDKScore_JCalls;
+static void LDKScore_JCalls_free(void* this_arg) {
+       LDKScore_JCalls *j_calls = (LDKScore_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+       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;
+}
+static void LDKScore_JCalls_cloned(LDKScore* new_obj) {
+       LDKScore_JCalls *j_calls = (LDKScore_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->ScoreLookUp->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->ScoreUpdate->refcnt, 1, memory_order_release);
+}
+static inline LDKScore LDKScore_init (int64_t o, int64_t ScoreLookUp, int64_t ScoreUpdate) {
+       LDKScore_JCalls *calls = MALLOC(sizeof(LDKScore_JCalls), "LDKScore_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKScore ret = {
+               .this_arg = (void*) calls,
+               .write = write_LDKScore_jcall,
+               .free = LDKScore_JCalls_free,
+               .ScoreLookUp = LDKScoreLookUp_init(ScoreLookUp),
+               .ScoreUpdate = LDKScoreUpdate_init(ScoreUpdate),
+       };
+       calls->ScoreLookUp = ret.ScoreLookUp.this_arg;
+       calls->ScoreUpdate = ret.ScoreUpdate.this_arg;
+       return ret;
+}
+uint64_t  CS_LDK_LDKScore_new(int32_t o, int32_t ScoreLookUp, int32_t ScoreUpdate) {
+       LDKScore *res_ptr = MALLOC(sizeof(LDKScore), "LDKScore");
+       *res_ptr = LDKScore_init(o, ScoreLookUp, ScoreUpdate);
+       return tag_ptr(res_ptr, true);
+}
+int8_tArray  CS_LDK_Score_write(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKScore* this_arg_conv = (LDKScore*)this_arg_ptr;
+       LDKCVec_u8Z ret_var = (this_arg_conv->write)(this_arg_conv->this_arg);
+       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;
+}
+
+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;
+} LDKCoinSelectionSource_JCalls;
+static void LDKCoinSelectionSource_JCalls_free(void* this_arg) {
+       LDKCoinSelectionSource_JCalls *j_calls = (LDKCoinSelectionSource_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_CoinSelectionNoneZ select_confirmed_utxos_LDKCoinSelectionSource_jcall(const void* this_arg, LDKThirtyTwoBytes claim_id, LDKCVec_InputZ must_spend, LDKCVec_TxOutZ must_pay_to, uint32_t target_feerate_sat_per_1000_weight) {
+       LDKCoinSelectionSource_JCalls *j_calls = (LDKCoinSelectionSource_JCalls*) this_arg;
+       int8_tArray claim_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(claim_id_arr->elems, claim_id.data, 32);
+       LDKCVec_InputZ must_spend_var = must_spend;
+       int64_tArray must_spend_arr = NULL;
+       must_spend_arr = init_int64_tArray(must_spend_var.datalen, __LINE__);
+       int64_t *must_spend_arr_ptr = (int64_t*)(((uint8_t*)must_spend_arr) + 8);
+       for (size_t h = 0; h < must_spend_var.datalen; h++) {
+               LDKInput must_spend_conv_7_var = must_spend_var.data[h];
+               int64_t must_spend_conv_7_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(must_spend_conv_7_var);
+               must_spend_conv_7_ref = tag_ptr(must_spend_conv_7_var.inner, must_spend_conv_7_var.is_owned);
+               must_spend_arr_ptr[h] = must_spend_conv_7_ref;
+       }
+       
+       FREE(must_spend_var.data);
+       LDKCVec_TxOutZ must_pay_to_var = must_pay_to;
+       int64_tArray must_pay_to_arr = NULL;
+       must_pay_to_arr = init_int64_tArray(must_pay_to_var.datalen, __LINE__);
+       int64_t *must_pay_to_arr_ptr = (int64_t*)(((uint8_t*)must_pay_to_arr) + 8);
+       for (size_t h = 0; h < must_pay_to_var.datalen; h++) {
+               LDKTxOut* must_pay_to_conv_7_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+               *must_pay_to_conv_7_ref = must_pay_to_var.data[h];
+               must_pay_to_arr_ptr[h] = tag_ptr(must_pay_to_conv_7_ref, true);
+       }
+       
+       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);
+       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) {
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_TransactionNoneZ ret_conv = *(LDKCResult_TransactionNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKCoinSelectionSource_JCalls_cloned(LDKCoinSelectionSource* new_obj) {
+       LDKCoinSelectionSource_JCalls *j_calls = (LDKCoinSelectionSource_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKCoinSelectionSource LDKCoinSelectionSource_init (int64_t o) {
+       LDKCoinSelectionSource_JCalls *calls = MALLOC(sizeof(LDKCoinSelectionSource_JCalls), "LDKCoinSelectionSource_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKCoinSelectionSource ret = {
+               .this_arg = (void*) calls,
+               .select_confirmed_utxos = select_confirmed_utxos_LDKCoinSelectionSource_jcall,
+               .sign_tx = sign_tx_LDKCoinSelectionSource_jcall,
+               .free = LDKCoinSelectionSource_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKCoinSelectionSource_new(int32_t o) {
+       LDKCoinSelectionSource *res_ptr = MALLOC(sizeof(LDKCoinSelectionSource), "LDKCoinSelectionSource");
+       *res_ptr = LDKCoinSelectionSource_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_CoinSelectionSource_select_confirmed_utxos(int64_t this_arg, int8_tArray claim_id, int64_tArray must_spend, int64_tArray must_pay_to, int32_t target_feerate_sat_per_1000_weight) {
+       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;
+       LDKThirtyTwoBytes claim_id_ref;
+       CHECK(claim_id->arr_len == 32);
+       memcpy(claim_id_ref.data, claim_id->elems, 32); FREE(claim_id);
+       LDKCVec_InputZ must_spend_constr;
+       must_spend_constr.datalen = must_spend->arr_len;
+       if (must_spend_constr.datalen > 0)
+               must_spend_constr.data = MALLOC(must_spend_constr.datalen * sizeof(LDKInput), "LDKCVec_InputZ Elements");
+       else
+               must_spend_constr.data = NULL;
+       int64_t* must_spend_vals = must_spend->elems;
+       for (size_t h = 0; h < must_spend_constr.datalen; h++) {
+               int64_t must_spend_conv_7 = must_spend_vals[h];
+               LDKInput must_spend_conv_7_conv;
+               must_spend_conv_7_conv.inner = untag_ptr(must_spend_conv_7);
+               must_spend_conv_7_conv.is_owned = ptr_is_owned(must_spend_conv_7);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(must_spend_conv_7_conv);
+               must_spend_conv_7_conv = Input_clone(&must_spend_conv_7_conv);
+               must_spend_constr.data[h] = must_spend_conv_7_conv;
+       }
+       FREE(must_spend);
+       LDKCVec_TxOutZ must_pay_to_constr;
+       must_pay_to_constr.datalen = must_pay_to->arr_len;
+       if (must_pay_to_constr.datalen > 0)
+               must_pay_to_constr.data = MALLOC(must_pay_to_constr.datalen * sizeof(LDKTxOut), "LDKCVec_TxOutZ Elements");
+       else
+               must_pay_to_constr.data = NULL;
+       int64_t* must_pay_to_vals = must_pay_to->elems;
+       for (size_t h = 0; h < must_pay_to_constr.datalen; h++) {
+               int64_t must_pay_to_conv_7 = must_pay_to_vals[h];
+               void* must_pay_to_conv_7_ptr = untag_ptr(must_pay_to_conv_7);
+               CHECK_ACCESS(must_pay_to_conv_7_ptr);
+               LDKTxOut must_pay_to_conv_7_conv = *(LDKTxOut*)(must_pay_to_conv_7_ptr);
+               must_pay_to_conv_7_conv = TxOut_clone((LDKTxOut*)untag_ptr(must_pay_to_conv_7));
+               must_pay_to_constr.data[h] = must_pay_to_conv_7_conv;
+       }
+       FREE(must_pay_to);
+       LDKCResult_CoinSelectionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CoinSelectionNoneZ), "LDKCResult_CoinSelectionNoneZ");
+       *ret_conv = (this_arg_conv->select_confirmed_utxos)(this_arg_conv->this_arg, claim_id_ref, must_spend_constr, must_pay_to_constr, target_feerate_sat_per_1000_weight);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CoinSelectionSource_sign_tx(int64_t this_arg, int8_tArray tx) {
+       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;
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = (this_arg_conv->sign_tx)(this_arg_conv->this_arg, tx_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+typedef struct LDKWalletSource_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKWalletSource_JCalls;
+static void LDKWalletSource_JCalls_free(void* this_arg) {
+       LDKWalletSource_JCalls *j_calls = (LDKWalletSource_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_CVec_UtxoZNoneZ ret_conv = *(LDKCResult_CVec_UtxoZNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+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);
+       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) {
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_TransactionNoneZ ret_conv = *(LDKCResult_TransactionNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKWalletSource_JCalls_cloned(LDKWalletSource* new_obj) {
+       LDKWalletSource_JCalls *j_calls = (LDKWalletSource_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKWalletSource LDKWalletSource_init (int64_t o) {
+       LDKWalletSource_JCalls *calls = MALLOC(sizeof(LDKWalletSource_JCalls), "LDKWalletSource_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKWalletSource ret = {
+               .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,
+               .free = LDKWalletSource_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKWalletSource_new(int32_t o) {
+       LDKWalletSource *res_ptr = MALLOC(sizeof(LDKWalletSource), "LDKWalletSource");
+       *res_ptr = LDKWalletSource_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_WalletSource_list_confirmed_utxos(int64_t this_arg) {
+       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;
+       LDKCResult_CVec_UtxoZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_UtxoZNoneZ), "LDKCResult_CVec_UtxoZNoneZ");
+       *ret_conv = (this_arg_conv->list_confirmed_utxos)(this_arg_conv->this_arg);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_WalletSource_get_change_script(int64_t this_arg) {
+       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;
+       LDKCResult_CVec_u8ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZNoneZ), "LDKCResult_CVec_u8ZNoneZ");
+       *ret_conv = (this_arg_conv->get_change_script)(this_arg_conv->this_arg);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_WalletSource_sign_tx(int64_t this_arg, int8_tArray tx) {
+       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;
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = (this_arg_conv->sign_tx)(this_arg_conv->this_arg, tx_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+uint32_t CS_LDK_LDKGossipSync_ty_from_ptr(int64_t ptr) {
+       LDKGossipSync *obj = (LDKGossipSync*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKGossipSync_P2P: return 0;
+               case LDKGossipSync_Rapid: return 1;
+               case LDKGossipSync_None: return 2;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKGossipSync_P2P_get_p2p(int64_t ptr) {
+       LDKGossipSync *obj = (LDKGossipSync*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKGossipSync_P2P);
+       LDKP2PGossipSync p2p_var = obj->p2p;
+                       int64_t p2p_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(p2p_var);
+                       p2p_ref = tag_ptr(p2p_var.inner, false);
+       return p2p_ref;
+}
+int64_t CS_LDK_LDKGossipSync_Rapid_get_rapid(int64_t ptr) {
+       LDKGossipSync *obj = (LDKGossipSync*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKGossipSync_Rapid);
+       LDKRapidGossipSync rapid_var = obj->rapid;
+                       int64_t rapid_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(rapid_var);
+                       rapid_ref = tag_ptr(rapid_var.inner, false);
+       return rapid_ref;
+}
+uint32_t CS_LDK_LDKFallback_ty_from_ptr(int64_t ptr) {
+       LDKFallback *obj = (LDKFallback*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKFallback_SegWitProgram: return 0;
+               case LDKFallback_PubKeyHash: return 1;
+               case LDKFallback_ScriptHash: return 2;
+               default: abort();
+       }
+}
+int8_t CS_LDK_LDKFallback_SegWitProgram_get_version(int64_t ptr) {
+       LDKFallback *obj = (LDKFallback*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKFallback_SegWitProgram);
+       uint8_t version_val = obj->seg_wit_program.version._0;
+       return version_val;
+}
+int8_tArray CS_LDK_LDKFallback_SegWitProgram_get_program(int64_t ptr) {
+       LDKFallback *obj = (LDKFallback*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKFallback_SegWitProgram);
+       LDKCVec_u8Z program_var = obj->seg_wit_program.program;
+                       int8_tArray program_arr = init_int8_tArray(program_var.datalen, __LINE__);
+                       memcpy(program_arr->elems, program_var.data, program_var.datalen);
+       return program_arr;
+}
+int8_tArray CS_LDK_LDKFallback_PubKeyHash_get_pub_key_hash(int64_t ptr) {
+       LDKFallback *obj = (LDKFallback*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKFallback_PubKeyHash);
+       int8_tArray pub_key_hash_arr = init_int8_tArray(20, __LINE__);
+       memcpy(pub_key_hash_arr->elems, obj->pub_key_hash.data, 20);
+       return pub_key_hash_arr;
+}
+int8_tArray CS_LDK_LDKFallback_ScriptHash_get_script_hash(int64_t ptr) {
+       LDKFallback *obj = (LDKFallback*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKFallback_ScriptHash);
+       int8_tArray script_hash_arr = init_int8_tArray(20, __LINE__);
+       memcpy(script_hash_arr->elems, obj->script_hash.data, 20);
+       return script_hash_arr;
+}
+jstring  CS_LDK__ldk_get_compiled_version() {
+       LDKStr ret_str = _ldk_get_compiled_version();
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+jstring  CS_LDK__ldk_c_bindings_get_compiled_version() {
+       LDKStr ret_str = _ldk_c_bindings_get_compiled_version();
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_U128_le_bytes(int8_tArray val) {
+       LDKU128 val_ref;
+       CHECK(val->arr_len == 16);
+       memcpy(val_ref.le_bytes, val->elems, 16); FREE(val);
+       int8_tArray ret_arr = init_int8_tArray(16, __LINE__);
+       memcpy(ret_arr->elems, U128_le_bytes(val_ref).data, 16);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_U128_new(int8_tArray le_bytes) {
+       LDKSixteenBytes le_bytes_ref;
+       CHECK(le_bytes->arr_len == 16);
+       memcpy(le_bytes_ref.data, le_bytes->elems, 16); FREE(le_bytes);
+       int8_tArray ret_arr = init_int8_tArray(16, __LINE__);
+       memcpy(ret_arr->elems, U128_new(le_bytes_ref).le_bytes, 16);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_BigEndianScalar_new(int8_tArray big_endian_bytes) {
+       LDKThirtyTwoBytes big_endian_bytes_ref;
+       CHECK(big_endian_bytes->arr_len == 32);
+       memcpy(big_endian_bytes_ref.data, big_endian_bytes->elems, 32); FREE(big_endian_bytes);
+       LDKBigEndianScalar* ret_ref = MALLOC(sizeof(LDKBigEndianScalar), "LDKBigEndianScalar");
+       *ret_ref = BigEndianScalar_new(big_endian_bytes_ref);
+       return tag_ptr(ret_ref, true);
+}
+
+static inline uint64_t Bech32Error_clone_ptr(LDKBech32Error *NONNULL_PTR arg) {
+       LDKBech32Error *ret_copy = MALLOC(sizeof(LDKBech32Error), "LDKBech32Error");
+       *ret_copy = Bech32Error_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_Bech32Error_clone_ptr(int64_t arg) {
+       LDKBech32Error* arg_conv = (LDKBech32Error*)untag_ptr(arg);
+       int64_t ret_conv = Bech32Error_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bech32Error_clone(int64_t orig) {
+       LDKBech32Error* orig_conv = (LDKBech32Error*)untag_ptr(orig);
+       LDKBech32Error *ret_copy = MALLOC(sizeof(LDKBech32Error), "LDKBech32Error");
+       *ret_copy = Bech32Error_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_Bech32Error_free(int64_t o) {
+       if (!ptr_is_owned(o)) return;
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKBech32Error o_conv = *(LDKBech32Error*)(o_ptr);
+       FREE(untag_ptr(o));
+       Bech32Error_free(o_conv);
+}
+
+void  CS_LDK_Transaction_free(int8_tArray _res) {
+       LDKTransaction _res_ref;
+       _res_ref.datalen = _res->arr_len;
+       _res_ref.data = MALLOC(_res_ref.datalen, "LDKTransaction Bytes");
+       memcpy(_res_ref.data, _res->elems, _res_ref.datalen); FREE(_res);
+       _res_ref.data_is_owned = true;
+       Transaction_free(_res_ref);
+}
+
+void  CS_LDK_Witness_free(int8_tArray _res) {
+       LDKWitness _res_ref;
+       _res_ref.datalen = _res->arr_len;
+       _res_ref.data = MALLOC(_res_ref.datalen, "LDKWitness Bytes");
+       memcpy(_res_ref.data, _res->elems, _res_ref.datalen); FREE(_res);
+       _res_ref.data_is_owned = true;
+       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;
+       witness_ref.data = MALLOC(witness_ref.datalen, "LDKWitness Bytes");
+       memcpy(witness_ref.data, witness->elems, witness_ref.datalen); FREE(witness);
+       witness_ref.data_is_owned = true;
+       LDKCVec_u8Z script_sig_ref;
+       script_sig_ref.datalen = script_sig->arr_len;
+       script_sig_ref.data = MALLOC(script_sig_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(script_sig_ref.data, script_sig->elems, script_sig_ref.datalen); FREE(script_sig);
+       LDKThirtyTwoBytes previous_txid_ref;
+       CHECK(previous_txid->arr_len == 32);
+       memcpy(previous_txid_ref.data, previous_txid->elems, 32); FREE(previous_txid);
+       LDKTxIn* ret_ref = MALLOC(sizeof(LDKTxIn), "LDKTxIn");
+       *ret_ref = TxIn_new(witness_ref, script_sig_ref, sequence, previous_txid_ref, previous_vout);
+       return tag_ptr(ret_ref, true);
+}
+
+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;
+       script_pubkey_ref.data = MALLOC(script_pubkey_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(script_pubkey_ref.data, script_pubkey->elems, script_pubkey_ref.datalen); FREE(script_pubkey);
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = TxOut_new(script_pubkey_ref, value);
+       return tag_ptr(ret_ref, true);
+}
+
+void  CS_LDK_TxOut_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKTxOut _res_conv = *(LDKTxOut*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       TxOut_free(_res_conv);
+}
+
+static inline uint64_t TxOut_clone_ptr(LDKTxOut *NONNULL_PTR arg) {
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = TxOut_clone(arg);
+       return tag_ptr(ret_ref, true);
+}
+int64_t  CS_LDK_TxOut_clone_ptr(int64_t arg) {
+       LDKTxOut* arg_conv = (LDKTxOut*)untag_ptr(arg);
+       int64_t ret_conv = TxOut_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxOut_clone(int64_t orig) {
+       LDKTxOut* orig_conv = (LDKTxOut*)untag_ptr(orig);
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = TxOut_clone(orig_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+void  CS_LDK_Str_free(jstring _res) {
+       LDKStr dummy = { .chars = NULL, .len = 0, .chars_is_owned = false };
+       Str_free(dummy);
+}
+
+int64_t  CS_LDK_COption_u64Z_some(int64_t o) {
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = COption_u64Z_some(o);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_u64Z_none() {
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = COption_u64Z_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_u64Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_u64Z _res_conv = *(LDKCOption_u64Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_u64Z_free(_res_conv);
+}
+
+static inline uint64_t COption_u64Z_clone_ptr(LDKCOption_u64Z *NONNULL_PTR arg) {
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = COption_u64Z_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_u64Z_clone_ptr(int64_t arg) {
+       LDKCOption_u64Z* arg_conv = (LDKCOption_u64Z*)untag_ptr(arg);
+       int64_t ret_conv = COption_u64Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_u64Z_clone(int64_t orig) {
+       LDKCOption_u64Z* orig_conv = (LDKCOption_u64Z*)untag_ptr(orig);
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = COption_u64Z_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CVec_BlindedPathZ_free(int64_tArray _res) {
+       LDKCVec_BlindedPathZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKBlindedPath), "LDKCVec_BlindedPathZ 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];
+               LDKBlindedPath _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_BlindedPathZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_RefundBolt12ParseErrorZ_ok(int64_t o) {
+       LDKRefund 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 = Refund_clone(&o_conv);
+       LDKCResult_RefundBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RefundBolt12ParseErrorZ), "LDKCResult_RefundBolt12ParseErrorZ");
+       *ret_conv = CResult_RefundBolt12ParseErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RefundBolt12ParseErrorZ_err(int64_t e) {
+       LDKBolt12ParseError e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = Bolt12ParseError_clone(&e_conv);
+       LDKCResult_RefundBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RefundBolt12ParseErrorZ), "LDKCResult_RefundBolt12ParseErrorZ");
+       *ret_conv = CResult_RefundBolt12ParseErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RefundBolt12ParseErrorZ_is_ok(int64_t o) {
+       LDKCResult_RefundBolt12ParseErrorZ* o_conv = (LDKCResult_RefundBolt12ParseErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RefundBolt12ParseErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RefundBolt12ParseErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RefundBolt12ParseErrorZ _res_conv = *(LDKCResult_RefundBolt12ParseErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RefundBolt12ParseErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RefundBolt12ParseErrorZ_clone_ptr(LDKCResult_RefundBolt12ParseErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RefundBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RefundBolt12ParseErrorZ), "LDKCResult_RefundBolt12ParseErrorZ");
+       *ret_conv = CResult_RefundBolt12ParseErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RefundBolt12ParseErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RefundBolt12ParseErrorZ* arg_conv = (LDKCResult_RefundBolt12ParseErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RefundBolt12ParseErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RefundBolt12ParseErrorZ_clone(int64_t orig) {
+       LDKCResult_RefundBolt12ParseErrorZ* orig_conv = (LDKCResult_RefundBolt12ParseErrorZ*)untag_ptr(orig);
+       LDKCResult_RefundBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RefundBolt12ParseErrorZ), "LDKCResult_RefundBolt12ParseErrorZ");
+       *ret_conv = CResult_RefundBolt12ParseErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RetryDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKRetry o_conv = *(LDKRetry*)(o_ptr);
+       o_conv = Retry_clone((LDKRetry*)untag_ptr(o));
+       LDKCResult_RetryDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RetryDecodeErrorZ), "LDKCResult_RetryDecodeErrorZ");
+       *ret_conv = CResult_RetryDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RetryDecodeErrorZ_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_RetryDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RetryDecodeErrorZ), "LDKCResult_RetryDecodeErrorZ");
+       *ret_conv = CResult_RetryDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RetryDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RetryDecodeErrorZ* o_conv = (LDKCResult_RetryDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RetryDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RetryDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RetryDecodeErrorZ _res_conv = *(LDKCResult_RetryDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RetryDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RetryDecodeErrorZ_clone_ptr(LDKCResult_RetryDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RetryDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RetryDecodeErrorZ), "LDKCResult_RetryDecodeErrorZ");
+       *ret_conv = CResult_RetryDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RetryDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RetryDecodeErrorZ* arg_conv = (LDKCResult_RetryDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RetryDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RetryDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RetryDecodeErrorZ* orig_conv = (LDKCResult_RetryDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RetryDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RetryDecodeErrorZ), "LDKCResult_RetryDecodeErrorZ");
+       *ret_conv = CResult_RetryDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneAPIErrorZ_ok() {
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = CResult_NoneAPIErrorZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneAPIErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKAPIError e_conv = *(LDKAPIError*)(e_ptr);
+       e_conv = APIError_clone((LDKAPIError*)untag_ptr(e));
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = CResult_NoneAPIErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NoneAPIErrorZ_is_ok(int64_t o) {
+       LDKCResult_NoneAPIErrorZ* o_conv = (LDKCResult_NoneAPIErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NoneAPIErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NoneAPIErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NoneAPIErrorZ _res_conv = *(LDKCResult_NoneAPIErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NoneAPIErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NoneAPIErrorZ_clone_ptr(LDKCResult_NoneAPIErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = CResult_NoneAPIErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NoneAPIErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NoneAPIErrorZ* arg_conv = (LDKCResult_NoneAPIErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NoneAPIErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NoneAPIErrorZ_clone(int64_t orig) {
+       LDKCResult_NoneAPIErrorZ* orig_conv = (LDKCResult_NoneAPIErrorZ*)untag_ptr(orig);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = CResult_NoneAPIErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_CResult_NoneAPIErrorZZ_free(int64_tArray _res) {
+       LDKCVec_CResult_NoneAPIErrorZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKCResult_NoneAPIErrorZ), "LDKCVec_CResult_NoneAPIErrorZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t w = 0; w < _res_constr.datalen; w++) {
+               int64_t _res_conv_22 = _res_vals[w];
+               void* _res_conv_22_ptr = untag_ptr(_res_conv_22);
+               CHECK_ACCESS(_res_conv_22_ptr);
+               LDKCResult_NoneAPIErrorZ _res_conv_22_conv = *(LDKCResult_NoneAPIErrorZ*)(_res_conv_22_ptr);
+               FREE(untag_ptr(_res_conv_22));
+               _res_constr.data[w] = _res_conv_22_conv;
+       }
+       FREE(_res);
+       CVec_CResult_NoneAPIErrorZZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_APIErrorZ_free(int64_tArray _res) {
+       LDKCVec_APIErrorZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKAPIError), "LDKCVec_APIErrorZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t k = 0; k < _res_constr.datalen; k++) {
+               int64_t _res_conv_10 = _res_vals[k];
+               void* _res_conv_10_ptr = untag_ptr(_res_conv_10);
+               CHECK_ACCESS(_res_conv_10_ptr);
+               LDKAPIError _res_conv_10_conv = *(LDKAPIError*)(_res_conv_10_ptr);
+               FREE(untag_ptr(_res_conv_10));
+               _res_constr.data[k] = _res_conv_10_conv;
+       }
+       FREE(_res);
+       CVec_APIErrorZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_ThirtyTwoBytesZ_some(int8_tArray o) {
+       LDKThirtyTwoBytes o_ref;
+       CHECK(o->arr_len == 32);
+       memcpy(o_ref.data, o->elems, 32); FREE(o);
+       LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
+       *ret_copy = COption_ThirtyTwoBytesZ_some(o_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_ThirtyTwoBytesZ_none() {
+       LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
+       *ret_copy = COption_ThirtyTwoBytesZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_ThirtyTwoBytesZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_ThirtyTwoBytesZ _res_conv = *(LDKCOption_ThirtyTwoBytesZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_ThirtyTwoBytesZ_free(_res_conv);
+}
+
+static inline uint64_t COption_ThirtyTwoBytesZ_clone_ptr(LDKCOption_ThirtyTwoBytesZ *NONNULL_PTR arg) {
+       LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
+       *ret_copy = COption_ThirtyTwoBytesZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_ThirtyTwoBytesZ_clone_ptr(int64_t arg) {
+       LDKCOption_ThirtyTwoBytesZ* arg_conv = (LDKCOption_ThirtyTwoBytesZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_ThirtyTwoBytesZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_ThirtyTwoBytesZ_clone(int64_t orig) {
+       LDKCOption_ThirtyTwoBytesZ* orig_conv = (LDKCOption_ThirtyTwoBytesZ*)untag_ptr(orig);
+       LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
+       *ret_copy = COption_ThirtyTwoBytesZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CVec_u8Z_free(int8_tArray _res) {
+       LDKCVec_u8Z _res_ref;
+       _res_ref.datalen = _res->arr_len;
+       _res_ref.data = MALLOC(_res_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(_res_ref.data, _res->elems, _res_ref.datalen); FREE(_res);
+       CVec_u8Z_free(_res_ref);
+}
+
+int64_t  CS_LDK_COption_CVec_u8ZZ_some(int8_tArray o) {
+       LDKCVec_u8Z o_ref;
+       o_ref.datalen = o->arr_len;
+       o_ref.data = MALLOC(o_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(o_ref.data, o->elems, o_ref.datalen); FREE(o);
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = COption_CVec_u8ZZ_some(o_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_CVec_u8ZZ_none() {
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = COption_CVec_u8ZZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_CVec_u8ZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_CVec_u8ZZ _res_conv = *(LDKCOption_CVec_u8ZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_CVec_u8ZZ_free(_res_conv);
+}
+
+static inline uint64_t COption_CVec_u8ZZ_clone_ptr(LDKCOption_CVec_u8ZZ *NONNULL_PTR arg) {
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = COption_CVec_u8ZZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_CVec_u8ZZ_clone_ptr(int64_t arg) {
+       LDKCOption_CVec_u8ZZ* arg_conv = (LDKCOption_CVec_u8ZZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_CVec_u8ZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_CVec_u8ZZ_clone(int64_t orig) {
+       LDKCOption_CVec_u8ZZ* orig_conv = (LDKCOption_CVec_u8ZZ*)untag_ptr(orig);
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = COption_CVec_u8ZZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_ok(int64_t o) {
+       LDKRecipientOnionFields 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 = RecipientOnionFields_clone(&o_conv);
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsDecodeErrorZ), "LDKCResult_RecipientOnionFieldsDecodeErrorZ");
+       *ret_conv = CResult_RecipientOnionFieldsDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_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_RecipientOnionFieldsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsDecodeErrorZ), "LDKCResult_RecipientOnionFieldsDecodeErrorZ");
+       *ret_conv = CResult_RecipientOnionFieldsDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* o_conv = (LDKCResult_RecipientOnionFieldsDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RecipientOnionFieldsDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ _res_conv = *(LDKCResult_RecipientOnionFieldsDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RecipientOnionFieldsDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RecipientOnionFieldsDecodeErrorZ_clone_ptr(LDKCResult_RecipientOnionFieldsDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsDecodeErrorZ), "LDKCResult_RecipientOnionFieldsDecodeErrorZ");
+       *ret_conv = CResult_RecipientOnionFieldsDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* arg_conv = (LDKCResult_RecipientOnionFieldsDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RecipientOnionFieldsDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* orig_conv = (LDKCResult_RecipientOnionFieldsDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsDecodeErrorZ), "LDKCResult_RecipientOnionFieldsDecodeErrorZ");
+       *ret_conv = CResult_RecipientOnionFieldsDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C2Tuple_u64CVec_u8ZZ_clone_ptr(LDKC2Tuple_u64CVec_u8ZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_u64CVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKC2Tuple_u64CVec_u8ZZ");
+       *ret_conv = C2Tuple_u64CVec_u8ZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_u64CVec_u8ZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_u64CVec_u8ZZ* arg_conv = (LDKC2Tuple_u64CVec_u8ZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_u64CVec_u8ZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_u64CVec_u8ZZ_clone(int64_t orig) {
+       LDKC2Tuple_u64CVec_u8ZZ* orig_conv = (LDKC2Tuple_u64CVec_u8ZZ*)untag_ptr(orig);
+       LDKC2Tuple_u64CVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKC2Tuple_u64CVec_u8ZZ");
+       *ret_conv = C2Tuple_u64CVec_u8ZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_u64CVec_u8ZZ_new(int64_t a, int8_tArray b) {
+       LDKCVec_u8Z b_ref;
+       b_ref.datalen = b->arr_len;
+       b_ref.data = MALLOC(b_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(b_ref.data, b->elems, b_ref.datalen); FREE(b);
+       LDKC2Tuple_u64CVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKC2Tuple_u64CVec_u8ZZ");
+       *ret_conv = C2Tuple_u64CVec_u8ZZ_new(a, b_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_u64CVec_u8ZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_u64CVec_u8ZZ _res_conv = *(LDKC2Tuple_u64CVec_u8ZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_u64CVec_u8ZZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_u64CVec_u8ZZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_u64CVec_u8ZZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKCVec_C2Tuple_u64CVec_u8ZZZ 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_23 = _res_vals[x];
+               void* _res_conv_23_ptr = untag_ptr(_res_conv_23);
+               CHECK_ACCESS(_res_conv_23_ptr);
+               LDKC2Tuple_u64CVec_u8ZZ _res_conv_23_conv = *(LDKC2Tuple_u64CVec_u8ZZ*)(_res_conv_23_ptr);
+               FREE(untag_ptr(_res_conv_23));
+               _res_constr.data[x] = _res_conv_23_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_u64CVec_u8ZZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_RecipientOnionFieldsNoneZ_ok(int64_t o) {
+       LDKRecipientOnionFields 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 = RecipientOnionFields_clone(&o_conv);
+       LDKCResult_RecipientOnionFieldsNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsNoneZ), "LDKCResult_RecipientOnionFieldsNoneZ");
+       *ret_conv = CResult_RecipientOnionFieldsNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RecipientOnionFieldsNoneZ_err() {
+       LDKCResult_RecipientOnionFieldsNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsNoneZ), "LDKCResult_RecipientOnionFieldsNoneZ");
+       *ret_conv = CResult_RecipientOnionFieldsNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RecipientOnionFieldsNoneZ_is_ok(int64_t o) {
+       LDKCResult_RecipientOnionFieldsNoneZ* o_conv = (LDKCResult_RecipientOnionFieldsNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RecipientOnionFieldsNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RecipientOnionFieldsNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RecipientOnionFieldsNoneZ _res_conv = *(LDKCResult_RecipientOnionFieldsNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RecipientOnionFieldsNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RecipientOnionFieldsNoneZ_clone_ptr(LDKCResult_RecipientOnionFieldsNoneZ *NONNULL_PTR arg) {
+       LDKCResult_RecipientOnionFieldsNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsNoneZ), "LDKCResult_RecipientOnionFieldsNoneZ");
+       *ret_conv = CResult_RecipientOnionFieldsNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RecipientOnionFieldsNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_RecipientOnionFieldsNoneZ* arg_conv = (LDKCResult_RecipientOnionFieldsNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RecipientOnionFieldsNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RecipientOnionFieldsNoneZ_clone(int64_t orig) {
+       LDKCResult_RecipientOnionFieldsNoneZ* orig_conv = (LDKCResult_RecipientOnionFieldsNoneZ*)untag_ptr(orig);
+       LDKCResult_RecipientOnionFieldsNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsNoneZ), "LDKCResult_RecipientOnionFieldsNoneZ");
+       *ret_conv = CResult_RecipientOnionFieldsNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_ThirtyTwoBytesZ_free(ptrArray _res) {
+       LDKCVec_ThirtyTwoBytesZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ 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];
+               LDKThirtyTwoBytes _res_conv_8_ref;
+               CHECK(_res_conv_8->arr_len == 32);
+               memcpy(_res_conv_8_ref.data, _res_conv_8->elems, 32); FREE(_res_conv_8);
+               _res_constr.data[i] = _res_conv_8_ref;
+       }
+       FREE(_res);
+       CVec_ThirtyTwoBytesZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_CVec_ThirtyTwoBytesZZ_some(ptrArray o) {
+       LDKCVec_ThirtyTwoBytesZ o_constr;
+       o_constr.datalen = o->arr_len;
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ 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];
+               LDKThirtyTwoBytes o_conv_8_ref;
+               CHECK(o_conv_8->arr_len == 32);
+               memcpy(o_conv_8_ref.data, o_conv_8->elems, 32); FREE(o_conv_8);
+               o_constr.data[i] = o_conv_8_ref;
+       }
+       FREE(o);
+       LDKCOption_CVec_ThirtyTwoBytesZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_ThirtyTwoBytesZZ), "LDKCOption_CVec_ThirtyTwoBytesZZ");
+       *ret_copy = COption_CVec_ThirtyTwoBytesZZ_some(o_constr);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_CVec_ThirtyTwoBytesZZ_none() {
+       LDKCOption_CVec_ThirtyTwoBytesZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_ThirtyTwoBytesZZ), "LDKCOption_CVec_ThirtyTwoBytesZZ");
+       *ret_copy = COption_CVec_ThirtyTwoBytesZZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_CVec_ThirtyTwoBytesZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_CVec_ThirtyTwoBytesZZ _res_conv = *(LDKCOption_CVec_ThirtyTwoBytesZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_CVec_ThirtyTwoBytesZZ_free(_res_conv);
+}
+
+static inline uint64_t COption_CVec_ThirtyTwoBytesZZ_clone_ptr(LDKCOption_CVec_ThirtyTwoBytesZZ *NONNULL_PTR arg) {
+       LDKCOption_CVec_ThirtyTwoBytesZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_ThirtyTwoBytesZZ), "LDKCOption_CVec_ThirtyTwoBytesZZ");
+       *ret_copy = COption_CVec_ThirtyTwoBytesZZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_CVec_ThirtyTwoBytesZZ_clone_ptr(int64_t arg) {
+       LDKCOption_CVec_ThirtyTwoBytesZZ* arg_conv = (LDKCOption_CVec_ThirtyTwoBytesZZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_CVec_ThirtyTwoBytesZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_CVec_ThirtyTwoBytesZZ_clone(int64_t orig) {
+       LDKCOption_CVec_ThirtyTwoBytesZZ* orig_conv = (LDKCOption_CVec_ThirtyTwoBytesZZ*)untag_ptr(orig);
+       LDKCOption_CVec_ThirtyTwoBytesZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_ThirtyTwoBytesZZ), "LDKCOption_CVec_ThirtyTwoBytesZZ");
+       *ret_copy = COption_CVec_ThirtyTwoBytesZZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesNoneZ_ok(int8_tArray o) {
+       LDKThirtyTwoBytes o_ref;
+       CHECK(o->arr_len == 32);
+       memcpy(o_ref.data, o->elems, 32); FREE(o);
+       LDKCResult_ThirtyTwoBytesNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesNoneZ), "LDKCResult_ThirtyTwoBytesNoneZ");
+       *ret_conv = CResult_ThirtyTwoBytesNoneZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesNoneZ_err() {
+       LDKCResult_ThirtyTwoBytesNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesNoneZ), "LDKCResult_ThirtyTwoBytesNoneZ");
+       *ret_conv = CResult_ThirtyTwoBytesNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ThirtyTwoBytesNoneZ_is_ok(int64_t o) {
+       LDKCResult_ThirtyTwoBytesNoneZ* o_conv = (LDKCResult_ThirtyTwoBytesNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ThirtyTwoBytesNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ThirtyTwoBytesNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ThirtyTwoBytesNoneZ _res_conv = *(LDKCResult_ThirtyTwoBytesNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ThirtyTwoBytesNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ThirtyTwoBytesNoneZ_clone_ptr(LDKCResult_ThirtyTwoBytesNoneZ *NONNULL_PTR arg) {
+       LDKCResult_ThirtyTwoBytesNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesNoneZ), "LDKCResult_ThirtyTwoBytesNoneZ");
+       *ret_conv = CResult_ThirtyTwoBytesNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ThirtyTwoBytesNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_ThirtyTwoBytesNoneZ* arg_conv = (LDKCResult_ThirtyTwoBytesNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ThirtyTwoBytesNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesNoneZ_clone(int64_t orig) {
+       LDKCResult_ThirtyTwoBytesNoneZ* orig_conv = (LDKCResult_ThirtyTwoBytesNoneZ*)untag_ptr(orig);
+       LDKCResult_ThirtyTwoBytesNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesNoneZ), "LDKCResult_ThirtyTwoBytesNoneZ");
+       *ret_conv = CResult_ThirtyTwoBytesNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_ok(int64_t o) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_clone(&o_conv);
+       LDKCResult_BlindedPayInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPayInfoDecodeErrorZ), "LDKCResult_BlindedPayInfoDecodeErrorZ");
+       *ret_conv = CResult_BlindedPayInfoDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_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_BlindedPayInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPayInfoDecodeErrorZ), "LDKCResult_BlindedPayInfoDecodeErrorZ");
+       *ret_conv = CResult_BlindedPayInfoDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BlindedPayInfoDecodeErrorZ* o_conv = (LDKCResult_BlindedPayInfoDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BlindedPayInfoDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BlindedPayInfoDecodeErrorZ _res_conv = *(LDKCResult_BlindedPayInfoDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BlindedPayInfoDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BlindedPayInfoDecodeErrorZ_clone_ptr(LDKCResult_BlindedPayInfoDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BlindedPayInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPayInfoDecodeErrorZ), "LDKCResult_BlindedPayInfoDecodeErrorZ");
+       *ret_conv = CResult_BlindedPayInfoDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BlindedPayInfoDecodeErrorZ* arg_conv = (LDKCResult_BlindedPayInfoDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BlindedPayInfoDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BlindedPayInfoDecodeErrorZ* orig_conv = (LDKCResult_BlindedPayInfoDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BlindedPayInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPayInfoDecodeErrorZ), "LDKCResult_BlindedPayInfoDecodeErrorZ");
+       *ret_conv = CResult_BlindedPayInfoDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_ok(int64_t o) {
+       LDKDelayedPaymentOutputDescriptor 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 = DelayedPaymentOutputDescriptor_clone(&o_conv);
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_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_DelayedPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* o_conv = (LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ _res_conv = *(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_clone_ptr(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* arg_conv = (LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* orig_conv = (LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_StaticPaymentOutputDescriptorDecodeErrorZ_ok(int64_t o) {
+       LDKStaticPaymentOutputDescriptor 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 = StaticPaymentOutputDescriptor_clone(&o_conv);
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_StaticPaymentOutputDescriptorDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_StaticPaymentOutputDescriptorDecodeErrorZ_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_StaticPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_StaticPaymentOutputDescriptorDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_StaticPaymentOutputDescriptorDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* o_conv = (LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_StaticPaymentOutputDescriptorDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_StaticPaymentOutputDescriptorDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ _res_conv = *(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_StaticPaymentOutputDescriptorDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_StaticPaymentOutputDescriptorDecodeErrorZ_clone_ptr(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_StaticPaymentOutputDescriptorDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_StaticPaymentOutputDescriptorDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* arg_conv = (LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_StaticPaymentOutputDescriptorDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_StaticPaymentOutputDescriptorDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* orig_conv = (LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_StaticPaymentOutputDescriptorDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKSpendableOutputDescriptor o_conv = *(LDKSpendableOutputDescriptor*)(o_ptr);
+       o_conv = SpendableOutputDescriptor_clone((LDKSpendableOutputDescriptor*)untag_ptr(o));
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpendableOutputDescriptorDecodeErrorZ), "LDKCResult_SpendableOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_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_SpendableOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpendableOutputDescriptorDecodeErrorZ), "LDKCResult_SpendableOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* o_conv = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ _res_conv = *(LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SpendableOutputDescriptorDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SpendableOutputDescriptorDecodeErrorZ_clone_ptr(LDKCResult_SpendableOutputDescriptorDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpendableOutputDescriptorDecodeErrorZ), "LDKCResult_SpendableOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* arg_conv = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* orig_conv = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpendableOutputDescriptorDecodeErrorZ), "LDKCResult_SpendableOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_SpendableOutputDescriptorZ_free(int64_tArray _res) {
+       LDKCVec_SpendableOutputDescriptorZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKSpendableOutputDescriptor), "LDKCVec_SpendableOutputDescriptorZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t b = 0; b < _res_constr.datalen; b++) {
+               int64_t _res_conv_27 = _res_vals[b];
+               void* _res_conv_27_ptr = untag_ptr(_res_conv_27);
+               CHECK_ACCESS(_res_conv_27_ptr);
+               LDKSpendableOutputDescriptor _res_conv_27_conv = *(LDKSpendableOutputDescriptor*)(_res_conv_27_ptr);
+               FREE(untag_ptr(_res_conv_27));
+               _res_constr.data[b] = _res_conv_27_conv;
+       }
+       FREE(_res);
+       CVec_SpendableOutputDescriptorZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_TxOutZ_free(int64_tArray _res) {
+       LDKCVec_TxOutZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKTxOut), "LDKCVec_TxOutZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t h = 0; h < _res_constr.datalen; h++) {
+               int64_t _res_conv_7 = _res_vals[h];
+               void* _res_conv_7_ptr = untag_ptr(_res_conv_7);
+               CHECK_ACCESS(_res_conv_7_ptr);
+               LDKTxOut _res_conv_7_conv = *(LDKTxOut*)(_res_conv_7_ptr);
+               FREE(untag_ptr(_res_conv_7));
+               _res_constr.data[h] = _res_conv_7_conv;
+       }
+       FREE(_res);
+       CVec_TxOutZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_u32Z_some(int32_t o) {
+       LDKCOption_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = COption_u32Z_some(o);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_u32Z_none() {
+       LDKCOption_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = COption_u32Z_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_u32Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_u32Z _res_conv = *(LDKCOption_u32Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_u32Z_free(_res_conv);
+}
+
+static inline uint64_t COption_u32Z_clone_ptr(LDKCOption_u32Z *NONNULL_PTR arg) {
+       LDKCOption_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = COption_u32Z_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_u32Z_clone_ptr(int64_t arg) {
+       LDKCOption_u32Z* arg_conv = (LDKCOption_u32Z*)untag_ptr(arg);
+       int64_t ret_conv = COption_u32Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_u32Z_clone(int64_t orig) {
+       LDKCOption_u32Z* orig_conv = (LDKCOption_u32Z*)untag_ptr(orig);
+       LDKCOption_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = COption_u32Z_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       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);
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_CVec_u8ZusizeZ_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);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_CVec_u8ZusizeZ_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);
+       FREE(untag_ptr(_res));
+       C2Tuple_CVec_u8ZusizeZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_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);
+       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();
+       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);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_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);
+       FREE(untag_ptr(_res));
+       CResult_C2Tuple_CVec_u8ZusizeZNoneZ_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);
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_ok(int64_t o) {
+       LDKChannelDerivationParameters 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 = ChannelDerivationParameters_clone(&o_conv);
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDerivationParametersDecodeErrorZ), "LDKCResult_ChannelDerivationParametersDecodeErrorZ");
+       *ret_conv = CResult_ChannelDerivationParametersDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_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_ChannelDerivationParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDerivationParametersDecodeErrorZ), "LDKCResult_ChannelDerivationParametersDecodeErrorZ");
+       *ret_conv = CResult_ChannelDerivationParametersDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* o_conv = (LDKCResult_ChannelDerivationParametersDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelDerivationParametersDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ _res_conv = *(LDKCResult_ChannelDerivationParametersDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelDerivationParametersDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelDerivationParametersDecodeErrorZ_clone_ptr(LDKCResult_ChannelDerivationParametersDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDerivationParametersDecodeErrorZ), "LDKCResult_ChannelDerivationParametersDecodeErrorZ");
+       *ret_conv = CResult_ChannelDerivationParametersDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* arg_conv = (LDKCResult_ChannelDerivationParametersDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelDerivationParametersDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* orig_conv = (LDKCResult_ChannelDerivationParametersDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDerivationParametersDecodeErrorZ), "LDKCResult_ChannelDerivationParametersDecodeErrorZ");
+       *ret_conv = CResult_ChannelDerivationParametersDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_ok(int64_t o) {
+       LDKHTLCDescriptor 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 = HTLCDescriptor_clone(&o_conv);
+       LDKCResult_HTLCDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCDescriptorDecodeErrorZ), "LDKCResult_HTLCDescriptorDecodeErrorZ");
+       *ret_conv = CResult_HTLCDescriptorDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_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_HTLCDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCDescriptorDecodeErrorZ), "LDKCResult_HTLCDescriptorDecodeErrorZ");
+       *ret_conv = CResult_HTLCDescriptorDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_HTLCDescriptorDecodeErrorZ* o_conv = (LDKCResult_HTLCDescriptorDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_HTLCDescriptorDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_HTLCDescriptorDecodeErrorZ _res_conv = *(LDKCResult_HTLCDescriptorDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_HTLCDescriptorDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_HTLCDescriptorDecodeErrorZ_clone_ptr(LDKCResult_HTLCDescriptorDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_HTLCDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCDescriptorDecodeErrorZ), "LDKCResult_HTLCDescriptorDecodeErrorZ");
+       *ret_conv = CResult_HTLCDescriptorDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_HTLCDescriptorDecodeErrorZ* arg_conv = (LDKCResult_HTLCDescriptorDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_HTLCDescriptorDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_HTLCDescriptorDecodeErrorZ* orig_conv = (LDKCResult_HTLCDescriptorDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_HTLCDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCDescriptorDecodeErrorZ), "LDKCResult_HTLCDescriptorDecodeErrorZ");
+       *ret_conv = CResult_HTLCDescriptorDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneNoneZ_ok() {
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = CResult_NoneNoneZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneNoneZ_err() {
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = CResult_NoneNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NoneNoneZ_is_ok(int64_t o) {
+       LDKCResult_NoneNoneZ* o_conv = (LDKCResult_NoneNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NoneNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NoneNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NoneNoneZ _res_conv = *(LDKCResult_NoneNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NoneNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NoneNoneZ_clone_ptr(LDKCResult_NoneNoneZ *NONNULL_PTR arg) {
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = CResult_NoneNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NoneNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_NoneNoneZ* arg_conv = (LDKCResult_NoneNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NoneNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NoneNoneZ_clone(int64_t orig) {
+       LDKCResult_NoneNoneZ* orig_conv = (LDKCResult_NoneNoneZ*)untag_ptr(orig);
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = CResult_NoneNoneZ_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(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);
+       memcpy(o_ref.compressed_form, o->elems, 33); FREE(o);
+       LDKCResult_PublicKeyNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeyNoneZ), "LDKCResult_PublicKeyNoneZ");
+       *ret_conv = CResult_PublicKeyNoneZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PublicKeyNoneZ_err() {
+       LDKCResult_PublicKeyNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeyNoneZ), "LDKCResult_PublicKeyNoneZ");
+       *ret_conv = CResult_PublicKeyNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PublicKeyNoneZ_is_ok(int64_t o) {
+       LDKCResult_PublicKeyNoneZ* o_conv = (LDKCResult_PublicKeyNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PublicKeyNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PublicKeyNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PublicKeyNoneZ _res_conv = *(LDKCResult_PublicKeyNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PublicKeyNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PublicKeyNoneZ_clone_ptr(LDKCResult_PublicKeyNoneZ *NONNULL_PTR arg) {
+       LDKCResult_PublicKeyNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeyNoneZ), "LDKCResult_PublicKeyNoneZ");
+       *ret_conv = CResult_PublicKeyNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PublicKeyNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_PublicKeyNoneZ* arg_conv = (LDKCResult_PublicKeyNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PublicKeyNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PublicKeyNoneZ_clone(int64_t orig) {
+       LDKCResult_PublicKeyNoneZ* orig_conv = (LDKCResult_PublicKeyNoneZ*)untag_ptr(orig);
+       LDKCResult_PublicKeyNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeyNoneZ), "LDKCResult_PublicKeyNoneZ");
+       *ret_conv = CResult_PublicKeyNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_BigEndianScalarZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKBigEndianScalar o_conv = *(LDKBigEndianScalar*)(o_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKBigEndianScalar
+       LDKCOption_BigEndianScalarZ *ret_copy = MALLOC(sizeof(LDKCOption_BigEndianScalarZ), "LDKCOption_BigEndianScalarZ");
+       *ret_copy = COption_BigEndianScalarZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_BigEndianScalarZ_none() {
+       LDKCOption_BigEndianScalarZ *ret_copy = MALLOC(sizeof(LDKCOption_BigEndianScalarZ), "LDKCOption_BigEndianScalarZ");
+       *ret_copy = COption_BigEndianScalarZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_BigEndianScalarZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_BigEndianScalarZ _res_conv = *(LDKCOption_BigEndianScalarZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_BigEndianScalarZ_free(_res_conv);
+}
+
+static inline uint64_t COption_BigEndianScalarZ_clone_ptr(LDKCOption_BigEndianScalarZ *NONNULL_PTR arg) {
+       LDKCOption_BigEndianScalarZ *ret_copy = MALLOC(sizeof(LDKCOption_BigEndianScalarZ), "LDKCOption_BigEndianScalarZ");
+       *ret_copy = COption_BigEndianScalarZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_BigEndianScalarZ_clone_ptr(int64_t arg) {
+       LDKCOption_BigEndianScalarZ* arg_conv = (LDKCOption_BigEndianScalarZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_BigEndianScalarZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_BigEndianScalarZ_clone(int64_t orig) {
+       LDKCOption_BigEndianScalarZ* orig_conv = (LDKCOption_BigEndianScalarZ*)untag_ptr(orig);
+       LDKCOption_BigEndianScalarZ *ret_copy = MALLOC(sizeof(LDKCOption_BigEndianScalarZ), "LDKCOption_BigEndianScalarZ");
+       *ret_copy = COption_BigEndianScalarZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CVec_U5Z_free(ptrArray _res) {
+       LDKCVec_U5Z _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKU5), "LDKCVec_U5Z Elements");
+       else
+               _res_constr.data = NULL;
+       int8_t* _res_vals = (void*) _res->elems;
+       for (size_t h = 0; h < _res_constr.datalen; h++) {
+               int8_t _res_conv_7 = _res_vals[h];
+               
+               _res_constr.data[h] = (LDKU5){ ._0 = _res_conv_7 };
+       }
+       FREE(_res);
+       CVec_U5Z_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_RecoverableSignatureNoneZ_ok(int8_tArray o) {
+       LDKRecoverableSignature o_ref;
+       CHECK(o->arr_len == 68);
+       memcpy(o_ref.serialized_form, o->elems, 68); FREE(o);
+       LDKCResult_RecoverableSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecoverableSignatureNoneZ), "LDKCResult_RecoverableSignatureNoneZ");
+       *ret_conv = CResult_RecoverableSignatureNoneZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RecoverableSignatureNoneZ_err() {
+       LDKCResult_RecoverableSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecoverableSignatureNoneZ), "LDKCResult_RecoverableSignatureNoneZ");
+       *ret_conv = CResult_RecoverableSignatureNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RecoverableSignatureNoneZ_is_ok(int64_t o) {
+       LDKCResult_RecoverableSignatureNoneZ* o_conv = (LDKCResult_RecoverableSignatureNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RecoverableSignatureNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RecoverableSignatureNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RecoverableSignatureNoneZ _res_conv = *(LDKCResult_RecoverableSignatureNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RecoverableSignatureNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RecoverableSignatureNoneZ_clone_ptr(LDKCResult_RecoverableSignatureNoneZ *NONNULL_PTR arg) {
+       LDKCResult_RecoverableSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecoverableSignatureNoneZ), "LDKCResult_RecoverableSignatureNoneZ");
+       *ret_conv = CResult_RecoverableSignatureNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RecoverableSignatureNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_RecoverableSignatureNoneZ* arg_conv = (LDKCResult_RecoverableSignatureNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RecoverableSignatureNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RecoverableSignatureNoneZ_clone(int64_t orig) {
+       LDKCResult_RecoverableSignatureNoneZ* orig_conv = (LDKCResult_RecoverableSignatureNoneZ*)untag_ptr(orig);
+       LDKCResult_RecoverableSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecoverableSignatureNoneZ), "LDKCResult_RecoverableSignatureNoneZ");
+       *ret_conv = CResult_RecoverableSignatureNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SchnorrSignatureNoneZ_ok(int8_tArray o) {
+       LDKSchnorrSignature o_ref;
+       CHECK(o->arr_len == 64);
+       memcpy(o_ref.compact_form, o->elems, 64); FREE(o);
+       LDKCResult_SchnorrSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_SchnorrSignatureNoneZ), "LDKCResult_SchnorrSignatureNoneZ");
+       *ret_conv = CResult_SchnorrSignatureNoneZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SchnorrSignatureNoneZ_err() {
+       LDKCResult_SchnorrSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_SchnorrSignatureNoneZ), "LDKCResult_SchnorrSignatureNoneZ");
+       *ret_conv = CResult_SchnorrSignatureNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SchnorrSignatureNoneZ_is_ok(int64_t o) {
+       LDKCResult_SchnorrSignatureNoneZ* o_conv = (LDKCResult_SchnorrSignatureNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SchnorrSignatureNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SchnorrSignatureNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SchnorrSignatureNoneZ _res_conv = *(LDKCResult_SchnorrSignatureNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SchnorrSignatureNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SchnorrSignatureNoneZ_clone_ptr(LDKCResult_SchnorrSignatureNoneZ *NONNULL_PTR arg) {
+       LDKCResult_SchnorrSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_SchnorrSignatureNoneZ), "LDKCResult_SchnorrSignatureNoneZ");
+       *ret_conv = CResult_SchnorrSignatureNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SchnorrSignatureNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_SchnorrSignatureNoneZ* arg_conv = (LDKCResult_SchnorrSignatureNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SchnorrSignatureNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SchnorrSignatureNoneZ_clone(int64_t orig) {
+       LDKCResult_SchnorrSignatureNoneZ* orig_conv = (LDKCResult_SchnorrSignatureNoneZ*)untag_ptr(orig);
+       LDKCResult_SchnorrSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_SchnorrSignatureNoneZ), "LDKCResult_SchnorrSignatureNoneZ");
+       *ret_conv = CResult_SchnorrSignatureNoneZ_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);
+       LDKWriteableEcdsaChannelSigner o_conv = *(LDKWriteableEcdsaChannelSigner*)(o_ptr);
+       if (o_conv.free == LDKWriteableEcdsaChannelSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKWriteableEcdsaChannelSigner_JCalls_cloned(&o_conv);
+       }
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ), "LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ");
+       *ret_conv = CResult_WriteableEcdsaChannelSignerDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_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_WriteableEcdsaChannelSignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ), "LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ");
+       *ret_conv = CResult_WriteableEcdsaChannelSignerDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* o_conv = (LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_WriteableEcdsaChannelSignerDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ _res_conv = *(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_WriteableEcdsaChannelSignerDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone_ptr(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ), "LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ");
+       *ret_conv = CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* arg_conv = (LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* orig_conv = (LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ), "LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ");
+       *ret_conv = CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZNoneZ_ok(int8_tArray o) {
+       LDKCVec_u8Z o_ref;
+       o_ref.datalen = o->arr_len;
+       o_ref.data = MALLOC(o_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(o_ref.data, o->elems, o_ref.datalen); FREE(o);
+       LDKCResult_CVec_u8ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZNoneZ), "LDKCResult_CVec_u8ZNoneZ");
+       *ret_conv = CResult_CVec_u8ZNoneZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZNoneZ_err() {
+       LDKCResult_CVec_u8ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZNoneZ), "LDKCResult_CVec_u8ZNoneZ");
+       *ret_conv = CResult_CVec_u8ZNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_u8ZNoneZ_is_ok(int64_t o) {
+       LDKCResult_CVec_u8ZNoneZ* o_conv = (LDKCResult_CVec_u8ZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_u8ZNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_u8ZNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_u8ZNoneZ _res_conv = *(LDKCResult_CVec_u8ZNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_u8ZNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_u8ZNoneZ_clone_ptr(LDKCResult_CVec_u8ZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_u8ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZNoneZ), "LDKCResult_CVec_u8ZNoneZ");
+       *ret_conv = CResult_CVec_u8ZNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_u8ZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_u8ZNoneZ* arg_conv = (LDKCResult_CVec_u8ZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_u8ZNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZNoneZ_clone(int64_t orig) {
+       LDKCResult_CVec_u8ZNoneZ* orig_conv = (LDKCResult_CVec_u8ZNoneZ*)untag_ptr(orig);
+       LDKCResult_CVec_u8ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZNoneZ), "LDKCResult_CVec_u8ZNoneZ");
+       *ret_conv = CResult_CVec_u8ZNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptNoneZ_ok(int64_t o) {
+       LDKShutdownScript 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 = ShutdownScript_clone(&o_conv);
+       LDKCResult_ShutdownScriptNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptNoneZ), "LDKCResult_ShutdownScriptNoneZ");
+       *ret_conv = CResult_ShutdownScriptNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptNoneZ_err() {
+       LDKCResult_ShutdownScriptNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptNoneZ), "LDKCResult_ShutdownScriptNoneZ");
+       *ret_conv = CResult_ShutdownScriptNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ShutdownScriptNoneZ_is_ok(int64_t o) {
+       LDKCResult_ShutdownScriptNoneZ* o_conv = (LDKCResult_ShutdownScriptNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ShutdownScriptNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ShutdownScriptNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ShutdownScriptNoneZ _res_conv = *(LDKCResult_ShutdownScriptNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ShutdownScriptNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ShutdownScriptNoneZ_clone_ptr(LDKCResult_ShutdownScriptNoneZ *NONNULL_PTR arg) {
+       LDKCResult_ShutdownScriptNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptNoneZ), "LDKCResult_ShutdownScriptNoneZ");
+       *ret_conv = CResult_ShutdownScriptNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ShutdownScriptNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_ShutdownScriptNoneZ* arg_conv = (LDKCResult_ShutdownScriptNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ShutdownScriptNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptNoneZ_clone(int64_t orig) {
+       LDKCResult_ShutdownScriptNoneZ* orig_conv = (LDKCResult_ShutdownScriptNoneZ*)untag_ptr(orig);
+       LDKCResult_ShutdownScriptNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptNoneZ), "LDKCResult_ShutdownScriptNoneZ");
+       *ret_conv = CResult_ShutdownScriptNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_u16Z_some(int16_t o) {
+       LDKCOption_u16Z *ret_copy = MALLOC(sizeof(LDKCOption_u16Z), "LDKCOption_u16Z");
+       *ret_copy = COption_u16Z_some(o);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_u16Z_none() {
+       LDKCOption_u16Z *ret_copy = MALLOC(sizeof(LDKCOption_u16Z), "LDKCOption_u16Z");
+       *ret_copy = COption_u16Z_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_u16Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_u16Z _res_conv = *(LDKCOption_u16Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_u16Z_free(_res_conv);
+}
+
+static inline uint64_t COption_u16Z_clone_ptr(LDKCOption_u16Z *NONNULL_PTR arg) {
+       LDKCOption_u16Z *ret_copy = MALLOC(sizeof(LDKCOption_u16Z), "LDKCOption_u16Z");
+       *ret_copy = COption_u16Z_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_u16Z_clone_ptr(int64_t arg) {
+       LDKCOption_u16Z* arg_conv = (LDKCOption_u16Z*)untag_ptr(arg);
+       int64_t ret_conv = COption_u16Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_u16Z_clone(int64_t orig) {
+       LDKCOption_u16Z* orig_conv = (LDKCOption_u16Z*)untag_ptr(orig);
+       LDKCOption_u16Z *ret_copy = MALLOC(sizeof(LDKCOption_u16Z), "LDKCOption_u16Z");
+       *ret_copy = COption_u16Z_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_boolZ_some(jboolean o) {
+       LDKCOption_boolZ *ret_copy = MALLOC(sizeof(LDKCOption_boolZ), "LDKCOption_boolZ");
+       *ret_copy = COption_boolZ_some(o);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_boolZ_none() {
+       LDKCOption_boolZ *ret_copy = MALLOC(sizeof(LDKCOption_boolZ), "LDKCOption_boolZ");
+       *ret_copy = COption_boolZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_boolZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_boolZ _res_conv = *(LDKCOption_boolZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_boolZ_free(_res_conv);
+}
+
+static inline uint64_t COption_boolZ_clone_ptr(LDKCOption_boolZ *NONNULL_PTR arg) {
+       LDKCOption_boolZ *ret_copy = MALLOC(sizeof(LDKCOption_boolZ), "LDKCOption_boolZ");
+       *ret_copy = COption_boolZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_boolZ_clone_ptr(int64_t arg) {
+       LDKCOption_boolZ* arg_conv = (LDKCOption_boolZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_boolZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_boolZ_clone(int64_t orig) {
+       LDKCOption_boolZ* orig_conv = (LDKCOption_boolZ*)untag_ptr(orig);
+       LDKCOption_boolZ *ret_copy = MALLOC(sizeof(LDKCOption_boolZ), "LDKCOption_boolZ");
+       *ret_copy = COption_boolZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CVec_CVec_u8ZZ_free(ptrArray _res) {
+       LDKCVec_CVec_u8ZZ _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");
+       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);
+               _res_constr.data[i] = _res_conv_8_ref;
+       }
+       FREE(_res);
+       CVec_CVec_u8ZZ_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");
+       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;
+       }
+       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);
+       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();
+       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);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_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);
+       FREE(untag_ptr(_res));
+       CResult_CVec_CVec_u8ZZNoneZ_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);
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_InMemorySignerDecodeErrorZ_ok(int64_t o) {
+       LDKInMemorySigner 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 = InMemorySigner_clone(&o_conv);
+       LDKCResult_InMemorySignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InMemorySignerDecodeErrorZ), "LDKCResult_InMemorySignerDecodeErrorZ");
+       *ret_conv = CResult_InMemorySignerDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_InMemorySignerDecodeErrorZ_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_InMemorySignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InMemorySignerDecodeErrorZ), "LDKCResult_InMemorySignerDecodeErrorZ");
+       *ret_conv = CResult_InMemorySignerDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_InMemorySignerDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_InMemorySignerDecodeErrorZ* o_conv = (LDKCResult_InMemorySignerDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_InMemorySignerDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_InMemorySignerDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_InMemorySignerDecodeErrorZ _res_conv = *(LDKCResult_InMemorySignerDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_InMemorySignerDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_InMemorySignerDecodeErrorZ_clone_ptr(LDKCResult_InMemorySignerDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_InMemorySignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InMemorySignerDecodeErrorZ), "LDKCResult_InMemorySignerDecodeErrorZ");
+       *ret_conv = CResult_InMemorySignerDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_InMemorySignerDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_InMemorySignerDecodeErrorZ* arg_conv = (LDKCResult_InMemorySignerDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_InMemorySignerDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_InMemorySignerDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_InMemorySignerDecodeErrorZ* orig_conv = (LDKCResult_InMemorySignerDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_InMemorySignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InMemorySignerDecodeErrorZ), "LDKCResult_InMemorySignerDecodeErrorZ");
+       *ret_conv = CResult_InMemorySignerDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TransactionNoneZ_ok(int8_tArray o) {
+       LDKTransaction o_ref;
+       o_ref.datalen = o->arr_len;
+       o_ref.data = MALLOC(o_ref.datalen, "LDKTransaction Bytes");
+       memcpy(o_ref.data, o->elems, o_ref.datalen); FREE(o);
+       o_ref.data_is_owned = true;
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = CResult_TransactionNoneZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TransactionNoneZ_err() {
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = CResult_TransactionNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TransactionNoneZ_is_ok(int64_t o) {
+       LDKCResult_TransactionNoneZ* o_conv = (LDKCResult_TransactionNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TransactionNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TransactionNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TransactionNoneZ _res_conv = *(LDKCResult_TransactionNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TransactionNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TransactionNoneZ_clone_ptr(LDKCResult_TransactionNoneZ *NONNULL_PTR arg) {
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = CResult_TransactionNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TransactionNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_TransactionNoneZ* arg_conv = (LDKCResult_TransactionNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TransactionNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TransactionNoneZ_clone(int64_t orig) {
+       LDKCResult_TransactionNoneZ* orig_conv = (LDKCResult_TransactionNoneZ*)untag_ptr(orig);
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = CResult_TransactionNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_WriteableScoreZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKWriteableScore o_conv = *(LDKWriteableScore*)(o_ptr);
+       if (o_conv.free == LDKWriteableScore_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKWriteableScore_JCalls_cloned(&o_conv);
+       }
+       LDKCOption_WriteableScoreZ *ret_copy = MALLOC(sizeof(LDKCOption_WriteableScoreZ), "LDKCOption_WriteableScoreZ");
+       *ret_copy = COption_WriteableScoreZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_WriteableScoreZ_none() {
+       LDKCOption_WriteableScoreZ *ret_copy = MALLOC(sizeof(LDKCOption_WriteableScoreZ), "LDKCOption_WriteableScoreZ");
+       *ret_copy = COption_WriteableScoreZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_WriteableScoreZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_WriteableScoreZ _res_conv = *(LDKCOption_WriteableScoreZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_WriteableScoreZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_NoneIOErrorZ_ok() {
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = CResult_NoneIOErrorZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneIOErrorZ_err(int32_t e) {
+       LDKIOError e_conv = LDKIOError_from_cs(e);
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = CResult_NoneIOErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NoneIOErrorZ_is_ok(int64_t o) {
+       LDKCResult_NoneIOErrorZ* o_conv = (LDKCResult_NoneIOErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NoneIOErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NoneIOErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NoneIOErrorZ _res_conv = *(LDKCResult_NoneIOErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NoneIOErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NoneIOErrorZ_clone_ptr(LDKCResult_NoneIOErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = CResult_NoneIOErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NoneIOErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NoneIOErrorZ* arg_conv = (LDKCResult_NoneIOErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NoneIOErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NoneIOErrorZ_clone(int64_t orig) {
+       LDKCResult_NoneIOErrorZ* orig_conv = (LDKCResult_NoneIOErrorZ*)untag_ptr(orig);
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = CResult_NoneIOErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_ChannelDetailsZ_free(int64_tArray _res) {
+       LDKCVec_ChannelDetailsZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKChannelDetails), "LDKCVec_ChannelDetailsZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t q = 0; q < _res_constr.datalen; q++) {
+               int64_t _res_conv_16 = _res_vals[q];
+               LDKChannelDetails _res_conv_16_conv;
+               _res_conv_16_conv.inner = untag_ptr(_res_conv_16);
+               _res_conv_16_conv.is_owned = ptr_is_owned(_res_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_16_conv);
+               _res_constr.data[q] = _res_conv_16_conv;
+       }
+       FREE(_res);
+       CVec_ChannelDetailsZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_RouteLightningErrorZ_ok(int64_t o) {
+       LDKRoute 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 = Route_clone(&o_conv);
+       LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
+       *ret_conv = CResult_RouteLightningErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteLightningErrorZ_err(int64_t e) {
+       LDKLightningError e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = LightningError_clone(&e_conv);
+       LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
+       *ret_conv = CResult_RouteLightningErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RouteLightningErrorZ_is_ok(int64_t o) {
+       LDKCResult_RouteLightningErrorZ* o_conv = (LDKCResult_RouteLightningErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RouteLightningErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RouteLightningErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RouteLightningErrorZ _res_conv = *(LDKCResult_RouteLightningErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RouteLightningErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RouteLightningErrorZ_clone_ptr(LDKCResult_RouteLightningErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
+       *ret_conv = CResult_RouteLightningErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RouteLightningErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RouteLightningErrorZ* arg_conv = (LDKCResult_RouteLightningErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RouteLightningErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RouteLightningErrorZ_clone(int64_t orig) {
+       LDKCResult_RouteLightningErrorZ* orig_conv = (LDKCResult_RouteLightningErrorZ*)untag_ptr(orig);
+       LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
+       *ret_conv = CResult_RouteLightningErrorZ_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);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = InFlightHtlcs_clone(&o_conv);
+       LDKCResult_InFlightHtlcsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InFlightHtlcsDecodeErrorZ), "LDKCResult_InFlightHtlcsDecodeErrorZ");
+       *ret_conv = CResult_InFlightHtlcsDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_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_InFlightHtlcsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InFlightHtlcsDecodeErrorZ), "LDKCResult_InFlightHtlcsDecodeErrorZ");
+       *ret_conv = CResult_InFlightHtlcsDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_InFlightHtlcsDecodeErrorZ* o_conv = (LDKCResult_InFlightHtlcsDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_InFlightHtlcsDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_InFlightHtlcsDecodeErrorZ _res_conv = *(LDKCResult_InFlightHtlcsDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_InFlightHtlcsDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_InFlightHtlcsDecodeErrorZ_clone_ptr(LDKCResult_InFlightHtlcsDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_InFlightHtlcsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InFlightHtlcsDecodeErrorZ), "LDKCResult_InFlightHtlcsDecodeErrorZ");
+       *ret_conv = CResult_InFlightHtlcsDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_InFlightHtlcsDecodeErrorZ* arg_conv = (LDKCResult_InFlightHtlcsDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_InFlightHtlcsDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_InFlightHtlcsDecodeErrorZ* orig_conv = (LDKCResult_InFlightHtlcsDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_InFlightHtlcsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InFlightHtlcsDecodeErrorZ), "LDKCResult_InFlightHtlcsDecodeErrorZ");
+       *ret_conv = CResult_InFlightHtlcsDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteHopDecodeErrorZ_ok(int64_t o) {
+       LDKRouteHop 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 = RouteHop_clone(&o_conv);
+       LDKCResult_RouteHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHopDecodeErrorZ), "LDKCResult_RouteHopDecodeErrorZ");
+       *ret_conv = CResult_RouteHopDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteHopDecodeErrorZ_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_RouteHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHopDecodeErrorZ), "LDKCResult_RouteHopDecodeErrorZ");
+       *ret_conv = CResult_RouteHopDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RouteHopDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RouteHopDecodeErrorZ* o_conv = (LDKCResult_RouteHopDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RouteHopDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RouteHopDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RouteHopDecodeErrorZ _res_conv = *(LDKCResult_RouteHopDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RouteHopDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RouteHopDecodeErrorZ_clone_ptr(LDKCResult_RouteHopDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RouteHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHopDecodeErrorZ), "LDKCResult_RouteHopDecodeErrorZ");
+       *ret_conv = CResult_RouteHopDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RouteHopDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RouteHopDecodeErrorZ* arg_conv = (LDKCResult_RouteHopDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RouteHopDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RouteHopDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RouteHopDecodeErrorZ* orig_conv = (LDKCResult_RouteHopDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RouteHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHopDecodeErrorZ), "LDKCResult_RouteHopDecodeErrorZ");
+       *ret_conv = CResult_RouteHopDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_BlindedHopZ_free(int64_tArray _res) {
+       LDKCVec_BlindedHopZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKBlindedHop), "LDKCVec_BlindedHopZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t m = 0; m < _res_constr.datalen; m++) {
+               int64_t _res_conv_12 = _res_vals[m];
+               LDKBlindedHop _res_conv_12_conv;
+               _res_conv_12_conv.inner = untag_ptr(_res_conv_12);
+               _res_conv_12_conv.is_owned = ptr_is_owned(_res_conv_12);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_12_conv);
+               _res_constr.data[m] = _res_conv_12_conv;
+       }
+       FREE(_res);
+       CVec_BlindedHopZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_BlindedTailDecodeErrorZ_ok(int64_t o) {
+       LDKBlindedTail 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 = BlindedTail_clone(&o_conv);
+       LDKCResult_BlindedTailDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedTailDecodeErrorZ), "LDKCResult_BlindedTailDecodeErrorZ");
+       *ret_conv = CResult_BlindedTailDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedTailDecodeErrorZ_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_BlindedTailDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedTailDecodeErrorZ), "LDKCResult_BlindedTailDecodeErrorZ");
+       *ret_conv = CResult_BlindedTailDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BlindedTailDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BlindedTailDecodeErrorZ* o_conv = (LDKCResult_BlindedTailDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BlindedTailDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BlindedTailDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BlindedTailDecodeErrorZ _res_conv = *(LDKCResult_BlindedTailDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BlindedTailDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BlindedTailDecodeErrorZ_clone_ptr(LDKCResult_BlindedTailDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BlindedTailDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedTailDecodeErrorZ), "LDKCResult_BlindedTailDecodeErrorZ");
+       *ret_conv = CResult_BlindedTailDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BlindedTailDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BlindedTailDecodeErrorZ* arg_conv = (LDKCResult_BlindedTailDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BlindedTailDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BlindedTailDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BlindedTailDecodeErrorZ* orig_conv = (LDKCResult_BlindedTailDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BlindedTailDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedTailDecodeErrorZ), "LDKCResult_BlindedTailDecodeErrorZ");
+       *ret_conv = CResult_BlindedTailDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_RouteHopZ_free(int64_tArray _res) {
+       LDKCVec_RouteHopZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKRouteHop), "LDKCVec_RouteHopZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t k = 0; k < _res_constr.datalen; k++) {
+               int64_t _res_conv_10 = _res_vals[k];
+               LDKRouteHop _res_conv_10_conv;
+               _res_conv_10_conv.inner = untag_ptr(_res_conv_10);
+               _res_conv_10_conv.is_owned = ptr_is_owned(_res_conv_10);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_10_conv);
+               _res_constr.data[k] = _res_conv_10_conv;
+       }
+       FREE(_res);
+       CVec_RouteHopZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_PathZ_free(int64_tArray _res) {
+       LDKCVec_PathZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKPath), "LDKCVec_PathZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t g = 0; g < _res_constr.datalen; g++) {
+               int64_t _res_conv_6 = _res_vals[g];
+               LDKPath _res_conv_6_conv;
+               _res_conv_6_conv.inner = untag_ptr(_res_conv_6);
+               _res_conv_6_conv.is_owned = ptr_is_owned(_res_conv_6);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_6_conv);
+               _res_constr.data[g] = _res_conv_6_conv;
+       }
+       FREE(_res);
+       CVec_PathZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_RouteDecodeErrorZ_ok(int64_t o) {
+       LDKRoute 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 = Route_clone(&o_conv);
+       LDKCResult_RouteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteDecodeErrorZ), "LDKCResult_RouteDecodeErrorZ");
+       *ret_conv = CResult_RouteDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteDecodeErrorZ_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_RouteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteDecodeErrorZ), "LDKCResult_RouteDecodeErrorZ");
+       *ret_conv = CResult_RouteDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RouteDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RouteDecodeErrorZ* o_conv = (LDKCResult_RouteDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RouteDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RouteDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RouteDecodeErrorZ _res_conv = *(LDKCResult_RouteDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RouteDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RouteDecodeErrorZ_clone_ptr(LDKCResult_RouteDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RouteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteDecodeErrorZ), "LDKCResult_RouteDecodeErrorZ");
+       *ret_conv = CResult_RouteDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RouteDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RouteDecodeErrorZ* arg_conv = (LDKCResult_RouteDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RouteDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RouteDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RouteDecodeErrorZ* orig_conv = (LDKCResult_RouteDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RouteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteDecodeErrorZ), "LDKCResult_RouteDecodeErrorZ");
+       *ret_conv = CResult_RouteDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteParametersDecodeErrorZ_ok(int64_t o) {
+       LDKRouteParameters 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 = RouteParameters_clone(&o_conv);
+       LDKCResult_RouteParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteParametersDecodeErrorZ), "LDKCResult_RouteParametersDecodeErrorZ");
+       *ret_conv = CResult_RouteParametersDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteParametersDecodeErrorZ_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_RouteParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteParametersDecodeErrorZ), "LDKCResult_RouteParametersDecodeErrorZ");
+       *ret_conv = CResult_RouteParametersDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RouteParametersDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RouteParametersDecodeErrorZ* o_conv = (LDKCResult_RouteParametersDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RouteParametersDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RouteParametersDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RouteParametersDecodeErrorZ _res_conv = *(LDKCResult_RouteParametersDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RouteParametersDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RouteParametersDecodeErrorZ_clone_ptr(LDKCResult_RouteParametersDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RouteParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteParametersDecodeErrorZ), "LDKCResult_RouteParametersDecodeErrorZ");
+       *ret_conv = CResult_RouteParametersDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RouteParametersDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RouteParametersDecodeErrorZ* arg_conv = (LDKCResult_RouteParametersDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RouteParametersDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RouteParametersDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RouteParametersDecodeErrorZ* orig_conv = (LDKCResult_RouteParametersDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RouteParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteParametersDecodeErrorZ), "LDKCResult_RouteParametersDecodeErrorZ");
+       *ret_conv = CResult_RouteParametersDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_u64Z_free(int64_tArray _res) {
+       LDKCVec_u64Z _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(int64_t), "LDKCVec_u64Z Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t g = 0; g < _res_constr.datalen; g++) {
+               int64_t _res_conv_6 = _res_vals[g];
+               _res_constr.data[g] = _res_conv_6;
+       }
+       FREE(_res);
+       CVec_u64Z_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_PaymentParametersDecodeErrorZ_ok(int64_t o) {
+       LDKPaymentParameters 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 = PaymentParameters_clone(&o_conv);
+       LDKCResult_PaymentParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentParametersDecodeErrorZ), "LDKCResult_PaymentParametersDecodeErrorZ");
+       *ret_conv = CResult_PaymentParametersDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PaymentParametersDecodeErrorZ_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_PaymentParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentParametersDecodeErrorZ), "LDKCResult_PaymentParametersDecodeErrorZ");
+       *ret_conv = CResult_PaymentParametersDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PaymentParametersDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PaymentParametersDecodeErrorZ* o_conv = (LDKCResult_PaymentParametersDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PaymentParametersDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PaymentParametersDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PaymentParametersDecodeErrorZ _res_conv = *(LDKCResult_PaymentParametersDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PaymentParametersDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PaymentParametersDecodeErrorZ_clone_ptr(LDKCResult_PaymentParametersDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PaymentParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentParametersDecodeErrorZ), "LDKCResult_PaymentParametersDecodeErrorZ");
+       *ret_conv = CResult_PaymentParametersDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PaymentParametersDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PaymentParametersDecodeErrorZ* arg_conv = (LDKCResult_PaymentParametersDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PaymentParametersDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PaymentParametersDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PaymentParametersDecodeErrorZ* orig_conv = (LDKCResult_PaymentParametersDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PaymentParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentParametersDecodeErrorZ), "LDKCResult_PaymentParametersDecodeErrorZ");
+       *ret_conv = CResult_PaymentParametersDecodeErrorZ_clone(orig_conv);
+       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;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKRouteHint), "LDKCVec_RouteHintZ 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_11 = _res_vals[l];
+               LDKRouteHint _res_conv_11_conv;
+               _res_conv_11_conv.inner = untag_ptr(_res_conv_11);
+               _res_conv_11_conv.is_owned = ptr_is_owned(_res_conv_11);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_11_conv);
+               _res_constr.data[l] = _res_conv_11_conv;
+       }
+       FREE(_res);
+       CVec_RouteHintZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_RouteHintHopZ_free(int64_tArray _res) {
+       LDKCVec_RouteHintHopZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKRouteHintHop), "LDKCVec_RouteHintHopZ 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_14 = _res_vals[o];
+               LDKRouteHintHop _res_conv_14_conv;
+               _res_conv_14_conv.inner = untag_ptr(_res_conv_14);
+               _res_conv_14_conv.is_owned = ptr_is_owned(_res_conv_14);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_14_conv);
+               _res_constr.data[o] = _res_conv_14_conv;
+       }
+       FREE(_res);
+       CVec_RouteHintHopZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_RouteHintDecodeErrorZ_ok(int64_t o) {
+       LDKRouteHint 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 = RouteHint_clone(&o_conv);
+       LDKCResult_RouteHintDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintDecodeErrorZ), "LDKCResult_RouteHintDecodeErrorZ");
+       *ret_conv = CResult_RouteHintDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteHintDecodeErrorZ_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_RouteHintDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintDecodeErrorZ), "LDKCResult_RouteHintDecodeErrorZ");
+       *ret_conv = CResult_RouteHintDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RouteHintDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RouteHintDecodeErrorZ* o_conv = (LDKCResult_RouteHintDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RouteHintDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RouteHintDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RouteHintDecodeErrorZ _res_conv = *(LDKCResult_RouteHintDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RouteHintDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RouteHintDecodeErrorZ_clone_ptr(LDKCResult_RouteHintDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RouteHintDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintDecodeErrorZ), "LDKCResult_RouteHintDecodeErrorZ");
+       *ret_conv = CResult_RouteHintDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RouteHintDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RouteHintDecodeErrorZ* arg_conv = (LDKCResult_RouteHintDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RouteHintDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RouteHintDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RouteHintDecodeErrorZ* orig_conv = (LDKCResult_RouteHintDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RouteHintDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintDecodeErrorZ), "LDKCResult_RouteHintDecodeErrorZ");
+       *ret_conv = CResult_RouteHintDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteHintHopDecodeErrorZ_ok(int64_t o) {
+       LDKRouteHintHop 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 = RouteHintHop_clone(&o_conv);
+       LDKCResult_RouteHintHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintHopDecodeErrorZ), "LDKCResult_RouteHintHopDecodeErrorZ");
+       *ret_conv = CResult_RouteHintHopDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteHintHopDecodeErrorZ_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_RouteHintHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintHopDecodeErrorZ), "LDKCResult_RouteHintHopDecodeErrorZ");
+       *ret_conv = CResult_RouteHintHopDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RouteHintHopDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RouteHintHopDecodeErrorZ* o_conv = (LDKCResult_RouteHintHopDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RouteHintHopDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RouteHintHopDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RouteHintHopDecodeErrorZ _res_conv = *(LDKCResult_RouteHintHopDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RouteHintHopDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RouteHintHopDecodeErrorZ_clone_ptr(LDKCResult_RouteHintHopDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RouteHintHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintHopDecodeErrorZ), "LDKCResult_RouteHintHopDecodeErrorZ");
+       *ret_conv = CResult_RouteHintHopDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RouteHintHopDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RouteHintHopDecodeErrorZ* arg_conv = (LDKCResult_RouteHintHopDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RouteHintHopDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RouteHintHopDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RouteHintHopDecodeErrorZ* orig_conv = (LDKCResult_RouteHintHopDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RouteHintHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintHopDecodeErrorZ), "LDKCResult_RouteHintHopDecodeErrorZ");
+       *ret_conv = CResult_RouteHintHopDecodeErrorZ_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_FixedPenaltyScorerDecodeErrorZ_ok(int64_t o) {
+       LDKFixedPenaltyScorer 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 = FixedPenaltyScorer_clone(&o_conv);
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FixedPenaltyScorerDecodeErrorZ), "LDKCResult_FixedPenaltyScorerDecodeErrorZ");
+       *ret_conv = CResult_FixedPenaltyScorerDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_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_FixedPenaltyScorerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FixedPenaltyScorerDecodeErrorZ), "LDKCResult_FixedPenaltyScorerDecodeErrorZ");
+       *ret_conv = CResult_FixedPenaltyScorerDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* o_conv = (LDKCResult_FixedPenaltyScorerDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_FixedPenaltyScorerDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ _res_conv = *(LDKCResult_FixedPenaltyScorerDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_FixedPenaltyScorerDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_FixedPenaltyScorerDecodeErrorZ_clone_ptr(LDKCResult_FixedPenaltyScorerDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FixedPenaltyScorerDecodeErrorZ), "LDKCResult_FixedPenaltyScorerDecodeErrorZ");
+       *ret_conv = CResult_FixedPenaltyScorerDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* arg_conv = (LDKCResult_FixedPenaltyScorerDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_FixedPenaltyScorerDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* orig_conv = (LDKCResult_FixedPenaltyScorerDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FixedPenaltyScorerDecodeErrorZ), "LDKCResult_FixedPenaltyScorerDecodeErrorZ");
+       *ret_conv = CResult_FixedPenaltyScorerDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_NodeIdZ_free(int64_tArray _res) {
+       LDKCVec_NodeIdZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKNodeId), "LDKCVec_NodeIdZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t i = 0; i < _res_constr.datalen; i++) {
+               int64_t _res_conv_8 = _res_vals[i];
+               LDKNodeId _res_conv_8_conv;
+               _res_conv_8_conv.inner = untag_ptr(_res_conv_8);
+               _res_conv_8_conv.is_owned = ptr_is_owned(_res_conv_8);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_8_conv);
+               _res_constr.data[i] = _res_conv_8_conv;
+       }
+       FREE(_res);
+       CVec_NodeIdZ_free(_res_constr);
+}
+
+static inline uint64_t C2Tuple_u64u64Z_clone_ptr(LDKC2Tuple_u64u64Z *NONNULL_PTR arg) {
+       LDKC2Tuple_u64u64Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64u64Z), "LDKC2Tuple_u64u64Z");
+       *ret_conv = C2Tuple_u64u64Z_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_u64u64Z_clone_ptr(int64_t arg) {
+       LDKC2Tuple_u64u64Z* arg_conv = (LDKC2Tuple_u64u64Z*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_u64u64Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_u64u64Z_clone(int64_t orig) {
+       LDKC2Tuple_u64u64Z* orig_conv = (LDKC2Tuple_u64u64Z*)untag_ptr(orig);
+       LDKC2Tuple_u64u64Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64u64Z), "LDKC2Tuple_u64u64Z");
+       *ret_conv = C2Tuple_u64u64Z_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_u64u64Z_new(int64_t a, int64_t b) {
+       LDKC2Tuple_u64u64Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64u64Z), "LDKC2Tuple_u64u64Z");
+       *ret_conv = C2Tuple_u64u64Z_new(a, b);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_u64u64Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_u64u64Z _res_conv = *(LDKC2Tuple_u64u64Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_u64u64Z_free(_res_conv);
+}
+
+int64_t  CS_LDK_COption_C2Tuple_u64u64ZZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_u64u64Z o_conv = *(LDKC2Tuple_u64u64Z*)(o_ptr);
+       o_conv = C2Tuple_u64u64Z_clone((LDKC2Tuple_u64u64Z*)untag_ptr(o));
+       LDKCOption_C2Tuple_u64u64ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u64ZZ), "LDKCOption_C2Tuple_u64u64ZZ");
+       *ret_copy = COption_C2Tuple_u64u64ZZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_C2Tuple_u64u64ZZ_none() {
+       LDKCOption_C2Tuple_u64u64ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u64ZZ), "LDKCOption_C2Tuple_u64u64ZZ");
+       *ret_copy = COption_C2Tuple_u64u64ZZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_C2Tuple_u64u64ZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_C2Tuple_u64u64ZZ _res_conv = *(LDKCOption_C2Tuple_u64u64ZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_C2Tuple_u64u64ZZ_free(_res_conv);
+}
+
+static inline uint64_t COption_C2Tuple_u64u64ZZ_clone_ptr(LDKCOption_C2Tuple_u64u64ZZ *NONNULL_PTR arg) {
+       LDKCOption_C2Tuple_u64u64ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u64ZZ), "LDKCOption_C2Tuple_u64u64ZZ");
+       *ret_copy = COption_C2Tuple_u64u64ZZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_C2Tuple_u64u64ZZ_clone_ptr(int64_t arg) {
+       LDKCOption_C2Tuple_u64u64ZZ* arg_conv = (LDKCOption_C2Tuple_u64u64ZZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_C2Tuple_u64u64ZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_C2Tuple_u64u64ZZ_clone(int64_t orig) {
+       LDKCOption_C2Tuple_u64u64ZZ* orig_conv = (LDKCOption_C2Tuple_u64u64ZZ*)untag_ptr(orig);
+       LDKCOption_C2Tuple_u64u64ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u64ZZ), "LDKCOption_C2Tuple_u64u64ZZ");
+       *ret_copy = COption_C2Tuple_u64u64ZZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_C2Tuple_Z_new(int16_tArray a, int16_tArray b) {
+       LDKThirtyTwoU16s a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32 * 2); FREE(a);
+       LDKThirtyTwoU16s b_ref;
+       CHECK(b->arr_len == 32);
+       memcpy(b_ref.data, b->elems, 32 * 2); FREE(b);
+       LDKC2Tuple_Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_Z), "LDKC2Tuple_Z");
+       *ret_conv = C2Tuple_Z_new(a_ref, b_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_Z _res_conv = *(LDKC2Tuple_Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_Z_free(_res_conv);
+}
+
+int64_t  CS_LDK_C2Tuple__u1632_u1632Z_new(int16_tArray a, int16_tArray b) {
+       LDKThirtyTwoU16s a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32 * 2); FREE(a);
+       LDKThirtyTwoU16s b_ref;
+       CHECK(b->arr_len == 32);
+       memcpy(b_ref.data, b->elems, 32 * 2); FREE(b);
+       LDKC2Tuple__u1632_u1632Z* ret_conv = MALLOC(sizeof(LDKC2Tuple__u1632_u1632Z), "LDKC2Tuple__u1632_u1632Z");
+       *ret_conv = C2Tuple__u1632_u1632Z_new(a_ref, b_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple__u1632_u1632Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple__u1632_u1632Z _res_conv = *(LDKC2Tuple__u1632_u1632Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple__u1632_u1632Z_free(_res_conv);
+}
+
+int64_t  CS_LDK_COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple__u1632_u1632Z o_conv = *(LDKC2Tuple__u1632_u1632Z*)(o_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKC2Tuple__u1632_u1632Z
+       LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ), "LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ");
+       *ret_copy = COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_none() {
+       LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ), "LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ");
+       *ret_copy = COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ _res_conv = *(LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_COption_f64Z_some(double o) {
+       LDKCOption_f64Z *ret_copy = MALLOC(sizeof(LDKCOption_f64Z), "LDKCOption_f64Z");
+       *ret_copy = COption_f64Z_some(o);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_f64Z_none() {
+       LDKCOption_f64Z *ret_copy = MALLOC(sizeof(LDKCOption_f64Z), "LDKCOption_f64Z");
+       *ret_copy = COption_f64Z_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_f64Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_f64Z _res_conv = *(LDKCOption_f64Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_f64Z_free(_res_conv);
+}
+
+static inline uint64_t COption_f64Z_clone_ptr(LDKCOption_f64Z *NONNULL_PTR arg) {
+       LDKCOption_f64Z *ret_copy = MALLOC(sizeof(LDKCOption_f64Z), "LDKCOption_f64Z");
+       *ret_copy = COption_f64Z_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_f64Z_clone_ptr(int64_t arg) {
+       LDKCOption_f64Z* arg_conv = (LDKCOption_f64Z*)untag_ptr(arg);
+       int64_t ret_conv = COption_f64Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_f64Z_clone(int64_t orig) {
+       LDKCOption_f64Z* orig_conv = (LDKCOption_f64Z*)untag_ptr(orig);
+       LDKCOption_f64Z *ret_copy = MALLOC(sizeof(LDKCOption_f64Z), "LDKCOption_f64Z");
+       *ret_copy = COption_f64Z_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_ProbabilisticScorerDecodeErrorZ_ok(int64_t o) {
+       LDKProbabilisticScorer o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       // WARNING: we need a move here but no clone is available for LDKProbabilisticScorer
+       
+       LDKCResult_ProbabilisticScorerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ProbabilisticScorerDecodeErrorZ), "LDKCResult_ProbabilisticScorerDecodeErrorZ");
+       *ret_conv = CResult_ProbabilisticScorerDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ProbabilisticScorerDecodeErrorZ_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_ProbabilisticScorerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ProbabilisticScorerDecodeErrorZ), "LDKCResult_ProbabilisticScorerDecodeErrorZ");
+       *ret_conv = CResult_ProbabilisticScorerDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ProbabilisticScorerDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ProbabilisticScorerDecodeErrorZ* o_conv = (LDKCResult_ProbabilisticScorerDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ProbabilisticScorerDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ProbabilisticScorerDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ProbabilisticScorerDecodeErrorZ _res_conv = *(LDKCResult_ProbabilisticScorerDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ProbabilisticScorerDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t C2Tuple_usizeTransactionZ_clone_ptr(LDKC2Tuple_usizeTransactionZ *NONNULL_PTR arg) {
+       LDKC2Tuple_usizeTransactionZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_usizeTransactionZ), "LDKC2Tuple_usizeTransactionZ");
+       *ret_conv = C2Tuple_usizeTransactionZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_usizeTransactionZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_usizeTransactionZ* arg_conv = (LDKC2Tuple_usizeTransactionZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_usizeTransactionZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_usizeTransactionZ_clone(int64_t orig) {
+       LDKC2Tuple_usizeTransactionZ* orig_conv = (LDKC2Tuple_usizeTransactionZ*)untag_ptr(orig);
+       LDKC2Tuple_usizeTransactionZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_usizeTransactionZ), "LDKC2Tuple_usizeTransactionZ");
+       *ret_conv = C2Tuple_usizeTransactionZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_usizeTransactionZ_new(int64_t a, int8_tArray b) {
+       LDKTransaction b_ref;
+       b_ref.datalen = b->arr_len;
+       b_ref.data = MALLOC(b_ref.datalen, "LDKTransaction Bytes");
+       memcpy(b_ref.data, b->elems, b_ref.datalen); FREE(b);
+       b_ref.data_is_owned = true;
+       LDKC2Tuple_usizeTransactionZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_usizeTransactionZ), "LDKC2Tuple_usizeTransactionZ");
+       *ret_conv = C2Tuple_usizeTransactionZ_new(a, b_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_usizeTransactionZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_usizeTransactionZ _res_conv = *(LDKC2Tuple_usizeTransactionZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_usizeTransactionZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_usizeTransactionZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_usizeTransactionZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_usizeTransactionZ), "LDKCVec_C2Tuple_usizeTransactionZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t c = 0; c < _res_constr.datalen; c++) {
+               int64_t _res_conv_28 = _res_vals[c];
+               void* _res_conv_28_ptr = untag_ptr(_res_conv_28);
+               CHECK_ACCESS(_res_conv_28_ptr);
+               LDKC2Tuple_usizeTransactionZ _res_conv_28_conv = *(LDKC2Tuple_usizeTransactionZ*)(_res_conv_28_ptr);
+               FREE(untag_ptr(_res_conv_28));
+               _res_constr.data[c] = _res_conv_28_conv;
+       }
+       FREE(_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);
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_new(int8_tArray a, int64_t b) {
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_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);
+       FREE(untag_ptr(_res));
+       C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesCOption_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");
+       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;
+       }
+       FREE(_res);
+       CVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_ok(int32_t o) {
+       LDKChannelMonitorUpdateStatus o_conv = LDKChannelMonitorUpdateStatus_from_cs(o);
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateStatusNoneZ), "LDKCResult_ChannelMonitorUpdateStatusNoneZ");
+       *ret_conv = CResult_ChannelMonitorUpdateStatusNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_err() {
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateStatusNoneZ), "LDKCResult_ChannelMonitorUpdateStatusNoneZ");
+       *ret_conv = CResult_ChannelMonitorUpdateStatusNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_is_ok(int64_t o) {
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* o_conv = (LDKCResult_ChannelMonitorUpdateStatusNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelMonitorUpdateStatusNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ _res_conv = *(LDKCResult_ChannelMonitorUpdateStatusNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelMonitorUpdateStatusNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelMonitorUpdateStatusNoneZ_clone_ptr(LDKCResult_ChannelMonitorUpdateStatusNoneZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateStatusNoneZ), "LDKCResult_ChannelMonitorUpdateStatusNoneZ");
+       *ret_conv = CResult_ChannelMonitorUpdateStatusNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* arg_conv = (LDKCResult_ChannelMonitorUpdateStatusNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelMonitorUpdateStatusNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_clone(int64_t orig) {
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* orig_conv = (LDKCResult_ChannelMonitorUpdateStatusNoneZ*)untag_ptr(orig);
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateStatusNoneZ), "LDKCResult_ChannelMonitorUpdateStatusNoneZ");
+       *ret_conv = CResult_ChannelMonitorUpdateStatusNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_MonitorEventZ_free(int64_tArray _res) {
+       LDKCVec_MonitorEventZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKMonitorEvent), "LDKCVec_MonitorEventZ 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_14 = _res_vals[o];
+               void* _res_conv_14_ptr = untag_ptr(_res_conv_14);
+               CHECK_ACCESS(_res_conv_14_ptr);
+               LDKMonitorEvent _res_conv_14_conv = *(LDKMonitorEvent*)(_res_conv_14_ptr);
+               FREE(untag_ptr(_res_conv_14));
+               _res_constr.data[o] = _res_conv_14_conv;
+       }
+       FREE(_res);
+       CVec_MonitorEventZ_free(_res_constr);
+}
+
+static inline uint64_t C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone_ptr(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ *NONNULL_PTR arg) {
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ), "LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ");
+       *ret_conv = C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone_ptr(int64_t arg) {
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* arg_conv = (LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ*)untag_ptr(arg);
+       int64_t ret_conv = C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone(int64_t orig) {
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* orig_conv = (LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ*)untag_ptr(orig);
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ), "LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ");
+       *ret_conv = C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_new(int64_t a, int64_tArray b, int8_tArray c) {
+       LDKOutPoint 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 = OutPoint_clone(&a_conv);
+       LDKCVec_MonitorEventZ b_constr;
+       b_constr.datalen = b->arr_len;
+       if (b_constr.datalen > 0)
+               b_constr.data = MALLOC(b_constr.datalen * sizeof(LDKMonitorEvent), "LDKCVec_MonitorEventZ Elements");
+       else
+               b_constr.data = NULL;
+       int64_t* b_vals = b->elems;
+       for (size_t o = 0; o < b_constr.datalen; o++) {
+               int64_t b_conv_14 = b_vals[o];
+               void* b_conv_14_ptr = untag_ptr(b_conv_14);
+               CHECK_ACCESS(b_conv_14_ptr);
+               LDKMonitorEvent b_conv_14_conv = *(LDKMonitorEvent*)(b_conv_14_ptr);
+               b_conv_14_conv = MonitorEvent_clone((LDKMonitorEvent*)untag_ptr(b_conv_14));
+               b_constr.data[o] = b_conv_14_conv;
+       }
+       FREE(b);
+       LDKPublicKey c_ref;
+       CHECK(c->arr_len == 33);
+       memcpy(c_ref.compressed_form, c->elems, 33); FREE(c);
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ), "LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ");
+       *ret_conv = C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_new(a_conv, b_constr, c_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ _res_conv = *(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ_free(int64_tArray _res) {
+       LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ), "LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ 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);
+               LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ _res_conv_49_conv = *(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ*)(_res_conv_49_ptr);
+               FREE(untag_ptr(_res_conv_49));
+               _res_constr.data[x] = _res_conv_49_conv;
+       }
+       FREE(_res);
+       CVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_InitFeaturesDecodeErrorZ_ok(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 = InitFeatures_clone(&o_conv);
+       LDKCResult_InitFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitFeaturesDecodeErrorZ), "LDKCResult_InitFeaturesDecodeErrorZ");
+       *ret_conv = CResult_InitFeaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_InitFeaturesDecodeErrorZ_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_InitFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitFeaturesDecodeErrorZ), "LDKCResult_InitFeaturesDecodeErrorZ");
+       *ret_conv = CResult_InitFeaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_InitFeaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_InitFeaturesDecodeErrorZ* o_conv = (LDKCResult_InitFeaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_InitFeaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_InitFeaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_InitFeaturesDecodeErrorZ _res_conv = *(LDKCResult_InitFeaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_InitFeaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_InitFeaturesDecodeErrorZ_clone_ptr(LDKCResult_InitFeaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_InitFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitFeaturesDecodeErrorZ), "LDKCResult_InitFeaturesDecodeErrorZ");
+       *ret_conv = CResult_InitFeaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_InitFeaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_InitFeaturesDecodeErrorZ* arg_conv = (LDKCResult_InitFeaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_InitFeaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_InitFeaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_InitFeaturesDecodeErrorZ* orig_conv = (LDKCResult_InitFeaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_InitFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitFeaturesDecodeErrorZ), "LDKCResult_InitFeaturesDecodeErrorZ");
+       *ret_conv = CResult_InitFeaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelFeaturesDecodeErrorZ_ok(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 = ChannelFeatures_clone(&o_conv);
+       LDKCResult_ChannelFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelFeaturesDecodeErrorZ), "LDKCResult_ChannelFeaturesDecodeErrorZ");
+       *ret_conv = CResult_ChannelFeaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelFeaturesDecodeErrorZ_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_ChannelFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelFeaturesDecodeErrorZ), "LDKCResult_ChannelFeaturesDecodeErrorZ");
+       *ret_conv = CResult_ChannelFeaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelFeaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelFeaturesDecodeErrorZ* o_conv = (LDKCResult_ChannelFeaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelFeaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelFeaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelFeaturesDecodeErrorZ _res_conv = *(LDKCResult_ChannelFeaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelFeaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelFeaturesDecodeErrorZ_clone_ptr(LDKCResult_ChannelFeaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelFeaturesDecodeErrorZ), "LDKCResult_ChannelFeaturesDecodeErrorZ");
+       *ret_conv = CResult_ChannelFeaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelFeaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelFeaturesDecodeErrorZ* arg_conv = (LDKCResult_ChannelFeaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelFeaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelFeaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelFeaturesDecodeErrorZ* orig_conv = (LDKCResult_ChannelFeaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelFeaturesDecodeErrorZ), "LDKCResult_ChannelFeaturesDecodeErrorZ");
+       *ret_conv = CResult_ChannelFeaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeFeaturesDecodeErrorZ_ok(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 = NodeFeatures_clone(&o_conv);
+       LDKCResult_NodeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeFeaturesDecodeErrorZ), "LDKCResult_NodeFeaturesDecodeErrorZ");
+       *ret_conv = CResult_NodeFeaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeFeaturesDecodeErrorZ_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_NodeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeFeaturesDecodeErrorZ), "LDKCResult_NodeFeaturesDecodeErrorZ");
+       *ret_conv = CResult_NodeFeaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NodeFeaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_NodeFeaturesDecodeErrorZ* o_conv = (LDKCResult_NodeFeaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NodeFeaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NodeFeaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NodeFeaturesDecodeErrorZ _res_conv = *(LDKCResult_NodeFeaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NodeFeaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NodeFeaturesDecodeErrorZ_clone_ptr(LDKCResult_NodeFeaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NodeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeFeaturesDecodeErrorZ), "LDKCResult_NodeFeaturesDecodeErrorZ");
+       *ret_conv = CResult_NodeFeaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NodeFeaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NodeFeaturesDecodeErrorZ* arg_conv = (LDKCResult_NodeFeaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NodeFeaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NodeFeaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_NodeFeaturesDecodeErrorZ* orig_conv = (LDKCResult_NodeFeaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_NodeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeFeaturesDecodeErrorZ), "LDKCResult_NodeFeaturesDecodeErrorZ");
+       *ret_conv = CResult_NodeFeaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceFeaturesDecodeErrorZ_ok(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 = Bolt11InvoiceFeatures_clone(&o_conv);
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceFeaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceFeaturesDecodeErrorZ_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_Bolt11InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceFeaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_Bolt11InvoiceFeaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* o_conv = (LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_Bolt11InvoiceFeaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_Bolt11InvoiceFeaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ _res_conv = *(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_Bolt11InvoiceFeaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_Bolt11InvoiceFeaturesDecodeErrorZ_clone_ptr(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceFeaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceFeaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* arg_conv = (LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_Bolt11InvoiceFeaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceFeaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* orig_conv = (LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceFeaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt12InvoiceFeaturesDecodeErrorZ_ok(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 = Bolt12InvoiceFeatures_clone(&o_conv);
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = CResult_Bolt12InvoiceFeaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt12InvoiceFeaturesDecodeErrorZ_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_Bolt12InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = CResult_Bolt12InvoiceFeaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_Bolt12InvoiceFeaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* o_conv = (LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_Bolt12InvoiceFeaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_Bolt12InvoiceFeaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ _res_conv = *(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_Bolt12InvoiceFeaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_Bolt12InvoiceFeaturesDecodeErrorZ_clone_ptr(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = CResult_Bolt12InvoiceFeaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_Bolt12InvoiceFeaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* arg_conv = (LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_Bolt12InvoiceFeaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_Bolt12InvoiceFeaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* orig_conv = (LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = CResult_Bolt12InvoiceFeaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedHopFeaturesDecodeErrorZ_ok(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 = BlindedHopFeatures_clone(&o_conv);
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopFeaturesDecodeErrorZ), "LDKCResult_BlindedHopFeaturesDecodeErrorZ");
+       *ret_conv = CResult_BlindedHopFeaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedHopFeaturesDecodeErrorZ_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_BlindedHopFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopFeaturesDecodeErrorZ), "LDKCResult_BlindedHopFeaturesDecodeErrorZ");
+       *ret_conv = CResult_BlindedHopFeaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BlindedHopFeaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* o_conv = (LDKCResult_BlindedHopFeaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BlindedHopFeaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BlindedHopFeaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ _res_conv = *(LDKCResult_BlindedHopFeaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BlindedHopFeaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BlindedHopFeaturesDecodeErrorZ_clone_ptr(LDKCResult_BlindedHopFeaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopFeaturesDecodeErrorZ), "LDKCResult_BlindedHopFeaturesDecodeErrorZ");
+       *ret_conv = CResult_BlindedHopFeaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BlindedHopFeaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* arg_conv = (LDKCResult_BlindedHopFeaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BlindedHopFeaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BlindedHopFeaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* orig_conv = (LDKCResult_BlindedHopFeaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopFeaturesDecodeErrorZ), "LDKCResult_BlindedHopFeaturesDecodeErrorZ");
+       *ret_conv = CResult_BlindedHopFeaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_ok(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 = ChannelTypeFeatures_clone(&o_conv);
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTypeFeaturesDecodeErrorZ), "LDKCResult_ChannelTypeFeaturesDecodeErrorZ");
+       *ret_conv = CResult_ChannelTypeFeaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_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_ChannelTypeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTypeFeaturesDecodeErrorZ), "LDKCResult_ChannelTypeFeaturesDecodeErrorZ");
+       *ret_conv = CResult_ChannelTypeFeaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* o_conv = (LDKCResult_ChannelTypeFeaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelTypeFeaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ _res_conv = *(LDKCResult_ChannelTypeFeaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelTypeFeaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelTypeFeaturesDecodeErrorZ_clone_ptr(LDKCResult_ChannelTypeFeaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTypeFeaturesDecodeErrorZ), "LDKCResult_ChannelTypeFeaturesDecodeErrorZ");
+       *ret_conv = CResult_ChannelTypeFeaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* arg_conv = (LDKCResult_ChannelTypeFeaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelTypeFeaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* orig_conv = (LDKCResult_ChannelTypeFeaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTypeFeaturesDecodeErrorZ), "LDKCResult_ChannelTypeFeaturesDecodeErrorZ");
+       *ret_conv = CResult_ChannelTypeFeaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OfferBolt12ParseErrorZ_ok(int64_t o) {
+       LDKOffer 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 = Offer_clone(&o_conv);
+       LDKCResult_OfferBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OfferBolt12ParseErrorZ), "LDKCResult_OfferBolt12ParseErrorZ");
+       *ret_conv = CResult_OfferBolt12ParseErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OfferBolt12ParseErrorZ_err(int64_t e) {
+       LDKBolt12ParseError e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = Bolt12ParseError_clone(&e_conv);
+       LDKCResult_OfferBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OfferBolt12ParseErrorZ), "LDKCResult_OfferBolt12ParseErrorZ");
+       *ret_conv = CResult_OfferBolt12ParseErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_OfferBolt12ParseErrorZ_is_ok(int64_t o) {
+       LDKCResult_OfferBolt12ParseErrorZ* o_conv = (LDKCResult_OfferBolt12ParseErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_OfferBolt12ParseErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_OfferBolt12ParseErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_OfferBolt12ParseErrorZ _res_conv = *(LDKCResult_OfferBolt12ParseErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_OfferBolt12ParseErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_OfferBolt12ParseErrorZ_clone_ptr(LDKCResult_OfferBolt12ParseErrorZ *NONNULL_PTR arg) {
+       LDKCResult_OfferBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OfferBolt12ParseErrorZ), "LDKCResult_OfferBolt12ParseErrorZ");
+       *ret_conv = CResult_OfferBolt12ParseErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_OfferBolt12ParseErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_OfferBolt12ParseErrorZ* arg_conv = (LDKCResult_OfferBolt12ParseErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_OfferBolt12ParseErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_OfferBolt12ParseErrorZ_clone(int64_t orig) {
+       LDKCResult_OfferBolt12ParseErrorZ* orig_conv = (LDKCResult_OfferBolt12ParseErrorZ*)untag_ptr(orig);
+       LDKCResult_OfferBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OfferBolt12ParseErrorZ), "LDKCResult_OfferBolt12ParseErrorZ");
+       *ret_conv = CResult_OfferBolt12ParseErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PublicKeySecp256k1ErrorZ_ok(int8_tArray o) {
+       LDKPublicKey o_ref;
+       CHECK(o->arr_len == 33);
+       memcpy(o_ref.compressed_form, o->elems, 33); FREE(o);
+       LDKCResult_PublicKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeySecp256k1ErrorZ), "LDKCResult_PublicKeySecp256k1ErrorZ");
+       *ret_conv = CResult_PublicKeySecp256k1ErrorZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PublicKeySecp256k1ErrorZ_err(int32_t e) {
+       LDKSecp256k1Error e_conv = LDKSecp256k1Error_from_cs(e);
+       LDKCResult_PublicKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeySecp256k1ErrorZ), "LDKCResult_PublicKeySecp256k1ErrorZ");
+       *ret_conv = CResult_PublicKeySecp256k1ErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PublicKeySecp256k1ErrorZ_is_ok(int64_t o) {
+       LDKCResult_PublicKeySecp256k1ErrorZ* o_conv = (LDKCResult_PublicKeySecp256k1ErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PublicKeySecp256k1ErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PublicKeySecp256k1ErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PublicKeySecp256k1ErrorZ _res_conv = *(LDKCResult_PublicKeySecp256k1ErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PublicKeySecp256k1ErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PublicKeySecp256k1ErrorZ_clone_ptr(LDKCResult_PublicKeySecp256k1ErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PublicKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeySecp256k1ErrorZ), "LDKCResult_PublicKeySecp256k1ErrorZ");
+       *ret_conv = CResult_PublicKeySecp256k1ErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PublicKeySecp256k1ErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PublicKeySecp256k1ErrorZ* arg_conv = (LDKCResult_PublicKeySecp256k1ErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PublicKeySecp256k1ErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PublicKeySecp256k1ErrorZ_clone(int64_t orig) {
+       LDKCResult_PublicKeySecp256k1ErrorZ* orig_conv = (LDKCResult_PublicKeySecp256k1ErrorZ*)untag_ptr(orig);
+       LDKCResult_PublicKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeySecp256k1ErrorZ), "LDKCResult_PublicKeySecp256k1ErrorZ");
+       *ret_conv = CResult_PublicKeySecp256k1ErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeIdDecodeErrorZ_ok(int64_t o) {
+       LDKNodeId 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 = NodeId_clone(&o_conv);
+       LDKCResult_NodeIdDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeIdDecodeErrorZ), "LDKCResult_NodeIdDecodeErrorZ");
+       *ret_conv = CResult_NodeIdDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeIdDecodeErrorZ_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_NodeIdDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeIdDecodeErrorZ), "LDKCResult_NodeIdDecodeErrorZ");
+       *ret_conv = CResult_NodeIdDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NodeIdDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_NodeIdDecodeErrorZ* o_conv = (LDKCResult_NodeIdDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NodeIdDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NodeIdDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NodeIdDecodeErrorZ _res_conv = *(LDKCResult_NodeIdDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NodeIdDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NodeIdDecodeErrorZ_clone_ptr(LDKCResult_NodeIdDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NodeIdDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeIdDecodeErrorZ), "LDKCResult_NodeIdDecodeErrorZ");
+       *ret_conv = CResult_NodeIdDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NodeIdDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NodeIdDecodeErrorZ* arg_conv = (LDKCResult_NodeIdDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NodeIdDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NodeIdDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_NodeIdDecodeErrorZ* orig_conv = (LDKCResult_NodeIdDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_NodeIdDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeIdDecodeErrorZ), "LDKCResult_NodeIdDecodeErrorZ");
+       *ret_conv = CResult_NodeIdDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_NetworkUpdateZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKNetworkUpdate o_conv = *(LDKNetworkUpdate*)(o_ptr);
+       o_conv = NetworkUpdate_clone((LDKNetworkUpdate*)untag_ptr(o));
+       LDKCOption_NetworkUpdateZ *ret_copy = MALLOC(sizeof(LDKCOption_NetworkUpdateZ), "LDKCOption_NetworkUpdateZ");
+       *ret_copy = COption_NetworkUpdateZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_NetworkUpdateZ_none() {
+       LDKCOption_NetworkUpdateZ *ret_copy = MALLOC(sizeof(LDKCOption_NetworkUpdateZ), "LDKCOption_NetworkUpdateZ");
+       *ret_copy = COption_NetworkUpdateZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_NetworkUpdateZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_NetworkUpdateZ _res_conv = *(LDKCOption_NetworkUpdateZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_NetworkUpdateZ_free(_res_conv);
+}
+
+static inline uint64_t COption_NetworkUpdateZ_clone_ptr(LDKCOption_NetworkUpdateZ *NONNULL_PTR arg) {
+       LDKCOption_NetworkUpdateZ *ret_copy = MALLOC(sizeof(LDKCOption_NetworkUpdateZ), "LDKCOption_NetworkUpdateZ");
+       *ret_copy = COption_NetworkUpdateZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_NetworkUpdateZ_clone_ptr(int64_t arg) {
+       LDKCOption_NetworkUpdateZ* arg_conv = (LDKCOption_NetworkUpdateZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_NetworkUpdateZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_NetworkUpdateZ_clone(int64_t orig) {
+       LDKCOption_NetworkUpdateZ* orig_conv = (LDKCOption_NetworkUpdateZ*)untag_ptr(orig);
+       LDKCOption_NetworkUpdateZ *ret_copy = MALLOC(sizeof(LDKCOption_NetworkUpdateZ), "LDKCOption_NetworkUpdateZ");
+       *ret_copy = COption_NetworkUpdateZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_NetworkUpdateZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_NetworkUpdateZ o_conv = *(LDKCOption_NetworkUpdateZ*)(o_ptr);
+       o_conv = COption_NetworkUpdateZ_clone((LDKCOption_NetworkUpdateZ*)untag_ptr(o));
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_NetworkUpdateZDecodeErrorZ), "LDKCResult_COption_NetworkUpdateZDecodeErrorZ");
+       *ret_conv = CResult_COption_NetworkUpdateZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_NetworkUpdateZDecodeErrorZ_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_COption_NetworkUpdateZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_NetworkUpdateZDecodeErrorZ), "LDKCResult_COption_NetworkUpdateZDecodeErrorZ");
+       *ret_conv = CResult_COption_NetworkUpdateZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_NetworkUpdateZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* o_conv = (LDKCResult_COption_NetworkUpdateZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_NetworkUpdateZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_NetworkUpdateZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ _res_conv = *(LDKCResult_COption_NetworkUpdateZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_NetworkUpdateZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_NetworkUpdateZDecodeErrorZ_clone_ptr(LDKCResult_COption_NetworkUpdateZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_NetworkUpdateZDecodeErrorZ), "LDKCResult_COption_NetworkUpdateZDecodeErrorZ");
+       *ret_conv = CResult_COption_NetworkUpdateZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_NetworkUpdateZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* arg_conv = (LDKCResult_COption_NetworkUpdateZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_NetworkUpdateZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_NetworkUpdateZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* orig_conv = (LDKCResult_COption_NetworkUpdateZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_NetworkUpdateZDecodeErrorZ), "LDKCResult_COption_NetworkUpdateZDecodeErrorZ");
+       *ret_conv = CResult_COption_NetworkUpdateZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_UtxoLookupZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKUtxoLookup o_conv = *(LDKUtxoLookup*)(o_ptr);
+       if (o_conv.free == LDKUtxoLookup_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKUtxoLookup_JCalls_cloned(&o_conv);
+       }
+       LDKCOption_UtxoLookupZ *ret_copy = MALLOC(sizeof(LDKCOption_UtxoLookupZ), "LDKCOption_UtxoLookupZ");
+       *ret_copy = COption_UtxoLookupZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_UtxoLookupZ_none() {
+       LDKCOption_UtxoLookupZ *ret_copy = MALLOC(sizeof(LDKCOption_UtxoLookupZ), "LDKCOption_UtxoLookupZ");
+       *ret_copy = COption_UtxoLookupZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_UtxoLookupZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_UtxoLookupZ _res_conv = *(LDKCOption_UtxoLookupZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_UtxoLookupZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_NoneLightningErrorZ_ok() {
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = CResult_NoneLightningErrorZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneLightningErrorZ_err(int64_t e) {
+       LDKLightningError e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = LightningError_clone(&e_conv);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = CResult_NoneLightningErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NoneLightningErrorZ_is_ok(int64_t o) {
+       LDKCResult_NoneLightningErrorZ* o_conv = (LDKCResult_NoneLightningErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NoneLightningErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NoneLightningErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NoneLightningErrorZ _res_conv = *(LDKCResult_NoneLightningErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NoneLightningErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NoneLightningErrorZ_clone_ptr(LDKCResult_NoneLightningErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = CResult_NoneLightningErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NoneLightningErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NoneLightningErrorZ* arg_conv = (LDKCResult_NoneLightningErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NoneLightningErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NoneLightningErrorZ_clone(int64_t orig) {
+       LDKCResult_NoneLightningErrorZ* orig_conv = (LDKCResult_NoneLightningErrorZ*)untag_ptr(orig);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = CResult_NoneLightningErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_boolLightningErrorZ_ok(jboolean o) {
+       LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
+       *ret_conv = CResult_boolLightningErrorZ_ok(o);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_boolLightningErrorZ_err(int64_t e) {
+       LDKLightningError e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = LightningError_clone(&e_conv);
+       LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
+       *ret_conv = CResult_boolLightningErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_boolLightningErrorZ_is_ok(int64_t o) {
+       LDKCResult_boolLightningErrorZ* o_conv = (LDKCResult_boolLightningErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_boolLightningErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_boolLightningErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_boolLightningErrorZ _res_conv = *(LDKCResult_boolLightningErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_boolLightningErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_boolLightningErrorZ_clone_ptr(LDKCResult_boolLightningErrorZ *NONNULL_PTR arg) {
+       LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
+       *ret_conv = CResult_boolLightningErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_boolLightningErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_boolLightningErrorZ* arg_conv = (LDKCResult_boolLightningErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_boolLightningErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_boolLightningErrorZ_clone(int64_t orig) {
+       LDKCResult_boolLightningErrorZ* orig_conv = (LDKCResult_boolLightningErrorZ*)untag_ptr(orig);
+       LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
+       *ret_conv = CResult_boolLightningErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone_ptr(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *NONNULL_PTR arg) {
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ), "LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ");
+       *ret_conv = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone_ptr(int64_t arg) {
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* arg_conv = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)untag_ptr(arg);
+       int64_t ret_conv = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone(int64_t orig) {
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* orig_conv = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)untag_ptr(orig);
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ), "LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ");
+       *ret_conv = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_new(int64_t a, int64_t b, int64_t c) {
+       LDKChannelAnnouncement 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 = ChannelAnnouncement_clone(&a_conv);
+       LDKChannelUpdate 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 = ChannelUpdate_clone(&b_conv);
+       LDKChannelUpdate 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 = ChannelUpdate_clone(&c_conv);
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ), "LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ");
+       *ret_conv = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_new(a_conv, b_conv, c_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ _res_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ o_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(o_ptr);
+       o_conv = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone((LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)untag_ptr(o));
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *ret_copy = MALLOC(sizeof(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ), "LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ");
+       *ret_copy = COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_none() {
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *ret_copy = MALLOC(sizeof(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ), "LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ");
+       *ret_copy = COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ _res_conv = *(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_free(_res_conv);
+}
+
+static inline uint64_t COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone_ptr(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *NONNULL_PTR arg) {
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *ret_copy = MALLOC(sizeof(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ), "LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ");
+       *ret_copy = COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone_ptr(int64_t arg) {
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ* arg_conv = (LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone(int64_t orig) {
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ* orig_conv = (LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ*)untag_ptr(orig);
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *ret_copy = MALLOC(sizeof(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ), "LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ");
+       *ret_copy = COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CVec_MessageSendEventZ_free(int64_tArray _res) {
+       LDKCVec_MessageSendEventZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKMessageSendEvent), "LDKCVec_MessageSendEventZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t s = 0; s < _res_constr.datalen; s++) {
+               int64_t _res_conv_18 = _res_vals[s];
+               void* _res_conv_18_ptr = untag_ptr(_res_conv_18);
+               CHECK_ACCESS(_res_conv_18_ptr);
+               LDKMessageSendEvent _res_conv_18_conv = *(LDKMessageSendEvent*)(_res_conv_18_ptr);
+               FREE(untag_ptr(_res_conv_18));
+               _res_constr.data[s] = _res_conv_18_conv;
+       }
+       FREE(_res);
+       CVec_MessageSendEventZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_ok(int64_t o) {
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_clone(&o_conv);
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateInfoDecodeErrorZ), "LDKCResult_ChannelUpdateInfoDecodeErrorZ");
+       *ret_conv = CResult_ChannelUpdateInfoDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_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_ChannelUpdateInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateInfoDecodeErrorZ), "LDKCResult_ChannelUpdateInfoDecodeErrorZ");
+       *ret_conv = CResult_ChannelUpdateInfoDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* o_conv = (LDKCResult_ChannelUpdateInfoDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelUpdateInfoDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ _res_conv = *(LDKCResult_ChannelUpdateInfoDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelUpdateInfoDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelUpdateInfoDecodeErrorZ_clone_ptr(LDKCResult_ChannelUpdateInfoDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateInfoDecodeErrorZ), "LDKCResult_ChannelUpdateInfoDecodeErrorZ");
+       *ret_conv = CResult_ChannelUpdateInfoDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* arg_conv = (LDKCResult_ChannelUpdateInfoDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelUpdateInfoDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* orig_conv = (LDKCResult_ChannelUpdateInfoDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateInfoDecodeErrorZ), "LDKCResult_ChannelUpdateInfoDecodeErrorZ");
+       *ret_conv = CResult_ChannelUpdateInfoDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelInfoDecodeErrorZ_ok(int64_t o) {
+       LDKChannelInfo 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 = ChannelInfo_clone(&o_conv);
+       LDKCResult_ChannelInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelInfoDecodeErrorZ), "LDKCResult_ChannelInfoDecodeErrorZ");
+       *ret_conv = CResult_ChannelInfoDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelInfoDecodeErrorZ_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_ChannelInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelInfoDecodeErrorZ), "LDKCResult_ChannelInfoDecodeErrorZ");
+       *ret_conv = CResult_ChannelInfoDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelInfoDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelInfoDecodeErrorZ* o_conv = (LDKCResult_ChannelInfoDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelInfoDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelInfoDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelInfoDecodeErrorZ _res_conv = *(LDKCResult_ChannelInfoDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelInfoDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelInfoDecodeErrorZ_clone_ptr(LDKCResult_ChannelInfoDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelInfoDecodeErrorZ), "LDKCResult_ChannelInfoDecodeErrorZ");
+       *ret_conv = CResult_ChannelInfoDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelInfoDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelInfoDecodeErrorZ* arg_conv = (LDKCResult_ChannelInfoDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelInfoDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelInfoDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelInfoDecodeErrorZ* orig_conv = (LDKCResult_ChannelInfoDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelInfoDecodeErrorZ), "LDKCResult_ChannelInfoDecodeErrorZ");
+       *ret_conv = CResult_ChannelInfoDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RoutingFeesDecodeErrorZ_ok(int64_t o) {
+       LDKRoutingFees 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 = RoutingFees_clone(&o_conv);
+       LDKCResult_RoutingFeesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RoutingFeesDecodeErrorZ), "LDKCResult_RoutingFeesDecodeErrorZ");
+       *ret_conv = CResult_RoutingFeesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RoutingFeesDecodeErrorZ_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_RoutingFeesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RoutingFeesDecodeErrorZ), "LDKCResult_RoutingFeesDecodeErrorZ");
+       *ret_conv = CResult_RoutingFeesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RoutingFeesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RoutingFeesDecodeErrorZ* o_conv = (LDKCResult_RoutingFeesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RoutingFeesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RoutingFeesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RoutingFeesDecodeErrorZ _res_conv = *(LDKCResult_RoutingFeesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RoutingFeesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RoutingFeesDecodeErrorZ_clone_ptr(LDKCResult_RoutingFeesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RoutingFeesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RoutingFeesDecodeErrorZ), "LDKCResult_RoutingFeesDecodeErrorZ");
+       *ret_conv = CResult_RoutingFeesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RoutingFeesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RoutingFeesDecodeErrorZ* arg_conv = (LDKCResult_RoutingFeesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RoutingFeesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RoutingFeesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RoutingFeesDecodeErrorZ* orig_conv = (LDKCResult_RoutingFeesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RoutingFeesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RoutingFeesDecodeErrorZ), "LDKCResult_RoutingFeesDecodeErrorZ");
+       *ret_conv = CResult_RoutingFeesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_SocketAddressZ_free(int64_tArray _res) {
+       LDKCVec_SocketAddressZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKSocketAddress), "LDKCVec_SocketAddressZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t p = 0; p < _res_constr.datalen; p++) {
+               int64_t _res_conv_15 = _res_vals[p];
+               void* _res_conv_15_ptr = untag_ptr(_res_conv_15);
+               CHECK_ACCESS(_res_conv_15_ptr);
+               LDKSocketAddress _res_conv_15_conv = *(LDKSocketAddress*)(_res_conv_15_ptr);
+               FREE(untag_ptr(_res_conv_15));
+               _res_constr.data[p] = _res_conv_15_conv;
+       }
+       FREE(_res);
+       CVec_SocketAddressZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_ok(int64_t o) {
+       LDKNodeAnnouncementInfo 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 = NodeAnnouncementInfo_clone(&o_conv);
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementInfoDecodeErrorZ), "LDKCResult_NodeAnnouncementInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_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_NodeAnnouncementInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementInfoDecodeErrorZ), "LDKCResult_NodeAnnouncementInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* o_conv = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ _res_conv = *(LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NodeAnnouncementInfoDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NodeAnnouncementInfoDecodeErrorZ_clone_ptr(LDKCResult_NodeAnnouncementInfoDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementInfoDecodeErrorZ), "LDKCResult_NodeAnnouncementInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* arg_conv = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* orig_conv = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementInfoDecodeErrorZ), "LDKCResult_NodeAnnouncementInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeAliasDecodeErrorZ_ok(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 = NodeAlias_clone(&o_conv);
+       LDKCResult_NodeAliasDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAliasDecodeErrorZ), "LDKCResult_NodeAliasDecodeErrorZ");
+       *ret_conv = CResult_NodeAliasDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeAliasDecodeErrorZ_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_NodeAliasDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAliasDecodeErrorZ), "LDKCResult_NodeAliasDecodeErrorZ");
+       *ret_conv = CResult_NodeAliasDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NodeAliasDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_NodeAliasDecodeErrorZ* o_conv = (LDKCResult_NodeAliasDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NodeAliasDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NodeAliasDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NodeAliasDecodeErrorZ _res_conv = *(LDKCResult_NodeAliasDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NodeAliasDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NodeAliasDecodeErrorZ_clone_ptr(LDKCResult_NodeAliasDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NodeAliasDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAliasDecodeErrorZ), "LDKCResult_NodeAliasDecodeErrorZ");
+       *ret_conv = CResult_NodeAliasDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NodeAliasDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NodeAliasDecodeErrorZ* arg_conv = (LDKCResult_NodeAliasDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NodeAliasDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NodeAliasDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_NodeAliasDecodeErrorZ* orig_conv = (LDKCResult_NodeAliasDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_NodeAliasDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAliasDecodeErrorZ), "LDKCResult_NodeAliasDecodeErrorZ");
+       *ret_conv = CResult_NodeAliasDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeInfoDecodeErrorZ_ok(int64_t o) {
+       LDKNodeInfo 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 = NodeInfo_clone(&o_conv);
+       LDKCResult_NodeInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeInfoDecodeErrorZ), "LDKCResult_NodeInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeInfoDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeInfoDecodeErrorZ_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_NodeInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeInfoDecodeErrorZ), "LDKCResult_NodeInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeInfoDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NodeInfoDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_NodeInfoDecodeErrorZ* o_conv = (LDKCResult_NodeInfoDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NodeInfoDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NodeInfoDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NodeInfoDecodeErrorZ _res_conv = *(LDKCResult_NodeInfoDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NodeInfoDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NodeInfoDecodeErrorZ_clone_ptr(LDKCResult_NodeInfoDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NodeInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeInfoDecodeErrorZ), "LDKCResult_NodeInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeInfoDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NodeInfoDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NodeInfoDecodeErrorZ* arg_conv = (LDKCResult_NodeInfoDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NodeInfoDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NodeInfoDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_NodeInfoDecodeErrorZ* orig_conv = (LDKCResult_NodeInfoDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_NodeInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeInfoDecodeErrorZ), "LDKCResult_NodeInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeInfoDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NetworkGraphDecodeErrorZ_ok(int64_t o) {
+       LDKNetworkGraph o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       // WARNING: we need a move here but no clone is available for LDKNetworkGraph
+       
+       LDKCResult_NetworkGraphDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NetworkGraphDecodeErrorZ), "LDKCResult_NetworkGraphDecodeErrorZ");
+       *ret_conv = CResult_NetworkGraphDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NetworkGraphDecodeErrorZ_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_NetworkGraphDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NetworkGraphDecodeErrorZ), "LDKCResult_NetworkGraphDecodeErrorZ");
+       *ret_conv = CResult_NetworkGraphDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NetworkGraphDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_NetworkGraphDecodeErrorZ* o_conv = (LDKCResult_NetworkGraphDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NetworkGraphDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NetworkGraphDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NetworkGraphDecodeErrorZ _res_conv = *(LDKCResult_NetworkGraphDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NetworkGraphDecodeErrorZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_COption_CVec_SocketAddressZZ_some(int64_tArray o) {
+       LDKCVec_SocketAddressZ o_constr;
+       o_constr.datalen = o->arr_len;
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKSocketAddress), "LDKCVec_SocketAddressZ Elements");
+       else
+               o_constr.data = NULL;
+       int64_t* o_vals = o->elems;
+       for (size_t p = 0; p < o_constr.datalen; p++) {
+               int64_t o_conv_15 = o_vals[p];
+               void* o_conv_15_ptr = untag_ptr(o_conv_15);
+               CHECK_ACCESS(o_conv_15_ptr);
+               LDKSocketAddress o_conv_15_conv = *(LDKSocketAddress*)(o_conv_15_ptr);
+               o_conv_15_conv = SocketAddress_clone((LDKSocketAddress*)untag_ptr(o_conv_15));
+               o_constr.data[p] = o_conv_15_conv;
+       }
+       FREE(o);
+       LDKCOption_CVec_SocketAddressZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_SocketAddressZZ), "LDKCOption_CVec_SocketAddressZZ");
+       *ret_copy = COption_CVec_SocketAddressZZ_some(o_constr);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_CVec_SocketAddressZZ_none() {
+       LDKCOption_CVec_SocketAddressZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_SocketAddressZZ), "LDKCOption_CVec_SocketAddressZZ");
+       *ret_copy = COption_CVec_SocketAddressZZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_CVec_SocketAddressZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_CVec_SocketAddressZZ _res_conv = *(LDKCOption_CVec_SocketAddressZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_CVec_SocketAddressZZ_free(_res_conv);
+}
+
+static inline uint64_t COption_CVec_SocketAddressZZ_clone_ptr(LDKCOption_CVec_SocketAddressZZ *NONNULL_PTR arg) {
+       LDKCOption_CVec_SocketAddressZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_SocketAddressZZ), "LDKCOption_CVec_SocketAddressZZ");
+       *ret_copy = COption_CVec_SocketAddressZZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_CVec_SocketAddressZZ_clone_ptr(int64_t arg) {
+       LDKCOption_CVec_SocketAddressZZ* arg_conv = (LDKCOption_CVec_SocketAddressZZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_CVec_SocketAddressZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_CVec_SocketAddressZZ_clone(int64_t orig) {
+       LDKCOption_CVec_SocketAddressZZ* orig_conv = (LDKCOption_CVec_SocketAddressZZ*)untag_ptr(orig);
+       LDKCOption_CVec_SocketAddressZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_SocketAddressZZ), "LDKCOption_CVec_SocketAddressZZ");
+       *ret_copy = COption_CVec_SocketAddressZZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CVec_HTLCOutputInCommitmentZ_free(int64_tArray _res) {
+       LDKCVec_HTLCOutputInCommitmentZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKHTLCOutputInCommitment), "LDKCVec_HTLCOutputInCommitmentZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t y = 0; y < _res_constr.datalen; y++) {
+               int64_t _res_conv_24 = _res_vals[y];
+               LDKHTLCOutputInCommitment _res_conv_24_conv;
+               _res_conv_24_conv.inner = untag_ptr(_res_conv_24);
+               _res_conv_24_conv.is_owned = ptr_is_owned(_res_conv_24);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_24_conv);
+               _res_constr.data[y] = _res_conv_24_conv;
+       }
+       FREE(_res);
+       CVec_HTLCOutputInCommitmentZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_HTLCDescriptorZ_free(int64_tArray _res) {
+       LDKCVec_HTLCDescriptorZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKHTLCDescriptor), "LDKCVec_HTLCDescriptorZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t q = 0; q < _res_constr.datalen; q++) {
+               int64_t _res_conv_16 = _res_vals[q];
+               LDKHTLCDescriptor _res_conv_16_conv;
+               _res_conv_16_conv.inner = untag_ptr(_res_conv_16);
+               _res_conv_16_conv.is_owned = ptr_is_owned(_res_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_16_conv);
+               _res_constr.data[q] = _res_conv_16_conv;
+       }
+       FREE(_res);
+       CVec_HTLCDescriptorZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_UtxoZ_free(int64_tArray _res) {
+       LDKCVec_UtxoZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKUtxo), "LDKCVec_UtxoZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t g = 0; g < _res_constr.datalen; g++) {
+               int64_t _res_conv_6 = _res_vals[g];
+               LDKUtxo _res_conv_6_conv;
+               _res_conv_6_conv.inner = untag_ptr(_res_conv_6);
+               _res_conv_6_conv.is_owned = ptr_is_owned(_res_conv_6);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_6_conv);
+               _res_constr.data[g] = _res_conv_6_conv;
+       }
+       FREE(_res);
+       CVec_UtxoZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_TxOutZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKTxOut o_conv = *(LDKTxOut*)(o_ptr);
+       o_conv = TxOut_clone((LDKTxOut*)untag_ptr(o));
+       LDKCOption_TxOutZ *ret_copy = MALLOC(sizeof(LDKCOption_TxOutZ), "LDKCOption_TxOutZ");
+       *ret_copy = COption_TxOutZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_TxOutZ_none() {
+       LDKCOption_TxOutZ *ret_copy = MALLOC(sizeof(LDKCOption_TxOutZ), "LDKCOption_TxOutZ");
+       *ret_copy = COption_TxOutZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_TxOutZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_TxOutZ _res_conv = *(LDKCOption_TxOutZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_TxOutZ_free(_res_conv);
+}
+
+static inline uint64_t COption_TxOutZ_clone_ptr(LDKCOption_TxOutZ *NONNULL_PTR arg) {
+       LDKCOption_TxOutZ *ret_copy = MALLOC(sizeof(LDKCOption_TxOutZ), "LDKCOption_TxOutZ");
+       *ret_copy = COption_TxOutZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_TxOutZ_clone_ptr(int64_t arg) {
+       LDKCOption_TxOutZ* arg_conv = (LDKCOption_TxOutZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_TxOutZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_TxOutZ_clone(int64_t orig) {
+       LDKCOption_TxOutZ* orig_conv = (LDKCOption_TxOutZ*)untag_ptr(orig);
+       LDKCOption_TxOutZ *ret_copy = MALLOC(sizeof(LDKCOption_TxOutZ), "LDKCOption_TxOutZ");
+       *ret_copy = COption_TxOutZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CVec_InputZ_free(int64_tArray _res) {
+       LDKCVec_InputZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKInput), "LDKCVec_InputZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t h = 0; h < _res_constr.datalen; h++) {
+               int64_t _res_conv_7 = _res_vals[h];
+               LDKInput _res_conv_7_conv;
+               _res_conv_7_conv.inner = untag_ptr(_res_conv_7);
+               _res_conv_7_conv.is_owned = ptr_is_owned(_res_conv_7);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_7_conv);
+               _res_constr.data[h] = _res_conv_7_conv;
+       }
+       FREE(_res);
+       CVec_InputZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_CoinSelectionNoneZ_ok(int64_t o) {
+       LDKCoinSelection 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 = CoinSelection_clone(&o_conv);
+       LDKCResult_CoinSelectionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CoinSelectionNoneZ), "LDKCResult_CoinSelectionNoneZ");
+       *ret_conv = CResult_CoinSelectionNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CoinSelectionNoneZ_err() {
+       LDKCResult_CoinSelectionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CoinSelectionNoneZ), "LDKCResult_CoinSelectionNoneZ");
+       *ret_conv = CResult_CoinSelectionNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CoinSelectionNoneZ_is_ok(int64_t o) {
+       LDKCResult_CoinSelectionNoneZ* o_conv = (LDKCResult_CoinSelectionNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CoinSelectionNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CoinSelectionNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CoinSelectionNoneZ _res_conv = *(LDKCResult_CoinSelectionNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CoinSelectionNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CoinSelectionNoneZ_clone_ptr(LDKCResult_CoinSelectionNoneZ *NONNULL_PTR arg) {
+       LDKCResult_CoinSelectionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CoinSelectionNoneZ), "LDKCResult_CoinSelectionNoneZ");
+       *ret_conv = CResult_CoinSelectionNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CoinSelectionNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_CoinSelectionNoneZ* arg_conv = (LDKCResult_CoinSelectionNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CoinSelectionNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CoinSelectionNoneZ_clone(int64_t orig) {
+       LDKCResult_CoinSelectionNoneZ* orig_conv = (LDKCResult_CoinSelectionNoneZ*)untag_ptr(orig);
+       LDKCResult_CoinSelectionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CoinSelectionNoneZ), "LDKCResult_CoinSelectionNoneZ");
+       *ret_conv = CResult_CoinSelectionNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_UtxoZNoneZ_ok(int64_tArray o) {
+       LDKCVec_UtxoZ o_constr;
+       o_constr.datalen = o->arr_len;
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKUtxo), "LDKCVec_UtxoZ Elements");
+       else
+               o_constr.data = NULL;
+       int64_t* o_vals = o->elems;
+       for (size_t g = 0; g < o_constr.datalen; g++) {
+               int64_t o_conv_6 = o_vals[g];
+               LDKUtxo o_conv_6_conv;
+               o_conv_6_conv.inner = untag_ptr(o_conv_6);
+               o_conv_6_conv.is_owned = ptr_is_owned(o_conv_6);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv_6_conv);
+               o_conv_6_conv = Utxo_clone(&o_conv_6_conv);
+               o_constr.data[g] = o_conv_6_conv;
+       }
+       FREE(o);
+       LDKCResult_CVec_UtxoZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_UtxoZNoneZ), "LDKCResult_CVec_UtxoZNoneZ");
+       *ret_conv = CResult_CVec_UtxoZNoneZ_ok(o_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_UtxoZNoneZ_err() {
+       LDKCResult_CVec_UtxoZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_UtxoZNoneZ), "LDKCResult_CVec_UtxoZNoneZ");
+       *ret_conv = CResult_CVec_UtxoZNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_UtxoZNoneZ_is_ok(int64_t o) {
+       LDKCResult_CVec_UtxoZNoneZ* o_conv = (LDKCResult_CVec_UtxoZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_UtxoZNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_UtxoZNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_UtxoZNoneZ _res_conv = *(LDKCResult_CVec_UtxoZNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_UtxoZNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_UtxoZNoneZ_clone_ptr(LDKCResult_CVec_UtxoZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_UtxoZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_UtxoZNoneZ), "LDKCResult_CVec_UtxoZNoneZ");
+       *ret_conv = CResult_CVec_UtxoZNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_UtxoZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_UtxoZNoneZ* arg_conv = (LDKCResult_CVec_UtxoZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_UtxoZNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_UtxoZNoneZ_clone(int64_t orig) {
+       LDKCResult_CVec_UtxoZNoneZ* orig_conv = (LDKCResult_CVec_UtxoZNoneZ*)untag_ptr(orig);
+       LDKCResult_CVec_UtxoZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_UtxoZNoneZ), "LDKCResult_CVec_UtxoZNoneZ");
+       *ret_conv = CResult_CVec_UtxoZNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C2Tuple_u64u16Z_clone_ptr(LDKC2Tuple_u64u16Z *NONNULL_PTR arg) {
+       LDKC2Tuple_u64u16Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64u16Z), "LDKC2Tuple_u64u16Z");
+       *ret_conv = C2Tuple_u64u16Z_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_u64u16Z_clone_ptr(int64_t arg) {
+       LDKC2Tuple_u64u16Z* arg_conv = (LDKC2Tuple_u64u16Z*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_u64u16Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_u64u16Z_clone(int64_t orig) {
+       LDKC2Tuple_u64u16Z* orig_conv = (LDKC2Tuple_u64u16Z*)untag_ptr(orig);
+       LDKC2Tuple_u64u16Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64u16Z), "LDKC2Tuple_u64u16Z");
+       *ret_conv = C2Tuple_u64u16Z_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_u64u16Z_new(int64_t a, int16_t b) {
+       LDKC2Tuple_u64u16Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64u16Z), "LDKC2Tuple_u64u16Z");
+       *ret_conv = C2Tuple_u64u16Z_new(a, b);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_u64u16Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_u64u16Z _res_conv = *(LDKC2Tuple_u64u16Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_u64u16Z_free(_res_conv);
+}
+
+int64_t  CS_LDK_COption_C2Tuple_u64u16ZZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_u64u16Z o_conv = *(LDKC2Tuple_u64u16Z*)(o_ptr);
+       o_conv = C2Tuple_u64u16Z_clone((LDKC2Tuple_u64u16Z*)untag_ptr(o));
+       LDKCOption_C2Tuple_u64u16ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u16ZZ), "LDKCOption_C2Tuple_u64u16ZZ");
+       *ret_copy = COption_C2Tuple_u64u16ZZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_C2Tuple_u64u16ZZ_none() {
+       LDKCOption_C2Tuple_u64u16ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u16ZZ), "LDKCOption_C2Tuple_u64u16ZZ");
+       *ret_copy = COption_C2Tuple_u64u16ZZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_C2Tuple_u64u16ZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_C2Tuple_u64u16ZZ _res_conv = *(LDKCOption_C2Tuple_u64u16ZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_C2Tuple_u64u16ZZ_free(_res_conv);
+}
+
+static inline uint64_t COption_C2Tuple_u64u16ZZ_clone_ptr(LDKCOption_C2Tuple_u64u16ZZ *NONNULL_PTR arg) {
+       LDKCOption_C2Tuple_u64u16ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u16ZZ), "LDKCOption_C2Tuple_u64u16ZZ");
+       *ret_copy = COption_C2Tuple_u64u16ZZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_C2Tuple_u64u16ZZ_clone_ptr(int64_t arg) {
+       LDKCOption_C2Tuple_u64u16ZZ* arg_conv = (LDKCOption_C2Tuple_u64u16ZZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_C2Tuple_u64u16ZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_C2Tuple_u64u16ZZ_clone(int64_t orig) {
+       LDKCOption_C2Tuple_u64u16ZZ* orig_conv = (LDKCOption_C2Tuple_u64u16ZZ*)untag_ptr(orig);
+       LDKCOption_C2Tuple_u64u16ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u16ZZ), "LDKCOption_C2Tuple_u64u16ZZ");
+       *ret_copy = COption_C2Tuple_u64u16ZZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_ChannelShutdownStateZ_some(int32_t o) {
+       LDKChannelShutdownState o_conv = LDKChannelShutdownState_from_cs(o);
+       LDKCOption_ChannelShutdownStateZ *ret_copy = MALLOC(sizeof(LDKCOption_ChannelShutdownStateZ), "LDKCOption_ChannelShutdownStateZ");
+       *ret_copy = COption_ChannelShutdownStateZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_ChannelShutdownStateZ_none() {
+       LDKCOption_ChannelShutdownStateZ *ret_copy = MALLOC(sizeof(LDKCOption_ChannelShutdownStateZ), "LDKCOption_ChannelShutdownStateZ");
+       *ret_copy = COption_ChannelShutdownStateZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_ChannelShutdownStateZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_ChannelShutdownStateZ _res_conv = *(LDKCOption_ChannelShutdownStateZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_ChannelShutdownStateZ_free(_res_conv);
+}
+
+static inline uint64_t COption_ChannelShutdownStateZ_clone_ptr(LDKCOption_ChannelShutdownStateZ *NONNULL_PTR arg) {
+       LDKCOption_ChannelShutdownStateZ *ret_copy = MALLOC(sizeof(LDKCOption_ChannelShutdownStateZ), "LDKCOption_ChannelShutdownStateZ");
+       *ret_copy = COption_ChannelShutdownStateZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_ChannelShutdownStateZ_clone_ptr(int64_t arg) {
+       LDKCOption_ChannelShutdownStateZ* arg_conv = (LDKCOption_ChannelShutdownStateZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_ChannelShutdownStateZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_ChannelShutdownStateZ_clone(int64_t orig) {
+       LDKCOption_ChannelShutdownStateZ* orig_conv = (LDKCOption_ChannelShutdownStateZ*)untag_ptr(orig);
+       LDKCOption_ChannelShutdownStateZ *ret_copy = MALLOC(sizeof(LDKCOption_ChannelShutdownStateZ), "LDKCOption_ChannelShutdownStateZ");
+       *ret_copy = COption_ChannelShutdownStateZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_ok(int8_tArray o) {
+       LDKThirtyTwoBytes o_ref;
+       CHECK(o->arr_len == 32);
+       memcpy(o_ref.data, o->elems, 32); FREE(o);
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesAPIErrorZ), "LDKCResult_ThirtyTwoBytesAPIErrorZ");
+       *ret_conv = CResult_ThirtyTwoBytesAPIErrorZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKAPIError e_conv = *(LDKAPIError*)(e_ptr);
+       e_conv = APIError_clone((LDKAPIError*)untag_ptr(e));
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesAPIErrorZ), "LDKCResult_ThirtyTwoBytesAPIErrorZ");
+       *ret_conv = CResult_ThirtyTwoBytesAPIErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_is_ok(int64_t o) {
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* o_conv = (LDKCResult_ThirtyTwoBytesAPIErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ThirtyTwoBytesAPIErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ThirtyTwoBytesAPIErrorZ _res_conv = *(LDKCResult_ThirtyTwoBytesAPIErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ThirtyTwoBytesAPIErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ThirtyTwoBytesAPIErrorZ_clone_ptr(LDKCResult_ThirtyTwoBytesAPIErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesAPIErrorZ), "LDKCResult_ThirtyTwoBytesAPIErrorZ");
+       *ret_conv = CResult_ThirtyTwoBytesAPIErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* arg_conv = (LDKCResult_ThirtyTwoBytesAPIErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ThirtyTwoBytesAPIErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_clone(int64_t orig) {
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* orig_conv = (LDKCResult_ThirtyTwoBytesAPIErrorZ*)untag_ptr(orig);
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesAPIErrorZ), "LDKCResult_ThirtyTwoBytesAPIErrorZ");
+       *ret_conv = CResult_ThirtyTwoBytesAPIErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_RecentPaymentDetailsZ_free(int64_tArray _res) {
+       LDKCVec_RecentPaymentDetailsZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKRecentPaymentDetails), "LDKCVec_RecentPaymentDetailsZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t w = 0; w < _res_constr.datalen; w++) {
+               int64_t _res_conv_22 = _res_vals[w];
+               void* _res_conv_22_ptr = untag_ptr(_res_conv_22);
+               CHECK_ACCESS(_res_conv_22_ptr);
+               LDKRecentPaymentDetails _res_conv_22_conv = *(LDKRecentPaymentDetails*)(_res_conv_22_ptr);
+               FREE(untag_ptr(_res_conv_22));
+               _res_constr.data[w] = _res_conv_22_conv;
+       }
+       FREE(_res);
+       CVec_RecentPaymentDetailsZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_NonePaymentSendFailureZ_ok() {
+       LDKCResult_NonePaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentSendFailureZ), "LDKCResult_NonePaymentSendFailureZ");
+       *ret_conv = CResult_NonePaymentSendFailureZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NonePaymentSendFailureZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKPaymentSendFailure e_conv = *(LDKPaymentSendFailure*)(e_ptr);
+       e_conv = PaymentSendFailure_clone((LDKPaymentSendFailure*)untag_ptr(e));
+       LDKCResult_NonePaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentSendFailureZ), "LDKCResult_NonePaymentSendFailureZ");
+       *ret_conv = CResult_NonePaymentSendFailureZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NonePaymentSendFailureZ_is_ok(int64_t o) {
+       LDKCResult_NonePaymentSendFailureZ* o_conv = (LDKCResult_NonePaymentSendFailureZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NonePaymentSendFailureZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NonePaymentSendFailureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NonePaymentSendFailureZ _res_conv = *(LDKCResult_NonePaymentSendFailureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NonePaymentSendFailureZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NonePaymentSendFailureZ_clone_ptr(LDKCResult_NonePaymentSendFailureZ *NONNULL_PTR arg) {
+       LDKCResult_NonePaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentSendFailureZ), "LDKCResult_NonePaymentSendFailureZ");
+       *ret_conv = CResult_NonePaymentSendFailureZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NonePaymentSendFailureZ_clone_ptr(int64_t arg) {
+       LDKCResult_NonePaymentSendFailureZ* arg_conv = (LDKCResult_NonePaymentSendFailureZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NonePaymentSendFailureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NonePaymentSendFailureZ_clone(int64_t orig) {
+       LDKCResult_NonePaymentSendFailureZ* orig_conv = (LDKCResult_NonePaymentSendFailureZ*)untag_ptr(orig);
+       LDKCResult_NonePaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentSendFailureZ), "LDKCResult_NonePaymentSendFailureZ");
+       *ret_conv = CResult_NonePaymentSendFailureZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneRetryableSendFailureZ_ok() {
+       LDKCResult_NoneRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneRetryableSendFailureZ), "LDKCResult_NoneRetryableSendFailureZ");
+       *ret_conv = CResult_NoneRetryableSendFailureZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneRetryableSendFailureZ_err(int32_t e) {
+       LDKRetryableSendFailure e_conv = LDKRetryableSendFailure_from_cs(e);
+       LDKCResult_NoneRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneRetryableSendFailureZ), "LDKCResult_NoneRetryableSendFailureZ");
+       *ret_conv = CResult_NoneRetryableSendFailureZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NoneRetryableSendFailureZ_is_ok(int64_t o) {
+       LDKCResult_NoneRetryableSendFailureZ* o_conv = (LDKCResult_NoneRetryableSendFailureZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NoneRetryableSendFailureZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NoneRetryableSendFailureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NoneRetryableSendFailureZ _res_conv = *(LDKCResult_NoneRetryableSendFailureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NoneRetryableSendFailureZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NoneRetryableSendFailureZ_clone_ptr(LDKCResult_NoneRetryableSendFailureZ *NONNULL_PTR arg) {
+       LDKCResult_NoneRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneRetryableSendFailureZ), "LDKCResult_NoneRetryableSendFailureZ");
+       *ret_conv = CResult_NoneRetryableSendFailureZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NoneRetryableSendFailureZ_clone_ptr(int64_t arg) {
+       LDKCResult_NoneRetryableSendFailureZ* arg_conv = (LDKCResult_NoneRetryableSendFailureZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NoneRetryableSendFailureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NoneRetryableSendFailureZ_clone(int64_t orig) {
+       LDKCResult_NoneRetryableSendFailureZ* orig_conv = (LDKCResult_NoneRetryableSendFailureZ*)untag_ptr(orig);
+       LDKCResult_NoneRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneRetryableSendFailureZ), "LDKCResult_NoneRetryableSendFailureZ");
+       *ret_conv = CResult_NoneRetryableSendFailureZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_ok(int8_tArray o) {
+       LDKThirtyTwoBytes o_ref;
+       CHECK(o->arr_len == 32);
+       memcpy(o_ref.data, o->elems, 32); FREE(o);
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ), "LDKCResult_ThirtyTwoBytesPaymentSendFailureZ");
+       *ret_conv = CResult_ThirtyTwoBytesPaymentSendFailureZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKPaymentSendFailure e_conv = *(LDKPaymentSendFailure*)(e_ptr);
+       e_conv = PaymentSendFailure_clone((LDKPaymentSendFailure*)untag_ptr(e));
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ), "LDKCResult_ThirtyTwoBytesPaymentSendFailureZ");
+       *ret_conv = CResult_ThirtyTwoBytesPaymentSendFailureZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_is_ok(int64_t o) {
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* o_conv = (LDKCResult_ThirtyTwoBytesPaymentSendFailureZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ThirtyTwoBytesPaymentSendFailureZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ _res_conv = *(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ThirtyTwoBytesPaymentSendFailureZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ThirtyTwoBytesPaymentSendFailureZ_clone_ptr(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ *NONNULL_PTR arg) {
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ), "LDKCResult_ThirtyTwoBytesPaymentSendFailureZ");
+       *ret_conv = CResult_ThirtyTwoBytesPaymentSendFailureZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_clone_ptr(int64_t arg) {
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* arg_conv = (LDKCResult_ThirtyTwoBytesPaymentSendFailureZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ThirtyTwoBytesPaymentSendFailureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_clone(int64_t orig) {
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* orig_conv = (LDKCResult_ThirtyTwoBytesPaymentSendFailureZ*)untag_ptr(orig);
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ), "LDKCResult_ThirtyTwoBytesPaymentSendFailureZ");
+       *ret_conv = CResult_ThirtyTwoBytesPaymentSendFailureZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_ok(int8_tArray o) {
+       LDKThirtyTwoBytes o_ref;
+       CHECK(o->arr_len == 32);
+       memcpy(o_ref.data, o->elems, 32); FREE(o);
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ), "LDKCResult_ThirtyTwoBytesRetryableSendFailureZ");
+       *ret_conv = CResult_ThirtyTwoBytesRetryableSendFailureZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_err(int32_t e) {
+       LDKRetryableSendFailure e_conv = LDKRetryableSendFailure_from_cs(e);
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ), "LDKCResult_ThirtyTwoBytesRetryableSendFailureZ");
+       *ret_conv = CResult_ThirtyTwoBytesRetryableSendFailureZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_is_ok(int64_t o) {
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* o_conv = (LDKCResult_ThirtyTwoBytesRetryableSendFailureZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ThirtyTwoBytesRetryableSendFailureZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ _res_conv = *(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ThirtyTwoBytesRetryableSendFailureZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ThirtyTwoBytesRetryableSendFailureZ_clone_ptr(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ *NONNULL_PTR arg) {
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ), "LDKCResult_ThirtyTwoBytesRetryableSendFailureZ");
+       *ret_conv = CResult_ThirtyTwoBytesRetryableSendFailureZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_clone_ptr(int64_t arg) {
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* arg_conv = (LDKCResult_ThirtyTwoBytesRetryableSendFailureZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ThirtyTwoBytesRetryableSendFailureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_clone(int64_t orig) {
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* orig_conv = (LDKCResult_ThirtyTwoBytesRetryableSendFailureZ*)untag_ptr(orig);
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ), "LDKCResult_ThirtyTwoBytesRetryableSendFailureZ");
+       *ret_conv = CResult_ThirtyTwoBytesRetryableSendFailureZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ *NONNULL_PTR arg) {
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ), "LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* arg_conv = (LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone(int64_t orig) {
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* orig_conv = (LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)untag_ptr(orig);
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ), "LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_new(int8_tArray a, int8_tArray b) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKThirtyTwoBytes b_ref;
+       CHECK(b->arr_len == 32);
+       memcpy(b_ref.data, b->elems, 32); FREE(b);
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ), "LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_new(a_ref, b_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ _res_conv = *(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ o_conv = *(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)(o_ptr);
+       o_conv = C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone((LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)untag_ptr(o));
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKPaymentSendFailure e_conv = *(LDKPaymentSendFailure*)(e_ptr);
+       e_conv = PaymentSendFailure_clone((LDKPaymentSendFailure*)untag_ptr(e));
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_is_ok(int64_t o) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* o_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ _res_conv = *(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone_ptr(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ *NONNULL_PTR arg) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone_ptr(int64_t arg) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* arg_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone(int64_t orig) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* orig_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ*)untag_ptr(orig);
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ), "LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ 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_ThirtyTwoBytesThirtyTwoBytesZ _res_conv_40_conv = *(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)(_res_conv_40_ptr);
+               FREE(untag_ptr(_res_conv_40));
+               _res_constr.data[o] = _res_conv_40_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_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_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ");
+       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_ok(o_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKProbeSendFailure e_conv = *(LDKProbeSendFailure*)(e_ptr);
+       e_conv = ProbeSendFailure_clone((LDKProbeSendFailure*)untag_ptr(e));
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ");
+       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_is_ok(int64_t o) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* o_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ _res_conv = *(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone_ptr(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ");
+       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* arg_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone(int64_t orig) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* orig_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ*)untag_ptr(orig);
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ");
+       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C2Tuple_ThirtyTwoBytesPublicKeyZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ *NONNULL_PTR arg) {
+       LDKC2Tuple_ThirtyTwoBytesPublicKeyZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ), "LDKC2Tuple_ThirtyTwoBytesPublicKeyZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesPublicKeyZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_ThirtyTwoBytesPublicKeyZ* arg_conv = (LDKC2Tuple_ThirtyTwoBytesPublicKeyZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_ThirtyTwoBytesPublicKeyZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_clone(int64_t orig) {
+       LDKC2Tuple_ThirtyTwoBytesPublicKeyZ* orig_conv = (LDKC2Tuple_ThirtyTwoBytesPublicKeyZ*)untag_ptr(orig);
+       LDKC2Tuple_ThirtyTwoBytesPublicKeyZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ), "LDKC2Tuple_ThirtyTwoBytesPublicKeyZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesPublicKeyZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_new(int8_tArray a, int8_tArray b) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKPublicKey b_ref;
+       CHECK(b->arr_len == 33);
+       memcpy(b_ref.compressed_form, b->elems, 33); FREE(b);
+       LDKC2Tuple_ThirtyTwoBytesPublicKeyZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ), "LDKC2Tuple_ThirtyTwoBytesPublicKeyZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesPublicKeyZ_new(a_ref, b_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_ThirtyTwoBytesPublicKeyZ _res_conv = *(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_ThirtyTwoBytesPublicKeyZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ), "LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t j = 0; j < _res_constr.datalen; j++) {
+               int64_t _res_conv_35 = _res_vals[j];
+               void* _res_conv_35_ptr = untag_ptr(_res_conv_35);
+               CHECK_ACCESS(_res_conv_35_ptr);
+               LDKC2Tuple_ThirtyTwoBytesPublicKeyZ _res_conv_35_conv = *(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ*)(_res_conv_35_ptr);
+               FREE(untag_ptr(_res_conv_35));
+               _res_constr.data[j] = _res_conv_35_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_StrZ_some(jstring o) {
+       LDKStr o_conv = str_ref_to_owned_c(o);
+       LDKCOption_StrZ *ret_copy = MALLOC(sizeof(LDKCOption_StrZ), "LDKCOption_StrZ");
+       *ret_copy = COption_StrZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_StrZ_none() {
+       LDKCOption_StrZ *ret_copy = MALLOC(sizeof(LDKCOption_StrZ), "LDKCOption_StrZ");
+       *ret_copy = COption_StrZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_StrZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_StrZ _res_conv = *(LDKCOption_StrZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_StrZ_free(_res_conv);
+}
+
+static inline uint64_t COption_StrZ_clone_ptr(LDKCOption_StrZ *NONNULL_PTR arg) {
+       LDKCOption_StrZ *ret_copy = MALLOC(sizeof(LDKCOption_StrZ), "LDKCOption_StrZ");
+       *ret_copy = COption_StrZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_StrZ_clone_ptr(int64_t arg) {
+       LDKCOption_StrZ* arg_conv = (LDKCOption_StrZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_StrZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_StrZ_clone(int64_t orig) {
+       LDKCOption_StrZ* orig_conv = (LDKCOption_StrZ*)untag_ptr(orig);
+       LDKCOption_StrZ *ret_copy = MALLOC(sizeof(LDKCOption_StrZ), "LDKCOption_StrZ");
+       *ret_copy = COption_StrZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_NoneBolt12SemanticErrorZ_ok() {
+       LDKCResult_NoneBolt12SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt12SemanticErrorZ), "LDKCResult_NoneBolt12SemanticErrorZ");
+       *ret_conv = CResult_NoneBolt12SemanticErrorZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneBolt12SemanticErrorZ_err(int32_t e) {
+       LDKBolt12SemanticError e_conv = LDKBolt12SemanticError_from_cs(e);
+       LDKCResult_NoneBolt12SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt12SemanticErrorZ), "LDKCResult_NoneBolt12SemanticErrorZ");
+       *ret_conv = CResult_NoneBolt12SemanticErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NoneBolt12SemanticErrorZ_is_ok(int64_t o) {
+       LDKCResult_NoneBolt12SemanticErrorZ* o_conv = (LDKCResult_NoneBolt12SemanticErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NoneBolt12SemanticErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NoneBolt12SemanticErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NoneBolt12SemanticErrorZ _res_conv = *(LDKCResult_NoneBolt12SemanticErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NoneBolt12SemanticErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NoneBolt12SemanticErrorZ_clone_ptr(LDKCResult_NoneBolt12SemanticErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NoneBolt12SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt12SemanticErrorZ), "LDKCResult_NoneBolt12SemanticErrorZ");
+       *ret_conv = CResult_NoneBolt12SemanticErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NoneBolt12SemanticErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NoneBolt12SemanticErrorZ* arg_conv = (LDKCResult_NoneBolt12SemanticErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NoneBolt12SemanticErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NoneBolt12SemanticErrorZ_clone(int64_t orig) {
+       LDKCResult_NoneBolt12SemanticErrorZ* orig_conv = (LDKCResult_NoneBolt12SemanticErrorZ*)untag_ptr(orig);
+       LDKCResult_NoneBolt12SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt12SemanticErrorZ), "LDKCResult_NoneBolt12SemanticErrorZ");
+       *ret_conv = CResult_NoneBolt12SemanticErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ o_conv = *(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)(o_ptr);
+       o_conv = C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone((LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)untag_ptr(o));
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_err() {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_is_ok(int64_t o) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* o_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ _res_conv = *(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone_ptr(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* arg_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone(int64_t orig) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* orig_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ*)untag_ptr(orig);
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_OffersMessageZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKOffersMessage o_conv = *(LDKOffersMessage*)(o_ptr);
+       o_conv = OffersMessage_clone((LDKOffersMessage*)untag_ptr(o));
+       LDKCOption_OffersMessageZ *ret_copy = MALLOC(sizeof(LDKCOption_OffersMessageZ), "LDKCOption_OffersMessageZ");
+       *ret_copy = COption_OffersMessageZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_OffersMessageZ_none() {
+       LDKCOption_OffersMessageZ *ret_copy = MALLOC(sizeof(LDKCOption_OffersMessageZ), "LDKCOption_OffersMessageZ");
+       *ret_copy = COption_OffersMessageZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_OffersMessageZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_OffersMessageZ _res_conv = *(LDKCOption_OffersMessageZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_OffersMessageZ_free(_res_conv);
+}
+
+static inline uint64_t COption_OffersMessageZ_clone_ptr(LDKCOption_OffersMessageZ *NONNULL_PTR arg) {
+       LDKCOption_OffersMessageZ *ret_copy = MALLOC(sizeof(LDKCOption_OffersMessageZ), "LDKCOption_OffersMessageZ");
+       *ret_copy = COption_OffersMessageZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_OffersMessageZ_clone_ptr(int64_t arg) {
+       LDKCOption_OffersMessageZ* arg_conv = (LDKCOption_OffersMessageZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_OffersMessageZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_OffersMessageZ_clone(int64_t orig) {
+       LDKCOption_OffersMessageZ* orig_conv = (LDKCOption_OffersMessageZ*)untag_ptr(orig);
+       LDKCOption_OffersMessageZ *ret_copy = MALLOC(sizeof(LDKCOption_OffersMessageZ), "LDKCOption_OffersMessageZ");
+       *ret_copy = COption_OffersMessageZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline uint64_t C3Tuple_OffersMessageDestinationBlindedPathZ_clone_ptr(LDKC3Tuple_OffersMessageDestinationBlindedPathZ *NONNULL_PTR arg) {
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OffersMessageDestinationBlindedPathZ), "LDKC3Tuple_OffersMessageDestinationBlindedPathZ");
+       *ret_conv = C3Tuple_OffersMessageDestinationBlindedPathZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_clone_ptr(int64_t arg) {
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ* arg_conv = (LDKC3Tuple_OffersMessageDestinationBlindedPathZ*)untag_ptr(arg);
+       int64_t ret_conv = C3Tuple_OffersMessageDestinationBlindedPathZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_clone(int64_t orig) {
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ* orig_conv = (LDKC3Tuple_OffersMessageDestinationBlindedPathZ*)untag_ptr(orig);
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OffersMessageDestinationBlindedPathZ), "LDKC3Tuple_OffersMessageDestinationBlindedPathZ");
+       *ret_conv = C3Tuple_OffersMessageDestinationBlindedPathZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_new(int64_t a, int64_t b, int64_t c) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKOffersMessage a_conv = *(LDKOffersMessage*)(a_ptr);
+       a_conv = OffersMessage_clone((LDKOffersMessage*)untag_ptr(a));
+       void* b_ptr = untag_ptr(b);
+       CHECK_ACCESS(b_ptr);
+       LDKDestination b_conv = *(LDKDestination*)(b_ptr);
+       b_conv = Destination_clone((LDKDestination*)untag_ptr(b));
+       LDKBlindedPath 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 = BlindedPath_clone(&c_conv);
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OffersMessageDestinationBlindedPathZ), "LDKC3Tuple_OffersMessageDestinationBlindedPathZ");
+       *ret_conv = C3Tuple_OffersMessageDestinationBlindedPathZ_new(a_conv, b_conv, c_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ _res_conv = *(LDKC3Tuple_OffersMessageDestinationBlindedPathZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C3Tuple_OffersMessageDestinationBlindedPathZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C3Tuple_OffersMessageDestinationBlindedPathZZ_free(int64_tArray _res) {
+       LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC3Tuple_OffersMessageDestinationBlindedPathZ), "LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ 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);
+               LDKC3Tuple_OffersMessageDestinationBlindedPathZ _res_conv_49_conv = *(LDKC3Tuple_OffersMessageDestinationBlindedPathZ*)(_res_conv_49_ptr);
+               FREE(untag_ptr(_res_conv_49));
+               _res_constr.data[x] = _res_conv_49_conv;
+       }
+       FREE(_res);
+       CVec_C3Tuple_OffersMessageDestinationBlindedPathZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_ok(int64_t o) {
+       LDKCounterpartyForwardingInfo 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 = CounterpartyForwardingInfo_clone(&o_conv);
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ), "LDKCResult_CounterpartyForwardingInfoDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyForwardingInfoDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_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_CounterpartyForwardingInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ), "LDKCResult_CounterpartyForwardingInfoDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyForwardingInfoDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* o_conv = (LDKCResult_CounterpartyForwardingInfoDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CounterpartyForwardingInfoDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ _res_conv = *(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CounterpartyForwardingInfoDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CounterpartyForwardingInfoDecodeErrorZ_clone_ptr(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ), "LDKCResult_CounterpartyForwardingInfoDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyForwardingInfoDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* arg_conv = (LDKCResult_CounterpartyForwardingInfoDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CounterpartyForwardingInfoDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* orig_conv = (LDKCResult_CounterpartyForwardingInfoDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ), "LDKCResult_CounterpartyForwardingInfoDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyForwardingInfoDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelCounterpartyDecodeErrorZ_ok(int64_t o) {
+       LDKChannelCounterparty 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 = ChannelCounterparty_clone(&o_conv);
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelCounterpartyDecodeErrorZ), "LDKCResult_ChannelCounterpartyDecodeErrorZ");
+       *ret_conv = CResult_ChannelCounterpartyDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelCounterpartyDecodeErrorZ_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_ChannelCounterpartyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelCounterpartyDecodeErrorZ), "LDKCResult_ChannelCounterpartyDecodeErrorZ");
+       *ret_conv = CResult_ChannelCounterpartyDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelCounterpartyDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* o_conv = (LDKCResult_ChannelCounterpartyDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelCounterpartyDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelCounterpartyDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelCounterpartyDecodeErrorZ _res_conv = *(LDKCResult_ChannelCounterpartyDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelCounterpartyDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelCounterpartyDecodeErrorZ_clone_ptr(LDKCResult_ChannelCounterpartyDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelCounterpartyDecodeErrorZ), "LDKCResult_ChannelCounterpartyDecodeErrorZ");
+       *ret_conv = CResult_ChannelCounterpartyDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelCounterpartyDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* arg_conv = (LDKCResult_ChannelCounterpartyDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelCounterpartyDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelCounterpartyDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* orig_conv = (LDKCResult_ChannelCounterpartyDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelCounterpartyDecodeErrorZ), "LDKCResult_ChannelCounterpartyDecodeErrorZ");
+       *ret_conv = CResult_ChannelCounterpartyDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelDetailsDecodeErrorZ_ok(int64_t o) {
+       LDKChannelDetails 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 = ChannelDetails_clone(&o_conv);
+       LDKCResult_ChannelDetailsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDetailsDecodeErrorZ), "LDKCResult_ChannelDetailsDecodeErrorZ");
+       *ret_conv = CResult_ChannelDetailsDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelDetailsDecodeErrorZ_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_ChannelDetailsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDetailsDecodeErrorZ), "LDKCResult_ChannelDetailsDecodeErrorZ");
+       *ret_conv = CResult_ChannelDetailsDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelDetailsDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelDetailsDecodeErrorZ* o_conv = (LDKCResult_ChannelDetailsDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelDetailsDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelDetailsDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelDetailsDecodeErrorZ _res_conv = *(LDKCResult_ChannelDetailsDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelDetailsDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelDetailsDecodeErrorZ_clone_ptr(LDKCResult_ChannelDetailsDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelDetailsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDetailsDecodeErrorZ), "LDKCResult_ChannelDetailsDecodeErrorZ");
+       *ret_conv = CResult_ChannelDetailsDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelDetailsDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelDetailsDecodeErrorZ* arg_conv = (LDKCResult_ChannelDetailsDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelDetailsDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelDetailsDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelDetailsDecodeErrorZ* orig_conv = (LDKCResult_ChannelDetailsDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelDetailsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDetailsDecodeErrorZ), "LDKCResult_ChannelDetailsDecodeErrorZ");
+       *ret_conv = CResult_ChannelDetailsDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_ok(int64_t o) {
+       LDKPhantomRouteHints 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 = PhantomRouteHints_clone(&o_conv);
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PhantomRouteHintsDecodeErrorZ), "LDKCResult_PhantomRouteHintsDecodeErrorZ");
+       *ret_conv = CResult_PhantomRouteHintsDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_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_PhantomRouteHintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PhantomRouteHintsDecodeErrorZ), "LDKCResult_PhantomRouteHintsDecodeErrorZ");
+       *ret_conv = CResult_PhantomRouteHintsDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* o_conv = (LDKCResult_PhantomRouteHintsDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PhantomRouteHintsDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PhantomRouteHintsDecodeErrorZ _res_conv = *(LDKCResult_PhantomRouteHintsDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PhantomRouteHintsDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PhantomRouteHintsDecodeErrorZ_clone_ptr(LDKCResult_PhantomRouteHintsDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PhantomRouteHintsDecodeErrorZ), "LDKCResult_PhantomRouteHintsDecodeErrorZ");
+       *ret_conv = CResult_PhantomRouteHintsDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* arg_conv = (LDKCResult_PhantomRouteHintsDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PhantomRouteHintsDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* orig_conv = (LDKCResult_PhantomRouteHintsDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PhantomRouteHintsDecodeErrorZ), "LDKCResult_PhantomRouteHintsDecodeErrorZ");
+       *ret_conv = CResult_PhantomRouteHintsDecodeErrorZ_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");
+       *ret_conv = CResult_ChannelShutdownStateDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_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_ChannelShutdownStateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelShutdownStateDecodeErrorZ), "LDKCResult_ChannelShutdownStateDecodeErrorZ");
+       *ret_conv = CResult_ChannelShutdownStateDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelShutdownStateDecodeErrorZ* o_conv = (LDKCResult_ChannelShutdownStateDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelShutdownStateDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelShutdownStateDecodeErrorZ _res_conv = *(LDKCResult_ChannelShutdownStateDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelShutdownStateDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelShutdownStateDecodeErrorZ_clone_ptr(LDKCResult_ChannelShutdownStateDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelShutdownStateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelShutdownStateDecodeErrorZ), "LDKCResult_ChannelShutdownStateDecodeErrorZ");
+       *ret_conv = CResult_ChannelShutdownStateDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelShutdownStateDecodeErrorZ* arg_conv = (LDKCResult_ChannelShutdownStateDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelShutdownStateDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelShutdownStateDecodeErrorZ* orig_conv = (LDKCResult_ChannelShutdownStateDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelShutdownStateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelShutdownStateDecodeErrorZ), "LDKCResult_ChannelShutdownStateDecodeErrorZ");
+       *ret_conv = CResult_ChannelShutdownStateDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_ChannelMonitorZ_free(int64_tArray _res) {
+       LDKCVec_ChannelMonitorZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKChannelMonitor), "LDKCVec_ChannelMonitorZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t q = 0; q < _res_constr.datalen; q++) {
+               int64_t _res_conv_16 = _res_vals[q];
+               LDKChannelMonitor _res_conv_16_conv;
+               _res_conv_16_conv.inner = untag_ptr(_res_conv_16);
+               _res_conv_16_conv.is_owned = ptr_is_owned(_res_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_16_conv);
+               _res_constr.data[q] = _res_conv_16_conv;
+       }
+       FREE(_res);
+       CVec_ChannelMonitorZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_new(int8_tArray a, int64_t b) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKChannelManager b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       // WARNING: we need a move here but no clone is available for LDKChannelManager
+       
+       LDKC2Tuple_ThirtyTwoBytesChannelManagerZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesChannelManagerZ), "LDKC2Tuple_ThirtyTwoBytesChannelManagerZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesChannelManagerZ_new(a_ref, b_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_ThirtyTwoBytesChannelManagerZ _res_conv = *(LDKC2Tuple_ThirtyTwoBytesChannelManagerZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_ThirtyTwoBytesChannelManagerZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_ThirtyTwoBytesChannelManagerZ o_conv = *(LDKC2Tuple_ThirtyTwoBytesChannelManagerZ*)(o_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKC2Tuple_ThirtyTwoBytesChannelManagerZ
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_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_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ* o_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ _res_conv = *(LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKMaxDustHTLCExposure o_conv = *(LDKMaxDustHTLCExposure*)(o_ptr);
+       o_conv = MaxDustHTLCExposure_clone((LDKMaxDustHTLCExposure*)untag_ptr(o));
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_MaxDustHTLCExposureDecodeErrorZ), "LDKCResult_MaxDustHTLCExposureDecodeErrorZ");
+       *ret_conv = CResult_MaxDustHTLCExposureDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_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_MaxDustHTLCExposureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_MaxDustHTLCExposureDecodeErrorZ), "LDKCResult_MaxDustHTLCExposureDecodeErrorZ");
+       *ret_conv = CResult_MaxDustHTLCExposureDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* o_conv = (LDKCResult_MaxDustHTLCExposureDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_MaxDustHTLCExposureDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ _res_conv = *(LDKCResult_MaxDustHTLCExposureDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_MaxDustHTLCExposureDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_MaxDustHTLCExposureDecodeErrorZ_clone_ptr(LDKCResult_MaxDustHTLCExposureDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_MaxDustHTLCExposureDecodeErrorZ), "LDKCResult_MaxDustHTLCExposureDecodeErrorZ");
+       *ret_conv = CResult_MaxDustHTLCExposureDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* arg_conv = (LDKCResult_MaxDustHTLCExposureDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_MaxDustHTLCExposureDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* orig_conv = (LDKCResult_MaxDustHTLCExposureDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_MaxDustHTLCExposureDecodeErrorZ), "LDKCResult_MaxDustHTLCExposureDecodeErrorZ");
+       *ret_conv = CResult_MaxDustHTLCExposureDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelConfigDecodeErrorZ_ok(int64_t o) {
+       LDKChannelConfig 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 = ChannelConfig_clone(&o_conv);
+       LDKCResult_ChannelConfigDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelConfigDecodeErrorZ), "LDKCResult_ChannelConfigDecodeErrorZ");
+       *ret_conv = CResult_ChannelConfigDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelConfigDecodeErrorZ_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_ChannelConfigDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelConfigDecodeErrorZ), "LDKCResult_ChannelConfigDecodeErrorZ");
+       *ret_conv = CResult_ChannelConfigDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelConfigDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelConfigDecodeErrorZ* o_conv = (LDKCResult_ChannelConfigDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelConfigDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelConfigDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelConfigDecodeErrorZ _res_conv = *(LDKCResult_ChannelConfigDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelConfigDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelConfigDecodeErrorZ_clone_ptr(LDKCResult_ChannelConfigDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelConfigDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelConfigDecodeErrorZ), "LDKCResult_ChannelConfigDecodeErrorZ");
+       *ret_conv = CResult_ChannelConfigDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelConfigDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelConfigDecodeErrorZ* arg_conv = (LDKCResult_ChannelConfigDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelConfigDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelConfigDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelConfigDecodeErrorZ* orig_conv = (LDKCResult_ChannelConfigDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelConfigDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelConfigDecodeErrorZ), "LDKCResult_ChannelConfigDecodeErrorZ");
+       *ret_conv = CResult_ChannelConfigDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_MaxDustHTLCExposureZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKMaxDustHTLCExposure o_conv = *(LDKMaxDustHTLCExposure*)(o_ptr);
+       o_conv = MaxDustHTLCExposure_clone((LDKMaxDustHTLCExposure*)untag_ptr(o));
+       LDKCOption_MaxDustHTLCExposureZ *ret_copy = MALLOC(sizeof(LDKCOption_MaxDustHTLCExposureZ), "LDKCOption_MaxDustHTLCExposureZ");
+       *ret_copy = COption_MaxDustHTLCExposureZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_MaxDustHTLCExposureZ_none() {
+       LDKCOption_MaxDustHTLCExposureZ *ret_copy = MALLOC(sizeof(LDKCOption_MaxDustHTLCExposureZ), "LDKCOption_MaxDustHTLCExposureZ");
+       *ret_copy = COption_MaxDustHTLCExposureZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_MaxDustHTLCExposureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_MaxDustHTLCExposureZ _res_conv = *(LDKCOption_MaxDustHTLCExposureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_MaxDustHTLCExposureZ_free(_res_conv);
+}
+
+static inline uint64_t COption_MaxDustHTLCExposureZ_clone_ptr(LDKCOption_MaxDustHTLCExposureZ *NONNULL_PTR arg) {
+       LDKCOption_MaxDustHTLCExposureZ *ret_copy = MALLOC(sizeof(LDKCOption_MaxDustHTLCExposureZ), "LDKCOption_MaxDustHTLCExposureZ");
+       *ret_copy = COption_MaxDustHTLCExposureZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_MaxDustHTLCExposureZ_clone_ptr(int64_t arg) {
+       LDKCOption_MaxDustHTLCExposureZ* arg_conv = (LDKCOption_MaxDustHTLCExposureZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_MaxDustHTLCExposureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_MaxDustHTLCExposureZ_clone(int64_t orig) {
+       LDKCOption_MaxDustHTLCExposureZ* orig_conv = (LDKCOption_MaxDustHTLCExposureZ*)untag_ptr(orig);
+       LDKCOption_MaxDustHTLCExposureZ *ret_copy = MALLOC(sizeof(LDKCOption_MaxDustHTLCExposureZ), "LDKCOption_MaxDustHTLCExposureZ");
+       *ret_copy = COption_MaxDustHTLCExposureZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_APIErrorZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKAPIError o_conv = *(LDKAPIError*)(o_ptr);
+       o_conv = APIError_clone((LDKAPIError*)untag_ptr(o));
+       LDKCOption_APIErrorZ *ret_copy = MALLOC(sizeof(LDKCOption_APIErrorZ), "LDKCOption_APIErrorZ");
+       *ret_copy = COption_APIErrorZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_APIErrorZ_none() {
+       LDKCOption_APIErrorZ *ret_copy = MALLOC(sizeof(LDKCOption_APIErrorZ), "LDKCOption_APIErrorZ");
+       *ret_copy = COption_APIErrorZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_APIErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_APIErrorZ _res_conv = *(LDKCOption_APIErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_APIErrorZ_free(_res_conv);
+}
+
+static inline uint64_t COption_APIErrorZ_clone_ptr(LDKCOption_APIErrorZ *NONNULL_PTR arg) {
+       LDKCOption_APIErrorZ *ret_copy = MALLOC(sizeof(LDKCOption_APIErrorZ), "LDKCOption_APIErrorZ");
+       *ret_copy = COption_APIErrorZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_APIErrorZ_clone_ptr(int64_t arg) {
+       LDKCOption_APIErrorZ* arg_conv = (LDKCOption_APIErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_APIErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_APIErrorZ_clone(int64_t orig) {
+       LDKCOption_APIErrorZ* orig_conv = (LDKCOption_APIErrorZ*)untag_ptr(orig);
+       LDKCOption_APIErrorZ *ret_copy = MALLOC(sizeof(LDKCOption_APIErrorZ), "LDKCOption_APIErrorZ");
+       *ret_copy = COption_APIErrorZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_APIErrorZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_APIErrorZ o_conv = *(LDKCOption_APIErrorZ*)(o_ptr);
+       o_conv = COption_APIErrorZ_clone((LDKCOption_APIErrorZ*)untag_ptr(o));
+       LDKCResult_COption_APIErrorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_APIErrorZDecodeErrorZ), "LDKCResult_COption_APIErrorZDecodeErrorZ");
+       *ret_conv = CResult_COption_APIErrorZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_APIErrorZDecodeErrorZ_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_COption_APIErrorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_APIErrorZDecodeErrorZ), "LDKCResult_COption_APIErrorZDecodeErrorZ");
+       *ret_conv = CResult_COption_APIErrorZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_APIErrorZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_APIErrorZDecodeErrorZ* o_conv = (LDKCResult_COption_APIErrorZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_APIErrorZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_APIErrorZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_APIErrorZDecodeErrorZ _res_conv = *(LDKCResult_COption_APIErrorZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_APIErrorZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_APIErrorZDecodeErrorZ_clone_ptr(LDKCResult_COption_APIErrorZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_APIErrorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_APIErrorZDecodeErrorZ), "LDKCResult_COption_APIErrorZDecodeErrorZ");
+       *ret_conv = CResult_COption_APIErrorZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_APIErrorZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_APIErrorZDecodeErrorZ* arg_conv = (LDKCResult_COption_APIErrorZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_APIErrorZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_APIErrorZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_APIErrorZDecodeErrorZ* orig_conv = (LDKCResult_COption_APIErrorZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_APIErrorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_APIErrorZDecodeErrorZ), "LDKCResult_COption_APIErrorZDecodeErrorZ");
+       *ret_conv = CResult_COption_APIErrorZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateDecodeErrorZ_ok(int64_t o) {
+       LDKChannelMonitorUpdate 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 = ChannelMonitorUpdate_clone(&o_conv);
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateDecodeErrorZ), "LDKCResult_ChannelMonitorUpdateDecodeErrorZ");
+       *ret_conv = CResult_ChannelMonitorUpdateDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateDecodeErrorZ_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_ChannelMonitorUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateDecodeErrorZ), "LDKCResult_ChannelMonitorUpdateDecodeErrorZ");
+       *ret_conv = CResult_ChannelMonitorUpdateDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelMonitorUpdateDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* o_conv = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelMonitorUpdateDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelMonitorUpdateDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ _res_conv = *(LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelMonitorUpdateDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelMonitorUpdateDecodeErrorZ_clone_ptr(LDKCResult_ChannelMonitorUpdateDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateDecodeErrorZ), "LDKCResult_ChannelMonitorUpdateDecodeErrorZ");
+       *ret_conv = CResult_ChannelMonitorUpdateDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* arg_conv = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelMonitorUpdateDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* orig_conv = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateDecodeErrorZ), "LDKCResult_ChannelMonitorUpdateDecodeErrorZ");
+       *ret_conv = CResult_ChannelMonitorUpdateDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_MonitorEventZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKMonitorEvent o_conv = *(LDKMonitorEvent*)(o_ptr);
+       o_conv = MonitorEvent_clone((LDKMonitorEvent*)untag_ptr(o));
+       LDKCOption_MonitorEventZ *ret_copy = MALLOC(sizeof(LDKCOption_MonitorEventZ), "LDKCOption_MonitorEventZ");
+       *ret_copy = COption_MonitorEventZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_MonitorEventZ_none() {
+       LDKCOption_MonitorEventZ *ret_copy = MALLOC(sizeof(LDKCOption_MonitorEventZ), "LDKCOption_MonitorEventZ");
+       *ret_copy = COption_MonitorEventZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_MonitorEventZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_MonitorEventZ _res_conv = *(LDKCOption_MonitorEventZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_MonitorEventZ_free(_res_conv);
+}
+
+static inline uint64_t COption_MonitorEventZ_clone_ptr(LDKCOption_MonitorEventZ *NONNULL_PTR arg) {
+       LDKCOption_MonitorEventZ *ret_copy = MALLOC(sizeof(LDKCOption_MonitorEventZ), "LDKCOption_MonitorEventZ");
+       *ret_copy = COption_MonitorEventZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_MonitorEventZ_clone_ptr(int64_t arg) {
+       LDKCOption_MonitorEventZ* arg_conv = (LDKCOption_MonitorEventZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_MonitorEventZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_MonitorEventZ_clone(int64_t orig) {
+       LDKCOption_MonitorEventZ* orig_conv = (LDKCOption_MonitorEventZ*)untag_ptr(orig);
+       LDKCOption_MonitorEventZ *ret_copy = MALLOC(sizeof(LDKCOption_MonitorEventZ), "LDKCOption_MonitorEventZ");
+       *ret_copy = COption_MonitorEventZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_MonitorEventZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_MonitorEventZ o_conv = *(LDKCOption_MonitorEventZ*)(o_ptr);
+       o_conv = COption_MonitorEventZ_clone((LDKCOption_MonitorEventZ*)untag_ptr(o));
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_MonitorEventZDecodeErrorZ), "LDKCResult_COption_MonitorEventZDecodeErrorZ");
+       *ret_conv = CResult_COption_MonitorEventZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_MonitorEventZDecodeErrorZ_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_COption_MonitorEventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_MonitorEventZDecodeErrorZ), "LDKCResult_COption_MonitorEventZDecodeErrorZ");
+       *ret_conv = CResult_COption_MonitorEventZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_MonitorEventZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* o_conv = (LDKCResult_COption_MonitorEventZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_MonitorEventZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_MonitorEventZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_MonitorEventZDecodeErrorZ _res_conv = *(LDKCResult_COption_MonitorEventZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_MonitorEventZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_MonitorEventZDecodeErrorZ_clone_ptr(LDKCResult_COption_MonitorEventZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_MonitorEventZDecodeErrorZ), "LDKCResult_COption_MonitorEventZDecodeErrorZ");
+       *ret_conv = CResult_COption_MonitorEventZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_MonitorEventZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* arg_conv = (LDKCResult_COption_MonitorEventZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_MonitorEventZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_MonitorEventZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* orig_conv = (LDKCResult_COption_MonitorEventZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_MonitorEventZDecodeErrorZ), "LDKCResult_COption_MonitorEventZDecodeErrorZ");
+       *ret_conv = CResult_COption_MonitorEventZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HTLCUpdateDecodeErrorZ_ok(int64_t o) {
+       LDKHTLCUpdate 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 = HTLCUpdate_clone(&o_conv);
+       LDKCResult_HTLCUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCUpdateDecodeErrorZ), "LDKCResult_HTLCUpdateDecodeErrorZ");
+       *ret_conv = CResult_HTLCUpdateDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HTLCUpdateDecodeErrorZ_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_HTLCUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCUpdateDecodeErrorZ), "LDKCResult_HTLCUpdateDecodeErrorZ");
+       *ret_conv = CResult_HTLCUpdateDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_HTLCUpdateDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_HTLCUpdateDecodeErrorZ* o_conv = (LDKCResult_HTLCUpdateDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_HTLCUpdateDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_HTLCUpdateDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_HTLCUpdateDecodeErrorZ _res_conv = *(LDKCResult_HTLCUpdateDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_HTLCUpdateDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_HTLCUpdateDecodeErrorZ_clone_ptr(LDKCResult_HTLCUpdateDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_HTLCUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCUpdateDecodeErrorZ), "LDKCResult_HTLCUpdateDecodeErrorZ");
+       *ret_conv = CResult_HTLCUpdateDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_HTLCUpdateDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_HTLCUpdateDecodeErrorZ* arg_conv = (LDKCResult_HTLCUpdateDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_HTLCUpdateDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_HTLCUpdateDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_HTLCUpdateDecodeErrorZ* orig_conv = (LDKCResult_HTLCUpdateDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_HTLCUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCUpdateDecodeErrorZ), "LDKCResult_HTLCUpdateDecodeErrorZ");
+       *ret_conv = CResult_HTLCUpdateDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C2Tuple_OutPointCVec_u8ZZ_clone_ptr(LDKC2Tuple_OutPointCVec_u8ZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_OutPointCVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_u8ZZ), "LDKC2Tuple_OutPointCVec_u8ZZ");
+       *ret_conv = C2Tuple_OutPointCVec_u8ZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_OutPointCVec_u8ZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_OutPointCVec_u8ZZ* arg_conv = (LDKC2Tuple_OutPointCVec_u8ZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_OutPointCVec_u8ZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_OutPointCVec_u8ZZ_clone(int64_t orig) {
+       LDKC2Tuple_OutPointCVec_u8ZZ* orig_conv = (LDKC2Tuple_OutPointCVec_u8ZZ*)untag_ptr(orig);
+       LDKC2Tuple_OutPointCVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_u8ZZ), "LDKC2Tuple_OutPointCVec_u8ZZ");
+       *ret_conv = C2Tuple_OutPointCVec_u8ZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_OutPointCVec_u8ZZ_new(int64_t a, int8_tArray b) {
+       LDKOutPoint 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 = OutPoint_clone(&a_conv);
+       LDKCVec_u8Z b_ref;
+       b_ref.datalen = b->arr_len;
+       b_ref.data = MALLOC(b_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(b_ref.data, b->elems, b_ref.datalen); FREE(b);
+       LDKC2Tuple_OutPointCVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_u8ZZ), "LDKC2Tuple_OutPointCVec_u8ZZ");
+       *ret_conv = C2Tuple_OutPointCVec_u8ZZ_new(a_conv, b_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_OutPointCVec_u8ZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_OutPointCVec_u8ZZ _res_conv = *(LDKC2Tuple_OutPointCVec_u8ZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_OutPointCVec_u8ZZ_free(_res_conv);
+}
+
+static inline uint64_t C2Tuple_u32CVec_u8ZZ_clone_ptr(LDKC2Tuple_u32CVec_u8ZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_u32CVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u32CVec_u8ZZ), "LDKC2Tuple_u32CVec_u8ZZ");
+       *ret_conv = C2Tuple_u32CVec_u8ZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_u32CVec_u8ZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_u32CVec_u8ZZ* arg_conv = (LDKC2Tuple_u32CVec_u8ZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_u32CVec_u8ZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_u32CVec_u8ZZ_clone(int64_t orig) {
+       LDKC2Tuple_u32CVec_u8ZZ* orig_conv = (LDKC2Tuple_u32CVec_u8ZZ*)untag_ptr(orig);
+       LDKC2Tuple_u32CVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u32CVec_u8ZZ), "LDKC2Tuple_u32CVec_u8ZZ");
+       *ret_conv = C2Tuple_u32CVec_u8ZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_u32CVec_u8ZZ_new(int32_t a, int8_tArray b) {
+       LDKCVec_u8Z b_ref;
+       b_ref.datalen = b->arr_len;
+       b_ref.data = MALLOC(b_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(b_ref.data, b->elems, b_ref.datalen); FREE(b);
+       LDKC2Tuple_u32CVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u32CVec_u8ZZ), "LDKC2Tuple_u32CVec_u8ZZ");
+       *ret_conv = C2Tuple_u32CVec_u8ZZ_new(a, b_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_u32CVec_u8ZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_u32CVec_u8ZZ _res_conv = *(LDKC2Tuple_u32CVec_u8ZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_u32CVec_u8ZZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_u32CVec_u8ZZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_u32CVec_u8ZZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_u32CVec_u8ZZ), "LDKCVec_C2Tuple_u32CVec_u8ZZZ 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_23 = _res_vals[x];
+               void* _res_conv_23_ptr = untag_ptr(_res_conv_23);
+               CHECK_ACCESS(_res_conv_23_ptr);
+               LDKC2Tuple_u32CVec_u8ZZ _res_conv_23_conv = *(LDKC2Tuple_u32CVec_u8ZZ*)(_res_conv_23_ptr);
+               FREE(untag_ptr(_res_conv_23));
+               _res_constr.data[x] = _res_conv_23_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_u32CVec_u8ZZZ_free(_res_constr);
+}
+
+static inline uint64_t C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ* arg_conv = (LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone(int64_t orig) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ* orig_conv = (LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ*)untag_ptr(orig);
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_new(int8_tArray a, int64_tArray b) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKCVec_C2Tuple_u32CVec_u8ZZZ b_constr;
+       b_constr.datalen = b->arr_len;
+       if (b_constr.datalen > 0)
+               b_constr.data = MALLOC(b_constr.datalen * sizeof(LDKC2Tuple_u32CVec_u8ZZ), "LDKCVec_C2Tuple_u32CVec_u8ZZZ Elements");
+       else
+               b_constr.data = NULL;
+       int64_t* b_vals = b->elems;
+       for (size_t x = 0; x < b_constr.datalen; x++) {
+               int64_t b_conv_23 = b_vals[x];
+               void* b_conv_23_ptr = untag_ptr(b_conv_23);
+               CHECK_ACCESS(b_conv_23_ptr);
+               LDKC2Tuple_u32CVec_u8ZZ b_conv_23_conv = *(LDKC2Tuple_u32CVec_u8ZZ*)(b_conv_23_ptr);
+               b_conv_23_conv = C2Tuple_u32CVec_u8ZZ_clone((LDKC2Tuple_u32CVec_u8ZZ*)untag_ptr(b_conv_23));
+               b_constr.data[x] = b_conv_23_conv;
+       }
+       FREE(b);
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_new(a_ref, b_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ _res_conv = *(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ), "LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t a = 0; a < _res_constr.datalen; a++) {
+               int64_t _res_conv_52 = _res_vals[a];
+               void* _res_conv_52_ptr = untag_ptr(_res_conv_52);
+               CHECK_ACCESS(_res_conv_52_ptr);
+               LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ _res_conv_52_conv = *(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ*)(_res_conv_52_ptr);
+               FREE(untag_ptr(_res_conv_52));
+               _res_constr.data[a] = _res_conv_52_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_CommitmentTransactionZ_free(int64_tArray _res) {
+       LDKCVec_CommitmentTransactionZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKCommitmentTransaction), "LDKCVec_CommitmentTransactionZ 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_23 = _res_vals[x];
+               LDKCommitmentTransaction _res_conv_23_conv;
+               _res_conv_23_conv.inner = untag_ptr(_res_conv_23);
+               _res_conv_23_conv.is_owned = ptr_is_owned(_res_conv_23);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_23_conv);
+               _res_constr.data[x] = _res_conv_23_conv;
+       }
+       FREE(_res);
+       CVec_CommitmentTransactionZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_TransactionZ_free(ptrArray _res) {
+       LDKCVec_TransactionZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKTransaction), "LDKCVec_TransactionZ 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];
+               LDKTransaction _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, "LDKTransaction Bytes");
+               memcpy(_res_conv_8_ref.data, _res_conv_8->elems, _res_conv_8_ref.datalen); FREE(_res_conv_8);
+               _res_conv_8_ref.data_is_owned = true;
+               _res_constr.data[i] = _res_conv_8_ref;
+       }
+       FREE(_res);
+       CVec_TransactionZ_free(_res_constr);
+}
+
+static inline uint64_t C2Tuple_u32TxOutZ_clone_ptr(LDKC2Tuple_u32TxOutZ *NONNULL_PTR arg) {
+       LDKC2Tuple_u32TxOutZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u32TxOutZ), "LDKC2Tuple_u32TxOutZ");
+       *ret_conv = C2Tuple_u32TxOutZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_u32TxOutZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_u32TxOutZ* arg_conv = (LDKC2Tuple_u32TxOutZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_u32TxOutZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_u32TxOutZ_clone(int64_t orig) {
+       LDKC2Tuple_u32TxOutZ* orig_conv = (LDKC2Tuple_u32TxOutZ*)untag_ptr(orig);
+       LDKC2Tuple_u32TxOutZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u32TxOutZ), "LDKC2Tuple_u32TxOutZ");
+       *ret_conv = C2Tuple_u32TxOutZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_u32TxOutZ_new(int32_t a, int64_t b) {
+       void* b_ptr = untag_ptr(b);
+       CHECK_ACCESS(b_ptr);
+       LDKTxOut b_conv = *(LDKTxOut*)(b_ptr);
+       b_conv = TxOut_clone((LDKTxOut*)untag_ptr(b));
+       LDKC2Tuple_u32TxOutZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u32TxOutZ), "LDKC2Tuple_u32TxOutZ");
+       *ret_conv = C2Tuple_u32TxOutZ_new(a, b_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_u32TxOutZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_u32TxOutZ _res_conv = *(LDKC2Tuple_u32TxOutZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_u32TxOutZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_u32TxOutZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_u32TxOutZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_u32TxOutZ), "LDKCVec_C2Tuple_u32TxOutZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t u = 0; u < _res_constr.datalen; u++) {
+               int64_t _res_conv_20 = _res_vals[u];
+               void* _res_conv_20_ptr = untag_ptr(_res_conv_20);
+               CHECK_ACCESS(_res_conv_20_ptr);
+               LDKC2Tuple_u32TxOutZ _res_conv_20_conv = *(LDKC2Tuple_u32TxOutZ*)(_res_conv_20_ptr);
+               FREE(untag_ptr(_res_conv_20));
+               _res_constr.data[u] = _res_conv_20_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_u32TxOutZZ_free(_res_constr);
+}
+
+static inline uint64_t C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* arg_conv = (LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone(int64_t orig) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* orig_conv = (LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ*)untag_ptr(orig);
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_new(int8_tArray a, int64_tArray b) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKCVec_C2Tuple_u32TxOutZZ b_constr;
+       b_constr.datalen = b->arr_len;
+       if (b_constr.datalen > 0)
+               b_constr.data = MALLOC(b_constr.datalen * sizeof(LDKC2Tuple_u32TxOutZ), "LDKCVec_C2Tuple_u32TxOutZZ Elements");
+       else
+               b_constr.data = NULL;
+       int64_t* b_vals = b->elems;
+       for (size_t u = 0; u < b_constr.datalen; u++) {
+               int64_t b_conv_20 = b_vals[u];
+               void* b_conv_20_ptr = untag_ptr(b_conv_20);
+               CHECK_ACCESS(b_conv_20_ptr);
+               LDKC2Tuple_u32TxOutZ b_conv_20_conv = *(LDKC2Tuple_u32TxOutZ*)(b_conv_20_ptr);
+               b_conv_20_conv = C2Tuple_u32TxOutZ_clone((LDKC2Tuple_u32TxOutZ*)untag_ptr(b_conv_20));
+               b_constr.data[u] = b_conv_20_conv;
+       }
+       FREE(b);
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_new(a_ref, b_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ _res_conv = *(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ), "LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ 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_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ _res_conv_49_conv = *(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ*)(_res_conv_49_ptr);
+               FREE(untag_ptr(_res_conv_49));
+               _res_constr.data[x] = _res_conv_49_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_BalanceZ_free(int64_tArray _res) {
+       LDKCVec_BalanceZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKBalance), "LDKCVec_BalanceZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t j = 0; j < _res_constr.datalen; j++) {
+               int64_t _res_conv_9 = _res_vals[j];
+               void* _res_conv_9_ptr = untag_ptr(_res_conv_9);
+               CHECK_ACCESS(_res_conv_9_ptr);
+               LDKBalance _res_conv_9_conv = *(LDKBalance*)(_res_conv_9_ptr);
+               FREE(untag_ptr(_res_conv_9));
+               _res_constr.data[j] = _res_conv_9_conv;
+       }
+       FREE(_res);
+       CVec_BalanceZ_free(_res_constr);
+}
+
+static inline uint64_t C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ *NONNULL_PTR arg) {
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ), "LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* arg_conv = (LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone(int64_t orig) {
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* orig_conv = (LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)untag_ptr(orig);
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ), "LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_new(int8_tArray a, int64_t b) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKChannelMonitor 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 = ChannelMonitor_clone(&b_conv);
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ), "LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesChannelMonitorZ_new(a_ref, b_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ _res_conv = *(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_ThirtyTwoBytesChannelMonitorZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ o_conv = *(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)(o_ptr);
+       o_conv = C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone((LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)untag_ptr(o));
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_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_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* o_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ _res_conv = *(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone_ptr(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* arg_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* orig_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C2Tuple_PublicKeyTypeZ_clone_ptr(LDKC2Tuple_PublicKeyTypeZ *NONNULL_PTR arg) {
+       LDKC2Tuple_PublicKeyTypeZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyTypeZ), "LDKC2Tuple_PublicKeyTypeZ");
+       *ret_conv = C2Tuple_PublicKeyTypeZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_PublicKeyTypeZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_PublicKeyTypeZ* arg_conv = (LDKC2Tuple_PublicKeyTypeZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_PublicKeyTypeZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_PublicKeyTypeZ_clone(int64_t orig) {
+       LDKC2Tuple_PublicKeyTypeZ* orig_conv = (LDKC2Tuple_PublicKeyTypeZ*)untag_ptr(orig);
+       LDKC2Tuple_PublicKeyTypeZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyTypeZ), "LDKC2Tuple_PublicKeyTypeZ");
+       *ret_conv = C2Tuple_PublicKeyTypeZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_PublicKeyTypeZ_new(int8_tArray a, int64_t b) {
+       LDKPublicKey a_ref;
+       CHECK(a->arr_len == 33);
+       memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
+       void* b_ptr = untag_ptr(b);
+       CHECK_ACCESS(b_ptr);
+       LDKType b_conv = *(LDKType*)(b_ptr);
+       if (b_conv.free == LDKType_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKType_JCalls_cloned(&b_conv);
+       }
+       LDKC2Tuple_PublicKeyTypeZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyTypeZ), "LDKC2Tuple_PublicKeyTypeZ");
+       *ret_conv = C2Tuple_PublicKeyTypeZ_new(a_ref, b_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_PublicKeyTypeZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_PublicKeyTypeZ _res_conv = *(LDKC2Tuple_PublicKeyTypeZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_PublicKeyTypeZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_PublicKeyTypeZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_PublicKeyTypeZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_PublicKeyTypeZ), "LDKCVec_C2Tuple_PublicKeyTypeZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t z = 0; z < _res_constr.datalen; z++) {
+               int64_t _res_conv_25 = _res_vals[z];
+               void* _res_conv_25_ptr = untag_ptr(_res_conv_25);
+               CHECK_ACCESS(_res_conv_25_ptr);
+               LDKC2Tuple_PublicKeyTypeZ _res_conv_25_conv = *(LDKC2Tuple_PublicKeyTypeZ*)(_res_conv_25_ptr);
+               FREE(untag_ptr(_res_conv_25));
+               _res_constr.data[z] = _res_conv_25_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_PublicKeyTypeZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_OnionMessageContentsZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKOnionMessageContents o_conv = *(LDKOnionMessageContents*)(o_ptr);
+       if (o_conv.free == LDKOnionMessageContents_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOnionMessageContents_JCalls_cloned(&o_conv);
+       }
+       LDKCOption_OnionMessageContentsZ *ret_copy = MALLOC(sizeof(LDKCOption_OnionMessageContentsZ), "LDKCOption_OnionMessageContentsZ");
+       *ret_copy = COption_OnionMessageContentsZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_OnionMessageContentsZ_none() {
+       LDKCOption_OnionMessageContentsZ *ret_copy = MALLOC(sizeof(LDKCOption_OnionMessageContentsZ), "LDKCOption_OnionMessageContentsZ");
+       *ret_copy = COption_OnionMessageContentsZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_OnionMessageContentsZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_OnionMessageContentsZ _res_conv = *(LDKCOption_OnionMessageContentsZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_OnionMessageContentsZ_free(_res_conv);
+}
+
+static inline uint64_t COption_OnionMessageContentsZ_clone_ptr(LDKCOption_OnionMessageContentsZ *NONNULL_PTR arg) {
+       LDKCOption_OnionMessageContentsZ *ret_copy = MALLOC(sizeof(LDKCOption_OnionMessageContentsZ), "LDKCOption_OnionMessageContentsZ");
+       *ret_copy = COption_OnionMessageContentsZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_OnionMessageContentsZ_clone_ptr(int64_t arg) {
+       LDKCOption_OnionMessageContentsZ* arg_conv = (LDKCOption_OnionMessageContentsZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_OnionMessageContentsZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_OnionMessageContentsZ_clone(int64_t orig) {
+       LDKCOption_OnionMessageContentsZ* orig_conv = (LDKCOption_OnionMessageContentsZ*)untag_ptr(orig);
+       LDKCOption_OnionMessageContentsZ *ret_copy = MALLOC(sizeof(LDKCOption_OnionMessageContentsZ), "LDKCOption_OnionMessageContentsZ");
+       *ret_copy = COption_OnionMessageContentsZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_OnionMessageContentsZ o_conv = *(LDKCOption_OnionMessageContentsZ*)(o_ptr);
+       o_conv = COption_OnionMessageContentsZ_clone((LDKCOption_OnionMessageContentsZ*)untag_ptr(o));
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ), "LDKCResult_COption_OnionMessageContentsZDecodeErrorZ");
+       *ret_conv = CResult_COption_OnionMessageContentsZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_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_COption_OnionMessageContentsZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ), "LDKCResult_COption_OnionMessageContentsZDecodeErrorZ");
+       *ret_conv = CResult_COption_OnionMessageContentsZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* o_conv = (LDKCResult_COption_OnionMessageContentsZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_OnionMessageContentsZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ _res_conv = *(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_OnionMessageContentsZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_OnionMessageContentsZDecodeErrorZ_clone_ptr(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ), "LDKCResult_COption_OnionMessageContentsZDecodeErrorZ");
+       *ret_conv = CResult_COption_OnionMessageContentsZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* arg_conv = (LDKCResult_COption_OnionMessageContentsZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_OnionMessageContentsZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* orig_conv = (LDKCResult_COption_OnionMessageContentsZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ), "LDKCResult_COption_OnionMessageContentsZDecodeErrorZ");
+       *ret_conv = CResult_COption_OnionMessageContentsZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone_ptr(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ *NONNULL_PTR arg) {
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ), "LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ");
+       *ret_conv = C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone_ptr(int64_t arg) {
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* arg_conv = (LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ*)untag_ptr(arg);
+       int64_t ret_conv = C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone(int64_t orig) {
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* orig_conv = (LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ*)untag_ptr(orig);
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ), "LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ");
+       *ret_conv = C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_new(int64_t a, int64_t b, int64_t c) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKOnionMessageContents a_conv = *(LDKOnionMessageContents*)(a_ptr);
+       if (a_conv.free == LDKOnionMessageContents_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOnionMessageContents_JCalls_cloned(&a_conv);
+       }
+       void* b_ptr = untag_ptr(b);
+       CHECK_ACCESS(b_ptr);
+       LDKDestination b_conv = *(LDKDestination*)(b_ptr);
+       b_conv = Destination_clone((LDKDestination*)untag_ptr(b));
+       LDKBlindedPath 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 = BlindedPath_clone(&c_conv);
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ), "LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ");
+       *ret_conv = C3Tuple_OnionMessageContentsDestinationBlindedPathZ_new(a_conv, b_conv, c_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ _res_conv = *(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C3Tuple_OnionMessageContentsDestinationBlindedPathZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ_free(int64_tArray _res) {
+       LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ), "LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t e = 0; e < _res_constr.datalen; e++) {
+               int64_t _res_conv_56 = _res_vals[e];
+               void* _res_conv_56_ptr = untag_ptr(_res_conv_56);
+               CHECK_ACCESS(_res_conv_56_ptr);
+               LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ _res_conv_56_conv = *(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ*)(_res_conv_56_ptr);
+               FREE(untag_ptr(_res_conv_56));
+               _res_constr.data[e] = _res_conv_56_conv;
+       }
+       FREE(_res);
+       CVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_TypeZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKType o_conv = *(LDKType*)(o_ptr);
+       if (o_conv.free == LDKType_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKType_JCalls_cloned(&o_conv);
+       }
+       LDKCOption_TypeZ *ret_copy = MALLOC(sizeof(LDKCOption_TypeZ), "LDKCOption_TypeZ");
+       *ret_copy = COption_TypeZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_TypeZ_none() {
+       LDKCOption_TypeZ *ret_copy = MALLOC(sizeof(LDKCOption_TypeZ), "LDKCOption_TypeZ");
+       *ret_copy = COption_TypeZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_TypeZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_TypeZ _res_conv = *(LDKCOption_TypeZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_TypeZ_free(_res_conv);
+}
+
+static inline uint64_t COption_TypeZ_clone_ptr(LDKCOption_TypeZ *NONNULL_PTR arg) {
+       LDKCOption_TypeZ *ret_copy = MALLOC(sizeof(LDKCOption_TypeZ), "LDKCOption_TypeZ");
+       *ret_copy = COption_TypeZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_TypeZ_clone_ptr(int64_t arg) {
+       LDKCOption_TypeZ* arg_conv = (LDKCOption_TypeZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_TypeZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_TypeZ_clone(int64_t orig) {
+       LDKCOption_TypeZ* orig_conv = (LDKCOption_TypeZ*)untag_ptr(orig);
+       LDKCOption_TypeZ *ret_copy = MALLOC(sizeof(LDKCOption_TypeZ), "LDKCOption_TypeZ");
+       *ret_copy = COption_TypeZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_TypeZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_TypeZ o_conv = *(LDKCOption_TypeZ*)(o_ptr);
+       o_conv = COption_TypeZ_clone((LDKCOption_TypeZ*)untag_ptr(o));
+       LDKCResult_COption_TypeZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_TypeZDecodeErrorZ), "LDKCResult_COption_TypeZDecodeErrorZ");
+       *ret_conv = CResult_COption_TypeZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_TypeZDecodeErrorZ_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_COption_TypeZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_TypeZDecodeErrorZ), "LDKCResult_COption_TypeZDecodeErrorZ");
+       *ret_conv = CResult_COption_TypeZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_TypeZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_TypeZDecodeErrorZ* o_conv = (LDKCResult_COption_TypeZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_TypeZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_TypeZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_TypeZDecodeErrorZ _res_conv = *(LDKCResult_COption_TypeZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_TypeZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_TypeZDecodeErrorZ_clone_ptr(LDKCResult_COption_TypeZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_TypeZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_TypeZDecodeErrorZ), "LDKCResult_COption_TypeZDecodeErrorZ");
+       *ret_conv = CResult_COption_TypeZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_TypeZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_TypeZDecodeErrorZ* arg_conv = (LDKCResult_COption_TypeZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_TypeZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_TypeZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_TypeZDecodeErrorZ* orig_conv = (LDKCResult_COption_TypeZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_TypeZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_TypeZDecodeErrorZ), "LDKCResult_COption_TypeZDecodeErrorZ");
+       *ret_conv = CResult_COption_TypeZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_SocketAddressZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKSocketAddress o_conv = *(LDKSocketAddress*)(o_ptr);
+       o_conv = SocketAddress_clone((LDKSocketAddress*)untag_ptr(o));
+       LDKCOption_SocketAddressZ *ret_copy = MALLOC(sizeof(LDKCOption_SocketAddressZ), "LDKCOption_SocketAddressZ");
+       *ret_copy = COption_SocketAddressZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_SocketAddressZ_none() {
+       LDKCOption_SocketAddressZ *ret_copy = MALLOC(sizeof(LDKCOption_SocketAddressZ), "LDKCOption_SocketAddressZ");
+       *ret_copy = COption_SocketAddressZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_SocketAddressZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_SocketAddressZ _res_conv = *(LDKCOption_SocketAddressZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_SocketAddressZ_free(_res_conv);
+}
+
+static inline uint64_t COption_SocketAddressZ_clone_ptr(LDKCOption_SocketAddressZ *NONNULL_PTR arg) {
+       LDKCOption_SocketAddressZ *ret_copy = MALLOC(sizeof(LDKCOption_SocketAddressZ), "LDKCOption_SocketAddressZ");
+       *ret_copy = COption_SocketAddressZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_SocketAddressZ_clone_ptr(int64_t arg) {
+       LDKCOption_SocketAddressZ* arg_conv = (LDKCOption_SocketAddressZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_SocketAddressZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_SocketAddressZ_clone(int64_t orig) {
+       LDKCOption_SocketAddressZ* orig_conv = (LDKCOption_SocketAddressZ*)untag_ptr(orig);
+       LDKCOption_SocketAddressZ *ret_copy = MALLOC(sizeof(LDKCOption_SocketAddressZ), "LDKCOption_SocketAddressZ");
+       *ret_copy = COption_SocketAddressZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline uint64_t C2Tuple_PublicKeyCOption_SocketAddressZZ_clone_ptr(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_PublicKeyCOption_SocketAddressZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ), "LDKC2Tuple_PublicKeyCOption_SocketAddressZZ");
+       *ret_conv = C2Tuple_PublicKeyCOption_SocketAddressZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_PublicKeyCOption_SocketAddressZZ* arg_conv = (LDKC2Tuple_PublicKeyCOption_SocketAddressZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_PublicKeyCOption_SocketAddressZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_clone(int64_t orig) {
+       LDKC2Tuple_PublicKeyCOption_SocketAddressZZ* orig_conv = (LDKC2Tuple_PublicKeyCOption_SocketAddressZZ*)untag_ptr(orig);
+       LDKC2Tuple_PublicKeyCOption_SocketAddressZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ), "LDKC2Tuple_PublicKeyCOption_SocketAddressZZ");
+       *ret_conv = C2Tuple_PublicKeyCOption_SocketAddressZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_new(int8_tArray a, int64_t b) {
+       LDKPublicKey a_ref;
+       CHECK(a->arr_len == 33);
+       memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
+       void* b_ptr = untag_ptr(b);
+       CHECK_ACCESS(b_ptr);
+       LDKCOption_SocketAddressZ b_conv = *(LDKCOption_SocketAddressZ*)(b_ptr);
+       b_conv = COption_SocketAddressZ_clone((LDKCOption_SocketAddressZ*)untag_ptr(b));
+       LDKC2Tuple_PublicKeyCOption_SocketAddressZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ), "LDKC2Tuple_PublicKeyCOption_SocketAddressZZ");
+       *ret_conv = C2Tuple_PublicKeyCOption_SocketAddressZZ_new(a_ref, b_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_PublicKeyCOption_SocketAddressZZ _res_conv = *(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_PublicKeyCOption_SocketAddressZZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ), "LDKCVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t r = 0; r < _res_constr.datalen; r++) {
+               int64_t _res_conv_43 = _res_vals[r];
+               void* _res_conv_43_ptr = untag_ptr(_res_conv_43);
+               CHECK_ACCESS(_res_conv_43_ptr);
+               LDKC2Tuple_PublicKeyCOption_SocketAddressZZ _res_conv_43_conv = *(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ*)(_res_conv_43_ptr);
+               FREE(untag_ptr(_res_conv_43));
+               _res_constr.data[r] = _res_conv_43_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_ok(int8_tArray o) {
+       LDKCVec_u8Z o_ref;
+       o_ref.datalen = o->arr_len;
+       o_ref.data = MALLOC(o_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(o_ref.data, o->elems, o_ref.datalen); FREE(o);
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZPeerHandleErrorZ), "LDKCResult_CVec_u8ZPeerHandleErrorZ");
+       *ret_conv = CResult_CVec_u8ZPeerHandleErrorZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_err(int64_t e) {
+       LDKPeerHandleError e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = PeerHandleError_clone(&e_conv);
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZPeerHandleErrorZ), "LDKCResult_CVec_u8ZPeerHandleErrorZ");
+       *ret_conv = CResult_CVec_u8ZPeerHandleErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_is_ok(int64_t o) {
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* o_conv = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_u8ZPeerHandleErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_u8ZPeerHandleErrorZ _res_conv = *(LDKCResult_CVec_u8ZPeerHandleErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_u8ZPeerHandleErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_u8ZPeerHandleErrorZ_clone_ptr(LDKCResult_CVec_u8ZPeerHandleErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZPeerHandleErrorZ), "LDKCResult_CVec_u8ZPeerHandleErrorZ");
+       *ret_conv = CResult_CVec_u8ZPeerHandleErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* arg_conv = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_u8ZPeerHandleErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_clone(int64_t orig) {
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* orig_conv = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)untag_ptr(orig);
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZPeerHandleErrorZ), "LDKCResult_CVec_u8ZPeerHandleErrorZ");
+       *ret_conv = CResult_CVec_u8ZPeerHandleErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NonePeerHandleErrorZ_ok() {
+       LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
+       *ret_conv = CResult_NonePeerHandleErrorZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NonePeerHandleErrorZ_err(int64_t e) {
+       LDKPeerHandleError e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = PeerHandleError_clone(&e_conv);
+       LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
+       *ret_conv = CResult_NonePeerHandleErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NonePeerHandleErrorZ_is_ok(int64_t o) {
+       LDKCResult_NonePeerHandleErrorZ* o_conv = (LDKCResult_NonePeerHandleErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NonePeerHandleErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NonePeerHandleErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NonePeerHandleErrorZ _res_conv = *(LDKCResult_NonePeerHandleErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NonePeerHandleErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NonePeerHandleErrorZ_clone_ptr(LDKCResult_NonePeerHandleErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
+       *ret_conv = CResult_NonePeerHandleErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NonePeerHandleErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NonePeerHandleErrorZ* arg_conv = (LDKCResult_NonePeerHandleErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NonePeerHandleErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NonePeerHandleErrorZ_clone(int64_t orig) {
+       LDKCResult_NonePeerHandleErrorZ* orig_conv = (LDKCResult_NonePeerHandleErrorZ*)untag_ptr(orig);
+       LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
+       *ret_conv = CResult_NonePeerHandleErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_boolPeerHandleErrorZ_ok(jboolean o) {
+       LDKCResult_boolPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolPeerHandleErrorZ), "LDKCResult_boolPeerHandleErrorZ");
+       *ret_conv = CResult_boolPeerHandleErrorZ_ok(o);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_boolPeerHandleErrorZ_err(int64_t e) {
+       LDKPeerHandleError e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = PeerHandleError_clone(&e_conv);
+       LDKCResult_boolPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolPeerHandleErrorZ), "LDKCResult_boolPeerHandleErrorZ");
+       *ret_conv = CResult_boolPeerHandleErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_boolPeerHandleErrorZ_is_ok(int64_t o) {
+       LDKCResult_boolPeerHandleErrorZ* o_conv = (LDKCResult_boolPeerHandleErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_boolPeerHandleErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_boolPeerHandleErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_boolPeerHandleErrorZ _res_conv = *(LDKCResult_boolPeerHandleErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_boolPeerHandleErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_boolPeerHandleErrorZ_clone_ptr(LDKCResult_boolPeerHandleErrorZ *NONNULL_PTR arg) {
+       LDKCResult_boolPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolPeerHandleErrorZ), "LDKCResult_boolPeerHandleErrorZ");
+       *ret_conv = CResult_boolPeerHandleErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_boolPeerHandleErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_boolPeerHandleErrorZ* arg_conv = (LDKCResult_boolPeerHandleErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_boolPeerHandleErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_boolPeerHandleErrorZ_clone(int64_t orig) {
+       LDKCResult_boolPeerHandleErrorZ* orig_conv = (LDKCResult_boolPeerHandleErrorZ*)untag_ptr(orig);
+       LDKCResult_boolPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolPeerHandleErrorZ), "LDKCResult_boolPeerHandleErrorZ");
+       *ret_conv = CResult_boolPeerHandleErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_u32GraphSyncErrorZ_ok(int32_t o) {
+       LDKCResult_u32GraphSyncErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_u32GraphSyncErrorZ), "LDKCResult_u32GraphSyncErrorZ");
+       *ret_conv = CResult_u32GraphSyncErrorZ_ok(o);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_u32GraphSyncErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKGraphSyncError e_conv = *(LDKGraphSyncError*)(e_ptr);
+       e_conv = GraphSyncError_clone((LDKGraphSyncError*)untag_ptr(e));
+       LDKCResult_u32GraphSyncErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_u32GraphSyncErrorZ), "LDKCResult_u32GraphSyncErrorZ");
+       *ret_conv = CResult_u32GraphSyncErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_u32GraphSyncErrorZ_is_ok(int64_t o) {
+       LDKCResult_u32GraphSyncErrorZ* o_conv = (LDKCResult_u32GraphSyncErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_u32GraphSyncErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_u32GraphSyncErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_u32GraphSyncErrorZ _res_conv = *(LDKCResult_u32GraphSyncErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_u32GraphSyncErrorZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZIOErrorZ_ok(int8_tArray o) {
+       LDKCVec_u8Z o_ref;
+       o_ref.datalen = o->arr_len;
+       o_ref.data = MALLOC(o_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(o_ref.data, o->elems, o_ref.datalen); FREE(o);
+       LDKCResult_CVec_u8ZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZIOErrorZ), "LDKCResult_CVec_u8ZIOErrorZ");
+       *ret_conv = CResult_CVec_u8ZIOErrorZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZIOErrorZ_err(int32_t e) {
+       LDKIOError e_conv = LDKIOError_from_cs(e);
+       LDKCResult_CVec_u8ZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZIOErrorZ), "LDKCResult_CVec_u8ZIOErrorZ");
+       *ret_conv = CResult_CVec_u8ZIOErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_u8ZIOErrorZ_is_ok(int64_t o) {
+       LDKCResult_CVec_u8ZIOErrorZ* o_conv = (LDKCResult_CVec_u8ZIOErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_u8ZIOErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_u8ZIOErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_u8ZIOErrorZ _res_conv = *(LDKCResult_CVec_u8ZIOErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_u8ZIOErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_u8ZIOErrorZ_clone_ptr(LDKCResult_CVec_u8ZIOErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_u8ZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZIOErrorZ), "LDKCResult_CVec_u8ZIOErrorZ");
+       *ret_conv = CResult_CVec_u8ZIOErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_u8ZIOErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_u8ZIOErrorZ* arg_conv = (LDKCResult_CVec_u8ZIOErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_u8ZIOErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZIOErrorZ_clone(int64_t orig) {
+       LDKCResult_CVec_u8ZIOErrorZ* orig_conv = (LDKCResult_CVec_u8ZIOErrorZ*)untag_ptr(orig);
+       LDKCResult_CVec_u8ZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZIOErrorZ), "LDKCResult_CVec_u8ZIOErrorZ");
+       *ret_conv = CResult_CVec_u8ZIOErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_StrZ_free(ptrArray _res) {
+       LDKCVec_StrZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKStr), "LDKCVec_StrZ Elements");
+       else
+               _res_constr.data = NULL;
+       jstring* _res_vals = (void*) _res->elems;
+       for (size_t i = 0; i < _res_constr.datalen; i++) {
+               jstring _res_conv_8 = _res_vals[i];
+               LDKStr dummy = { .chars = NULL, .len = 0, .chars_is_owned = false };
+               _res_constr.data[i] = dummy;
+       }
+       FREE(_res);
+       CVec_StrZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_CVec_StrZIOErrorZ_ok(ptrArray o) {
+       LDKCVec_StrZ o_constr;
+       o_constr.datalen = o->arr_len;
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKStr), "LDKCVec_StrZ Elements");
+       else
+               o_constr.data = NULL;
+       jstring* o_vals = (void*) o->elems;
+       for (size_t i = 0; i < o_constr.datalen; i++) {
+               jstring o_conv_8 = o_vals[i];
+               LDKStr o_conv_8_conv = str_ref_to_owned_c(o_conv_8);
+               o_constr.data[i] = o_conv_8_conv;
+       }
+       FREE(o);
+       LDKCResult_CVec_StrZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_StrZIOErrorZ), "LDKCResult_CVec_StrZIOErrorZ");
+       *ret_conv = CResult_CVec_StrZIOErrorZ_ok(o_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_StrZIOErrorZ_err(int32_t e) {
+       LDKIOError e_conv = LDKIOError_from_cs(e);
+       LDKCResult_CVec_StrZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_StrZIOErrorZ), "LDKCResult_CVec_StrZIOErrorZ");
+       *ret_conv = CResult_CVec_StrZIOErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_StrZIOErrorZ_is_ok(int64_t o) {
+       LDKCResult_CVec_StrZIOErrorZ* o_conv = (LDKCResult_CVec_StrZIOErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_StrZIOErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_StrZIOErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_StrZIOErrorZ _res_conv = *(LDKCResult_CVec_StrZIOErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_StrZIOErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_StrZIOErrorZ_clone_ptr(LDKCResult_CVec_StrZIOErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_StrZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_StrZIOErrorZ), "LDKCResult_CVec_StrZIOErrorZ");
+       *ret_conv = CResult_CVec_StrZIOErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_StrZIOErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_StrZIOErrorZ* arg_conv = (LDKCResult_CVec_StrZIOErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_StrZIOErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_StrZIOErrorZ_clone(int64_t orig) {
+       LDKCResult_CVec_StrZIOErrorZ* orig_conv = (LDKCResult_CVec_StrZIOErrorZ*)untag_ptr(orig);
+       LDKCResult_CVec_StrZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_StrZIOErrorZ), "LDKCResult_CVec_StrZIOErrorZ");
+       *ret_conv = CResult_CVec_StrZIOErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ), "LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ 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_ThirtyTwoBytesChannelMonitorZ _res_conv_40_conv = *(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)(_res_conv_40_ptr);
+               FREE(untag_ptr(_res_conv_40));
+               _res_constr.data[o] = _res_conv_40_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_ok(int64_tArray o) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ o_constr;
+       o_constr.datalen = o->arr_len;
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ), "LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ 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_ThirtyTwoBytesChannelMonitorZ o_conv_40_conv = *(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)(o_conv_40_ptr);
+               o_conv_40_conv = C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone((LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)untag_ptr(o_conv_40));
+               o_constr.data[o] = o_conv_40_conv;
+       }
+       FREE(o);
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ");
+       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_ok(o_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_err(int32_t e) {
+       LDKIOError e_conv = LDKIOError_from_cs(e);
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ");
+       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_is_ok(int64_t o) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* o_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ _res_conv = *(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone_ptr(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ");
+       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* arg_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone(int64_t orig) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* orig_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ*)untag_ptr(orig);
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ");
+       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ o_conv = *(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)(o_ptr);
+       o_conv = C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone((LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)untag_ptr(o));
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_err(int32_t e) {
+       LDKIOError e_conv = LDKIOError_from_cs(e);
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_is_ok(int64_t o) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* o_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ _res_conv = *(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone_ptr(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ *NONNULL_PTR arg) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* arg_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone(int64_t orig) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* orig_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ*)untag_ptr(orig);
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_SecretKeyZ_some(int8_tArray o) {
+       LDKSecretKey o_ref;
+       CHECK(o->arr_len == 32);
+       memcpy(o_ref.bytes, o->elems, 32); FREE(o);
+       LDKCOption_SecretKeyZ *ret_copy = MALLOC(sizeof(LDKCOption_SecretKeyZ), "LDKCOption_SecretKeyZ");
+       *ret_copy = COption_SecretKeyZ_some(o_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_SecretKeyZ_none() {
+       LDKCOption_SecretKeyZ *ret_copy = MALLOC(sizeof(LDKCOption_SecretKeyZ), "LDKCOption_SecretKeyZ");
+       *ret_copy = COption_SecretKeyZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_SecretKeyZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_SecretKeyZ _res_conv = *(LDKCOption_SecretKeyZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_SecretKeyZ_free(_res_conv);
+}
+
+static inline uint64_t COption_SecretKeyZ_clone_ptr(LDKCOption_SecretKeyZ *NONNULL_PTR arg) {
+       LDKCOption_SecretKeyZ *ret_copy = MALLOC(sizeof(LDKCOption_SecretKeyZ), "LDKCOption_SecretKeyZ");
+       *ret_copy = COption_SecretKeyZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_SecretKeyZ_clone_ptr(int64_t arg) {
+       LDKCOption_SecretKeyZ* arg_conv = (LDKCOption_SecretKeyZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_SecretKeyZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_SecretKeyZ_clone(int64_t orig) {
+       LDKCOption_SecretKeyZ* orig_conv = (LDKCOption_SecretKeyZ*)untag_ptr(orig);
+       LDKCOption_SecretKeyZ *ret_copy = MALLOC(sizeof(LDKCOption_SecretKeyZ), "LDKCOption_SecretKeyZ");
+       *ret_copy = COption_SecretKeyZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_ok(int64_t o) {
+       LDKVerifiedInvoiceRequest 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 = VerifiedInvoiceRequest_clone(&o_conv);
+       LDKCResult_VerifiedInvoiceRequestNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_VerifiedInvoiceRequestNoneZ), "LDKCResult_VerifiedInvoiceRequestNoneZ");
+       *ret_conv = CResult_VerifiedInvoiceRequestNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_err() {
+       LDKCResult_VerifiedInvoiceRequestNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_VerifiedInvoiceRequestNoneZ), "LDKCResult_VerifiedInvoiceRequestNoneZ");
+       *ret_conv = CResult_VerifiedInvoiceRequestNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_is_ok(int64_t o) {
+       LDKCResult_VerifiedInvoiceRequestNoneZ* o_conv = (LDKCResult_VerifiedInvoiceRequestNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_VerifiedInvoiceRequestNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_VerifiedInvoiceRequestNoneZ _res_conv = *(LDKCResult_VerifiedInvoiceRequestNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_VerifiedInvoiceRequestNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_VerifiedInvoiceRequestNoneZ_clone_ptr(LDKCResult_VerifiedInvoiceRequestNoneZ *NONNULL_PTR arg) {
+       LDKCResult_VerifiedInvoiceRequestNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_VerifiedInvoiceRequestNoneZ), "LDKCResult_VerifiedInvoiceRequestNoneZ");
+       *ret_conv = CResult_VerifiedInvoiceRequestNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_VerifiedInvoiceRequestNoneZ* arg_conv = (LDKCResult_VerifiedInvoiceRequestNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_VerifiedInvoiceRequestNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_clone(int64_t orig) {
+       LDKCResult_VerifiedInvoiceRequestNoneZ* orig_conv = (LDKCResult_VerifiedInvoiceRequestNoneZ*)untag_ptr(orig);
+       LDKCResult_VerifiedInvoiceRequestNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_VerifiedInvoiceRequestNoneZ), "LDKCResult_VerifiedInvoiceRequestNoneZ");
+       *ret_conv = CResult_VerifiedInvoiceRequestNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int32_t  CS_LDK_COption_NoneZ_some() {
+       int32_t ret_conv = LDKCOption_NoneZ_to_cs(COption_NoneZ_some());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_COption_NoneZ_none() {
+       int32_t ret_conv = LDKCOption_NoneZ_to_cs(COption_NoneZ_none());
+       return ret_conv;
+}
+
+void  CS_LDK_COption_NoneZ_free(int32_t _res) {
+       LDKCOption_NoneZ _res_conv = LDKCOption_NoneZ_from_cs(_res);
+       COption_NoneZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_WitnessZ_free(ptrArray _res) {
+       LDKCVec_WitnessZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKWitness), "LDKCVec_WitnessZ 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];
+               LDKWitness _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, "LDKWitness Bytes");
+               memcpy(_res_conv_8_ref.data, _res_conv_8->elems, _res_conv_8_ref.datalen); FREE(_res_conv_8);
+               _res_conv_8_ref.data_is_owned = true;
+               _res_constr.data[i] = _res_conv_8_ref;
+       }
+       FREE(_res);
+       CVec_WitnessZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_i64Z_some(int64_t o) {
+       LDKCOption_i64Z *ret_copy = MALLOC(sizeof(LDKCOption_i64Z), "LDKCOption_i64Z");
+       *ret_copy = COption_i64Z_some(o);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_i64Z_none() {
+       LDKCOption_i64Z *ret_copy = MALLOC(sizeof(LDKCOption_i64Z), "LDKCOption_i64Z");
+       *ret_copy = COption_i64Z_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_i64Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_i64Z _res_conv = *(LDKCOption_i64Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_i64Z_free(_res_conv);
+}
+
+static inline uint64_t COption_i64Z_clone_ptr(LDKCOption_i64Z *NONNULL_PTR arg) {
+       LDKCOption_i64Z *ret_copy = MALLOC(sizeof(LDKCOption_i64Z), "LDKCOption_i64Z");
+       *ret_copy = COption_i64Z_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_i64Z_clone_ptr(int64_t arg) {
+       LDKCOption_i64Z* arg_conv = (LDKCOption_i64Z*)untag_ptr(arg);
+       int64_t ret_conv = COption_i64Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_i64Z_clone(int64_t orig) {
+       LDKCOption_i64Z* orig_conv = (LDKCOption_i64Z*)untag_ptr(orig);
+       LDKCOption_i64Z *ret_copy = MALLOC(sizeof(LDKCOption_i64Z), "LDKCOption_i64Z");
+       *ret_copy = COption_i64Z_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_SocketAddressDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKSocketAddress o_conv = *(LDKSocketAddress*)(o_ptr);
+       o_conv = SocketAddress_clone((LDKSocketAddress*)untag_ptr(o));
+       LDKCResult_SocketAddressDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressDecodeErrorZ), "LDKCResult_SocketAddressDecodeErrorZ");
+       *ret_conv = CResult_SocketAddressDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SocketAddressDecodeErrorZ_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_SocketAddressDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressDecodeErrorZ), "LDKCResult_SocketAddressDecodeErrorZ");
+       *ret_conv = CResult_SocketAddressDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SocketAddressDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_SocketAddressDecodeErrorZ* o_conv = (LDKCResult_SocketAddressDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SocketAddressDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SocketAddressDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SocketAddressDecodeErrorZ _res_conv = *(LDKCResult_SocketAddressDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SocketAddressDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SocketAddressDecodeErrorZ_clone_ptr(LDKCResult_SocketAddressDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_SocketAddressDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressDecodeErrorZ), "LDKCResult_SocketAddressDecodeErrorZ");
+       *ret_conv = CResult_SocketAddressDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SocketAddressDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_SocketAddressDecodeErrorZ* arg_conv = (LDKCResult_SocketAddressDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SocketAddressDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SocketAddressDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_SocketAddressDecodeErrorZ* orig_conv = (LDKCResult_SocketAddressDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_SocketAddressDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressDecodeErrorZ), "LDKCResult_SocketAddressDecodeErrorZ");
+       *ret_conv = CResult_SocketAddressDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKSocketAddress o_conv = *(LDKSocketAddress*)(o_ptr);
+       o_conv = SocketAddress_clone((LDKSocketAddress*)untag_ptr(o));
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressSocketAddressParseErrorZ), "LDKCResult_SocketAddressSocketAddressParseErrorZ");
+       *ret_conv = CResult_SocketAddressSocketAddressParseErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_err(int32_t e) {
+       LDKSocketAddressParseError e_conv = LDKSocketAddressParseError_from_cs(e);
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressSocketAddressParseErrorZ), "LDKCResult_SocketAddressSocketAddressParseErrorZ");
+       *ret_conv = CResult_SocketAddressSocketAddressParseErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_is_ok(int64_t o) {
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* o_conv = (LDKCResult_SocketAddressSocketAddressParseErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SocketAddressSocketAddressParseErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SocketAddressSocketAddressParseErrorZ _res_conv = *(LDKCResult_SocketAddressSocketAddressParseErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SocketAddressSocketAddressParseErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SocketAddressSocketAddressParseErrorZ_clone_ptr(LDKCResult_SocketAddressSocketAddressParseErrorZ *NONNULL_PTR arg) {
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressSocketAddressParseErrorZ), "LDKCResult_SocketAddressSocketAddressParseErrorZ");
+       *ret_conv = CResult_SocketAddressSocketAddressParseErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* arg_conv = (LDKCResult_SocketAddressSocketAddressParseErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SocketAddressSocketAddressParseErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_clone(int64_t orig) {
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* orig_conv = (LDKCResult_SocketAddressSocketAddressParseErrorZ*)untag_ptr(orig);
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressSocketAddressParseErrorZ), "LDKCResult_SocketAddressSocketAddressParseErrorZ");
+       *ret_conv = CResult_SocketAddressSocketAddressParseErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_UpdateAddHTLCZ_free(int64_tArray _res) {
+       LDKCVec_UpdateAddHTLCZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKUpdateAddHTLC), "LDKCVec_UpdateAddHTLCZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t p = 0; p < _res_constr.datalen; p++) {
+               int64_t _res_conv_15 = _res_vals[p];
+               LDKUpdateAddHTLC _res_conv_15_conv;
+               _res_conv_15_conv.inner = untag_ptr(_res_conv_15);
+               _res_conv_15_conv.is_owned = ptr_is_owned(_res_conv_15);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_15_conv);
+               _res_constr.data[p] = _res_conv_15_conv;
+       }
+       FREE(_res);
+       CVec_UpdateAddHTLCZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_UpdateFulfillHTLCZ_free(int64_tArray _res) {
+       LDKCVec_UpdateFulfillHTLCZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKUpdateFulfillHTLC), "LDKCVec_UpdateFulfillHTLCZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t t = 0; t < _res_constr.datalen; t++) {
+               int64_t _res_conv_19 = _res_vals[t];
+               LDKUpdateFulfillHTLC _res_conv_19_conv;
+               _res_conv_19_conv.inner = untag_ptr(_res_conv_19);
+               _res_conv_19_conv.is_owned = ptr_is_owned(_res_conv_19);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_19_conv);
+               _res_constr.data[t] = _res_conv_19_conv;
+       }
+       FREE(_res);
+       CVec_UpdateFulfillHTLCZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_UpdateFailHTLCZ_free(int64_tArray _res) {
+       LDKCVec_UpdateFailHTLCZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKUpdateFailHTLC), "LDKCVec_UpdateFailHTLCZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t q = 0; q < _res_constr.datalen; q++) {
+               int64_t _res_conv_16 = _res_vals[q];
+               LDKUpdateFailHTLC _res_conv_16_conv;
+               _res_conv_16_conv.inner = untag_ptr(_res_conv_16);
+               _res_conv_16_conv.is_owned = ptr_is_owned(_res_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_16_conv);
+               _res_constr.data[q] = _res_conv_16_conv;
+       }
+       FREE(_res);
+       CVec_UpdateFailHTLCZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_UpdateFailMalformedHTLCZ_free(int64_tArray _res) {
+       LDKCVec_UpdateFailMalformedHTLCZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKUpdateFailMalformedHTLC), "LDKCVec_UpdateFailMalformedHTLCZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t z = 0; z < _res_constr.datalen; z++) {
+               int64_t _res_conv_25 = _res_vals[z];
+               LDKUpdateFailMalformedHTLC _res_conv_25_conv;
+               _res_conv_25_conv.inner = untag_ptr(_res_conv_25);
+               _res_conv_25_conv.is_owned = ptr_is_owned(_res_conv_25);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_25_conv);
+               _res_constr.data[z] = _res_conv_25_conv;
+       }
+       FREE(_res);
+       CVec_UpdateFailMalformedHTLCZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_AcceptChannelDecodeErrorZ_ok(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 = AcceptChannel_clone(&o_conv);
+       LDKCResult_AcceptChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelDecodeErrorZ), "LDKCResult_AcceptChannelDecodeErrorZ");
+       *ret_conv = CResult_AcceptChannelDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_AcceptChannelDecodeErrorZ_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_AcceptChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelDecodeErrorZ), "LDKCResult_AcceptChannelDecodeErrorZ");
+       *ret_conv = CResult_AcceptChannelDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_AcceptChannelDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_AcceptChannelDecodeErrorZ* o_conv = (LDKCResult_AcceptChannelDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_AcceptChannelDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_AcceptChannelDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_AcceptChannelDecodeErrorZ _res_conv = *(LDKCResult_AcceptChannelDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_AcceptChannelDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_AcceptChannelDecodeErrorZ_clone_ptr(LDKCResult_AcceptChannelDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_AcceptChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelDecodeErrorZ), "LDKCResult_AcceptChannelDecodeErrorZ");
+       *ret_conv = CResult_AcceptChannelDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_AcceptChannelDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_AcceptChannelDecodeErrorZ* arg_conv = (LDKCResult_AcceptChannelDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_AcceptChannelDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_AcceptChannelDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_AcceptChannelDecodeErrorZ* orig_conv = (LDKCResult_AcceptChannelDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_AcceptChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelDecodeErrorZ), "LDKCResult_AcceptChannelDecodeErrorZ");
+       *ret_conv = CResult_AcceptChannelDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_ok(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 = AcceptChannelV2_clone(&o_conv);
+       LDKCResult_AcceptChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelV2DecodeErrorZ), "LDKCResult_AcceptChannelV2DecodeErrorZ");
+       *ret_conv = CResult_AcceptChannelV2DecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_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_AcceptChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelV2DecodeErrorZ), "LDKCResult_AcceptChannelV2DecodeErrorZ");
+       *ret_conv = CResult_AcceptChannelV2DecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_AcceptChannelV2DecodeErrorZ* o_conv = (LDKCResult_AcceptChannelV2DecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_AcceptChannelV2DecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_AcceptChannelV2DecodeErrorZ _res_conv = *(LDKCResult_AcceptChannelV2DecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_AcceptChannelV2DecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_AcceptChannelV2DecodeErrorZ_clone_ptr(LDKCResult_AcceptChannelV2DecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_AcceptChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelV2DecodeErrorZ), "LDKCResult_AcceptChannelV2DecodeErrorZ");
+       *ret_conv = CResult_AcceptChannelV2DecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_AcceptChannelV2DecodeErrorZ* arg_conv = (LDKCResult_AcceptChannelV2DecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_AcceptChannelV2DecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_AcceptChannelV2DecodeErrorZ* orig_conv = (LDKCResult_AcceptChannelV2DecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_AcceptChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelV2DecodeErrorZ), "LDKCResult_AcceptChannelV2DecodeErrorZ");
+       *ret_conv = CResult_AcceptChannelV2DecodeErrorZ_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);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = TxAddInput_clone(&o_conv);
+       LDKCResult_TxAddInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddInputDecodeErrorZ), "LDKCResult_TxAddInputDecodeErrorZ");
+       *ret_conv = CResult_TxAddInputDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxAddInputDecodeErrorZ_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_TxAddInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddInputDecodeErrorZ), "LDKCResult_TxAddInputDecodeErrorZ");
+       *ret_conv = CResult_TxAddInputDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxAddInputDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxAddInputDecodeErrorZ* o_conv = (LDKCResult_TxAddInputDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxAddInputDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxAddInputDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxAddInputDecodeErrorZ _res_conv = *(LDKCResult_TxAddInputDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxAddInputDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxAddInputDecodeErrorZ_clone_ptr(LDKCResult_TxAddInputDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxAddInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddInputDecodeErrorZ), "LDKCResult_TxAddInputDecodeErrorZ");
+       *ret_conv = CResult_TxAddInputDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxAddInputDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxAddInputDecodeErrorZ* arg_conv = (LDKCResult_TxAddInputDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxAddInputDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxAddInputDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxAddInputDecodeErrorZ* orig_conv = (LDKCResult_TxAddInputDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxAddInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddInputDecodeErrorZ), "LDKCResult_TxAddInputDecodeErrorZ");
+       *ret_conv = CResult_TxAddInputDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxAddOutputDecodeErrorZ_ok(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 = TxAddOutput_clone(&o_conv);
+       LDKCResult_TxAddOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddOutputDecodeErrorZ), "LDKCResult_TxAddOutputDecodeErrorZ");
+       *ret_conv = CResult_TxAddOutputDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxAddOutputDecodeErrorZ_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_TxAddOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddOutputDecodeErrorZ), "LDKCResult_TxAddOutputDecodeErrorZ");
+       *ret_conv = CResult_TxAddOutputDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxAddOutputDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxAddOutputDecodeErrorZ* o_conv = (LDKCResult_TxAddOutputDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxAddOutputDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxAddOutputDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxAddOutputDecodeErrorZ _res_conv = *(LDKCResult_TxAddOutputDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxAddOutputDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxAddOutputDecodeErrorZ_clone_ptr(LDKCResult_TxAddOutputDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxAddOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddOutputDecodeErrorZ), "LDKCResult_TxAddOutputDecodeErrorZ");
+       *ret_conv = CResult_TxAddOutputDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxAddOutputDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxAddOutputDecodeErrorZ* arg_conv = (LDKCResult_TxAddOutputDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxAddOutputDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxAddOutputDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxAddOutputDecodeErrorZ* orig_conv = (LDKCResult_TxAddOutputDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxAddOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddOutputDecodeErrorZ), "LDKCResult_TxAddOutputDecodeErrorZ");
+       *ret_conv = CResult_TxAddOutputDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxRemoveInputDecodeErrorZ_ok(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 = TxRemoveInput_clone(&o_conv);
+       LDKCResult_TxRemoveInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveInputDecodeErrorZ), "LDKCResult_TxRemoveInputDecodeErrorZ");
+       *ret_conv = CResult_TxRemoveInputDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxRemoveInputDecodeErrorZ_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_TxRemoveInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveInputDecodeErrorZ), "LDKCResult_TxRemoveInputDecodeErrorZ");
+       *ret_conv = CResult_TxRemoveInputDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxRemoveInputDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxRemoveInputDecodeErrorZ* o_conv = (LDKCResult_TxRemoveInputDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxRemoveInputDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxRemoveInputDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxRemoveInputDecodeErrorZ _res_conv = *(LDKCResult_TxRemoveInputDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxRemoveInputDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxRemoveInputDecodeErrorZ_clone_ptr(LDKCResult_TxRemoveInputDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxRemoveInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveInputDecodeErrorZ), "LDKCResult_TxRemoveInputDecodeErrorZ");
+       *ret_conv = CResult_TxRemoveInputDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxRemoveInputDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxRemoveInputDecodeErrorZ* arg_conv = (LDKCResult_TxRemoveInputDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxRemoveInputDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxRemoveInputDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxRemoveInputDecodeErrorZ* orig_conv = (LDKCResult_TxRemoveInputDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxRemoveInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveInputDecodeErrorZ), "LDKCResult_TxRemoveInputDecodeErrorZ");
+       *ret_conv = CResult_TxRemoveInputDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxRemoveOutputDecodeErrorZ_ok(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 = TxRemoveOutput_clone(&o_conv);
+       LDKCResult_TxRemoveOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveOutputDecodeErrorZ), "LDKCResult_TxRemoveOutputDecodeErrorZ");
+       *ret_conv = CResult_TxRemoveOutputDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxRemoveOutputDecodeErrorZ_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_TxRemoveOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveOutputDecodeErrorZ), "LDKCResult_TxRemoveOutputDecodeErrorZ");
+       *ret_conv = CResult_TxRemoveOutputDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxRemoveOutputDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxRemoveOutputDecodeErrorZ* o_conv = (LDKCResult_TxRemoveOutputDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxRemoveOutputDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxRemoveOutputDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxRemoveOutputDecodeErrorZ _res_conv = *(LDKCResult_TxRemoveOutputDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxRemoveOutputDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxRemoveOutputDecodeErrorZ_clone_ptr(LDKCResult_TxRemoveOutputDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxRemoveOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveOutputDecodeErrorZ), "LDKCResult_TxRemoveOutputDecodeErrorZ");
+       *ret_conv = CResult_TxRemoveOutputDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxRemoveOutputDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxRemoveOutputDecodeErrorZ* arg_conv = (LDKCResult_TxRemoveOutputDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxRemoveOutputDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxRemoveOutputDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxRemoveOutputDecodeErrorZ* orig_conv = (LDKCResult_TxRemoveOutputDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxRemoveOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveOutputDecodeErrorZ), "LDKCResult_TxRemoveOutputDecodeErrorZ");
+       *ret_conv = CResult_TxRemoveOutputDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxCompleteDecodeErrorZ_ok(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 = TxComplete_clone(&o_conv);
+       LDKCResult_TxCompleteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCompleteDecodeErrorZ), "LDKCResult_TxCompleteDecodeErrorZ");
+       *ret_conv = CResult_TxCompleteDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxCompleteDecodeErrorZ_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_TxCompleteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCompleteDecodeErrorZ), "LDKCResult_TxCompleteDecodeErrorZ");
+       *ret_conv = CResult_TxCompleteDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxCompleteDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxCompleteDecodeErrorZ* o_conv = (LDKCResult_TxCompleteDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxCompleteDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxCompleteDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxCompleteDecodeErrorZ _res_conv = *(LDKCResult_TxCompleteDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxCompleteDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxCompleteDecodeErrorZ_clone_ptr(LDKCResult_TxCompleteDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxCompleteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCompleteDecodeErrorZ), "LDKCResult_TxCompleteDecodeErrorZ");
+       *ret_conv = CResult_TxCompleteDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxCompleteDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxCompleteDecodeErrorZ* arg_conv = (LDKCResult_TxCompleteDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxCompleteDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxCompleteDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxCompleteDecodeErrorZ* orig_conv = (LDKCResult_TxCompleteDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxCompleteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCompleteDecodeErrorZ), "LDKCResult_TxCompleteDecodeErrorZ");
+       *ret_conv = CResult_TxCompleteDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxSignaturesDecodeErrorZ_ok(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 = TxSignatures_clone(&o_conv);
+       LDKCResult_TxSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxSignaturesDecodeErrorZ), "LDKCResult_TxSignaturesDecodeErrorZ");
+       *ret_conv = CResult_TxSignaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxSignaturesDecodeErrorZ_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_TxSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxSignaturesDecodeErrorZ), "LDKCResult_TxSignaturesDecodeErrorZ");
+       *ret_conv = CResult_TxSignaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxSignaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxSignaturesDecodeErrorZ* o_conv = (LDKCResult_TxSignaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxSignaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxSignaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxSignaturesDecodeErrorZ _res_conv = *(LDKCResult_TxSignaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxSignaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxSignaturesDecodeErrorZ_clone_ptr(LDKCResult_TxSignaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxSignaturesDecodeErrorZ), "LDKCResult_TxSignaturesDecodeErrorZ");
+       *ret_conv = CResult_TxSignaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxSignaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxSignaturesDecodeErrorZ* arg_conv = (LDKCResult_TxSignaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxSignaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxSignaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxSignaturesDecodeErrorZ* orig_conv = (LDKCResult_TxSignaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxSignaturesDecodeErrorZ), "LDKCResult_TxSignaturesDecodeErrorZ");
+       *ret_conv = CResult_TxSignaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxInitRbfDecodeErrorZ_ok(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 = TxInitRbf_clone(&o_conv);
+       LDKCResult_TxInitRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxInitRbfDecodeErrorZ), "LDKCResult_TxInitRbfDecodeErrorZ");
+       *ret_conv = CResult_TxInitRbfDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxInitRbfDecodeErrorZ_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_TxInitRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxInitRbfDecodeErrorZ), "LDKCResult_TxInitRbfDecodeErrorZ");
+       *ret_conv = CResult_TxInitRbfDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxInitRbfDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxInitRbfDecodeErrorZ* o_conv = (LDKCResult_TxInitRbfDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxInitRbfDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxInitRbfDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxInitRbfDecodeErrorZ _res_conv = *(LDKCResult_TxInitRbfDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxInitRbfDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxInitRbfDecodeErrorZ_clone_ptr(LDKCResult_TxInitRbfDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxInitRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxInitRbfDecodeErrorZ), "LDKCResult_TxInitRbfDecodeErrorZ");
+       *ret_conv = CResult_TxInitRbfDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxInitRbfDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxInitRbfDecodeErrorZ* arg_conv = (LDKCResult_TxInitRbfDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxInitRbfDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxInitRbfDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxInitRbfDecodeErrorZ* orig_conv = (LDKCResult_TxInitRbfDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxInitRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxInitRbfDecodeErrorZ), "LDKCResult_TxInitRbfDecodeErrorZ");
+       *ret_conv = CResult_TxInitRbfDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxAckRbfDecodeErrorZ_ok(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 = TxAckRbf_clone(&o_conv);
+       LDKCResult_TxAckRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAckRbfDecodeErrorZ), "LDKCResult_TxAckRbfDecodeErrorZ");
+       *ret_conv = CResult_TxAckRbfDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxAckRbfDecodeErrorZ_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_TxAckRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAckRbfDecodeErrorZ), "LDKCResult_TxAckRbfDecodeErrorZ");
+       *ret_conv = CResult_TxAckRbfDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxAckRbfDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxAckRbfDecodeErrorZ* o_conv = (LDKCResult_TxAckRbfDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxAckRbfDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxAckRbfDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxAckRbfDecodeErrorZ _res_conv = *(LDKCResult_TxAckRbfDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxAckRbfDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxAckRbfDecodeErrorZ_clone_ptr(LDKCResult_TxAckRbfDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxAckRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAckRbfDecodeErrorZ), "LDKCResult_TxAckRbfDecodeErrorZ");
+       *ret_conv = CResult_TxAckRbfDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxAckRbfDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxAckRbfDecodeErrorZ* arg_conv = (LDKCResult_TxAckRbfDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxAckRbfDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxAckRbfDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxAckRbfDecodeErrorZ* orig_conv = (LDKCResult_TxAckRbfDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxAckRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAckRbfDecodeErrorZ), "LDKCResult_TxAckRbfDecodeErrorZ");
+       *ret_conv = CResult_TxAckRbfDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxAbortDecodeErrorZ_ok(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 = TxAbort_clone(&o_conv);
+       LDKCResult_TxAbortDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAbortDecodeErrorZ), "LDKCResult_TxAbortDecodeErrorZ");
+       *ret_conv = CResult_TxAbortDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxAbortDecodeErrorZ_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_TxAbortDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAbortDecodeErrorZ), "LDKCResult_TxAbortDecodeErrorZ");
+       *ret_conv = CResult_TxAbortDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxAbortDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxAbortDecodeErrorZ* o_conv = (LDKCResult_TxAbortDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxAbortDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxAbortDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxAbortDecodeErrorZ _res_conv = *(LDKCResult_TxAbortDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxAbortDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxAbortDecodeErrorZ_clone_ptr(LDKCResult_TxAbortDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxAbortDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAbortDecodeErrorZ), "LDKCResult_TxAbortDecodeErrorZ");
+       *ret_conv = CResult_TxAbortDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxAbortDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxAbortDecodeErrorZ* arg_conv = (LDKCResult_TxAbortDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxAbortDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxAbortDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxAbortDecodeErrorZ* orig_conv = (LDKCResult_TxAbortDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxAbortDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAbortDecodeErrorZ), "LDKCResult_TxAbortDecodeErrorZ");
+       *ret_conv = CResult_TxAbortDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_AnnouncementSignaturesDecodeErrorZ_ok(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 = AnnouncementSignatures_clone(&o_conv);
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AnnouncementSignaturesDecodeErrorZ), "LDKCResult_AnnouncementSignaturesDecodeErrorZ");
+       *ret_conv = CResult_AnnouncementSignaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_AnnouncementSignaturesDecodeErrorZ_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_AnnouncementSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AnnouncementSignaturesDecodeErrorZ), "LDKCResult_AnnouncementSignaturesDecodeErrorZ");
+       *ret_conv = CResult_AnnouncementSignaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_AnnouncementSignaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* o_conv = (LDKCResult_AnnouncementSignaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_AnnouncementSignaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_AnnouncementSignaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ _res_conv = *(LDKCResult_AnnouncementSignaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_AnnouncementSignaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_AnnouncementSignaturesDecodeErrorZ_clone_ptr(LDKCResult_AnnouncementSignaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AnnouncementSignaturesDecodeErrorZ), "LDKCResult_AnnouncementSignaturesDecodeErrorZ");
+       *ret_conv = CResult_AnnouncementSignaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_AnnouncementSignaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* arg_conv = (LDKCResult_AnnouncementSignaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_AnnouncementSignaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_AnnouncementSignaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* orig_conv = (LDKCResult_AnnouncementSignaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AnnouncementSignaturesDecodeErrorZ), "LDKCResult_AnnouncementSignaturesDecodeErrorZ");
+       *ret_conv = CResult_AnnouncementSignaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelReestablishDecodeErrorZ_ok(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 = ChannelReestablish_clone(&o_conv);
+       LDKCResult_ChannelReestablishDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReestablishDecodeErrorZ), "LDKCResult_ChannelReestablishDecodeErrorZ");
+       *ret_conv = CResult_ChannelReestablishDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelReestablishDecodeErrorZ_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_ChannelReestablishDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReestablishDecodeErrorZ), "LDKCResult_ChannelReestablishDecodeErrorZ");
+       *ret_conv = CResult_ChannelReestablishDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelReestablishDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelReestablishDecodeErrorZ* o_conv = (LDKCResult_ChannelReestablishDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelReestablishDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelReestablishDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelReestablishDecodeErrorZ _res_conv = *(LDKCResult_ChannelReestablishDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelReestablishDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelReestablishDecodeErrorZ_clone_ptr(LDKCResult_ChannelReestablishDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelReestablishDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReestablishDecodeErrorZ), "LDKCResult_ChannelReestablishDecodeErrorZ");
+       *ret_conv = CResult_ChannelReestablishDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelReestablishDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelReestablishDecodeErrorZ* arg_conv = (LDKCResult_ChannelReestablishDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelReestablishDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelReestablishDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelReestablishDecodeErrorZ* orig_conv = (LDKCResult_ChannelReestablishDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelReestablishDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReestablishDecodeErrorZ), "LDKCResult_ChannelReestablishDecodeErrorZ");
+       *ret_conv = CResult_ChannelReestablishDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ClosingSignedDecodeErrorZ_ok(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 = ClosingSigned_clone(&o_conv);
+       LDKCResult_ClosingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedDecodeErrorZ), "LDKCResult_ClosingSignedDecodeErrorZ");
+       *ret_conv = CResult_ClosingSignedDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ClosingSignedDecodeErrorZ_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_ClosingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedDecodeErrorZ), "LDKCResult_ClosingSignedDecodeErrorZ");
+       *ret_conv = CResult_ClosingSignedDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ClosingSignedDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ClosingSignedDecodeErrorZ* o_conv = (LDKCResult_ClosingSignedDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ClosingSignedDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ClosingSignedDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ClosingSignedDecodeErrorZ _res_conv = *(LDKCResult_ClosingSignedDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ClosingSignedDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ClosingSignedDecodeErrorZ_clone_ptr(LDKCResult_ClosingSignedDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ClosingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedDecodeErrorZ), "LDKCResult_ClosingSignedDecodeErrorZ");
+       *ret_conv = CResult_ClosingSignedDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ClosingSignedDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ClosingSignedDecodeErrorZ* arg_conv = (LDKCResult_ClosingSignedDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ClosingSignedDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ClosingSignedDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ClosingSignedDecodeErrorZ* orig_conv = (LDKCResult_ClosingSignedDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ClosingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedDecodeErrorZ), "LDKCResult_ClosingSignedDecodeErrorZ");
+       *ret_conv = CResult_ClosingSignedDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ClosingSignedFeeRangeDecodeErrorZ_ok(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 = ClosingSignedFeeRange_clone(&o_conv);
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ), "LDKCResult_ClosingSignedFeeRangeDecodeErrorZ");
+       *ret_conv = CResult_ClosingSignedFeeRangeDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ClosingSignedFeeRangeDecodeErrorZ_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_ClosingSignedFeeRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ), "LDKCResult_ClosingSignedFeeRangeDecodeErrorZ");
+       *ret_conv = CResult_ClosingSignedFeeRangeDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ClosingSignedFeeRangeDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* o_conv = (LDKCResult_ClosingSignedFeeRangeDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ClosingSignedFeeRangeDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ClosingSignedFeeRangeDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ _res_conv = *(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ClosingSignedFeeRangeDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ClosingSignedFeeRangeDecodeErrorZ_clone_ptr(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ), "LDKCResult_ClosingSignedFeeRangeDecodeErrorZ");
+       *ret_conv = CResult_ClosingSignedFeeRangeDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ClosingSignedFeeRangeDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* arg_conv = (LDKCResult_ClosingSignedFeeRangeDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ClosingSignedFeeRangeDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ClosingSignedFeeRangeDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* orig_conv = (LDKCResult_ClosingSignedFeeRangeDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ), "LDKCResult_ClosingSignedFeeRangeDecodeErrorZ");
+       *ret_conv = CResult_ClosingSignedFeeRangeDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CommitmentSignedDecodeErrorZ_ok(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 = CommitmentSigned_clone(&o_conv);
+       LDKCResult_CommitmentSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentSignedDecodeErrorZ), "LDKCResult_CommitmentSignedDecodeErrorZ");
+       *ret_conv = CResult_CommitmentSignedDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CommitmentSignedDecodeErrorZ_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_CommitmentSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentSignedDecodeErrorZ), "LDKCResult_CommitmentSignedDecodeErrorZ");
+       *ret_conv = CResult_CommitmentSignedDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CommitmentSignedDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_CommitmentSignedDecodeErrorZ* o_conv = (LDKCResult_CommitmentSignedDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CommitmentSignedDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CommitmentSignedDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CommitmentSignedDecodeErrorZ _res_conv = *(LDKCResult_CommitmentSignedDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CommitmentSignedDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CommitmentSignedDecodeErrorZ_clone_ptr(LDKCResult_CommitmentSignedDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CommitmentSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentSignedDecodeErrorZ), "LDKCResult_CommitmentSignedDecodeErrorZ");
+       *ret_conv = CResult_CommitmentSignedDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CommitmentSignedDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CommitmentSignedDecodeErrorZ* arg_conv = (LDKCResult_CommitmentSignedDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CommitmentSignedDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CommitmentSignedDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_CommitmentSignedDecodeErrorZ* orig_conv = (LDKCResult_CommitmentSignedDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_CommitmentSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentSignedDecodeErrorZ), "LDKCResult_CommitmentSignedDecodeErrorZ");
+       *ret_conv = CResult_CommitmentSignedDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_FundingCreatedDecodeErrorZ_ok(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 = FundingCreated_clone(&o_conv);
+       LDKCResult_FundingCreatedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingCreatedDecodeErrorZ), "LDKCResult_FundingCreatedDecodeErrorZ");
+       *ret_conv = CResult_FundingCreatedDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_FundingCreatedDecodeErrorZ_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_FundingCreatedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingCreatedDecodeErrorZ), "LDKCResult_FundingCreatedDecodeErrorZ");
+       *ret_conv = CResult_FundingCreatedDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_FundingCreatedDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_FundingCreatedDecodeErrorZ* o_conv = (LDKCResult_FundingCreatedDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_FundingCreatedDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_FundingCreatedDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_FundingCreatedDecodeErrorZ _res_conv = *(LDKCResult_FundingCreatedDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_FundingCreatedDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_FundingCreatedDecodeErrorZ_clone_ptr(LDKCResult_FundingCreatedDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_FundingCreatedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingCreatedDecodeErrorZ), "LDKCResult_FundingCreatedDecodeErrorZ");
+       *ret_conv = CResult_FundingCreatedDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_FundingCreatedDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_FundingCreatedDecodeErrorZ* arg_conv = (LDKCResult_FundingCreatedDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_FundingCreatedDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_FundingCreatedDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_FundingCreatedDecodeErrorZ* orig_conv = (LDKCResult_FundingCreatedDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_FundingCreatedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingCreatedDecodeErrorZ), "LDKCResult_FundingCreatedDecodeErrorZ");
+       *ret_conv = CResult_FundingCreatedDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_FundingSignedDecodeErrorZ_ok(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 = FundingSigned_clone(&o_conv);
+       LDKCResult_FundingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingSignedDecodeErrorZ), "LDKCResult_FundingSignedDecodeErrorZ");
+       *ret_conv = CResult_FundingSignedDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_FundingSignedDecodeErrorZ_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_FundingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingSignedDecodeErrorZ), "LDKCResult_FundingSignedDecodeErrorZ");
+       *ret_conv = CResult_FundingSignedDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_FundingSignedDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_FundingSignedDecodeErrorZ* o_conv = (LDKCResult_FundingSignedDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_FundingSignedDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_FundingSignedDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_FundingSignedDecodeErrorZ _res_conv = *(LDKCResult_FundingSignedDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_FundingSignedDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_FundingSignedDecodeErrorZ_clone_ptr(LDKCResult_FundingSignedDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_FundingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingSignedDecodeErrorZ), "LDKCResult_FundingSignedDecodeErrorZ");
+       *ret_conv = CResult_FundingSignedDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_FundingSignedDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_FundingSignedDecodeErrorZ* arg_conv = (LDKCResult_FundingSignedDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_FundingSignedDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_FundingSignedDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_FundingSignedDecodeErrorZ* orig_conv = (LDKCResult_FundingSignedDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_FundingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingSignedDecodeErrorZ), "LDKCResult_FundingSignedDecodeErrorZ");
+       *ret_conv = CResult_FundingSignedDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelReadyDecodeErrorZ_ok(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 = ChannelReady_clone(&o_conv);
+       LDKCResult_ChannelReadyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReadyDecodeErrorZ), "LDKCResult_ChannelReadyDecodeErrorZ");
+       *ret_conv = CResult_ChannelReadyDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelReadyDecodeErrorZ_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_ChannelReadyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReadyDecodeErrorZ), "LDKCResult_ChannelReadyDecodeErrorZ");
+       *ret_conv = CResult_ChannelReadyDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelReadyDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelReadyDecodeErrorZ* o_conv = (LDKCResult_ChannelReadyDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelReadyDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelReadyDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelReadyDecodeErrorZ _res_conv = *(LDKCResult_ChannelReadyDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelReadyDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelReadyDecodeErrorZ_clone_ptr(LDKCResult_ChannelReadyDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelReadyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReadyDecodeErrorZ), "LDKCResult_ChannelReadyDecodeErrorZ");
+       *ret_conv = CResult_ChannelReadyDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelReadyDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelReadyDecodeErrorZ* arg_conv = (LDKCResult_ChannelReadyDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelReadyDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelReadyDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelReadyDecodeErrorZ* orig_conv = (LDKCResult_ChannelReadyDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelReadyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReadyDecodeErrorZ), "LDKCResult_ChannelReadyDecodeErrorZ");
+       *ret_conv = CResult_ChannelReadyDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_InitDecodeErrorZ_ok(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 = Init_clone(&o_conv);
+       LDKCResult_InitDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitDecodeErrorZ), "LDKCResult_InitDecodeErrorZ");
+       *ret_conv = CResult_InitDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_InitDecodeErrorZ_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_InitDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitDecodeErrorZ), "LDKCResult_InitDecodeErrorZ");
+       *ret_conv = CResult_InitDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_InitDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_InitDecodeErrorZ* o_conv = (LDKCResult_InitDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_InitDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_InitDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_InitDecodeErrorZ _res_conv = *(LDKCResult_InitDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_InitDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_InitDecodeErrorZ_clone_ptr(LDKCResult_InitDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_InitDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitDecodeErrorZ), "LDKCResult_InitDecodeErrorZ");
+       *ret_conv = CResult_InitDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_InitDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_InitDecodeErrorZ* arg_conv = (LDKCResult_InitDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_InitDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_InitDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_InitDecodeErrorZ* orig_conv = (LDKCResult_InitDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_InitDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitDecodeErrorZ), "LDKCResult_InitDecodeErrorZ");
+       *ret_conv = CResult_InitDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OpenChannelDecodeErrorZ_ok(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 = OpenChannel_clone(&o_conv);
+       LDKCResult_OpenChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelDecodeErrorZ), "LDKCResult_OpenChannelDecodeErrorZ");
+       *ret_conv = CResult_OpenChannelDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OpenChannelDecodeErrorZ_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_OpenChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelDecodeErrorZ), "LDKCResult_OpenChannelDecodeErrorZ");
+       *ret_conv = CResult_OpenChannelDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_OpenChannelDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_OpenChannelDecodeErrorZ* o_conv = (LDKCResult_OpenChannelDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_OpenChannelDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_OpenChannelDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_OpenChannelDecodeErrorZ _res_conv = *(LDKCResult_OpenChannelDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_OpenChannelDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_OpenChannelDecodeErrorZ_clone_ptr(LDKCResult_OpenChannelDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_OpenChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelDecodeErrorZ), "LDKCResult_OpenChannelDecodeErrorZ");
+       *ret_conv = CResult_OpenChannelDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_OpenChannelDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_OpenChannelDecodeErrorZ* arg_conv = (LDKCResult_OpenChannelDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_OpenChannelDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_OpenChannelDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_OpenChannelDecodeErrorZ* orig_conv = (LDKCResult_OpenChannelDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_OpenChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelDecodeErrorZ), "LDKCResult_OpenChannelDecodeErrorZ");
+       *ret_conv = CResult_OpenChannelDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OpenChannelV2DecodeErrorZ_ok(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 = OpenChannelV2_clone(&o_conv);
+       LDKCResult_OpenChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelV2DecodeErrorZ), "LDKCResult_OpenChannelV2DecodeErrorZ");
+       *ret_conv = CResult_OpenChannelV2DecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OpenChannelV2DecodeErrorZ_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_OpenChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelV2DecodeErrorZ), "LDKCResult_OpenChannelV2DecodeErrorZ");
+       *ret_conv = CResult_OpenChannelV2DecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_OpenChannelV2DecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_OpenChannelV2DecodeErrorZ* o_conv = (LDKCResult_OpenChannelV2DecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_OpenChannelV2DecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_OpenChannelV2DecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_OpenChannelV2DecodeErrorZ _res_conv = *(LDKCResult_OpenChannelV2DecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_OpenChannelV2DecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_OpenChannelV2DecodeErrorZ_clone_ptr(LDKCResult_OpenChannelV2DecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_OpenChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelV2DecodeErrorZ), "LDKCResult_OpenChannelV2DecodeErrorZ");
+       *ret_conv = CResult_OpenChannelV2DecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_OpenChannelV2DecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_OpenChannelV2DecodeErrorZ* arg_conv = (LDKCResult_OpenChannelV2DecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_OpenChannelV2DecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_OpenChannelV2DecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_OpenChannelV2DecodeErrorZ* orig_conv = (LDKCResult_OpenChannelV2DecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_OpenChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelV2DecodeErrorZ), "LDKCResult_OpenChannelV2DecodeErrorZ");
+       *ret_conv = CResult_OpenChannelV2DecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RevokeAndACKDecodeErrorZ_ok(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 = RevokeAndACK_clone(&o_conv);
+       LDKCResult_RevokeAndACKDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevokeAndACKDecodeErrorZ), "LDKCResult_RevokeAndACKDecodeErrorZ");
+       *ret_conv = CResult_RevokeAndACKDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RevokeAndACKDecodeErrorZ_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_RevokeAndACKDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevokeAndACKDecodeErrorZ), "LDKCResult_RevokeAndACKDecodeErrorZ");
+       *ret_conv = CResult_RevokeAndACKDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RevokeAndACKDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RevokeAndACKDecodeErrorZ* o_conv = (LDKCResult_RevokeAndACKDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RevokeAndACKDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RevokeAndACKDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RevokeAndACKDecodeErrorZ _res_conv = *(LDKCResult_RevokeAndACKDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RevokeAndACKDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RevokeAndACKDecodeErrorZ_clone_ptr(LDKCResult_RevokeAndACKDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RevokeAndACKDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevokeAndACKDecodeErrorZ), "LDKCResult_RevokeAndACKDecodeErrorZ");
+       *ret_conv = CResult_RevokeAndACKDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RevokeAndACKDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RevokeAndACKDecodeErrorZ* arg_conv = (LDKCResult_RevokeAndACKDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RevokeAndACKDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RevokeAndACKDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RevokeAndACKDecodeErrorZ* orig_conv = (LDKCResult_RevokeAndACKDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RevokeAndACKDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevokeAndACKDecodeErrorZ), "LDKCResult_RevokeAndACKDecodeErrorZ");
+       *ret_conv = CResult_RevokeAndACKDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ShutdownDecodeErrorZ_ok(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 = Shutdown_clone(&o_conv);
+       LDKCResult_ShutdownDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownDecodeErrorZ), "LDKCResult_ShutdownDecodeErrorZ");
+       *ret_conv = CResult_ShutdownDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ShutdownDecodeErrorZ_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_ShutdownDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownDecodeErrorZ), "LDKCResult_ShutdownDecodeErrorZ");
+       *ret_conv = CResult_ShutdownDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ShutdownDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ShutdownDecodeErrorZ* o_conv = (LDKCResult_ShutdownDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ShutdownDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ShutdownDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ShutdownDecodeErrorZ _res_conv = *(LDKCResult_ShutdownDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ShutdownDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ShutdownDecodeErrorZ_clone_ptr(LDKCResult_ShutdownDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ShutdownDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownDecodeErrorZ), "LDKCResult_ShutdownDecodeErrorZ");
+       *ret_conv = CResult_ShutdownDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ShutdownDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ShutdownDecodeErrorZ* arg_conv = (LDKCResult_ShutdownDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ShutdownDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ShutdownDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ShutdownDecodeErrorZ* orig_conv = (LDKCResult_ShutdownDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ShutdownDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownDecodeErrorZ), "LDKCResult_ShutdownDecodeErrorZ");
+       *ret_conv = CResult_ShutdownDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateFailHTLCDecodeErrorZ_ok(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 = UpdateFailHTLC_clone(&o_conv);
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailHTLCDecodeErrorZ), "LDKCResult_UpdateFailHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFailHTLCDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateFailHTLCDecodeErrorZ_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_UpdateFailHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailHTLCDecodeErrorZ), "LDKCResult_UpdateFailHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFailHTLCDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UpdateFailHTLCDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* o_conv = (LDKCResult_UpdateFailHTLCDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UpdateFailHTLCDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UpdateFailHTLCDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UpdateFailHTLCDecodeErrorZ _res_conv = *(LDKCResult_UpdateFailHTLCDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UpdateFailHTLCDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UpdateFailHTLCDecodeErrorZ_clone_ptr(LDKCResult_UpdateFailHTLCDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailHTLCDecodeErrorZ), "LDKCResult_UpdateFailHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFailHTLCDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UpdateFailHTLCDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* arg_conv = (LDKCResult_UpdateFailHTLCDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UpdateFailHTLCDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UpdateFailHTLCDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* orig_conv = (LDKCResult_UpdateFailHTLCDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailHTLCDecodeErrorZ), "LDKCResult_UpdateFailHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFailHTLCDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateFailMalformedHTLCDecodeErrorZ_ok(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 = UpdateFailMalformedHTLC_clone(&o_conv);
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ), "LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFailMalformedHTLCDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateFailMalformedHTLCDecodeErrorZ_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_UpdateFailMalformedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ), "LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFailMalformedHTLCDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UpdateFailMalformedHTLCDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* o_conv = (LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UpdateFailMalformedHTLCDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UpdateFailMalformedHTLCDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ _res_conv = *(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UpdateFailMalformedHTLCDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UpdateFailMalformedHTLCDecodeErrorZ_clone_ptr(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ), "LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFailMalformedHTLCDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UpdateFailMalformedHTLCDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* arg_conv = (LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UpdateFailMalformedHTLCDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UpdateFailMalformedHTLCDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* orig_conv = (LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ), "LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFailMalformedHTLCDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateFeeDecodeErrorZ_ok(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 = UpdateFee_clone(&o_conv);
+       LDKCResult_UpdateFeeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFeeDecodeErrorZ), "LDKCResult_UpdateFeeDecodeErrorZ");
+       *ret_conv = CResult_UpdateFeeDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateFeeDecodeErrorZ_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_UpdateFeeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFeeDecodeErrorZ), "LDKCResult_UpdateFeeDecodeErrorZ");
+       *ret_conv = CResult_UpdateFeeDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UpdateFeeDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UpdateFeeDecodeErrorZ* o_conv = (LDKCResult_UpdateFeeDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UpdateFeeDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UpdateFeeDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UpdateFeeDecodeErrorZ _res_conv = *(LDKCResult_UpdateFeeDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UpdateFeeDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UpdateFeeDecodeErrorZ_clone_ptr(LDKCResult_UpdateFeeDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UpdateFeeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFeeDecodeErrorZ), "LDKCResult_UpdateFeeDecodeErrorZ");
+       *ret_conv = CResult_UpdateFeeDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UpdateFeeDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UpdateFeeDecodeErrorZ* arg_conv = (LDKCResult_UpdateFeeDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UpdateFeeDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UpdateFeeDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UpdateFeeDecodeErrorZ* orig_conv = (LDKCResult_UpdateFeeDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UpdateFeeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFeeDecodeErrorZ), "LDKCResult_UpdateFeeDecodeErrorZ");
+       *ret_conv = CResult_UpdateFeeDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_ok(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 = UpdateFulfillHTLC_clone(&o_conv);
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFulfillHTLCDecodeErrorZ), "LDKCResult_UpdateFulfillHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFulfillHTLCDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_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_UpdateFulfillHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFulfillHTLCDecodeErrorZ), "LDKCResult_UpdateFulfillHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFulfillHTLCDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* o_conv = (LDKCResult_UpdateFulfillHTLCDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UpdateFulfillHTLCDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ _res_conv = *(LDKCResult_UpdateFulfillHTLCDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UpdateFulfillHTLCDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UpdateFulfillHTLCDecodeErrorZ_clone_ptr(LDKCResult_UpdateFulfillHTLCDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFulfillHTLCDecodeErrorZ), "LDKCResult_UpdateFulfillHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFulfillHTLCDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* arg_conv = (LDKCResult_UpdateFulfillHTLCDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UpdateFulfillHTLCDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* orig_conv = (LDKCResult_UpdateFulfillHTLCDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFulfillHTLCDecodeErrorZ), "LDKCResult_UpdateFulfillHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFulfillHTLCDecodeErrorZ_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);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = UpdateAddHTLC_clone(&o_conv);
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateAddHTLCDecodeErrorZ), "LDKCResult_UpdateAddHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateAddHTLCDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_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_UpdateAddHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateAddHTLCDecodeErrorZ), "LDKCResult_UpdateAddHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateAddHTLCDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* o_conv = (LDKCResult_UpdateAddHTLCDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UpdateAddHTLCDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UpdateAddHTLCDecodeErrorZ _res_conv = *(LDKCResult_UpdateAddHTLCDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UpdateAddHTLCDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UpdateAddHTLCDecodeErrorZ_clone_ptr(LDKCResult_UpdateAddHTLCDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateAddHTLCDecodeErrorZ), "LDKCResult_UpdateAddHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateAddHTLCDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* arg_conv = (LDKCResult_UpdateAddHTLCDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UpdateAddHTLCDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* orig_conv = (LDKCResult_UpdateAddHTLCDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateAddHTLCDecodeErrorZ), "LDKCResult_UpdateAddHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateAddHTLCDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OnionMessageDecodeErrorZ_ok(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 = OnionMessage_clone(&o_conv);
+       LDKCResult_OnionMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessageDecodeErrorZ), "LDKCResult_OnionMessageDecodeErrorZ");
+       *ret_conv = CResult_OnionMessageDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OnionMessageDecodeErrorZ_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_OnionMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessageDecodeErrorZ), "LDKCResult_OnionMessageDecodeErrorZ");
+       *ret_conv = CResult_OnionMessageDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_OnionMessageDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_OnionMessageDecodeErrorZ* o_conv = (LDKCResult_OnionMessageDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_OnionMessageDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_OnionMessageDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_OnionMessageDecodeErrorZ _res_conv = *(LDKCResult_OnionMessageDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_OnionMessageDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_OnionMessageDecodeErrorZ_clone_ptr(LDKCResult_OnionMessageDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_OnionMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessageDecodeErrorZ), "LDKCResult_OnionMessageDecodeErrorZ");
+       *ret_conv = CResult_OnionMessageDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_OnionMessageDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_OnionMessageDecodeErrorZ* arg_conv = (LDKCResult_OnionMessageDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_OnionMessageDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_OnionMessageDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_OnionMessageDecodeErrorZ* orig_conv = (LDKCResult_OnionMessageDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_OnionMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessageDecodeErrorZ), "LDKCResult_OnionMessageDecodeErrorZ");
+       *ret_conv = CResult_OnionMessageDecodeErrorZ_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);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = Ping_clone(&o_conv);
+       LDKCResult_PingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PingDecodeErrorZ), "LDKCResult_PingDecodeErrorZ");
+       *ret_conv = CResult_PingDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PingDecodeErrorZ_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_PingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PingDecodeErrorZ), "LDKCResult_PingDecodeErrorZ");
+       *ret_conv = CResult_PingDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PingDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PingDecodeErrorZ* o_conv = (LDKCResult_PingDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PingDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PingDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PingDecodeErrorZ _res_conv = *(LDKCResult_PingDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PingDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PingDecodeErrorZ_clone_ptr(LDKCResult_PingDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PingDecodeErrorZ), "LDKCResult_PingDecodeErrorZ");
+       *ret_conv = CResult_PingDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PingDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PingDecodeErrorZ* arg_conv = (LDKCResult_PingDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PingDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PingDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PingDecodeErrorZ* orig_conv = (LDKCResult_PingDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PingDecodeErrorZ), "LDKCResult_PingDecodeErrorZ");
+       *ret_conv = CResult_PingDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PongDecodeErrorZ_ok(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 = Pong_clone(&o_conv);
+       LDKCResult_PongDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PongDecodeErrorZ), "LDKCResult_PongDecodeErrorZ");
+       *ret_conv = CResult_PongDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PongDecodeErrorZ_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_PongDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PongDecodeErrorZ), "LDKCResult_PongDecodeErrorZ");
+       *ret_conv = CResult_PongDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PongDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PongDecodeErrorZ* o_conv = (LDKCResult_PongDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PongDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PongDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PongDecodeErrorZ _res_conv = *(LDKCResult_PongDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PongDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PongDecodeErrorZ_clone_ptr(LDKCResult_PongDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PongDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PongDecodeErrorZ), "LDKCResult_PongDecodeErrorZ");
+       *ret_conv = CResult_PongDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PongDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PongDecodeErrorZ* arg_conv = (LDKCResult_PongDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PongDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PongDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PongDecodeErrorZ* orig_conv = (LDKCResult_PongDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PongDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PongDecodeErrorZ), "LDKCResult_PongDecodeErrorZ");
+       *ret_conv = CResult_PongDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UnsignedChannelAnnouncementDecodeErrorZ_ok(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 = UnsignedChannelAnnouncement_clone(&o_conv);
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ), "LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_UnsignedChannelAnnouncementDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UnsignedChannelAnnouncementDecodeErrorZ_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_UnsignedChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ), "LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_UnsignedChannelAnnouncementDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UnsignedChannelAnnouncementDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* o_conv = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UnsignedChannelAnnouncementDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UnsignedChannelAnnouncementDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ _res_conv = *(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UnsignedChannelAnnouncementDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UnsignedChannelAnnouncementDecodeErrorZ_clone_ptr(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ), "LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_UnsignedChannelAnnouncementDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UnsignedChannelAnnouncementDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* arg_conv = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UnsignedChannelAnnouncementDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UnsignedChannelAnnouncementDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* orig_conv = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ), "LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_UnsignedChannelAnnouncementDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelAnnouncementDecodeErrorZ_ok(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 = ChannelAnnouncement_clone(&o_conv);
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelAnnouncementDecodeErrorZ), "LDKCResult_ChannelAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_ChannelAnnouncementDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelAnnouncementDecodeErrorZ_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_ChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelAnnouncementDecodeErrorZ), "LDKCResult_ChannelAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_ChannelAnnouncementDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelAnnouncementDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* o_conv = (LDKCResult_ChannelAnnouncementDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelAnnouncementDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelAnnouncementDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelAnnouncementDecodeErrorZ _res_conv = *(LDKCResult_ChannelAnnouncementDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelAnnouncementDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelAnnouncementDecodeErrorZ_clone_ptr(LDKCResult_ChannelAnnouncementDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelAnnouncementDecodeErrorZ), "LDKCResult_ChannelAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_ChannelAnnouncementDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelAnnouncementDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* arg_conv = (LDKCResult_ChannelAnnouncementDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelAnnouncementDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelAnnouncementDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* orig_conv = (LDKCResult_ChannelAnnouncementDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelAnnouncementDecodeErrorZ), "LDKCResult_ChannelAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_ChannelAnnouncementDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UnsignedChannelUpdateDecodeErrorZ_ok(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 = UnsignedChannelUpdate_clone(&o_conv);
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelUpdateDecodeErrorZ), "LDKCResult_UnsignedChannelUpdateDecodeErrorZ");
+       *ret_conv = CResult_UnsignedChannelUpdateDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UnsignedChannelUpdateDecodeErrorZ_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_UnsignedChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelUpdateDecodeErrorZ), "LDKCResult_UnsignedChannelUpdateDecodeErrorZ");
+       *ret_conv = CResult_UnsignedChannelUpdateDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UnsignedChannelUpdateDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* o_conv = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UnsignedChannelUpdateDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UnsignedChannelUpdateDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ _res_conv = *(LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UnsignedChannelUpdateDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UnsignedChannelUpdateDecodeErrorZ_clone_ptr(LDKCResult_UnsignedChannelUpdateDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelUpdateDecodeErrorZ), "LDKCResult_UnsignedChannelUpdateDecodeErrorZ");
+       *ret_conv = CResult_UnsignedChannelUpdateDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UnsignedChannelUpdateDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* arg_conv = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UnsignedChannelUpdateDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UnsignedChannelUpdateDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* orig_conv = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelUpdateDecodeErrorZ), "LDKCResult_UnsignedChannelUpdateDecodeErrorZ");
+       *ret_conv = CResult_UnsignedChannelUpdateDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelUpdateDecodeErrorZ_ok(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 = ChannelUpdate_clone(&o_conv);
+       LDKCResult_ChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateDecodeErrorZ), "LDKCResult_ChannelUpdateDecodeErrorZ");
+       *ret_conv = CResult_ChannelUpdateDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelUpdateDecodeErrorZ_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_ChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateDecodeErrorZ), "LDKCResult_ChannelUpdateDecodeErrorZ");
+       *ret_conv = CResult_ChannelUpdateDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelUpdateDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelUpdateDecodeErrorZ* o_conv = (LDKCResult_ChannelUpdateDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelUpdateDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelUpdateDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelUpdateDecodeErrorZ _res_conv = *(LDKCResult_ChannelUpdateDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelUpdateDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelUpdateDecodeErrorZ_clone_ptr(LDKCResult_ChannelUpdateDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateDecodeErrorZ), "LDKCResult_ChannelUpdateDecodeErrorZ");
+       *ret_conv = CResult_ChannelUpdateDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelUpdateDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelUpdateDecodeErrorZ* arg_conv = (LDKCResult_ChannelUpdateDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelUpdateDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelUpdateDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelUpdateDecodeErrorZ* orig_conv = (LDKCResult_ChannelUpdateDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateDecodeErrorZ), "LDKCResult_ChannelUpdateDecodeErrorZ");
+       *ret_conv = CResult_ChannelUpdateDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ErrorMessageDecodeErrorZ_ok(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 = ErrorMessage_clone(&o_conv);
+       LDKCResult_ErrorMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ErrorMessageDecodeErrorZ), "LDKCResult_ErrorMessageDecodeErrorZ");
+       *ret_conv = CResult_ErrorMessageDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ErrorMessageDecodeErrorZ_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_ErrorMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ErrorMessageDecodeErrorZ), "LDKCResult_ErrorMessageDecodeErrorZ");
+       *ret_conv = CResult_ErrorMessageDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ErrorMessageDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ErrorMessageDecodeErrorZ* o_conv = (LDKCResult_ErrorMessageDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ErrorMessageDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ErrorMessageDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ErrorMessageDecodeErrorZ _res_conv = *(LDKCResult_ErrorMessageDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ErrorMessageDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ErrorMessageDecodeErrorZ_clone_ptr(LDKCResult_ErrorMessageDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ErrorMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ErrorMessageDecodeErrorZ), "LDKCResult_ErrorMessageDecodeErrorZ");
+       *ret_conv = CResult_ErrorMessageDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ErrorMessageDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ErrorMessageDecodeErrorZ* arg_conv = (LDKCResult_ErrorMessageDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ErrorMessageDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ErrorMessageDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ErrorMessageDecodeErrorZ* orig_conv = (LDKCResult_ErrorMessageDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ErrorMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ErrorMessageDecodeErrorZ), "LDKCResult_ErrorMessageDecodeErrorZ");
+       *ret_conv = CResult_ErrorMessageDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_WarningMessageDecodeErrorZ_ok(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 = WarningMessage_clone(&o_conv);
+       LDKCResult_WarningMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WarningMessageDecodeErrorZ), "LDKCResult_WarningMessageDecodeErrorZ");
+       *ret_conv = CResult_WarningMessageDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_WarningMessageDecodeErrorZ_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_WarningMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WarningMessageDecodeErrorZ), "LDKCResult_WarningMessageDecodeErrorZ");
+       *ret_conv = CResult_WarningMessageDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_WarningMessageDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_WarningMessageDecodeErrorZ* o_conv = (LDKCResult_WarningMessageDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_WarningMessageDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_WarningMessageDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_WarningMessageDecodeErrorZ _res_conv = *(LDKCResult_WarningMessageDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_WarningMessageDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_WarningMessageDecodeErrorZ_clone_ptr(LDKCResult_WarningMessageDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_WarningMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WarningMessageDecodeErrorZ), "LDKCResult_WarningMessageDecodeErrorZ");
+       *ret_conv = CResult_WarningMessageDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_WarningMessageDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_WarningMessageDecodeErrorZ* arg_conv = (LDKCResult_WarningMessageDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_WarningMessageDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_WarningMessageDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_WarningMessageDecodeErrorZ* orig_conv = (LDKCResult_WarningMessageDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_WarningMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WarningMessageDecodeErrorZ), "LDKCResult_WarningMessageDecodeErrorZ");
+       *ret_conv = CResult_WarningMessageDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UnsignedNodeAnnouncementDecodeErrorZ_ok(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 = UnsignedNodeAnnouncement_clone(&o_conv);
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ), "LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_UnsignedNodeAnnouncementDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UnsignedNodeAnnouncementDecodeErrorZ_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_UnsignedNodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ), "LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_UnsignedNodeAnnouncementDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UnsignedNodeAnnouncementDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* o_conv = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UnsignedNodeAnnouncementDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UnsignedNodeAnnouncementDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ _res_conv = *(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UnsignedNodeAnnouncementDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UnsignedNodeAnnouncementDecodeErrorZ_clone_ptr(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ), "LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_UnsignedNodeAnnouncementDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UnsignedNodeAnnouncementDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* arg_conv = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UnsignedNodeAnnouncementDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UnsignedNodeAnnouncementDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* orig_conv = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ), "LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_UnsignedNodeAnnouncementDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeAnnouncementDecodeErrorZ_ok(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 = NodeAnnouncement_clone(&o_conv);
+       LDKCResult_NodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementDecodeErrorZ), "LDKCResult_NodeAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeAnnouncementDecodeErrorZ_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_NodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementDecodeErrorZ), "LDKCResult_NodeAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NodeAnnouncementDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_NodeAnnouncementDecodeErrorZ* o_conv = (LDKCResult_NodeAnnouncementDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NodeAnnouncementDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NodeAnnouncementDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NodeAnnouncementDecodeErrorZ _res_conv = *(LDKCResult_NodeAnnouncementDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NodeAnnouncementDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NodeAnnouncementDecodeErrorZ_clone_ptr(LDKCResult_NodeAnnouncementDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementDecodeErrorZ), "LDKCResult_NodeAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NodeAnnouncementDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NodeAnnouncementDecodeErrorZ* arg_conv = (LDKCResult_NodeAnnouncementDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NodeAnnouncementDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NodeAnnouncementDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_NodeAnnouncementDecodeErrorZ* orig_conv = (LDKCResult_NodeAnnouncementDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_NodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementDecodeErrorZ), "LDKCResult_NodeAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_QueryShortChannelIdsDecodeErrorZ_ok(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 = QueryShortChannelIds_clone(&o_conv);
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryShortChannelIdsDecodeErrorZ), "LDKCResult_QueryShortChannelIdsDecodeErrorZ");
+       *ret_conv = CResult_QueryShortChannelIdsDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_QueryShortChannelIdsDecodeErrorZ_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_QueryShortChannelIdsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryShortChannelIdsDecodeErrorZ), "LDKCResult_QueryShortChannelIdsDecodeErrorZ");
+       *ret_conv = CResult_QueryShortChannelIdsDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_QueryShortChannelIdsDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* o_conv = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_QueryShortChannelIdsDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_QueryShortChannelIdsDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ _res_conv = *(LDKCResult_QueryShortChannelIdsDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_QueryShortChannelIdsDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_QueryShortChannelIdsDecodeErrorZ_clone_ptr(LDKCResult_QueryShortChannelIdsDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryShortChannelIdsDecodeErrorZ), "LDKCResult_QueryShortChannelIdsDecodeErrorZ");
+       *ret_conv = CResult_QueryShortChannelIdsDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_QueryShortChannelIdsDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* arg_conv = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_QueryShortChannelIdsDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_QueryShortChannelIdsDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* orig_conv = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryShortChannelIdsDecodeErrorZ), "LDKCResult_QueryShortChannelIdsDecodeErrorZ");
+       *ret_conv = CResult_QueryShortChannelIdsDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ReplyShortChannelIdsEndDecodeErrorZ_ok(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 = ReplyShortChannelIdsEnd_clone(&o_conv);
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ), "LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ");
+       *ret_conv = CResult_ReplyShortChannelIdsEndDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ReplyShortChannelIdsEndDecodeErrorZ_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_ReplyShortChannelIdsEndDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ), "LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ");
+       *ret_conv = CResult_ReplyShortChannelIdsEndDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ReplyShortChannelIdsEndDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* o_conv = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ReplyShortChannelIdsEndDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ReplyShortChannelIdsEndDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ _res_conv = *(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ReplyShortChannelIdsEndDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ReplyShortChannelIdsEndDecodeErrorZ_clone_ptr(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ), "LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ");
+       *ret_conv = CResult_ReplyShortChannelIdsEndDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ReplyShortChannelIdsEndDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* arg_conv = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ReplyShortChannelIdsEndDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ReplyShortChannelIdsEndDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* orig_conv = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ), "LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ");
+       *ret_conv = CResult_ReplyShortChannelIdsEndDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_QueryChannelRangeDecodeErrorZ_ok(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 = QueryChannelRange_clone(&o_conv);
+       LDKCResult_QueryChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryChannelRangeDecodeErrorZ), "LDKCResult_QueryChannelRangeDecodeErrorZ");
+       *ret_conv = CResult_QueryChannelRangeDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_QueryChannelRangeDecodeErrorZ_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_QueryChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryChannelRangeDecodeErrorZ), "LDKCResult_QueryChannelRangeDecodeErrorZ");
+       *ret_conv = CResult_QueryChannelRangeDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_QueryChannelRangeDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_QueryChannelRangeDecodeErrorZ* o_conv = (LDKCResult_QueryChannelRangeDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_QueryChannelRangeDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_QueryChannelRangeDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_QueryChannelRangeDecodeErrorZ _res_conv = *(LDKCResult_QueryChannelRangeDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_QueryChannelRangeDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_QueryChannelRangeDecodeErrorZ_clone_ptr(LDKCResult_QueryChannelRangeDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_QueryChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryChannelRangeDecodeErrorZ), "LDKCResult_QueryChannelRangeDecodeErrorZ");
+       *ret_conv = CResult_QueryChannelRangeDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_QueryChannelRangeDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_QueryChannelRangeDecodeErrorZ* arg_conv = (LDKCResult_QueryChannelRangeDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_QueryChannelRangeDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_QueryChannelRangeDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_QueryChannelRangeDecodeErrorZ* orig_conv = (LDKCResult_QueryChannelRangeDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_QueryChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryChannelRangeDecodeErrorZ), "LDKCResult_QueryChannelRangeDecodeErrorZ");
+       *ret_conv = CResult_QueryChannelRangeDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ReplyChannelRangeDecodeErrorZ_ok(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 = ReplyChannelRange_clone(&o_conv);
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyChannelRangeDecodeErrorZ), "LDKCResult_ReplyChannelRangeDecodeErrorZ");
+       *ret_conv = CResult_ReplyChannelRangeDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ReplyChannelRangeDecodeErrorZ_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_ReplyChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyChannelRangeDecodeErrorZ), "LDKCResult_ReplyChannelRangeDecodeErrorZ");
+       *ret_conv = CResult_ReplyChannelRangeDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ReplyChannelRangeDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* o_conv = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ReplyChannelRangeDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ReplyChannelRangeDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ReplyChannelRangeDecodeErrorZ _res_conv = *(LDKCResult_ReplyChannelRangeDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ReplyChannelRangeDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ReplyChannelRangeDecodeErrorZ_clone_ptr(LDKCResult_ReplyChannelRangeDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyChannelRangeDecodeErrorZ), "LDKCResult_ReplyChannelRangeDecodeErrorZ");
+       *ret_conv = CResult_ReplyChannelRangeDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ReplyChannelRangeDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* arg_conv = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ReplyChannelRangeDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ReplyChannelRangeDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* orig_conv = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyChannelRangeDecodeErrorZ), "LDKCResult_ReplyChannelRangeDecodeErrorZ");
+       *ret_conv = CResult_ReplyChannelRangeDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_ok(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 = GossipTimestampFilter_clone(&o_conv);
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_GossipTimestampFilterDecodeErrorZ), "LDKCResult_GossipTimestampFilterDecodeErrorZ");
+       *ret_conv = CResult_GossipTimestampFilterDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_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_GossipTimestampFilterDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_GossipTimestampFilterDecodeErrorZ), "LDKCResult_GossipTimestampFilterDecodeErrorZ");
+       *ret_conv = CResult_GossipTimestampFilterDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* o_conv = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_GossipTimestampFilterDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_GossipTimestampFilterDecodeErrorZ _res_conv = *(LDKCResult_GossipTimestampFilterDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_GossipTimestampFilterDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_GossipTimestampFilterDecodeErrorZ_clone_ptr(LDKCResult_GossipTimestampFilterDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_GossipTimestampFilterDecodeErrorZ), "LDKCResult_GossipTimestampFilterDecodeErrorZ");
+       *ret_conv = CResult_GossipTimestampFilterDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* arg_conv = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_GossipTimestampFilterDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* orig_conv = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_GossipTimestampFilterDecodeErrorZ), "LDKCResult_GossipTimestampFilterDecodeErrorZ");
+       *ret_conv = CResult_GossipTimestampFilterDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_PhantomRouteHintsZ_free(int64_tArray _res) {
+       LDKCVec_PhantomRouteHintsZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKPhantomRouteHints), "LDKCVec_PhantomRouteHintsZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t t = 0; t < _res_constr.datalen; t++) {
+               int64_t _res_conv_19 = _res_vals[t];
+               LDKPhantomRouteHints _res_conv_19_conv;
+               _res_conv_19_conv.inner = untag_ptr(_res_conv_19);
+               _res_conv_19_conv.is_owned = ptr_is_owned(_res_conv_19);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_19_conv);
+               _res_constr.data[t] = _res_conv_19_conv;
+       }
+       FREE(_res);
+       CVec_PhantomRouteHintsZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_ok(int64_t o) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_clone(&o_conv);
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceSignOrCreationErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKSignOrCreationError e_conv = *(LDKSignOrCreationError*)(e_ptr);
+       e_conv = SignOrCreationError_clone((LDKSignOrCreationError*)untag_ptr(e));
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceSignOrCreationErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_is_ok(int64_t o) {
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* o_conv = (LDKCResult_Bolt11InvoiceSignOrCreationErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_Bolt11InvoiceSignOrCreationErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ _res_conv = *(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_Bolt11InvoiceSignOrCreationErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_Bolt11InvoiceSignOrCreationErrorZ_clone_ptr(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ *NONNULL_PTR arg) {
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceSignOrCreationErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* arg_conv = (LDKCResult_Bolt11InvoiceSignOrCreationErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_Bolt11InvoiceSignOrCreationErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_clone(int64_t orig) {
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* orig_conv = (LDKCResult_Bolt11InvoiceSignOrCreationErrorZ*)untag_ptr(orig);
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceSignOrCreationErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_FutureZ_free(int64_tArray _res) {
+       LDKCVec_FutureZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKFuture), "LDKCVec_FutureZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t i = 0; i < _res_constr.datalen; i++) {
+               int64_t _res_conv_8 = _res_vals[i];
+               LDKFuture _res_conv_8_conv;
+               _res_conv_8_conv.inner = untag_ptr(_res_conv_8);
+               _res_conv_8_conv.is_owned = ptr_is_owned(_res_conv_8);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_8_conv);
+               _res_constr.data[i] = _res_conv_8_conv;
+       }
+       FREE(_res);
+       CVec_FutureZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_OffersMessageDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKOffersMessage o_conv = *(LDKOffersMessage*)(o_ptr);
+       o_conv = OffersMessage_clone((LDKOffersMessage*)untag_ptr(o));
+       LDKCResult_OffersMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OffersMessageDecodeErrorZ), "LDKCResult_OffersMessageDecodeErrorZ");
+       *ret_conv = CResult_OffersMessageDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OffersMessageDecodeErrorZ_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_OffersMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OffersMessageDecodeErrorZ), "LDKCResult_OffersMessageDecodeErrorZ");
+       *ret_conv = CResult_OffersMessageDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_OffersMessageDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_OffersMessageDecodeErrorZ* o_conv = (LDKCResult_OffersMessageDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_OffersMessageDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_OffersMessageDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_OffersMessageDecodeErrorZ _res_conv = *(LDKCResult_OffersMessageDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_OffersMessageDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_OffersMessageDecodeErrorZ_clone_ptr(LDKCResult_OffersMessageDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_OffersMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OffersMessageDecodeErrorZ), "LDKCResult_OffersMessageDecodeErrorZ");
+       *ret_conv = CResult_OffersMessageDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_OffersMessageDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_OffersMessageDecodeErrorZ* arg_conv = (LDKCResult_OffersMessageDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_OffersMessageDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_OffersMessageDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_OffersMessageDecodeErrorZ* orig_conv = (LDKCResult_OffersMessageDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_OffersMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OffersMessageDecodeErrorZ), "LDKCResult_OffersMessageDecodeErrorZ");
+       *ret_conv = CResult_OffersMessageDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_HTLCClaimZ_some(int32_t o) {
+       LDKHTLCClaim o_conv = LDKHTLCClaim_from_cs(o);
+       LDKCOption_HTLCClaimZ *ret_copy = MALLOC(sizeof(LDKCOption_HTLCClaimZ), "LDKCOption_HTLCClaimZ");
+       *ret_copy = COption_HTLCClaimZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_HTLCClaimZ_none() {
+       LDKCOption_HTLCClaimZ *ret_copy = MALLOC(sizeof(LDKCOption_HTLCClaimZ), "LDKCOption_HTLCClaimZ");
+       *ret_copy = COption_HTLCClaimZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_HTLCClaimZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_HTLCClaimZ _res_conv = *(LDKCOption_HTLCClaimZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_HTLCClaimZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_CounterpartyCommitmentSecretsDecodeErrorZ_ok(int64_t o) {
+       LDKCounterpartyCommitmentSecrets 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 = CounterpartyCommitmentSecrets_clone(&o_conv);
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ), "LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyCommitmentSecretsDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CounterpartyCommitmentSecretsDecodeErrorZ_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_CounterpartyCommitmentSecretsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ), "LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyCommitmentSecretsDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CounterpartyCommitmentSecretsDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* o_conv = (LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CounterpartyCommitmentSecretsDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CounterpartyCommitmentSecretsDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ _res_conv = *(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CounterpartyCommitmentSecretsDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CounterpartyCommitmentSecretsDecodeErrorZ_clone_ptr(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ), "LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyCommitmentSecretsDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CounterpartyCommitmentSecretsDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* arg_conv = (LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CounterpartyCommitmentSecretsDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CounterpartyCommitmentSecretsDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* orig_conv = (LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ), "LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyCommitmentSecretsDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxCreationKeysDecodeErrorZ_ok(int64_t o) {
+       LDKTxCreationKeys 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 = TxCreationKeys_clone(&o_conv);
+       LDKCResult_TxCreationKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCreationKeysDecodeErrorZ), "LDKCResult_TxCreationKeysDecodeErrorZ");
+       *ret_conv = CResult_TxCreationKeysDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxCreationKeysDecodeErrorZ_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_TxCreationKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCreationKeysDecodeErrorZ), "LDKCResult_TxCreationKeysDecodeErrorZ");
+       *ret_conv = CResult_TxCreationKeysDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxCreationKeysDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxCreationKeysDecodeErrorZ* o_conv = (LDKCResult_TxCreationKeysDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxCreationKeysDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxCreationKeysDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxCreationKeysDecodeErrorZ _res_conv = *(LDKCResult_TxCreationKeysDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxCreationKeysDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxCreationKeysDecodeErrorZ_clone_ptr(LDKCResult_TxCreationKeysDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxCreationKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCreationKeysDecodeErrorZ), "LDKCResult_TxCreationKeysDecodeErrorZ");
+       *ret_conv = CResult_TxCreationKeysDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxCreationKeysDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxCreationKeysDecodeErrorZ* arg_conv = (LDKCResult_TxCreationKeysDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxCreationKeysDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxCreationKeysDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxCreationKeysDecodeErrorZ* orig_conv = (LDKCResult_TxCreationKeysDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxCreationKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCreationKeysDecodeErrorZ), "LDKCResult_TxCreationKeysDecodeErrorZ");
+       *ret_conv = CResult_TxCreationKeysDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelPublicKeysDecodeErrorZ_ok(int64_t o) {
+       LDKChannelPublicKeys 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 = ChannelPublicKeys_clone(&o_conv);
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelPublicKeysDecodeErrorZ), "LDKCResult_ChannelPublicKeysDecodeErrorZ");
+       *ret_conv = CResult_ChannelPublicKeysDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelPublicKeysDecodeErrorZ_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_ChannelPublicKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelPublicKeysDecodeErrorZ), "LDKCResult_ChannelPublicKeysDecodeErrorZ");
+       *ret_conv = CResult_ChannelPublicKeysDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelPublicKeysDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* o_conv = (LDKCResult_ChannelPublicKeysDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelPublicKeysDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelPublicKeysDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelPublicKeysDecodeErrorZ _res_conv = *(LDKCResult_ChannelPublicKeysDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelPublicKeysDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelPublicKeysDecodeErrorZ_clone_ptr(LDKCResult_ChannelPublicKeysDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelPublicKeysDecodeErrorZ), "LDKCResult_ChannelPublicKeysDecodeErrorZ");
+       *ret_conv = CResult_ChannelPublicKeysDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelPublicKeysDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* arg_conv = (LDKCResult_ChannelPublicKeysDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelPublicKeysDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelPublicKeysDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* orig_conv = (LDKCResult_ChannelPublicKeysDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelPublicKeysDecodeErrorZ), "LDKCResult_ChannelPublicKeysDecodeErrorZ");
+       *ret_conv = CResult_ChannelPublicKeysDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HTLCOutputInCommitmentDecodeErrorZ_ok(int64_t o) {
+       LDKHTLCOutputInCommitment 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 = HTLCOutputInCommitment_clone(&o_conv);
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ), "LDKCResult_HTLCOutputInCommitmentDecodeErrorZ");
+       *ret_conv = CResult_HTLCOutputInCommitmentDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HTLCOutputInCommitmentDecodeErrorZ_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_HTLCOutputInCommitmentDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ), "LDKCResult_HTLCOutputInCommitmentDecodeErrorZ");
+       *ret_conv = CResult_HTLCOutputInCommitmentDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_HTLCOutputInCommitmentDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* o_conv = (LDKCResult_HTLCOutputInCommitmentDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_HTLCOutputInCommitmentDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_HTLCOutputInCommitmentDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ _res_conv = *(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_HTLCOutputInCommitmentDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_HTLCOutputInCommitmentDecodeErrorZ_clone_ptr(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ), "LDKCResult_HTLCOutputInCommitmentDecodeErrorZ");
+       *ret_conv = CResult_HTLCOutputInCommitmentDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_HTLCOutputInCommitmentDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* arg_conv = (LDKCResult_HTLCOutputInCommitmentDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_HTLCOutputInCommitmentDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_HTLCOutputInCommitmentDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* orig_conv = (LDKCResult_HTLCOutputInCommitmentDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ), "LDKCResult_HTLCOutputInCommitmentDecodeErrorZ");
+       *ret_conv = CResult_HTLCOutputInCommitmentDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_ok(int64_t o) {
+       LDKCounterpartyChannelTransactionParameters 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 = CounterpartyChannelTransactionParameters_clone(&o_conv);
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ), "LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_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_CounterpartyChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ), "LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* o_conv = (LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ _res_conv = *(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_clone_ptr(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ), "LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* arg_conv = (LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* orig_conv = (LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ), "LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelTransactionParametersDecodeErrorZ_ok(int64_t o) {
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_clone(&o_conv);
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTransactionParametersDecodeErrorZ), "LDKCResult_ChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CResult_ChannelTransactionParametersDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelTransactionParametersDecodeErrorZ_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_ChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTransactionParametersDecodeErrorZ), "LDKCResult_ChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CResult_ChannelTransactionParametersDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelTransactionParametersDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* o_conv = (LDKCResult_ChannelTransactionParametersDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelTransactionParametersDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelTransactionParametersDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ _res_conv = *(LDKCResult_ChannelTransactionParametersDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelTransactionParametersDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelTransactionParametersDecodeErrorZ_clone_ptr(LDKCResult_ChannelTransactionParametersDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTransactionParametersDecodeErrorZ), "LDKCResult_ChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CResult_ChannelTransactionParametersDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelTransactionParametersDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* arg_conv = (LDKCResult_ChannelTransactionParametersDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelTransactionParametersDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelTransactionParametersDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* orig_conv = (LDKCResult_ChannelTransactionParametersDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTransactionParametersDecodeErrorZ), "LDKCResult_ChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CResult_ChannelTransactionParametersDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HolderCommitmentTransactionDecodeErrorZ_ok(int64_t o) {
+       LDKHolderCommitmentTransaction 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 = HolderCommitmentTransaction_clone(&o_conv);
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HolderCommitmentTransactionDecodeErrorZ), "LDKCResult_HolderCommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_HolderCommitmentTransactionDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HolderCommitmentTransactionDecodeErrorZ_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_HolderCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HolderCommitmentTransactionDecodeErrorZ), "LDKCResult_HolderCommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_HolderCommitmentTransactionDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_HolderCommitmentTransactionDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* o_conv = (LDKCResult_HolderCommitmentTransactionDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_HolderCommitmentTransactionDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_HolderCommitmentTransactionDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ _res_conv = *(LDKCResult_HolderCommitmentTransactionDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_HolderCommitmentTransactionDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_HolderCommitmentTransactionDecodeErrorZ_clone_ptr(LDKCResult_HolderCommitmentTransactionDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HolderCommitmentTransactionDecodeErrorZ), "LDKCResult_HolderCommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_HolderCommitmentTransactionDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_HolderCommitmentTransactionDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* arg_conv = (LDKCResult_HolderCommitmentTransactionDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_HolderCommitmentTransactionDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_HolderCommitmentTransactionDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* orig_conv = (LDKCResult_HolderCommitmentTransactionDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HolderCommitmentTransactionDecodeErrorZ), "LDKCResult_HolderCommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_HolderCommitmentTransactionDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BuiltCommitmentTransactionDecodeErrorZ_ok(int64_t o) {
+       LDKBuiltCommitmentTransaction 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 = BuiltCommitmentTransaction_clone(&o_conv);
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ), "LDKCResult_BuiltCommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_BuiltCommitmentTransactionDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BuiltCommitmentTransactionDecodeErrorZ_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_BuiltCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ), "LDKCResult_BuiltCommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_BuiltCommitmentTransactionDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BuiltCommitmentTransactionDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* o_conv = (LDKCResult_BuiltCommitmentTransactionDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BuiltCommitmentTransactionDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BuiltCommitmentTransactionDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ _res_conv = *(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BuiltCommitmentTransactionDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BuiltCommitmentTransactionDecodeErrorZ_clone_ptr(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ), "LDKCResult_BuiltCommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_BuiltCommitmentTransactionDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BuiltCommitmentTransactionDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* arg_conv = (LDKCResult_BuiltCommitmentTransactionDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BuiltCommitmentTransactionDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BuiltCommitmentTransactionDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* orig_conv = (LDKCResult_BuiltCommitmentTransactionDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ), "LDKCResult_BuiltCommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_BuiltCommitmentTransactionDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TrustedClosingTransactionNoneZ_ok(int64_t o) {
+       LDKTrustedClosingTransaction o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       // WARNING: we need a move here but no clone is available for LDKTrustedClosingTransaction
+       
+       LDKCResult_TrustedClosingTransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TrustedClosingTransactionNoneZ), "LDKCResult_TrustedClosingTransactionNoneZ");
+       *ret_conv = CResult_TrustedClosingTransactionNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TrustedClosingTransactionNoneZ_err() {
+       LDKCResult_TrustedClosingTransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TrustedClosingTransactionNoneZ), "LDKCResult_TrustedClosingTransactionNoneZ");
+       *ret_conv = CResult_TrustedClosingTransactionNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TrustedClosingTransactionNoneZ_is_ok(int64_t o) {
+       LDKCResult_TrustedClosingTransactionNoneZ* o_conv = (LDKCResult_TrustedClosingTransactionNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TrustedClosingTransactionNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TrustedClosingTransactionNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TrustedClosingTransactionNoneZ _res_conv = *(LDKCResult_TrustedClosingTransactionNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TrustedClosingTransactionNoneZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_CommitmentTransactionDecodeErrorZ_ok(int64_t o) {
+       LDKCommitmentTransaction 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 = CommitmentTransaction_clone(&o_conv);
+       LDKCResult_CommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentTransactionDecodeErrorZ), "LDKCResult_CommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_CommitmentTransactionDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CommitmentTransactionDecodeErrorZ_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_CommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentTransactionDecodeErrorZ), "LDKCResult_CommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_CommitmentTransactionDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CommitmentTransactionDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_CommitmentTransactionDecodeErrorZ* o_conv = (LDKCResult_CommitmentTransactionDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CommitmentTransactionDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CommitmentTransactionDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CommitmentTransactionDecodeErrorZ _res_conv = *(LDKCResult_CommitmentTransactionDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CommitmentTransactionDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CommitmentTransactionDecodeErrorZ_clone_ptr(LDKCResult_CommitmentTransactionDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentTransactionDecodeErrorZ), "LDKCResult_CommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_CommitmentTransactionDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CommitmentTransactionDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CommitmentTransactionDecodeErrorZ* arg_conv = (LDKCResult_CommitmentTransactionDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CommitmentTransactionDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CommitmentTransactionDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_CommitmentTransactionDecodeErrorZ* orig_conv = (LDKCResult_CommitmentTransactionDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_CommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentTransactionDecodeErrorZ), "LDKCResult_CommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_CommitmentTransactionDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TrustedCommitmentTransactionNoneZ_ok(int64_t o) {
+       LDKTrustedCommitmentTransaction o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       // WARNING: we need a move here but no clone is available for LDKTrustedCommitmentTransaction
+       
+       LDKCResult_TrustedCommitmentTransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TrustedCommitmentTransactionNoneZ), "LDKCResult_TrustedCommitmentTransactionNoneZ");
+       *ret_conv = CResult_TrustedCommitmentTransactionNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TrustedCommitmentTransactionNoneZ_err() {
+       LDKCResult_TrustedCommitmentTransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TrustedCommitmentTransactionNoneZ), "LDKCResult_TrustedCommitmentTransactionNoneZ");
+       *ret_conv = CResult_TrustedCommitmentTransactionNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TrustedCommitmentTransactionNoneZ_is_ok(int64_t o) {
+       LDKCResult_TrustedCommitmentTransactionNoneZ* o_conv = (LDKCResult_TrustedCommitmentTransactionNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TrustedCommitmentTransactionNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TrustedCommitmentTransactionNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TrustedCommitmentTransactionNoneZ _res_conv = *(LDKCResult_TrustedCommitmentTransactionNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TrustedCommitmentTransactionNoneZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_ok(ptrArray o) {
+       LDKCVec_ECDSASignatureZ o_constr;
+       o_constr.datalen = o->arr_len;
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_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];
+               LDKECDSASignature o_conv_8_ref;
+               CHECK(o_conv_8->arr_len == 64);
+               memcpy(o_conv_8_ref.compact_form, o_conv_8->elems, 64); FREE(o_conv_8);
+               o_constr.data[i] = o_conv_8_ref;
+       }
+       FREE(o);
+       LDKCResult_CVec_ECDSASignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_ECDSASignatureZNoneZ), "LDKCResult_CVec_ECDSASignatureZNoneZ");
+       *ret_conv = CResult_CVec_ECDSASignatureZNoneZ_ok(o_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_err() {
+       LDKCResult_CVec_ECDSASignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_ECDSASignatureZNoneZ), "LDKCResult_CVec_ECDSASignatureZNoneZ");
+       *ret_conv = CResult_CVec_ECDSASignatureZNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_is_ok(int64_t o) {
+       LDKCResult_CVec_ECDSASignatureZNoneZ* o_conv = (LDKCResult_CVec_ECDSASignatureZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_ECDSASignatureZNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_ECDSASignatureZNoneZ _res_conv = *(LDKCResult_CVec_ECDSASignatureZNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_ECDSASignatureZNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_ECDSASignatureZNoneZ_clone_ptr(LDKCResult_CVec_ECDSASignatureZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_ECDSASignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_ECDSASignatureZNoneZ), "LDKCResult_CVec_ECDSASignatureZNoneZ");
+       *ret_conv = CResult_CVec_ECDSASignatureZNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_ECDSASignatureZNoneZ* arg_conv = (LDKCResult_CVec_ECDSASignatureZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_ECDSASignatureZNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_clone(int64_t orig) {
+       LDKCResult_CVec_ECDSASignatureZNoneZ* orig_conv = (LDKCResult_CVec_ECDSASignatureZNoneZ*)untag_ptr(orig);
+       LDKCResult_CVec_ECDSASignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_ECDSASignatureZNoneZ), "LDKCResult_CVec_ECDSASignatureZNoneZ");
+       *ret_conv = CResult_CVec_ECDSASignatureZNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_usizeZ_some(int64_t o) {
+       LDKCOption_usizeZ *ret_copy = MALLOC(sizeof(LDKCOption_usizeZ), "LDKCOption_usizeZ");
+       *ret_copy = COption_usizeZ_some(o);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_usizeZ_none() {
+       LDKCOption_usizeZ *ret_copy = MALLOC(sizeof(LDKCOption_usizeZ), "LDKCOption_usizeZ");
+       *ret_copy = COption_usizeZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_usizeZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_usizeZ _res_conv = *(LDKCOption_usizeZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_usizeZ_free(_res_conv);
+}
+
+static inline uint64_t COption_usizeZ_clone_ptr(LDKCOption_usizeZ *NONNULL_PTR arg) {
+       LDKCOption_usizeZ *ret_copy = MALLOC(sizeof(LDKCOption_usizeZ), "LDKCOption_usizeZ");
+       *ret_copy = COption_usizeZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_usizeZ_clone_ptr(int64_t arg) {
+       LDKCOption_usizeZ* arg_conv = (LDKCOption_usizeZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_usizeZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_usizeZ_clone(int64_t orig) {
+       LDKCOption_usizeZ* orig_conv = (LDKCOption_usizeZ*)untag_ptr(orig);
+       LDKCOption_usizeZ *ret_copy = MALLOC(sizeof(LDKCOption_usizeZ), "LDKCOption_usizeZ");
+       *ret_copy = COption_usizeZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptDecodeErrorZ_ok(int64_t o) {
+       LDKShutdownScript 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 = ShutdownScript_clone(&o_conv);
+       LDKCResult_ShutdownScriptDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptDecodeErrorZ), "LDKCResult_ShutdownScriptDecodeErrorZ");
+       *ret_conv = CResult_ShutdownScriptDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptDecodeErrorZ_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_ShutdownScriptDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptDecodeErrorZ), "LDKCResult_ShutdownScriptDecodeErrorZ");
+       *ret_conv = CResult_ShutdownScriptDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ShutdownScriptDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ShutdownScriptDecodeErrorZ* o_conv = (LDKCResult_ShutdownScriptDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ShutdownScriptDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ShutdownScriptDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ShutdownScriptDecodeErrorZ _res_conv = *(LDKCResult_ShutdownScriptDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ShutdownScriptDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ShutdownScriptDecodeErrorZ_clone_ptr(LDKCResult_ShutdownScriptDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ShutdownScriptDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptDecodeErrorZ), "LDKCResult_ShutdownScriptDecodeErrorZ");
+       *ret_conv = CResult_ShutdownScriptDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ShutdownScriptDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ShutdownScriptDecodeErrorZ* arg_conv = (LDKCResult_ShutdownScriptDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ShutdownScriptDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ShutdownScriptDecodeErrorZ* orig_conv = (LDKCResult_ShutdownScriptDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ShutdownScriptDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptDecodeErrorZ), "LDKCResult_ShutdownScriptDecodeErrorZ");
+       *ret_conv = CResult_ShutdownScriptDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_ok(int64_t o) {
+       LDKShutdownScript 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 = ShutdownScript_clone(&o_conv);
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptInvalidShutdownScriptZ), "LDKCResult_ShutdownScriptInvalidShutdownScriptZ");
+       *ret_conv = CResult_ShutdownScriptInvalidShutdownScriptZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_err(int64_t e) {
+       LDKInvalidShutdownScript e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = InvalidShutdownScript_clone(&e_conv);
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptInvalidShutdownScriptZ), "LDKCResult_ShutdownScriptInvalidShutdownScriptZ");
+       *ret_conv = CResult_ShutdownScriptInvalidShutdownScriptZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_is_ok(int64_t o) {
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* o_conv = (LDKCResult_ShutdownScriptInvalidShutdownScriptZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ShutdownScriptInvalidShutdownScriptZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ _res_conv = *(LDKCResult_ShutdownScriptInvalidShutdownScriptZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ShutdownScriptInvalidShutdownScriptZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ShutdownScriptInvalidShutdownScriptZ_clone_ptr(LDKCResult_ShutdownScriptInvalidShutdownScriptZ *NONNULL_PTR arg) {
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptInvalidShutdownScriptZ), "LDKCResult_ShutdownScriptInvalidShutdownScriptZ");
+       *ret_conv = CResult_ShutdownScriptInvalidShutdownScriptZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_clone_ptr(int64_t arg) {
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* arg_conv = (LDKCResult_ShutdownScriptInvalidShutdownScriptZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ShutdownScriptInvalidShutdownScriptZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_clone(int64_t orig) {
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* orig_conv = (LDKCResult_ShutdownScriptInvalidShutdownScriptZ*)untag_ptr(orig);
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptInvalidShutdownScriptZ), "LDKCResult_ShutdownScriptInvalidShutdownScriptZ");
+       *ret_conv = CResult_ShutdownScriptInvalidShutdownScriptZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PaymentPurposeDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKPaymentPurpose o_conv = *(LDKPaymentPurpose*)(o_ptr);
+       o_conv = PaymentPurpose_clone((LDKPaymentPurpose*)untag_ptr(o));
+       LDKCResult_PaymentPurposeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentPurposeDecodeErrorZ), "LDKCResult_PaymentPurposeDecodeErrorZ");
+       *ret_conv = CResult_PaymentPurposeDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PaymentPurposeDecodeErrorZ_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_PaymentPurposeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentPurposeDecodeErrorZ), "LDKCResult_PaymentPurposeDecodeErrorZ");
+       *ret_conv = CResult_PaymentPurposeDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PaymentPurposeDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PaymentPurposeDecodeErrorZ* o_conv = (LDKCResult_PaymentPurposeDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PaymentPurposeDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PaymentPurposeDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PaymentPurposeDecodeErrorZ _res_conv = *(LDKCResult_PaymentPurposeDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PaymentPurposeDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PaymentPurposeDecodeErrorZ_clone_ptr(LDKCResult_PaymentPurposeDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PaymentPurposeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentPurposeDecodeErrorZ), "LDKCResult_PaymentPurposeDecodeErrorZ");
+       *ret_conv = CResult_PaymentPurposeDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PaymentPurposeDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PaymentPurposeDecodeErrorZ* arg_conv = (LDKCResult_PaymentPurposeDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PaymentPurposeDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PaymentPurposeDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PaymentPurposeDecodeErrorZ* orig_conv = (LDKCResult_PaymentPurposeDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PaymentPurposeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentPurposeDecodeErrorZ), "LDKCResult_PaymentPurposeDecodeErrorZ");
+       *ret_conv = CResult_PaymentPurposeDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_ok(int64_t o) {
+       LDKClaimedHTLC 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 = ClaimedHTLC_clone(&o_conv);
+       LDKCResult_ClaimedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClaimedHTLCDecodeErrorZ), "LDKCResult_ClaimedHTLCDecodeErrorZ");
+       *ret_conv = CResult_ClaimedHTLCDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_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_ClaimedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClaimedHTLCDecodeErrorZ), "LDKCResult_ClaimedHTLCDecodeErrorZ");
+       *ret_conv = CResult_ClaimedHTLCDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ClaimedHTLCDecodeErrorZ* o_conv = (LDKCResult_ClaimedHTLCDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ClaimedHTLCDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ClaimedHTLCDecodeErrorZ _res_conv = *(LDKCResult_ClaimedHTLCDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ClaimedHTLCDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ClaimedHTLCDecodeErrorZ_clone_ptr(LDKCResult_ClaimedHTLCDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ClaimedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClaimedHTLCDecodeErrorZ), "LDKCResult_ClaimedHTLCDecodeErrorZ");
+       *ret_conv = CResult_ClaimedHTLCDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ClaimedHTLCDecodeErrorZ* arg_conv = (LDKCResult_ClaimedHTLCDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ClaimedHTLCDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ClaimedHTLCDecodeErrorZ* orig_conv = (LDKCResult_ClaimedHTLCDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ClaimedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClaimedHTLCDecodeErrorZ), "LDKCResult_ClaimedHTLCDecodeErrorZ");
+       *ret_conv = CResult_ClaimedHTLCDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_PathFailureZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKPathFailure o_conv = *(LDKPathFailure*)(o_ptr);
+       o_conv = PathFailure_clone((LDKPathFailure*)untag_ptr(o));
+       LDKCOption_PathFailureZ *ret_copy = MALLOC(sizeof(LDKCOption_PathFailureZ), "LDKCOption_PathFailureZ");
+       *ret_copy = COption_PathFailureZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_PathFailureZ_none() {
+       LDKCOption_PathFailureZ *ret_copy = MALLOC(sizeof(LDKCOption_PathFailureZ), "LDKCOption_PathFailureZ");
+       *ret_copy = COption_PathFailureZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_PathFailureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_PathFailureZ _res_conv = *(LDKCOption_PathFailureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_PathFailureZ_free(_res_conv);
+}
+
+static inline uint64_t COption_PathFailureZ_clone_ptr(LDKCOption_PathFailureZ *NONNULL_PTR arg) {
+       LDKCOption_PathFailureZ *ret_copy = MALLOC(sizeof(LDKCOption_PathFailureZ), "LDKCOption_PathFailureZ");
+       *ret_copy = COption_PathFailureZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_PathFailureZ_clone_ptr(int64_t arg) {
+       LDKCOption_PathFailureZ* arg_conv = (LDKCOption_PathFailureZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_PathFailureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_PathFailureZ_clone(int64_t orig) {
+       LDKCOption_PathFailureZ* orig_conv = (LDKCOption_PathFailureZ*)untag_ptr(orig);
+       LDKCOption_PathFailureZ *ret_copy = MALLOC(sizeof(LDKCOption_PathFailureZ), "LDKCOption_PathFailureZ");
+       *ret_copy = COption_PathFailureZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_PathFailureZ o_conv = *(LDKCOption_PathFailureZ*)(o_ptr);
+       o_conv = COption_PathFailureZ_clone((LDKCOption_PathFailureZ*)untag_ptr(o));
+       LDKCResult_COption_PathFailureZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_PathFailureZDecodeErrorZ), "LDKCResult_COption_PathFailureZDecodeErrorZ");
+       *ret_conv = CResult_COption_PathFailureZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_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_COption_PathFailureZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_PathFailureZDecodeErrorZ), "LDKCResult_COption_PathFailureZDecodeErrorZ");
+       *ret_conv = CResult_COption_PathFailureZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_PathFailureZDecodeErrorZ* o_conv = (LDKCResult_COption_PathFailureZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_PathFailureZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_PathFailureZDecodeErrorZ _res_conv = *(LDKCResult_COption_PathFailureZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_PathFailureZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_PathFailureZDecodeErrorZ_clone_ptr(LDKCResult_COption_PathFailureZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_PathFailureZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_PathFailureZDecodeErrorZ), "LDKCResult_COption_PathFailureZDecodeErrorZ");
+       *ret_conv = CResult_COption_PathFailureZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_PathFailureZDecodeErrorZ* arg_conv = (LDKCResult_COption_PathFailureZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_PathFailureZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_PathFailureZDecodeErrorZ* orig_conv = (LDKCResult_COption_PathFailureZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_PathFailureZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_PathFailureZDecodeErrorZ), "LDKCResult_COption_PathFailureZDecodeErrorZ");
+       *ret_conv = CResult_COption_PathFailureZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_ClosureReasonZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKClosureReason o_conv = *(LDKClosureReason*)(o_ptr);
+       o_conv = ClosureReason_clone((LDKClosureReason*)untag_ptr(o));
+       LDKCOption_ClosureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_ClosureReasonZ), "LDKCOption_ClosureReasonZ");
+       *ret_copy = COption_ClosureReasonZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_ClosureReasonZ_none() {
+       LDKCOption_ClosureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_ClosureReasonZ), "LDKCOption_ClosureReasonZ");
+       *ret_copy = COption_ClosureReasonZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_ClosureReasonZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_ClosureReasonZ _res_conv = *(LDKCOption_ClosureReasonZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_ClosureReasonZ_free(_res_conv);
+}
+
+static inline uint64_t COption_ClosureReasonZ_clone_ptr(LDKCOption_ClosureReasonZ *NONNULL_PTR arg) {
+       LDKCOption_ClosureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_ClosureReasonZ), "LDKCOption_ClosureReasonZ");
+       *ret_copy = COption_ClosureReasonZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_ClosureReasonZ_clone_ptr(int64_t arg) {
+       LDKCOption_ClosureReasonZ* arg_conv = (LDKCOption_ClosureReasonZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_ClosureReasonZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_ClosureReasonZ_clone(int64_t orig) {
+       LDKCOption_ClosureReasonZ* orig_conv = (LDKCOption_ClosureReasonZ*)untag_ptr(orig);
+       LDKCOption_ClosureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_ClosureReasonZ), "LDKCOption_ClosureReasonZ");
+       *ret_copy = COption_ClosureReasonZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_ClosureReasonZ o_conv = *(LDKCOption_ClosureReasonZ*)(o_ptr);
+       o_conv = COption_ClosureReasonZ_clone((LDKCOption_ClosureReasonZ*)untag_ptr(o));
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_ClosureReasonZDecodeErrorZ), "LDKCResult_COption_ClosureReasonZDecodeErrorZ");
+       *ret_conv = CResult_COption_ClosureReasonZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_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_COption_ClosureReasonZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_ClosureReasonZDecodeErrorZ), "LDKCResult_COption_ClosureReasonZDecodeErrorZ");
+       *ret_conv = CResult_COption_ClosureReasonZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* o_conv = (LDKCResult_COption_ClosureReasonZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_ClosureReasonZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ _res_conv = *(LDKCResult_COption_ClosureReasonZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_ClosureReasonZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_ClosureReasonZDecodeErrorZ_clone_ptr(LDKCResult_COption_ClosureReasonZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_ClosureReasonZDecodeErrorZ), "LDKCResult_COption_ClosureReasonZDecodeErrorZ");
+       *ret_conv = CResult_COption_ClosureReasonZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* arg_conv = (LDKCResult_COption_ClosureReasonZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_ClosureReasonZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* orig_conv = (LDKCResult_COption_ClosureReasonZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_ClosureReasonZDecodeErrorZ), "LDKCResult_COption_ClosureReasonZDecodeErrorZ");
+       *ret_conv = CResult_COption_ClosureReasonZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_HTLCDestinationZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKHTLCDestination o_conv = *(LDKHTLCDestination*)(o_ptr);
+       o_conv = HTLCDestination_clone((LDKHTLCDestination*)untag_ptr(o));
+       LDKCOption_HTLCDestinationZ *ret_copy = MALLOC(sizeof(LDKCOption_HTLCDestinationZ), "LDKCOption_HTLCDestinationZ");
+       *ret_copy = COption_HTLCDestinationZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_HTLCDestinationZ_none() {
+       LDKCOption_HTLCDestinationZ *ret_copy = MALLOC(sizeof(LDKCOption_HTLCDestinationZ), "LDKCOption_HTLCDestinationZ");
+       *ret_copy = COption_HTLCDestinationZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_HTLCDestinationZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_HTLCDestinationZ _res_conv = *(LDKCOption_HTLCDestinationZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_HTLCDestinationZ_free(_res_conv);
+}
+
+static inline uint64_t COption_HTLCDestinationZ_clone_ptr(LDKCOption_HTLCDestinationZ *NONNULL_PTR arg) {
+       LDKCOption_HTLCDestinationZ *ret_copy = MALLOC(sizeof(LDKCOption_HTLCDestinationZ), "LDKCOption_HTLCDestinationZ");
+       *ret_copy = COption_HTLCDestinationZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_HTLCDestinationZ_clone_ptr(int64_t arg) {
+       LDKCOption_HTLCDestinationZ* arg_conv = (LDKCOption_HTLCDestinationZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_HTLCDestinationZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_HTLCDestinationZ_clone(int64_t orig) {
+       LDKCOption_HTLCDestinationZ* orig_conv = (LDKCOption_HTLCDestinationZ*)untag_ptr(orig);
+       LDKCOption_HTLCDestinationZ *ret_copy = MALLOC(sizeof(LDKCOption_HTLCDestinationZ), "LDKCOption_HTLCDestinationZ");
+       *ret_copy = COption_HTLCDestinationZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_HTLCDestinationZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_HTLCDestinationZ o_conv = *(LDKCOption_HTLCDestinationZ*)(o_ptr);
+       o_conv = COption_HTLCDestinationZ_clone((LDKCOption_HTLCDestinationZ*)untag_ptr(o));
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_HTLCDestinationZDecodeErrorZ), "LDKCResult_COption_HTLCDestinationZDecodeErrorZ");
+       *ret_conv = CResult_COption_HTLCDestinationZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_HTLCDestinationZDecodeErrorZ_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_COption_HTLCDestinationZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_HTLCDestinationZDecodeErrorZ), "LDKCResult_COption_HTLCDestinationZDecodeErrorZ");
+       *ret_conv = CResult_COption_HTLCDestinationZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_HTLCDestinationZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* o_conv = (LDKCResult_COption_HTLCDestinationZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_HTLCDestinationZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_HTLCDestinationZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ _res_conv = *(LDKCResult_COption_HTLCDestinationZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_HTLCDestinationZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_HTLCDestinationZDecodeErrorZ_clone_ptr(LDKCResult_COption_HTLCDestinationZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_HTLCDestinationZDecodeErrorZ), "LDKCResult_COption_HTLCDestinationZDecodeErrorZ");
+       *ret_conv = CResult_COption_HTLCDestinationZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_HTLCDestinationZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* arg_conv = (LDKCResult_COption_HTLCDestinationZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_HTLCDestinationZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_HTLCDestinationZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* orig_conv = (LDKCResult_COption_HTLCDestinationZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_HTLCDestinationZDecodeErrorZ), "LDKCResult_COption_HTLCDestinationZDecodeErrorZ");
+       *ret_conv = CResult_COption_HTLCDestinationZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_ok(int32_t o) {
+       LDKPaymentFailureReason o_conv = LDKPaymentFailureReason_from_cs(o);
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentFailureReasonDecodeErrorZ), "LDKCResult_PaymentFailureReasonDecodeErrorZ");
+       *ret_conv = CResult_PaymentFailureReasonDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_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_PaymentFailureReasonDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentFailureReasonDecodeErrorZ), "LDKCResult_PaymentFailureReasonDecodeErrorZ");
+       *ret_conv = CResult_PaymentFailureReasonDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* o_conv = (LDKCResult_PaymentFailureReasonDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PaymentFailureReasonDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PaymentFailureReasonDecodeErrorZ _res_conv = *(LDKCResult_PaymentFailureReasonDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PaymentFailureReasonDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PaymentFailureReasonDecodeErrorZ_clone_ptr(LDKCResult_PaymentFailureReasonDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentFailureReasonDecodeErrorZ), "LDKCResult_PaymentFailureReasonDecodeErrorZ");
+       *ret_conv = CResult_PaymentFailureReasonDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* arg_conv = (LDKCResult_PaymentFailureReasonDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PaymentFailureReasonDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* orig_conv = (LDKCResult_PaymentFailureReasonDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentFailureReasonDecodeErrorZ), "LDKCResult_PaymentFailureReasonDecodeErrorZ");
+       *ret_conv = CResult_PaymentFailureReasonDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_U128Z_some(int8_tArray o) {
+       LDKU128 o_ref;
+       CHECK(o->arr_len == 16);
+       memcpy(o_ref.le_bytes, o->elems, 16); FREE(o);
+       LDKCOption_U128Z *ret_copy = MALLOC(sizeof(LDKCOption_U128Z), "LDKCOption_U128Z");
+       *ret_copy = COption_U128Z_some(o_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_U128Z_none() {
+       LDKCOption_U128Z *ret_copy = MALLOC(sizeof(LDKCOption_U128Z), "LDKCOption_U128Z");
+       *ret_copy = COption_U128Z_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_U128Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_U128Z _res_conv = *(LDKCOption_U128Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_U128Z_free(_res_conv);
+}
+
+static inline uint64_t COption_U128Z_clone_ptr(LDKCOption_U128Z *NONNULL_PTR arg) {
+       LDKCOption_U128Z *ret_copy = MALLOC(sizeof(LDKCOption_U128Z), "LDKCOption_U128Z");
+       *ret_copy = COption_U128Z_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_U128Z_clone_ptr(int64_t arg) {
+       LDKCOption_U128Z* arg_conv = (LDKCOption_U128Z*)untag_ptr(arg);
+       int64_t ret_conv = COption_U128Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_U128Z_clone(int64_t orig) {
+       LDKCOption_U128Z* orig_conv = (LDKCOption_U128Z*)untag_ptr(orig);
+       LDKCOption_U128Z *ret_copy = MALLOC(sizeof(LDKCOption_U128Z), "LDKCOption_U128Z");
+       *ret_copy = COption_U128Z_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CVec_ClaimedHTLCZ_free(int64_tArray _res) {
+       LDKCVec_ClaimedHTLCZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKClaimedHTLC), "LDKCVec_ClaimedHTLCZ 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];
+               LDKClaimedHTLC _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_ClaimedHTLCZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_PaymentFailureReasonZ_some(int32_t o) {
+       LDKPaymentFailureReason o_conv = LDKPaymentFailureReason_from_cs(o);
+       LDKCOption_PaymentFailureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_PaymentFailureReasonZ), "LDKCOption_PaymentFailureReasonZ");
+       *ret_copy = COption_PaymentFailureReasonZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_PaymentFailureReasonZ_none() {
+       LDKCOption_PaymentFailureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_PaymentFailureReasonZ), "LDKCOption_PaymentFailureReasonZ");
+       *ret_copy = COption_PaymentFailureReasonZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_PaymentFailureReasonZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_PaymentFailureReasonZ _res_conv = *(LDKCOption_PaymentFailureReasonZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_PaymentFailureReasonZ_free(_res_conv);
+}
+
+static inline uint64_t COption_PaymentFailureReasonZ_clone_ptr(LDKCOption_PaymentFailureReasonZ *NONNULL_PTR arg) {
+       LDKCOption_PaymentFailureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_PaymentFailureReasonZ), "LDKCOption_PaymentFailureReasonZ");
+       *ret_copy = COption_PaymentFailureReasonZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_PaymentFailureReasonZ_clone_ptr(int64_t arg) {
+       LDKCOption_PaymentFailureReasonZ* arg_conv = (LDKCOption_PaymentFailureReasonZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_PaymentFailureReasonZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_PaymentFailureReasonZ_clone(int64_t orig) {
+       LDKCOption_PaymentFailureReasonZ* orig_conv = (LDKCOption_PaymentFailureReasonZ*)untag_ptr(orig);
+       LDKCOption_PaymentFailureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_PaymentFailureReasonZ), "LDKCOption_PaymentFailureReasonZ");
+       *ret_copy = COption_PaymentFailureReasonZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_EventZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKEvent o_conv = *(LDKEvent*)(o_ptr);
+       o_conv = Event_clone((LDKEvent*)untag_ptr(o));
+       LDKCOption_EventZ *ret_copy = MALLOC(sizeof(LDKCOption_EventZ), "LDKCOption_EventZ");
+       *ret_copy = COption_EventZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_EventZ_none() {
+       LDKCOption_EventZ *ret_copy = MALLOC(sizeof(LDKCOption_EventZ), "LDKCOption_EventZ");
+       *ret_copy = COption_EventZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_EventZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_EventZ _res_conv = *(LDKCOption_EventZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_EventZ_free(_res_conv);
+}
+
+static inline uint64_t COption_EventZ_clone_ptr(LDKCOption_EventZ *NONNULL_PTR arg) {
+       LDKCOption_EventZ *ret_copy = MALLOC(sizeof(LDKCOption_EventZ), "LDKCOption_EventZ");
+       *ret_copy = COption_EventZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_EventZ_clone_ptr(int64_t arg) {
+       LDKCOption_EventZ* arg_conv = (LDKCOption_EventZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_EventZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_EventZ_clone(int64_t orig) {
+       LDKCOption_EventZ* orig_conv = (LDKCOption_EventZ*)untag_ptr(orig);
+       LDKCOption_EventZ *ret_copy = MALLOC(sizeof(LDKCOption_EventZ), "LDKCOption_EventZ");
+       *ret_copy = COption_EventZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_EventZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_EventZ o_conv = *(LDKCOption_EventZ*)(o_ptr);
+       o_conv = COption_EventZ_clone((LDKCOption_EventZ*)untag_ptr(o));
+       LDKCResult_COption_EventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_EventZDecodeErrorZ), "LDKCResult_COption_EventZDecodeErrorZ");
+       *ret_conv = CResult_COption_EventZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_EventZDecodeErrorZ_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_COption_EventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_EventZDecodeErrorZ), "LDKCResult_COption_EventZDecodeErrorZ");
+       *ret_conv = CResult_COption_EventZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_EventZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_EventZDecodeErrorZ* o_conv = (LDKCResult_COption_EventZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_EventZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_EventZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_EventZDecodeErrorZ _res_conv = *(LDKCResult_COption_EventZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_EventZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_EventZDecodeErrorZ_clone_ptr(LDKCResult_COption_EventZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_EventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_EventZDecodeErrorZ), "LDKCResult_COption_EventZDecodeErrorZ");
+       *ret_conv = CResult_COption_EventZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_EventZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_EventZDecodeErrorZ* arg_conv = (LDKCResult_COption_EventZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_EventZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_EventZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_EventZDecodeErrorZ* orig_conv = (LDKCResult_COption_EventZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_EventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_EventZDecodeErrorZ), "LDKCResult_COption_EventZDecodeErrorZ");
+       *ret_conv = CResult_COption_EventZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_ok(int32_t o) {
+       LDKSiPrefix o_conv = LDKSiPrefix_from_cs(o);
+       LDKCResult_SiPrefixBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SiPrefixBolt11ParseErrorZ), "LDKCResult_SiPrefixBolt11ParseErrorZ");
+       *ret_conv = CResult_SiPrefixBolt11ParseErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKBolt11ParseError e_conv = *(LDKBolt11ParseError*)(e_ptr);
+       e_conv = Bolt11ParseError_clone((LDKBolt11ParseError*)untag_ptr(e));
+       LDKCResult_SiPrefixBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SiPrefixBolt11ParseErrorZ), "LDKCResult_SiPrefixBolt11ParseErrorZ");
+       *ret_conv = CResult_SiPrefixBolt11ParseErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_is_ok(int64_t o) {
+       LDKCResult_SiPrefixBolt11ParseErrorZ* o_conv = (LDKCResult_SiPrefixBolt11ParseErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SiPrefixBolt11ParseErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SiPrefixBolt11ParseErrorZ _res_conv = *(LDKCResult_SiPrefixBolt11ParseErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SiPrefixBolt11ParseErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SiPrefixBolt11ParseErrorZ_clone_ptr(LDKCResult_SiPrefixBolt11ParseErrorZ *NONNULL_PTR arg) {
+       LDKCResult_SiPrefixBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SiPrefixBolt11ParseErrorZ), "LDKCResult_SiPrefixBolt11ParseErrorZ");
+       *ret_conv = CResult_SiPrefixBolt11ParseErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_SiPrefixBolt11ParseErrorZ* arg_conv = (LDKCResult_SiPrefixBolt11ParseErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SiPrefixBolt11ParseErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_clone(int64_t orig) {
+       LDKCResult_SiPrefixBolt11ParseErrorZ* orig_conv = (LDKCResult_SiPrefixBolt11ParseErrorZ*)untag_ptr(orig);
+       LDKCResult_SiPrefixBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SiPrefixBolt11ParseErrorZ), "LDKCResult_SiPrefixBolt11ParseErrorZ");
+       *ret_conv = CResult_SiPrefixBolt11ParseErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceParseOrSemanticErrorZ_ok(int64_t o) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_clone(&o_conv);
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ), "LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceParseOrSemanticErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceParseOrSemanticErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKParseOrSemanticError e_conv = *(LDKParseOrSemanticError*)(e_ptr);
+       e_conv = ParseOrSemanticError_clone((LDKParseOrSemanticError*)untag_ptr(e));
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ), "LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceParseOrSemanticErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_Bolt11InvoiceParseOrSemanticErrorZ_is_ok(int64_t o) {
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* o_conv = (LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_Bolt11InvoiceParseOrSemanticErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_Bolt11InvoiceParseOrSemanticErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ _res_conv = *(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_Bolt11InvoiceParseOrSemanticErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_Bolt11InvoiceParseOrSemanticErrorZ_clone_ptr(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ *NONNULL_PTR arg) {
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ), "LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceParseOrSemanticErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceParseOrSemanticErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* arg_conv = (LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_Bolt11InvoiceParseOrSemanticErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceParseOrSemanticErrorZ_clone(int64_t orig) {
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* orig_conv = (LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ*)untag_ptr(orig);
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ), "LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceParseOrSemanticErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_ok(int64_t o) {
+       LDKSignedRawBolt11Invoice 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 = SignedRawBolt11Invoice_clone(&o_conv);
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ), "LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ");
+       *ret_conv = CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKBolt11ParseError e_conv = *(LDKBolt11ParseError*)(e_ptr);
+       e_conv = Bolt11ParseError_clone((LDKBolt11ParseError*)untag_ptr(e));
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ), "LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ");
+       *ret_conv = CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_is_ok(int64_t o) {
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* o_conv = (LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ _res_conv = *(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_clone_ptr(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ *NONNULL_PTR arg) {
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ), "LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ");
+       *ret_conv = CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* arg_conv = (LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_clone(int64_t orig) {
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* orig_conv = (LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ*)untag_ptr(orig);
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ), "LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ");
+       *ret_conv = CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_clone_ptr(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ *NONNULL_PTR arg) {
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ), "LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ");
+       *ret_conv = C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_clone_ptr(int64_t arg) {
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* arg_conv = (LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ*)untag_ptr(arg);
+       int64_t ret_conv = C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_clone(int64_t orig) {
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* orig_conv = (LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ*)untag_ptr(orig);
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ), "LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ");
+       *ret_conv = C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_new(int64_t a, int8_tArray b, int64_t c) {
+       LDKRawBolt11Invoice 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 = RawBolt11Invoice_clone(&a_conv);
+       LDKThirtyTwoBytes b_ref;
+       CHECK(b->arr_len == 32);
+       memcpy(b_ref.data, b->elems, 32); FREE(b);
+       LDKBolt11InvoiceSignature 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 = Bolt11InvoiceSignature_clone(&c_conv);
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ), "LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ");
+       *ret_conv = C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_new(a_conv, b_ref, c_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ _res_conv = *(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_ok(int64_t o) {
+       LDKPayeePubKey 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 = PayeePubKey_clone(&o_conv);
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PayeePubKeySecp256k1ErrorZ), "LDKCResult_PayeePubKeySecp256k1ErrorZ");
+       *ret_conv = CResult_PayeePubKeySecp256k1ErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_err(int32_t e) {
+       LDKSecp256k1Error e_conv = LDKSecp256k1Error_from_cs(e);
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PayeePubKeySecp256k1ErrorZ), "LDKCResult_PayeePubKeySecp256k1ErrorZ");
+       *ret_conv = CResult_PayeePubKeySecp256k1ErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_is_ok(int64_t o) {
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* o_conv = (LDKCResult_PayeePubKeySecp256k1ErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PayeePubKeySecp256k1ErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PayeePubKeySecp256k1ErrorZ _res_conv = *(LDKCResult_PayeePubKeySecp256k1ErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PayeePubKeySecp256k1ErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PayeePubKeySecp256k1ErrorZ_clone_ptr(LDKCResult_PayeePubKeySecp256k1ErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PayeePubKeySecp256k1ErrorZ), "LDKCResult_PayeePubKeySecp256k1ErrorZ");
+       *ret_conv = CResult_PayeePubKeySecp256k1ErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* arg_conv = (LDKCResult_PayeePubKeySecp256k1ErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PayeePubKeySecp256k1ErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_clone(int64_t orig) {
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* orig_conv = (LDKCResult_PayeePubKeySecp256k1ErrorZ*)untag_ptr(orig);
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PayeePubKeySecp256k1ErrorZ), "LDKCResult_PayeePubKeySecp256k1ErrorZ");
+       *ret_conv = CResult_PayeePubKeySecp256k1ErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_PrivateRouteZ_free(int64_tArray _res) {
+       LDKCVec_PrivateRouteZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKPrivateRoute), "LDKCVec_PrivateRouteZ 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_14 = _res_vals[o];
+               LDKPrivateRoute _res_conv_14_conv;
+               _res_conv_14_conv.inner = untag_ptr(_res_conv_14);
+               _res_conv_14_conv.is_owned = ptr_is_owned(_res_conv_14);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_14_conv);
+               _res_constr.data[o] = _res_conv_14_conv;
+       }
+       FREE(_res);
+       CVec_PrivateRouteZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_PositiveTimestampCreationErrorZ_ok(int64_t o) {
+       LDKPositiveTimestamp 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 = PositiveTimestamp_clone(&o_conv);
+       LDKCResult_PositiveTimestampCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PositiveTimestampCreationErrorZ), "LDKCResult_PositiveTimestampCreationErrorZ");
+       *ret_conv = CResult_PositiveTimestampCreationErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PositiveTimestampCreationErrorZ_err(int32_t e) {
+       LDKCreationError e_conv = LDKCreationError_from_cs(e);
+       LDKCResult_PositiveTimestampCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PositiveTimestampCreationErrorZ), "LDKCResult_PositiveTimestampCreationErrorZ");
+       *ret_conv = CResult_PositiveTimestampCreationErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PositiveTimestampCreationErrorZ_is_ok(int64_t o) {
+       LDKCResult_PositiveTimestampCreationErrorZ* o_conv = (LDKCResult_PositiveTimestampCreationErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PositiveTimestampCreationErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PositiveTimestampCreationErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PositiveTimestampCreationErrorZ _res_conv = *(LDKCResult_PositiveTimestampCreationErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PositiveTimestampCreationErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PositiveTimestampCreationErrorZ_clone_ptr(LDKCResult_PositiveTimestampCreationErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PositiveTimestampCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PositiveTimestampCreationErrorZ), "LDKCResult_PositiveTimestampCreationErrorZ");
+       *ret_conv = CResult_PositiveTimestampCreationErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PositiveTimestampCreationErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PositiveTimestampCreationErrorZ* arg_conv = (LDKCResult_PositiveTimestampCreationErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PositiveTimestampCreationErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PositiveTimestampCreationErrorZ_clone(int64_t orig) {
+       LDKCResult_PositiveTimestampCreationErrorZ* orig_conv = (LDKCResult_PositiveTimestampCreationErrorZ*)untag_ptr(orig);
+       LDKCResult_PositiveTimestampCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PositiveTimestampCreationErrorZ), "LDKCResult_PositiveTimestampCreationErrorZ");
+       *ret_conv = CResult_PositiveTimestampCreationErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneBolt11SemanticErrorZ_ok() {
+       LDKCResult_NoneBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt11SemanticErrorZ), "LDKCResult_NoneBolt11SemanticErrorZ");
+       *ret_conv = CResult_NoneBolt11SemanticErrorZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneBolt11SemanticErrorZ_err(int32_t e) {
+       LDKBolt11SemanticError e_conv = LDKBolt11SemanticError_from_cs(e);
+       LDKCResult_NoneBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt11SemanticErrorZ), "LDKCResult_NoneBolt11SemanticErrorZ");
+       *ret_conv = CResult_NoneBolt11SemanticErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NoneBolt11SemanticErrorZ_is_ok(int64_t o) {
+       LDKCResult_NoneBolt11SemanticErrorZ* o_conv = (LDKCResult_NoneBolt11SemanticErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NoneBolt11SemanticErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NoneBolt11SemanticErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NoneBolt11SemanticErrorZ _res_conv = *(LDKCResult_NoneBolt11SemanticErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NoneBolt11SemanticErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NoneBolt11SemanticErrorZ_clone_ptr(LDKCResult_NoneBolt11SemanticErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NoneBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt11SemanticErrorZ), "LDKCResult_NoneBolt11SemanticErrorZ");
+       *ret_conv = CResult_NoneBolt11SemanticErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NoneBolt11SemanticErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NoneBolt11SemanticErrorZ* arg_conv = (LDKCResult_NoneBolt11SemanticErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NoneBolt11SemanticErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NoneBolt11SemanticErrorZ_clone(int64_t orig) {
+       LDKCResult_NoneBolt11SemanticErrorZ* orig_conv = (LDKCResult_NoneBolt11SemanticErrorZ*)untag_ptr(orig);
+       LDKCResult_NoneBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt11SemanticErrorZ), "LDKCResult_NoneBolt11SemanticErrorZ");
+       *ret_conv = CResult_NoneBolt11SemanticErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_ok(int64_t o) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_clone(&o_conv);
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ), "LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceBolt11SemanticErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_err(int32_t e) {
+       LDKBolt11SemanticError e_conv = LDKBolt11SemanticError_from_cs(e);
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ), "LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceBolt11SemanticErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_is_ok(int64_t o) {
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* o_conv = (LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_Bolt11InvoiceBolt11SemanticErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ _res_conv = *(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_Bolt11InvoiceBolt11SemanticErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone_ptr(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ *NONNULL_PTR arg) {
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ), "LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* arg_conv = (LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone(int64_t orig) {
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* orig_conv = (LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ*)untag_ptr(orig);
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ), "LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_DescriptionCreationErrorZ_ok(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 = Description_clone(&o_conv);
+       LDKCResult_DescriptionCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DescriptionCreationErrorZ), "LDKCResult_DescriptionCreationErrorZ");
+       *ret_conv = CResult_DescriptionCreationErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_DescriptionCreationErrorZ_err(int32_t e) {
+       LDKCreationError e_conv = LDKCreationError_from_cs(e);
+       LDKCResult_DescriptionCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DescriptionCreationErrorZ), "LDKCResult_DescriptionCreationErrorZ");
+       *ret_conv = CResult_DescriptionCreationErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_DescriptionCreationErrorZ_is_ok(int64_t o) {
+       LDKCResult_DescriptionCreationErrorZ* o_conv = (LDKCResult_DescriptionCreationErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_DescriptionCreationErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_DescriptionCreationErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_DescriptionCreationErrorZ _res_conv = *(LDKCResult_DescriptionCreationErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_DescriptionCreationErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_DescriptionCreationErrorZ_clone_ptr(LDKCResult_DescriptionCreationErrorZ *NONNULL_PTR arg) {
+       LDKCResult_DescriptionCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DescriptionCreationErrorZ), "LDKCResult_DescriptionCreationErrorZ");
+       *ret_conv = CResult_DescriptionCreationErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_DescriptionCreationErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_DescriptionCreationErrorZ* arg_conv = (LDKCResult_DescriptionCreationErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_DescriptionCreationErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_DescriptionCreationErrorZ_clone(int64_t orig) {
+       LDKCResult_DescriptionCreationErrorZ* orig_conv = (LDKCResult_DescriptionCreationErrorZ*)untag_ptr(orig);
+       LDKCResult_DescriptionCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DescriptionCreationErrorZ), "LDKCResult_DescriptionCreationErrorZ");
+       *ret_conv = CResult_DescriptionCreationErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PrivateRouteCreationErrorZ_ok(int64_t o) {
+       LDKPrivateRoute 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 = PrivateRoute_clone(&o_conv);
+       LDKCResult_PrivateRouteCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PrivateRouteCreationErrorZ), "LDKCResult_PrivateRouteCreationErrorZ");
+       *ret_conv = CResult_PrivateRouteCreationErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PrivateRouteCreationErrorZ_err(int32_t e) {
+       LDKCreationError e_conv = LDKCreationError_from_cs(e);
+       LDKCResult_PrivateRouteCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PrivateRouteCreationErrorZ), "LDKCResult_PrivateRouteCreationErrorZ");
+       *ret_conv = CResult_PrivateRouteCreationErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PrivateRouteCreationErrorZ_is_ok(int64_t o) {
+       LDKCResult_PrivateRouteCreationErrorZ* o_conv = (LDKCResult_PrivateRouteCreationErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PrivateRouteCreationErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PrivateRouteCreationErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PrivateRouteCreationErrorZ _res_conv = *(LDKCResult_PrivateRouteCreationErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PrivateRouteCreationErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PrivateRouteCreationErrorZ_clone_ptr(LDKCResult_PrivateRouteCreationErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PrivateRouteCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PrivateRouteCreationErrorZ), "LDKCResult_PrivateRouteCreationErrorZ");
+       *ret_conv = CResult_PrivateRouteCreationErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PrivateRouteCreationErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PrivateRouteCreationErrorZ* arg_conv = (LDKCResult_PrivateRouteCreationErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PrivateRouteCreationErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PrivateRouteCreationErrorZ_clone(int64_t orig) {
+       LDKCResult_PrivateRouteCreationErrorZ* orig_conv = (LDKCResult_PrivateRouteCreationErrorZ*)untag_ptr(orig);
+       LDKCResult_PrivateRouteCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PrivateRouteCreationErrorZ), "LDKCResult_PrivateRouteCreationErrorZ");
+       *ret_conv = CResult_PrivateRouteCreationErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OutPointDecodeErrorZ_ok(int64_t o) {
+       LDKOutPoint 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 = OutPoint_clone(&o_conv);
+       LDKCResult_OutPointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OutPointDecodeErrorZ), "LDKCResult_OutPointDecodeErrorZ");
+       *ret_conv = CResult_OutPointDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OutPointDecodeErrorZ_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_OutPointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OutPointDecodeErrorZ), "LDKCResult_OutPointDecodeErrorZ");
+       *ret_conv = CResult_OutPointDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_OutPointDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_OutPointDecodeErrorZ* o_conv = (LDKCResult_OutPointDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_OutPointDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_OutPointDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_OutPointDecodeErrorZ _res_conv = *(LDKCResult_OutPointDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_OutPointDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_OutPointDecodeErrorZ_clone_ptr(LDKCResult_OutPointDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_OutPointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OutPointDecodeErrorZ), "LDKCResult_OutPointDecodeErrorZ");
+       *ret_conv = CResult_OutPointDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_OutPointDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_OutPointDecodeErrorZ* arg_conv = (LDKCResult_OutPointDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_OutPointDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_OutPointDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_OutPointDecodeErrorZ* orig_conv = (LDKCResult_OutPointDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_OutPointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OutPointDecodeErrorZ), "LDKCResult_OutPointDecodeErrorZ");
+       *ret_conv = CResult_OutPointDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BigSizeDecodeErrorZ_ok(int64_t o) {
+       LDKBigSize 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 = BigSize_clone(&o_conv);
+       LDKCResult_BigSizeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BigSizeDecodeErrorZ), "LDKCResult_BigSizeDecodeErrorZ");
+       *ret_conv = CResult_BigSizeDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BigSizeDecodeErrorZ_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_BigSizeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BigSizeDecodeErrorZ), "LDKCResult_BigSizeDecodeErrorZ");
+       *ret_conv = CResult_BigSizeDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BigSizeDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BigSizeDecodeErrorZ* o_conv = (LDKCResult_BigSizeDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BigSizeDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BigSizeDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BigSizeDecodeErrorZ _res_conv = *(LDKCResult_BigSizeDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BigSizeDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BigSizeDecodeErrorZ_clone_ptr(LDKCResult_BigSizeDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BigSizeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BigSizeDecodeErrorZ), "LDKCResult_BigSizeDecodeErrorZ");
+       *ret_conv = CResult_BigSizeDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BigSizeDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BigSizeDecodeErrorZ* arg_conv = (LDKCResult_BigSizeDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BigSizeDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BigSizeDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BigSizeDecodeErrorZ* orig_conv = (LDKCResult_BigSizeDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BigSizeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BigSizeDecodeErrorZ), "LDKCResult_BigSizeDecodeErrorZ");
+       *ret_conv = CResult_BigSizeDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HostnameDecodeErrorZ_ok(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 = Hostname_clone(&o_conv);
+       LDKCResult_HostnameDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HostnameDecodeErrorZ), "LDKCResult_HostnameDecodeErrorZ");
+       *ret_conv = CResult_HostnameDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HostnameDecodeErrorZ_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_HostnameDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HostnameDecodeErrorZ), "LDKCResult_HostnameDecodeErrorZ");
+       *ret_conv = CResult_HostnameDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_HostnameDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_HostnameDecodeErrorZ* o_conv = (LDKCResult_HostnameDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_HostnameDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_HostnameDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_HostnameDecodeErrorZ _res_conv = *(LDKCResult_HostnameDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_HostnameDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_HostnameDecodeErrorZ_clone_ptr(LDKCResult_HostnameDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_HostnameDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HostnameDecodeErrorZ), "LDKCResult_HostnameDecodeErrorZ");
+       *ret_conv = CResult_HostnameDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_HostnameDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_HostnameDecodeErrorZ* arg_conv = (LDKCResult_HostnameDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_HostnameDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_HostnameDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_HostnameDecodeErrorZ* orig_conv = (LDKCResult_HostnameDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_HostnameDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HostnameDecodeErrorZ), "LDKCResult_HostnameDecodeErrorZ");
+       *ret_conv = CResult_HostnameDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedNoneZ_ok(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 = TransactionU16LenLimited_clone(&o_conv);
+       LDKCResult_TransactionU16LenLimitedNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedNoneZ), "LDKCResult_TransactionU16LenLimitedNoneZ");
+       *ret_conv = CResult_TransactionU16LenLimitedNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedNoneZ_err() {
+       LDKCResult_TransactionU16LenLimitedNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedNoneZ), "LDKCResult_TransactionU16LenLimitedNoneZ");
+       *ret_conv = CResult_TransactionU16LenLimitedNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TransactionU16LenLimitedNoneZ_is_ok(int64_t o) {
+       LDKCResult_TransactionU16LenLimitedNoneZ* o_conv = (LDKCResult_TransactionU16LenLimitedNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TransactionU16LenLimitedNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TransactionU16LenLimitedNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TransactionU16LenLimitedNoneZ _res_conv = *(LDKCResult_TransactionU16LenLimitedNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TransactionU16LenLimitedNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TransactionU16LenLimitedNoneZ_clone_ptr(LDKCResult_TransactionU16LenLimitedNoneZ *NONNULL_PTR arg) {
+       LDKCResult_TransactionU16LenLimitedNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedNoneZ), "LDKCResult_TransactionU16LenLimitedNoneZ");
+       *ret_conv = CResult_TransactionU16LenLimitedNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_TransactionU16LenLimitedNoneZ* arg_conv = (LDKCResult_TransactionU16LenLimitedNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TransactionU16LenLimitedNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedNoneZ_clone(int64_t orig) {
+       LDKCResult_TransactionU16LenLimitedNoneZ* orig_conv = (LDKCResult_TransactionU16LenLimitedNoneZ*)untag_ptr(orig);
+       LDKCResult_TransactionU16LenLimitedNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedNoneZ), "LDKCResult_TransactionU16LenLimitedNoneZ");
+       *ret_conv = CResult_TransactionU16LenLimitedNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedDecodeErrorZ_ok(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 = TransactionU16LenLimited_clone(&o_conv);
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedDecodeErrorZ), "LDKCResult_TransactionU16LenLimitedDecodeErrorZ");
+       *ret_conv = CResult_TransactionU16LenLimitedDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedDecodeErrorZ_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_TransactionU16LenLimitedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedDecodeErrorZ), "LDKCResult_TransactionU16LenLimitedDecodeErrorZ");
+       *ret_conv = CResult_TransactionU16LenLimitedDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TransactionU16LenLimitedDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* o_conv = (LDKCResult_TransactionU16LenLimitedDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TransactionU16LenLimitedDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TransactionU16LenLimitedDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ _res_conv = *(LDKCResult_TransactionU16LenLimitedDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TransactionU16LenLimitedDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TransactionU16LenLimitedDecodeErrorZ_clone_ptr(LDKCResult_TransactionU16LenLimitedDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedDecodeErrorZ), "LDKCResult_TransactionU16LenLimitedDecodeErrorZ");
+       *ret_conv = CResult_TransactionU16LenLimitedDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* arg_conv = (LDKCResult_TransactionU16LenLimitedDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TransactionU16LenLimitedDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* orig_conv = (LDKCResult_TransactionU16LenLimitedDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedDecodeErrorZ), "LDKCResult_TransactionU16LenLimitedDecodeErrorZ");
+       *ret_conv = CResult_TransactionU16LenLimitedDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UntrustedStringDecodeErrorZ_ok(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 = UntrustedString_clone(&o_conv);
+       LDKCResult_UntrustedStringDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UntrustedStringDecodeErrorZ), "LDKCResult_UntrustedStringDecodeErrorZ");
+       *ret_conv = CResult_UntrustedStringDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UntrustedStringDecodeErrorZ_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_UntrustedStringDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UntrustedStringDecodeErrorZ), "LDKCResult_UntrustedStringDecodeErrorZ");
+       *ret_conv = CResult_UntrustedStringDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UntrustedStringDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UntrustedStringDecodeErrorZ* o_conv = (LDKCResult_UntrustedStringDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UntrustedStringDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UntrustedStringDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UntrustedStringDecodeErrorZ _res_conv = *(LDKCResult_UntrustedStringDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UntrustedStringDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UntrustedStringDecodeErrorZ_clone_ptr(LDKCResult_UntrustedStringDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UntrustedStringDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UntrustedStringDecodeErrorZ), "LDKCResult_UntrustedStringDecodeErrorZ");
+       *ret_conv = CResult_UntrustedStringDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UntrustedStringDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UntrustedStringDecodeErrorZ* arg_conv = (LDKCResult_UntrustedStringDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UntrustedStringDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UntrustedStringDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UntrustedStringDecodeErrorZ* orig_conv = (LDKCResult_UntrustedStringDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UntrustedStringDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UntrustedStringDecodeErrorZ), "LDKCResult_UntrustedStringDecodeErrorZ");
+       *ret_conv = CResult_UntrustedStringDecodeErrorZ_clone(orig_conv);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+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);
+       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;
+}
+
+void  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_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);
+       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);
+}
+
+int64_t  CS_LDK_CResult_PaymentRelayDecodeErrorZ_ok(int64_t o) {
+       LDKPaymentRelay 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 = PaymentRelay_clone(&o_conv);
+       LDKCResult_PaymentRelayDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentRelayDecodeErrorZ), "LDKCResult_PaymentRelayDecodeErrorZ");
+       *ret_conv = CResult_PaymentRelayDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PaymentRelayDecodeErrorZ_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_PaymentRelayDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentRelayDecodeErrorZ), "LDKCResult_PaymentRelayDecodeErrorZ");
+       *ret_conv = CResult_PaymentRelayDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PaymentRelayDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PaymentRelayDecodeErrorZ* o_conv = (LDKCResult_PaymentRelayDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PaymentRelayDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PaymentRelayDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PaymentRelayDecodeErrorZ _res_conv = *(LDKCResult_PaymentRelayDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PaymentRelayDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PaymentRelayDecodeErrorZ_clone_ptr(LDKCResult_PaymentRelayDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PaymentRelayDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentRelayDecodeErrorZ), "LDKCResult_PaymentRelayDecodeErrorZ");
+       *ret_conv = CResult_PaymentRelayDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PaymentRelayDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PaymentRelayDecodeErrorZ* arg_conv = (LDKCResult_PaymentRelayDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PaymentRelayDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PaymentRelayDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PaymentRelayDecodeErrorZ* orig_conv = (LDKCResult_PaymentRelayDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PaymentRelayDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentRelayDecodeErrorZ), "LDKCResult_PaymentRelayDecodeErrorZ");
+       *ret_conv = CResult_PaymentRelayDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_ok(int64_t o) {
+       LDKPaymentConstraints 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 = PaymentConstraints_clone(&o_conv);
+       LDKCResult_PaymentConstraintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentConstraintsDecodeErrorZ), "LDKCResult_PaymentConstraintsDecodeErrorZ");
+       *ret_conv = CResult_PaymentConstraintsDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_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_PaymentConstraintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentConstraintsDecodeErrorZ), "LDKCResult_PaymentConstraintsDecodeErrorZ");
+       *ret_conv = CResult_PaymentConstraintsDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PaymentConstraintsDecodeErrorZ* o_conv = (LDKCResult_PaymentConstraintsDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PaymentConstraintsDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PaymentConstraintsDecodeErrorZ _res_conv = *(LDKCResult_PaymentConstraintsDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PaymentConstraintsDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PaymentConstraintsDecodeErrorZ_clone_ptr(LDKCResult_PaymentConstraintsDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PaymentConstraintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentConstraintsDecodeErrorZ), "LDKCResult_PaymentConstraintsDecodeErrorZ");
+       *ret_conv = CResult_PaymentConstraintsDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PaymentConstraintsDecodeErrorZ* arg_conv = (LDKCResult_PaymentConstraintsDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PaymentConstraintsDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PaymentConstraintsDecodeErrorZ* orig_conv = (LDKCResult_PaymentConstraintsDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PaymentConstraintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentConstraintsDecodeErrorZ), "LDKCResult_PaymentConstraintsDecodeErrorZ");
+       *ret_conv = CResult_PaymentConstraintsDecodeErrorZ_clone(orig_conv);
+       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);
+       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);
+       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);
+       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);
+       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) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NonePaymentErrorZ _res_conv = *(LDKCResult_NonePaymentErrorZ*)(_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);
+}
+
+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);
+       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);
+       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);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_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);
+       FREE(untag_ptr(_res));
+       CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_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);
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_StrSecp256k1ErrorZ_ok(jstring o) {
+       LDKStr o_conv = str_ref_to_owned_c(o);
+       LDKCResult_StrSecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StrSecp256k1ErrorZ), "LDKCResult_StrSecp256k1ErrorZ");
+       *ret_conv = CResult_StrSecp256k1ErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_StrSecp256k1ErrorZ_err(int32_t e) {
+       LDKSecp256k1Error e_conv = LDKSecp256k1Error_from_cs(e);
+       LDKCResult_StrSecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StrSecp256k1ErrorZ), "LDKCResult_StrSecp256k1ErrorZ");
+       *ret_conv = CResult_StrSecp256k1ErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_StrSecp256k1ErrorZ_is_ok(int64_t o) {
+       LDKCResult_StrSecp256k1ErrorZ* o_conv = (LDKCResult_StrSecp256k1ErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_StrSecp256k1ErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_StrSecp256k1ErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_StrSecp256k1ErrorZ _res_conv = *(LDKCResult_StrSecp256k1ErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_StrSecp256k1ErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_StrSecp256k1ErrorZ_clone_ptr(LDKCResult_StrSecp256k1ErrorZ *NONNULL_PTR arg) {
+       LDKCResult_StrSecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StrSecp256k1ErrorZ), "LDKCResult_StrSecp256k1ErrorZ");
+       *ret_conv = CResult_StrSecp256k1ErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_StrSecp256k1ErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_StrSecp256k1ErrorZ* arg_conv = (LDKCResult_StrSecp256k1ErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_StrSecp256k1ErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_StrSecp256k1ErrorZ_clone(int64_t orig) {
+       LDKCResult_StrSecp256k1ErrorZ* orig_conv = (LDKCResult_StrSecp256k1ErrorZ*)untag_ptr(orig);
+       LDKCResult_StrSecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StrSecp256k1ErrorZ), "LDKCResult_StrSecp256k1ErrorZ");
+       *ret_conv = CResult_StrSecp256k1ErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxOutUtxoLookupErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKTxOut o_conv = *(LDKTxOut*)(o_ptr);
+       o_conv = TxOut_clone((LDKTxOut*)untag_ptr(o));
+       LDKCResult_TxOutUtxoLookupErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxOutUtxoLookupErrorZ), "LDKCResult_TxOutUtxoLookupErrorZ");
+       *ret_conv = CResult_TxOutUtxoLookupErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxOutUtxoLookupErrorZ_err(int32_t e) {
+       LDKUtxoLookupError e_conv = LDKUtxoLookupError_from_cs(e);
+       LDKCResult_TxOutUtxoLookupErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxOutUtxoLookupErrorZ), "LDKCResult_TxOutUtxoLookupErrorZ");
+       *ret_conv = CResult_TxOutUtxoLookupErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxOutUtxoLookupErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxOutUtxoLookupErrorZ* o_conv = (LDKCResult_TxOutUtxoLookupErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxOutUtxoLookupErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxOutUtxoLookupErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxOutUtxoLookupErrorZ _res_conv = *(LDKCResult_TxOutUtxoLookupErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxOutUtxoLookupErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxOutUtxoLookupErrorZ_clone_ptr(LDKCResult_TxOutUtxoLookupErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxOutUtxoLookupErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxOutUtxoLookupErrorZ), "LDKCResult_TxOutUtxoLookupErrorZ");
+       *ret_conv = CResult_TxOutUtxoLookupErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxOutUtxoLookupErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxOutUtxoLookupErrorZ* arg_conv = (LDKCResult_TxOutUtxoLookupErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxOutUtxoLookupErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxOutUtxoLookupErrorZ_clone(int64_t orig) {
+       LDKCResult_TxOutUtxoLookupErrorZ* orig_conv = (LDKCResult_TxOutUtxoLookupErrorZ*)untag_ptr(orig);
+       LDKCResult_TxOutUtxoLookupErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxOutUtxoLookupErrorZ), "LDKCResult_TxOutUtxoLookupErrorZ");
+       *ret_conv = CResult_TxOutUtxoLookupErrorZ_clone(orig_conv);
+       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);
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_new(int8_tArray a, int64_t b) {
+       LDKPublicKey a_ref;
+       CHECK(a->arr_len == 33);
+       memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
+       LDKOnionMessage 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 = OnionMessage_clone(&b_conv);
+       LDKC2Tuple_PublicKeyOnionMessageZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyOnionMessageZ), "LDKC2Tuple_PublicKeyOnionMessageZ");
+       *ret_conv = C2Tuple_PublicKeyOnionMessageZ_new(a_ref, b_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_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);
+       FREE(untag_ptr(_res));
+       C2Tuple_PublicKeyOnionMessageZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_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);
+       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);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_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);
+       FREE(untag_ptr(_res));
+       CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_PeeledOnionNoneZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKPeeledOnion o_conv = *(LDKPeeledOnion*)(o_ptr);
+       o_conv = PeeledOnion_clone((LDKPeeledOnion*)untag_ptr(o));
+       LDKCResult_PeeledOnionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_PeeledOnionNoneZ), "LDKCResult_PeeledOnionNoneZ");
+       *ret_conv = CResult_PeeledOnionNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PeeledOnionNoneZ_err() {
+       LDKCResult_PeeledOnionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_PeeledOnionNoneZ), "LDKCResult_PeeledOnionNoneZ");
+       *ret_conv = CResult_PeeledOnionNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PeeledOnionNoneZ_is_ok(int64_t o) {
+       LDKCResult_PeeledOnionNoneZ* o_conv = (LDKCResult_PeeledOnionNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PeeledOnionNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PeeledOnionNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PeeledOnionNoneZ _res_conv = *(LDKCResult_PeeledOnionNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_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();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneSendErrorZ_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);
+       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);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NoneSendErrorZ_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);
+       FREE(untag_ptr(_res));
+       CResult_NoneSendErrorZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_BlindedPathNoneZ_ok(int64_t o) {
+       LDKBlindedPath 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 = BlindedPath_clone(&o_conv);
+       LDKCResult_BlindedPathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathNoneZ), "LDKCResult_BlindedPathNoneZ");
+       *ret_conv = CResult_BlindedPathNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedPathNoneZ_err() {
+       LDKCResult_BlindedPathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathNoneZ), "LDKCResult_BlindedPathNoneZ");
+       *ret_conv = CResult_BlindedPathNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BlindedPathNoneZ_is_ok(int64_t o) {
+       LDKCResult_BlindedPathNoneZ* o_conv = (LDKCResult_BlindedPathNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BlindedPathNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BlindedPathNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BlindedPathNoneZ _res_conv = *(LDKCResult_BlindedPathNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BlindedPathNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BlindedPathNoneZ_clone_ptr(LDKCResult_BlindedPathNoneZ *NONNULL_PTR arg) {
+       LDKCResult_BlindedPathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathNoneZ), "LDKCResult_BlindedPathNoneZ");
+       *ret_conv = CResult_BlindedPathNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BlindedPathNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_BlindedPathNoneZ* arg_conv = (LDKCResult_BlindedPathNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BlindedPathNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BlindedPathNoneZ_clone(int64_t orig) {
+       LDKCResult_BlindedPathNoneZ* orig_conv = (LDKCResult_BlindedPathNoneZ*)untag_ptr(orig);
+       LDKCResult_BlindedPathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathNoneZ), "LDKCResult_BlindedPathNoneZ");
+       *ret_conv = CResult_BlindedPathNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ o_conv = *(LDKC2Tuple_BlindedPayInfoBlindedPathZ*)(o_ptr);
+       o_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone((LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(o));
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ), "LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ");
+       *ret_conv = CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_err() {
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ), "LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ");
+       *ret_conv = CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_is_ok(int64_t o) {
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* o_conv = (LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ _res_conv = *(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone_ptr(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ), "LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ");
+       *ret_conv = CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* arg_conv = (LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone(int64_t orig) {
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* orig_conv = (LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ*)untag_ptr(orig);
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ), "LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ");
+       *ret_conv = CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedPathDecodeErrorZ_ok(int64_t o) {
+       LDKBlindedPath 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 = BlindedPath_clone(&o_conv);
+       LDKCResult_BlindedPathDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathDecodeErrorZ), "LDKCResult_BlindedPathDecodeErrorZ");
+       *ret_conv = CResult_BlindedPathDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedPathDecodeErrorZ_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_BlindedPathDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathDecodeErrorZ), "LDKCResult_BlindedPathDecodeErrorZ");
+       *ret_conv = CResult_BlindedPathDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BlindedPathDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BlindedPathDecodeErrorZ* o_conv = (LDKCResult_BlindedPathDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BlindedPathDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BlindedPathDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BlindedPathDecodeErrorZ _res_conv = *(LDKCResult_BlindedPathDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BlindedPathDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BlindedPathDecodeErrorZ_clone_ptr(LDKCResult_BlindedPathDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BlindedPathDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathDecodeErrorZ), "LDKCResult_BlindedPathDecodeErrorZ");
+       *ret_conv = CResult_BlindedPathDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BlindedPathDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BlindedPathDecodeErrorZ* arg_conv = (LDKCResult_BlindedPathDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BlindedPathDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BlindedPathDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BlindedPathDecodeErrorZ* orig_conv = (LDKCResult_BlindedPathDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BlindedPathDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathDecodeErrorZ), "LDKCResult_BlindedPathDecodeErrorZ");
+       *ret_conv = CResult_BlindedPathDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedHopDecodeErrorZ_ok(int64_t o) {
+       LDKBlindedHop 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 = BlindedHop_clone(&o_conv);
+       LDKCResult_BlindedHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopDecodeErrorZ), "LDKCResult_BlindedHopDecodeErrorZ");
+       *ret_conv = CResult_BlindedHopDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedHopDecodeErrorZ_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_BlindedHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopDecodeErrorZ), "LDKCResult_BlindedHopDecodeErrorZ");
+       *ret_conv = CResult_BlindedHopDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BlindedHopDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BlindedHopDecodeErrorZ* o_conv = (LDKCResult_BlindedHopDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BlindedHopDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BlindedHopDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BlindedHopDecodeErrorZ _res_conv = *(LDKCResult_BlindedHopDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BlindedHopDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BlindedHopDecodeErrorZ_clone_ptr(LDKCResult_BlindedHopDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BlindedHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopDecodeErrorZ), "LDKCResult_BlindedHopDecodeErrorZ");
+       *ret_conv = CResult_BlindedHopDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BlindedHopDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BlindedHopDecodeErrorZ* arg_conv = (LDKCResult_BlindedHopDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BlindedHopDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BlindedHopDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BlindedHopDecodeErrorZ* orig_conv = (LDKCResult_BlindedHopDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BlindedHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopDecodeErrorZ), "LDKCResult_BlindedHopDecodeErrorZ");
+       *ret_conv = CResult_BlindedHopDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_ok(int64_t o) {
+       LDKInvoiceError 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 = InvoiceError_clone(&o_conv);
+       LDKCResult_InvoiceErrorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InvoiceErrorDecodeErrorZ), "LDKCResult_InvoiceErrorDecodeErrorZ");
+       *ret_conv = CResult_InvoiceErrorDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_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_InvoiceErrorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InvoiceErrorDecodeErrorZ), "LDKCResult_InvoiceErrorDecodeErrorZ");
+       *ret_conv = CResult_InvoiceErrorDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_InvoiceErrorDecodeErrorZ* o_conv = (LDKCResult_InvoiceErrorDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_InvoiceErrorDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_InvoiceErrorDecodeErrorZ _res_conv = *(LDKCResult_InvoiceErrorDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_InvoiceErrorDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_InvoiceErrorDecodeErrorZ_clone_ptr(LDKCResult_InvoiceErrorDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_InvoiceErrorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InvoiceErrorDecodeErrorZ), "LDKCResult_InvoiceErrorDecodeErrorZ");
+       *ret_conv = CResult_InvoiceErrorDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_InvoiceErrorDecodeErrorZ* arg_conv = (LDKCResult_InvoiceErrorDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_InvoiceErrorDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_InvoiceErrorDecodeErrorZ* orig_conv = (LDKCResult_InvoiceErrorDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_InvoiceErrorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InvoiceErrorDecodeErrorZ), "LDKCResult_InvoiceErrorDecodeErrorZ");
+       *ret_conv = CResult_InvoiceErrorDecodeErrorZ_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);
+       LDKFilter o_conv = *(LDKFilter*)(o_ptr);
+       if (o_conv.free == LDKFilter_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFilter_JCalls_cloned(&o_conv);
+       }
+       LDKCOption_FilterZ *ret_copy = MALLOC(sizeof(LDKCOption_FilterZ), "LDKCOption_FilterZ");
+       *ret_copy = COption_FilterZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_FilterZ_none() {
+       LDKCOption_FilterZ *ret_copy = MALLOC(sizeof(LDKCOption_FilterZ), "LDKCOption_FilterZ");
+       *ret_copy = COption_FilterZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_FilterZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_FilterZ _res_conv = *(LDKCOption_FilterZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_FilterZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_LockedChannelMonitorNoneZ_ok(int64_t o) {
+       LDKLockedChannelMonitor o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       // WARNING: we need a move here but no clone is available for LDKLockedChannelMonitor
+       
+       LDKCResult_LockedChannelMonitorNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_LockedChannelMonitorNoneZ), "LDKCResult_LockedChannelMonitorNoneZ");
+       *ret_conv = CResult_LockedChannelMonitorNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_LockedChannelMonitorNoneZ_err() {
+       LDKCResult_LockedChannelMonitorNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_LockedChannelMonitorNoneZ), "LDKCResult_LockedChannelMonitorNoneZ");
+       *ret_conv = CResult_LockedChannelMonitorNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_LockedChannelMonitorNoneZ_is_ok(int64_t o) {
+       LDKCResult_LockedChannelMonitorNoneZ* o_conv = (LDKCResult_LockedChannelMonitorNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_LockedChannelMonitorNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_LockedChannelMonitorNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_LockedChannelMonitorNoneZ _res_conv = *(LDKCResult_LockedChannelMonitorNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_LockedChannelMonitorNoneZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_OutPointZ_free(int64_tArray _res) {
+       LDKCVec_OutPointZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKOutPoint), "LDKCVec_OutPointZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t k = 0; k < _res_constr.datalen; k++) {
+               int64_t _res_conv_10 = _res_vals[k];
+               LDKOutPoint _res_conv_10_conv;
+               _res_conv_10_conv.inner = untag_ptr(_res_conv_10);
+               _res_conv_10_conv.is_owned = ptr_is_owned(_res_conv_10);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_10_conv);
+               _res_constr.data[k] = _res_conv_10_conv;
+       }
+       FREE(_res);
+       CVec_OutPointZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_MonitorUpdateIdZ_free(int64_tArray _res) {
+       LDKCVec_MonitorUpdateIdZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKMonitorUpdateId), "LDKCVec_MonitorUpdateIdZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t r = 0; r < _res_constr.datalen; r++) {
+               int64_t _res_conv_17 = _res_vals[r];
+               LDKMonitorUpdateId _res_conv_17_conv;
+               _res_conv_17_conv.inner = untag_ptr(_res_conv_17);
+               _res_conv_17_conv.is_owned = ptr_is_owned(_res_conv_17);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_17_conv);
+               _res_constr.data[r] = _res_conv_17_conv;
+       }
+       FREE(_res);
+       CVec_MonitorUpdateIdZ_free(_res_constr);
+}
+
+static inline uint64_t C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone_ptr(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ), "LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ");
+       *ret_conv = C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ* arg_conv = (LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone(int64_t orig) {
+       LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ* orig_conv = (LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ*)untag_ptr(orig);
+       LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ), "LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ");
+       *ret_conv = C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_new(int64_t a, int64_tArray b) {
+       LDKOutPoint 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 = OutPoint_clone(&a_conv);
+       LDKCVec_MonitorUpdateIdZ b_constr;
+       b_constr.datalen = b->arr_len;
+       if (b_constr.datalen > 0)
+               b_constr.data = MALLOC(b_constr.datalen * sizeof(LDKMonitorUpdateId), "LDKCVec_MonitorUpdateIdZ Elements");
+       else
+               b_constr.data = NULL;
+       int64_t* b_vals = b->elems;
+       for (size_t r = 0; r < b_constr.datalen; r++) {
+               int64_t b_conv_17 = b_vals[r];
+               LDKMonitorUpdateId b_conv_17_conv;
+               b_conv_17_conv.inner = untag_ptr(b_conv_17);
+               b_conv_17_conv.is_owned = ptr_is_owned(b_conv_17);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv_17_conv);
+               b_conv_17_conv = MonitorUpdateId_clone(&b_conv_17_conv);
+               b_constr.data[r] = b_conv_17_conv;
+       }
+       FREE(b);
+       LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ), "LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ");
+       *ret_conv = C2Tuple_OutPointCVec_MonitorUpdateIdZZ_new(a_conv, b_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ _res_conv = *(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_OutPointCVec_MonitorUpdateIdZZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ), "LDKCVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t p = 0; p < _res_constr.datalen; p++) {
+               int64_t _res_conv_41 = _res_vals[p];
+               void* _res_conv_41_ptr = untag_ptr(_res_conv_41);
+               CHECK_ACCESS(_res_conv_41_ptr);
+               LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ _res_conv_41_conv = *(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ*)(_res_conv_41_ptr);
+               FREE(untag_ptr(_res_conv_41));
+               _res_constr.data[p] = _res_conv_41_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ_free(_res_constr);
+}
+
+void  CS_LDK_APIError_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);
+       LDKAPIError this_ptr_conv = *(LDKAPIError*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       APIError_free(this_ptr_conv);
+}
+
+static inline uint64_t APIError_clone_ptr(LDKAPIError *NONNULL_PTR arg) {
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = APIError_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_APIError_clone_ptr(int64_t arg) {
+       LDKAPIError* arg_conv = (LDKAPIError*)untag_ptr(arg);
+       int64_t ret_conv = APIError_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_APIError_clone(int64_t orig) {
+       LDKAPIError* orig_conv = (LDKAPIError*)untag_ptr(orig);
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = APIError_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_APIError_apimisuse_error(jstring err) {
+       LDKStr err_conv = str_ref_to_owned_c(err);
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = APIError_apimisuse_error(err_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_APIError_fee_rate_too_high(jstring err, int32_t feerate) {
+       LDKStr err_conv = str_ref_to_owned_c(err);
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = APIError_fee_rate_too_high(err_conv, feerate);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_APIError_invalid_route(jstring err) {
+       LDKStr err_conv = str_ref_to_owned_c(err);
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = APIError_invalid_route(err_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_APIError_channel_unavailable(jstring err) {
+       LDKStr err_conv = str_ref_to_owned_c(err);
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = APIError_channel_unavailable(err_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_APIError_monitor_update_in_progress() {
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = APIError_monitor_update_in_progress();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_APIError_incompatible_shutdown_script(int64_t script) {
+       LDKShutdownScript script_conv;
+       script_conv.inner = untag_ptr(script);
+       script_conv.is_owned = ptr_is_owned(script);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(script_conv);
+       script_conv = ShutdownScript_clone(&script_conv);
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = APIError_incompatible_shutdown_script(script_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_APIError_eq(int64_t a, int64_t b) {
+       LDKAPIError* a_conv = (LDKAPIError*)untag_ptr(a);
+       LDKAPIError* b_conv = (LDKAPIError*)untag_ptr(b);
+       jboolean ret_conv = APIError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_APIError_write(int64_t obj) {
+       LDKAPIError* obj_conv = (LDKAPIError*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = APIError_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_APIError_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_COption_APIErrorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_APIErrorZDecodeErrorZ), "LDKCResult_COption_APIErrorZDecodeErrorZ");
+       *ret_conv = APIError_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_BigSize_free(int64_t this_obj) {
+       LDKBigSize 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);
+       BigSize_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_BigSize_get_a(int64_t this_ptr) {
+       LDKBigSize 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 = BigSize_get_a(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BigSize_set_a(int64_t this_ptr, int64_t val) {
+       LDKBigSize 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;
+       BigSize_set_a(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_BigSize_new(int64_t a_arg) {
+       LDKBigSize ret_var = BigSize_new(a_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 BigSize_clone_ptr(LDKBigSize *NONNULL_PTR arg) {
+       LDKBigSize ret_var = BigSize_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_BigSize_clone_ptr(int64_t arg) {
+       LDKBigSize 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 = BigSize_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BigSize_clone(int64_t orig) {
+       LDKBigSize 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;
+       LDKBigSize ret_var = BigSize_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_BigSize_hash(int64_t o) {
+       LDKBigSize 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 = BigSize_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BigSize_eq(int64_t a, int64_t b) {
+       LDKBigSize 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;
+       LDKBigSize 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 = BigSize_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_BigSize_write(int64_t obj) {
+       LDKBigSize 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 = BigSize_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_BigSize_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BigSizeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BigSizeDecodeErrorZ), "LDKCResult_BigSizeDecodeErrorZ");
+       *ret_conv = BigSize_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_Hostname_free(int64_t this_obj) {
+       LDKHostname 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);
+       Hostname_free(this_obj_conv);
+}
+
+static inline uint64_t Hostname_clone_ptr(LDKHostname *NONNULL_PTR arg) {
+       LDKHostname ret_var = Hostname_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_Hostname_clone_ptr(int64_t arg) {
+       LDKHostname 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 = Hostname_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Hostname_clone(int64_t orig) {
+       LDKHostname 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;
+       LDKHostname ret_var = Hostname_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_Hostname_eq(int64_t a, int64_t b) {
+       LDKHostname 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;
+       LDKHostname 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 = Hostname_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_t  CS_LDK_Hostname_len(int64_t this_arg) {
+       LDKHostname 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_t ret_conv = Hostname_len(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Hostname_write(int64_t obj) {
+       LDKHostname 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 = Hostname_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_Hostname_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_HostnameDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HostnameDecodeErrorZ), "LDKCResult_HostnameDecodeErrorZ");
+       *ret_conv = Hostname_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_TransactionU16LenLimited_free(int64_t this_obj) {
+       LDKTransactionU16LenLimited 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);
+       TransactionU16LenLimited_free(this_obj_conv);
+}
+
+static inline uint64_t TransactionU16LenLimited_clone_ptr(LDKTransactionU16LenLimited *NONNULL_PTR arg) {
+       LDKTransactionU16LenLimited ret_var = TransactionU16LenLimited_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_TransactionU16LenLimited_clone_ptr(int64_t arg) {
+       LDKTransactionU16LenLimited 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 = TransactionU16LenLimited_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TransactionU16LenLimited_clone(int64_t orig) {
+       LDKTransactionU16LenLimited 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;
+       LDKTransactionU16LenLimited ret_var = TransactionU16LenLimited_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_TransactionU16LenLimited_eq(int64_t a, int64_t b) {
+       LDKTransactionU16LenLimited 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;
+       LDKTransactionU16LenLimited 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 = TransactionU16LenLimited_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TransactionU16LenLimited_new(int8_tArray transaction) {
+       LDKTransaction transaction_ref;
+       transaction_ref.datalen = transaction->arr_len;
+       transaction_ref.data = MALLOC(transaction_ref.datalen, "LDKTransaction Bytes");
+       memcpy(transaction_ref.data, transaction->elems, transaction_ref.datalen); FREE(transaction);
+       transaction_ref.data_is_owned = true;
+       LDKCResult_TransactionU16LenLimitedNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedNoneZ), "LDKCResult_TransactionU16LenLimitedNoneZ");
+       *ret_conv = TransactionU16LenLimited_new(transaction_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TransactionU16LenLimited_into_transaction(int64_t this_arg) {
+       LDKTransactionU16LenLimited 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 = TransactionU16LenLimited_clone(&this_arg_conv);
+       LDKTransaction ret_var = TransactionU16LenLimited_into_transaction(this_arg_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);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_TransactionU16LenLimited_write(int64_t obj) {
+       LDKTransactionU16LenLimited 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 = TransactionU16LenLimited_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_TransactionU16LenLimited_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedDecodeErrorZ), "LDKCResult_TransactionU16LenLimitedDecodeErrorZ");
+       *ret_conv = TransactionU16LenLimited_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_sign(int8_tArray msg, int8_tArray sk) {
+       LDKu8slice msg_ref;
+       msg_ref.datalen = msg->arr_len;
+       msg_ref.data = msg->elems;
+       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;
+       LDKCResult_StrSecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StrSecp256k1ErrorZ), "LDKCResult_StrSecp256k1ErrorZ");
+       *ret_conv = sign(msg_ref, sk_ref);
+       FREE(msg);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_recover_pk(int8_tArray msg, jstring sig) {
+       LDKu8slice msg_ref;
+       msg_ref.datalen = msg->arr_len;
+       msg_ref.data = msg->elems;
+       LDKStr sig_conv = str_ref_to_owned_c(sig);
+       LDKCResult_PublicKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeySecp256k1ErrorZ), "LDKCResult_PublicKeySecp256k1ErrorZ");
+       *ret_conv = recover_pk(msg_ref, sig_conv);
+       FREE(msg);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_verify(int8_tArray msg, jstring sig, int8_tArray pk) {
+       LDKu8slice msg_ref;
+       msg_ref.datalen = msg->arr_len;
+       msg_ref.data = msg->elems;
+       LDKStr sig_conv = str_ref_to_owned_c(sig);
+       LDKPublicKey pk_ref;
+       CHECK(pk->arr_len == 33);
+       memcpy(pk_ref.compressed_form, pk->elems, 33); FREE(pk);
+       jboolean ret_conv = verify(msg_ref, sig_conv, pk_ref);
+       FREE(msg);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_construct_invoice_preimage(int8_tArray hrp_bytes, ptrArray data_without_signature) {
+       LDKu8slice hrp_bytes_ref;
+       hrp_bytes_ref.datalen = hrp_bytes->arr_len;
+       hrp_bytes_ref.data = hrp_bytes->elems;
+       LDKCVec_U5Z data_without_signature_constr;
+       data_without_signature_constr.datalen = data_without_signature->arr_len;
+       if (data_without_signature_constr.datalen > 0)
+               data_without_signature_constr.data = MALLOC(data_without_signature_constr.datalen * sizeof(LDKU5), "LDKCVec_U5Z Elements");
+       else
+               data_without_signature_constr.data = NULL;
+       int8_t* data_without_signature_vals = (void*) data_without_signature->elems;
+       for (size_t h = 0; h < data_without_signature_constr.datalen; h++) {
+               int8_t data_without_signature_conv_7 = data_without_signature_vals[h];
+               
+               data_without_signature_constr.data[h] = (LDKU5){ ._0 = data_without_signature_conv_7 };
+       }
+       FREE(data_without_signature);
+       LDKCVec_u8Z ret_var = construct_invoice_preimage(hrp_bytes_ref, data_without_signature_constr);
+       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);
+       FREE(hrp_bytes);
+       return ret_arr;
+}
+
+void  CS_LDK_KVStore_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);
+       LDKKVStore this_ptr_conv = *(LDKKVStore*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       KVStore_free(this_ptr_conv);
+}
+
+void  CS_LDK_Persister_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);
+       LDKPersister this_ptr_conv = *(LDKPersister*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Persister_free(this_ptr_conv);
+}
+
+int64_t  CS_LDK_read_channel_monitors(int64_t kv_store, int64_t entropy_source, int64_t signer_provider) {
+       void* kv_store_ptr = untag_ptr(kv_store);
+       CHECK_ACCESS(kv_store_ptr);
+       LDKKVStore kv_store_conv = *(LDKKVStore*)(kv_store_ptr);
+       if (kv_store_conv.free == LDKKVStore_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKKVStore_JCalls_cloned(&kv_store_conv);
+       }
+       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* signer_provider_ptr = untag_ptr(signer_provider);
+       CHECK_ACCESS(signer_provider_ptr);
+       LDKSignerProvider signer_provider_conv = *(LDKSignerProvider*)(signer_provider_ptr);
+       if (signer_provider_conv.free == LDKSignerProvider_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKSignerProvider_JCalls_cloned(&signer_provider_conv);
+       }
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ");
+       *ret_conv = read_channel_monitors(kv_store_conv, entropy_source_conv, signer_provider_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_MonitorUpdatingPersister_free(int64_t this_obj) {
+       LDKMonitorUpdatingPersister 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);
+       MonitorUpdatingPersister_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_MonitorUpdatingPersister_new(int64_t kv_store, int64_t logger, int64_t maximum_pending_updates, int64_t entropy_source, int64_t signer_provider) {
+       void* kv_store_ptr = untag_ptr(kv_store);
+       CHECK_ACCESS(kv_store_ptr);
+       LDKKVStore kv_store_conv = *(LDKKVStore*)(kv_store_ptr);
+       if (kv_store_conv.free == LDKKVStore_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKKVStore_JCalls_cloned(&kv_store_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);
+       }
+       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* signer_provider_ptr = untag_ptr(signer_provider);
+       CHECK_ACCESS(signer_provider_ptr);
+       LDKSignerProvider signer_provider_conv = *(LDKSignerProvider*)(signer_provider_ptr);
+       if (signer_provider_conv.free == LDKSignerProvider_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKSignerProvider_JCalls_cloned(&signer_provider_conv);
+       }
+       LDKMonitorUpdatingPersister ret_var = MonitorUpdatingPersister_new(kv_store_conv, logger_conv, maximum_pending_updates, entropy_source_conv, signer_provider_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_MonitorUpdatingPersister_read_all_channel_monitors_with_updates(int64_t this_arg, int64_t broadcaster, int64_t fee_estimator) {
+       LDKMonitorUpdatingPersister 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;
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       if (ptr_is_owned(broadcaster)) { CHECK_ACCESS(broadcaster_ptr); }
+       LDKBroadcasterInterface* broadcaster_conv = (LDKBroadcasterInterface*)broadcaster_ptr;
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       if (ptr_is_owned(fee_estimator)) { CHECK_ACCESS(fee_estimator_ptr); }
+       LDKFeeEstimator* fee_estimator_conv = (LDKFeeEstimator*)fee_estimator_ptr;
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ");
+       *ret_conv = MonitorUpdatingPersister_read_all_channel_monitors_with_updates(&this_arg_conv, broadcaster_conv, fee_estimator_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_MonitorUpdatingPersister_read_channel_monitor_with_updates(int64_t this_arg, int64_t broadcaster, int64_t fee_estimator, jstring monitor_key) {
+       LDKMonitorUpdatingPersister 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;
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       if (ptr_is_owned(broadcaster)) { CHECK_ACCESS(broadcaster_ptr); }
+       LDKBroadcasterInterface* broadcaster_conv = (LDKBroadcasterInterface*)broadcaster_ptr;
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       if (ptr_is_owned(fee_estimator)) { CHECK_ACCESS(fee_estimator_ptr); }
+       LDKFeeEstimator* fee_estimator_conv = (LDKFeeEstimator*)fee_estimator_ptr;
+       LDKStr monitor_key_conv = str_ref_to_owned_c(monitor_key);
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ");
+       *ret_conv = MonitorUpdatingPersister_read_channel_monitor_with_updates(&this_arg_conv, broadcaster_conv, fee_estimator_conv, monitor_key_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_MonitorUpdatingPersister_cleanup_stale_updates(int64_t this_arg, jboolean lazy) {
+       LDKMonitorUpdatingPersister 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;
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = MonitorUpdatingPersister_cleanup_stale_updates(&this_arg_conv, lazy);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_MonitorUpdatingPersister_as_Persist(int64_t this_arg) {
+       LDKMonitorUpdatingPersister 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;
+       LDKPersist* ret_ret = MALLOC(sizeof(LDKPersist), "LDKPersist");
+       *ret_ret = MonitorUpdatingPersister_as_Persist(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_UntrustedString_free(int64_t this_obj) {
+       LDKUntrustedString 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);
+       UntrustedString_free(this_obj_conv);
+}
+
+jstring  CS_LDK_UntrustedString_get_a(int64_t this_ptr) {
+       LDKUntrustedString 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 = UntrustedString_get_a(&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_UntrustedString_set_a(int64_t this_ptr, jstring val) {
+       LDKUntrustedString 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);
+       UntrustedString_set_a(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_UntrustedString_new(jstring a_arg) {
+       LDKStr a_arg_conv = str_ref_to_owned_c(a_arg);
+       LDKUntrustedString ret_var = UntrustedString_new(a_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 UntrustedString_clone_ptr(LDKUntrustedString *NONNULL_PTR arg) {
+       LDKUntrustedString ret_var = UntrustedString_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_UntrustedString_clone_ptr(int64_t arg) {
+       LDKUntrustedString 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 = UntrustedString_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UntrustedString_clone(int64_t orig) {
+       LDKUntrustedString 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;
+       LDKUntrustedString ret_var = UntrustedString_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_UntrustedString_eq(int64_t a, int64_t b) {
+       LDKUntrustedString 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;
+       LDKUntrustedString 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 = UntrustedString_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_UntrustedString_write(int64_t obj) {
+       LDKUntrustedString 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 = UntrustedString_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_UntrustedString_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UntrustedStringDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UntrustedStringDecodeErrorZ), "LDKCResult_UntrustedStringDecodeErrorZ");
+       *ret_conv = UntrustedString_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_PrintableString_free(int64_t this_obj) {
+       LDKPrintableString 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);
+       PrintableString_free(this_obj_conv);
+}
+
+jstring  CS_LDK_PrintableString_get_a(int64_t this_ptr) {
+       LDKPrintableString 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 = PrintableString_get_a(&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_PrintableString_set_a(int64_t this_ptr, jstring val) {
+       LDKPrintableString 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);
+       PrintableString_set_a(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_PrintableString_new(jstring a_arg) {
+       LDKStr a_arg_conv = str_ref_to_owned_c(a_arg);
+       LDKPrintableString ret_var = PrintableString_new(a_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;
+}
+
+void  CS_LDK_FutureCallback_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);
+       LDKFutureCallback this_ptr_conv = *(LDKFutureCallback*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       FutureCallback_free(this_ptr_conv);
+}
+
+void  CS_LDK_Future_free(int64_t this_obj) {
+       LDKFuture 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);
+       Future_free(this_obj_conv);
+}
+
+static inline uint64_t Future_clone_ptr(LDKFuture *NONNULL_PTR arg) {
+       LDKFuture ret_var = Future_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_Future_clone_ptr(int64_t arg) {
+       LDKFuture 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 = Future_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Future_clone(int64_t orig) {
+       LDKFuture 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;
+       LDKFuture ret_var = Future_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_Future_register_callback_fn(int64_t this_arg, int64_t callback) {
+       LDKFuture 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;
+       void* callback_ptr = untag_ptr(callback);
+       CHECK_ACCESS(callback_ptr);
+       LDKFutureCallback callback_conv = *(LDKFutureCallback*)(callback_ptr);
+       if (callback_conv.free == LDKFutureCallback_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFutureCallback_JCalls_cloned(&callback_conv);
+       }
+       Future_register_callback_fn(&this_arg_conv, callback_conv);
+}
+
+void  CS_LDK_Future_wait(int64_t this_arg) {
+       LDKFuture 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 = Future_clone(&this_arg_conv);
+       Future_wait(this_arg_conv);
+}
+
+jboolean  CS_LDK_Future_wait_timeout(int64_t this_arg, int64_t max_wait) {
+       LDKFuture 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 = Future_clone(&this_arg_conv);
+       jboolean ret_conv = Future_wait_timeout(this_arg_conv, max_wait);
+       return ret_conv;
+}
+
+void  CS_LDK_Sleeper_free(int64_t this_obj) {
+       LDKSleeper 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);
+       Sleeper_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_Sleeper_from_single_future(int64_t future) {
+       LDKFuture future_conv;
+       future_conv.inner = untag_ptr(future);
+       future_conv.is_owned = ptr_is_owned(future);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(future_conv);
+       future_conv = Future_clone(&future_conv);
+       LDKSleeper ret_var = Sleeper_from_single_future(future_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_Sleeper_from_two_futures(int64_t fut_a, int64_t fut_b) {
+       LDKFuture fut_a_conv;
+       fut_a_conv.inner = untag_ptr(fut_a);
+       fut_a_conv.is_owned = ptr_is_owned(fut_a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(fut_a_conv);
+       fut_a_conv = Future_clone(&fut_a_conv);
+       LDKFuture fut_b_conv;
+       fut_b_conv.inner = untag_ptr(fut_b);
+       fut_b_conv.is_owned = ptr_is_owned(fut_b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(fut_b_conv);
+       fut_b_conv = Future_clone(&fut_b_conv);
+       LDKSleeper ret_var = Sleeper_from_two_futures(fut_a_conv, fut_b_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_Sleeper_new(int64_tArray futures) {
+       LDKCVec_FutureZ futures_constr;
+       futures_constr.datalen = futures->arr_len;
+       if (futures_constr.datalen > 0)
+               futures_constr.data = MALLOC(futures_constr.datalen * sizeof(LDKFuture), "LDKCVec_FutureZ Elements");
+       else
+               futures_constr.data = NULL;
+       int64_t* futures_vals = futures->elems;
+       for (size_t i = 0; i < futures_constr.datalen; i++) {
+               int64_t futures_conv_8 = futures_vals[i];
+               LDKFuture futures_conv_8_conv;
+               futures_conv_8_conv.inner = untag_ptr(futures_conv_8);
+               futures_conv_8_conv.is_owned = ptr_is_owned(futures_conv_8);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(futures_conv_8_conv);
+               futures_conv_8_conv = Future_clone(&futures_conv_8_conv);
+               futures_constr.data[i] = futures_conv_8_conv;
+       }
+       FREE(futures);
+       LDKSleeper ret_var = Sleeper_new(futures_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);
+       return ret_ref;
+}
+
+void  CS_LDK_Sleeper_wait(int64_t this_arg) {
+       LDKSleeper 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;
+       Sleeper_wait(&this_arg_conv);
+}
+
+jboolean  CS_LDK_Sleeper_wait_timeout(int64_t this_arg, int64_t max_wait) {
+       LDKSleeper 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 = Sleeper_wait_timeout(&this_arg_conv, max_wait);
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Level_clone(int64_t orig) {
+       LDKLevel* orig_conv = (LDKLevel*)untag_ptr(orig);
+       int32_t ret_conv = LDKLevel_to_cs(Level_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Level_gossip() {
+       int32_t ret_conv = LDKLevel_to_cs(Level_gossip());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Level_trace() {
+       int32_t ret_conv = LDKLevel_to_cs(Level_trace());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Level_debug() {
+       int32_t ret_conv = LDKLevel_to_cs(Level_debug());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Level_info() {
+       int32_t ret_conv = LDKLevel_to_cs(Level_info());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Level_warn() {
+       int32_t ret_conv = LDKLevel_to_cs(Level_warn());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Level_error() {
+       int32_t ret_conv = LDKLevel_to_cs(Level_error());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Level_eq(int64_t a, int64_t b) {
+       LDKLevel* a_conv = (LDKLevel*)untag_ptr(a);
+       LDKLevel* b_conv = (LDKLevel*)untag_ptr(b);
+       jboolean ret_conv = Level_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Level_hash(int64_t o) {
+       LDKLevel* o_conv = (LDKLevel*)untag_ptr(o);
+       int64_t ret_conv = Level_hash(o_conv);
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Level_max() {
+       int32_t ret_conv = LDKLevel_to_cs(Level_max());
+       return ret_conv;
+}
+
+void  CS_LDK_Record_free(int64_t this_obj) {
+       LDKRecord 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);
+       Record_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_Record_get_level(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;
+       int32_t ret_conv = LDKLevel_to_cs(Record_get_level(&this_ptr_conv));
+       return ret_conv;
+}
+
+void  CS_LDK_Record_set_level(int64_t this_ptr, int32_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;
+       LDKLevel val_conv = LDKLevel_from_cs(val);
+       Record_set_level(&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);
+       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 = Record_get_args(&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_Record_set_args(int64_t this_ptr, jstring 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;
+       LDKStr val_conv = str_ref_to_owned_c(val);
+       Record_set_args(&this_ptr_conv, val_conv);
+}
+
+jstring  CS_LDK_Record_get_module_path(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;
+       LDKStr ret_str = Record_get_module_path(&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_Record_set_module_path(int64_t this_ptr, jstring 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;
+       LDKStr val_conv = str_ref_to_owned_c(val);
+       Record_set_module_path(&this_ptr_conv, val_conv);
+}
+
+jstring  CS_LDK_Record_get_file(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;
+       LDKStr ret_str = Record_get_file(&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_Record_set_file(int64_t this_ptr, jstring 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;
+       LDKStr val_conv = str_ref_to_owned_c(val);
+       Record_set_file(&this_ptr_conv, val_conv);
+}
+
+int32_t  CS_LDK_Record_get_line(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;
+       int32_t ret_conv = Record_get_line(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Record_set_line(int64_t this_ptr, int32_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;
+       Record_set_line(&this_ptr_conv, val);
+}
+
+static inline uint64_t Record_clone_ptr(LDKRecord *NONNULL_PTR arg) {
+       LDKRecord ret_var = Record_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_Record_clone_ptr(int64_t arg) {
+       LDKRecord 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 = Record_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Record_clone(int64_t orig) {
+       LDKRecord 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;
+       LDKRecord ret_var = Record_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_Logger_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);
+       LDKLogger this_ptr_conv = *(LDKLogger*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Logger_free(this_ptr_conv);
+}
+
+void  CS_LDK_ChannelHandshakeConfig_free(int64_t this_obj) {
+       LDKChannelHandshakeConfig 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);
+       ChannelHandshakeConfig_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_ChannelHandshakeConfig_get_minimum_depth(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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 = ChannelHandshakeConfig_get_minimum_depth(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_minimum_depth(int64_t this_ptr, int32_t val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_minimum_depth(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_ChannelHandshakeConfig_get_our_to_self_delay(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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 = ChannelHandshakeConfig_get_our_to_self_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_our_to_self_delay(int64_t this_ptr, int16_t val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_our_to_self_delay(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelHandshakeConfig_get_our_htlc_minimum_msat(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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 = ChannelHandshakeConfig_get_our_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_our_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_our_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int8_t  CS_LDK_ChannelHandshakeConfig_get_max_inbound_htlc_value_in_flight_percent_of_channel(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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 = ChannelHandshakeConfig_get_max_inbound_htlc_value_in_flight_percent_of_channel(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_max_inbound_htlc_value_in_flight_percent_of_channel(int64_t this_ptr, int8_t val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_max_inbound_htlc_value_in_flight_percent_of_channel(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelHandshakeConfig_get_negotiate_scid_privacy(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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;
+       jboolean ret_conv = ChannelHandshakeConfig_get_negotiate_scid_privacy(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_negotiate_scid_privacy(int64_t this_ptr, jboolean val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_negotiate_scid_privacy(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelHandshakeConfig_get_announced_channel(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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;
+       jboolean ret_conv = ChannelHandshakeConfig_get_announced_channel(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_announced_channel(int64_t this_ptr, jboolean val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_announced_channel(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelHandshakeConfig_get_commit_upfront_shutdown_pubkey(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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;
+       jboolean ret_conv = ChannelHandshakeConfig_get_commit_upfront_shutdown_pubkey(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_commit_upfront_shutdown_pubkey(int64_t this_ptr, jboolean val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_commit_upfront_shutdown_pubkey(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_ChannelHandshakeConfig_get_their_channel_reserve_proportional_millionths(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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 = ChannelHandshakeConfig_get_their_channel_reserve_proportional_millionths(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_their_channel_reserve_proportional_millionths(int64_t this_ptr, int32_t val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_their_channel_reserve_proportional_millionths(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelHandshakeConfig_get_negotiate_anchors_zero_fee_htlc_tx(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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;
+       jboolean ret_conv = ChannelHandshakeConfig_get_negotiate_anchors_zero_fee_htlc_tx(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_negotiate_anchors_zero_fee_htlc_tx(int64_t this_ptr, jboolean val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_negotiate_anchors_zero_fee_htlc_tx(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_ChannelHandshakeConfig_get_our_max_accepted_htlcs(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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 = ChannelHandshakeConfig_get_our_max_accepted_htlcs(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_our_max_accepted_htlcs(int64_t this_ptr, int16_t val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_our_max_accepted_htlcs(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelHandshakeConfig_new(int32_t minimum_depth_arg, int16_t our_to_self_delay_arg, int64_t our_htlc_minimum_msat_arg, int8_t max_inbound_htlc_value_in_flight_percent_of_channel_arg, jboolean negotiate_scid_privacy_arg, jboolean announced_channel_arg, jboolean commit_upfront_shutdown_pubkey_arg, int32_t their_channel_reserve_proportional_millionths_arg, jboolean negotiate_anchors_zero_fee_htlc_tx_arg, int16_t our_max_accepted_htlcs_arg) {
+       LDKChannelHandshakeConfig ret_var = ChannelHandshakeConfig_new(minimum_depth_arg, our_to_self_delay_arg, our_htlc_minimum_msat_arg, max_inbound_htlc_value_in_flight_percent_of_channel_arg, negotiate_scid_privacy_arg, announced_channel_arg, commit_upfront_shutdown_pubkey_arg, their_channel_reserve_proportional_millionths_arg, negotiate_anchors_zero_fee_htlc_tx_arg, our_max_accepted_htlcs_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 ChannelHandshakeConfig_clone_ptr(LDKChannelHandshakeConfig *NONNULL_PTR arg) {
+       LDKChannelHandshakeConfig ret_var = ChannelHandshakeConfig_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_ChannelHandshakeConfig_clone_ptr(int64_t arg) {
+       LDKChannelHandshakeConfig 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 = ChannelHandshakeConfig_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelHandshakeConfig_clone(int64_t orig) {
+       LDKChannelHandshakeConfig 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;
+       LDKChannelHandshakeConfig ret_var = ChannelHandshakeConfig_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_ChannelHandshakeConfig_default() {
+       LDKChannelHandshakeConfig ret_var = ChannelHandshakeConfig_default();
+       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_ChannelHandshakeLimits_free(int64_t this_obj) {
+       LDKChannelHandshakeLimits 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);
+       ChannelHandshakeLimits_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChannelHandshakeLimits_get_min_funding_satoshis(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_get_min_funding_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_min_funding_satoshis(int64_t this_ptr, int64_t val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_min_funding_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelHandshakeLimits_get_max_funding_satoshis(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_get_max_funding_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_max_funding_satoshis(int64_t this_ptr, int64_t val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_max_funding_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelHandshakeLimits_get_max_htlc_minimum_msat(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_get_max_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_max_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_max_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelHandshakeLimits_get_min_max_htlc_value_in_flight_msat(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_get_min_max_htlc_value_in_flight_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_min_max_htlc_value_in_flight_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_min_max_htlc_value_in_flight_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelHandshakeLimits_get_max_channel_reserve_satoshis(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_get_max_channel_reserve_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_max_channel_reserve_satoshis(int64_t this_ptr, int64_t val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_max_channel_reserve_satoshis(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_ChannelHandshakeLimits_get_min_max_accepted_htlcs(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_get_min_max_accepted_htlcs(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_min_max_accepted_htlcs(int64_t this_ptr, int16_t val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_min_max_accepted_htlcs(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_ChannelHandshakeLimits_get_max_minimum_depth(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_get_max_minimum_depth(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_max_minimum_depth(int64_t this_ptr, int32_t val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_max_minimum_depth(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelHandshakeLimits_get_trust_own_funding_0conf(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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;
+       jboolean ret_conv = ChannelHandshakeLimits_get_trust_own_funding_0conf(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_trust_own_funding_0conf(int64_t this_ptr, jboolean val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_trust_own_funding_0conf(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelHandshakeLimits_get_force_announced_channel_preference(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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;
+       jboolean ret_conv = ChannelHandshakeLimits_get_force_announced_channel_preference(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_force_announced_channel_preference(int64_t this_ptr, jboolean val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_force_announced_channel_preference(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_ChannelHandshakeLimits_get_their_to_self_delay(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_get_their_to_self_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_their_to_self_delay(int64_t this_ptr, int16_t val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_their_to_self_delay(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelHandshakeLimits_new(int64_t min_funding_satoshis_arg, int64_t max_funding_satoshis_arg, int64_t max_htlc_minimum_msat_arg, int64_t min_max_htlc_value_in_flight_msat_arg, int64_t max_channel_reserve_satoshis_arg, int16_t min_max_accepted_htlcs_arg, int32_t max_minimum_depth_arg, jboolean trust_own_funding_0conf_arg, jboolean force_announced_channel_preference_arg, int16_t their_to_self_delay_arg) {
+       LDKChannelHandshakeLimits ret_var = ChannelHandshakeLimits_new(min_funding_satoshis_arg, max_funding_satoshis_arg, max_htlc_minimum_msat_arg, min_max_htlc_value_in_flight_msat_arg, max_channel_reserve_satoshis_arg, min_max_accepted_htlcs_arg, max_minimum_depth_arg, trust_own_funding_0conf_arg, force_announced_channel_preference_arg, their_to_self_delay_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 ChannelHandshakeLimits_clone_ptr(LDKChannelHandshakeLimits *NONNULL_PTR arg) {
+       LDKChannelHandshakeLimits ret_var = ChannelHandshakeLimits_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_ChannelHandshakeLimits_clone_ptr(int64_t arg) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelHandshakeLimits_clone(int64_t orig) {
+       LDKChannelHandshakeLimits 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;
+       LDKChannelHandshakeLimits ret_var = ChannelHandshakeLimits_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_ChannelHandshakeLimits_default() {
+       LDKChannelHandshakeLimits ret_var = ChannelHandshakeLimits_default();
+       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_MaxDustHTLCExposure_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);
+       LDKMaxDustHTLCExposure this_ptr_conv = *(LDKMaxDustHTLCExposure*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       MaxDustHTLCExposure_free(this_ptr_conv);
+}
+
+static inline uint64_t MaxDustHTLCExposure_clone_ptr(LDKMaxDustHTLCExposure *NONNULL_PTR arg) {
+       LDKMaxDustHTLCExposure *ret_copy = MALLOC(sizeof(LDKMaxDustHTLCExposure), "LDKMaxDustHTLCExposure");
+       *ret_copy = MaxDustHTLCExposure_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_MaxDustHTLCExposure_clone_ptr(int64_t arg) {
+       LDKMaxDustHTLCExposure* arg_conv = (LDKMaxDustHTLCExposure*)untag_ptr(arg);
+       int64_t ret_conv = MaxDustHTLCExposure_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_MaxDustHTLCExposure_clone(int64_t orig) {
+       LDKMaxDustHTLCExposure* orig_conv = (LDKMaxDustHTLCExposure*)untag_ptr(orig);
+       LDKMaxDustHTLCExposure *ret_copy = MALLOC(sizeof(LDKMaxDustHTLCExposure), "LDKMaxDustHTLCExposure");
+       *ret_copy = MaxDustHTLCExposure_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MaxDustHTLCExposure_fixed_limit_msat(int64_t a) {
+       LDKMaxDustHTLCExposure *ret_copy = MALLOC(sizeof(LDKMaxDustHTLCExposure), "LDKMaxDustHTLCExposure");
+       *ret_copy = MaxDustHTLCExposure_fixed_limit_msat(a);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MaxDustHTLCExposure_fee_rate_multiplier(int64_t a) {
+       LDKMaxDustHTLCExposure *ret_copy = MALLOC(sizeof(LDKMaxDustHTLCExposure), "LDKMaxDustHTLCExposure");
+       *ret_copy = MaxDustHTLCExposure_fee_rate_multiplier(a);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_MaxDustHTLCExposure_eq(int64_t a, int64_t b) {
+       LDKMaxDustHTLCExposure* a_conv = (LDKMaxDustHTLCExposure*)untag_ptr(a);
+       LDKMaxDustHTLCExposure* b_conv = (LDKMaxDustHTLCExposure*)untag_ptr(b);
+       jboolean ret_conv = MaxDustHTLCExposure_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_MaxDustHTLCExposure_write(int64_t obj) {
+       LDKMaxDustHTLCExposure* obj_conv = (LDKMaxDustHTLCExposure*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = MaxDustHTLCExposure_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_MaxDustHTLCExposure_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_MaxDustHTLCExposureDecodeErrorZ), "LDKCResult_MaxDustHTLCExposureDecodeErrorZ");
+       *ret_conv = MaxDustHTLCExposure_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelConfig_free(int64_t this_obj) {
+       LDKChannelConfig 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);
+       ChannelConfig_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_ChannelConfig_get_forwarding_fee_proportional_millionths(int64_t this_ptr) {
+       LDKChannelConfig 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 = ChannelConfig_get_forwarding_fee_proportional_millionths(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelConfig_set_forwarding_fee_proportional_millionths(int64_t this_ptr, int32_t val) {
+       LDKChannelConfig 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;
+       ChannelConfig_set_forwarding_fee_proportional_millionths(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_ChannelConfig_get_forwarding_fee_base_msat(int64_t this_ptr) {
+       LDKChannelConfig 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 = ChannelConfig_get_forwarding_fee_base_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelConfig_set_forwarding_fee_base_msat(int64_t this_ptr, int32_t val) {
+       LDKChannelConfig 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;
+       ChannelConfig_set_forwarding_fee_base_msat(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_ChannelConfig_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKChannelConfig 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 = ChannelConfig_get_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelConfig_set_cltv_expiry_delta(int64_t this_ptr, int16_t val) {
+       LDKChannelConfig 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;
+       ChannelConfig_set_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelConfig_get_max_dust_htlc_exposure(int64_t this_ptr) {
+       LDKChannelConfig 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;
+       LDKMaxDustHTLCExposure *ret_copy = MALLOC(sizeof(LDKMaxDustHTLCExposure), "LDKMaxDustHTLCExposure");
+       *ret_copy = ChannelConfig_get_max_dust_htlc_exposure(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelConfig_set_max_dust_htlc_exposure(int64_t this_ptr, int64_t val) {
+       LDKChannelConfig 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);
+       LDKMaxDustHTLCExposure val_conv = *(LDKMaxDustHTLCExposure*)(val_ptr);
+       val_conv = MaxDustHTLCExposure_clone((LDKMaxDustHTLCExposure*)untag_ptr(val));
+       ChannelConfig_set_max_dust_htlc_exposure(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelConfig_get_force_close_avoidance_max_fee_satoshis(int64_t this_ptr) {
+       LDKChannelConfig 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 = ChannelConfig_get_force_close_avoidance_max_fee_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelConfig_set_force_close_avoidance_max_fee_satoshis(int64_t this_ptr, int64_t val) {
+       LDKChannelConfig 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;
+       ChannelConfig_set_force_close_avoidance_max_fee_satoshis(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelConfig_get_accept_underpaying_htlcs(int64_t this_ptr) {
+       LDKChannelConfig 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;
+       jboolean ret_conv = ChannelConfig_get_accept_underpaying_htlcs(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelConfig_set_accept_underpaying_htlcs(int64_t this_ptr, jboolean val) {
+       LDKChannelConfig 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;
+       ChannelConfig_set_accept_underpaying_htlcs(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelConfig_new(int32_t forwarding_fee_proportional_millionths_arg, int32_t forwarding_fee_base_msat_arg, int16_t cltv_expiry_delta_arg, int64_t max_dust_htlc_exposure_arg, int64_t force_close_avoidance_max_fee_satoshis_arg, jboolean accept_underpaying_htlcs_arg) {
+       void* max_dust_htlc_exposure_arg_ptr = untag_ptr(max_dust_htlc_exposure_arg);
+       CHECK_ACCESS(max_dust_htlc_exposure_arg_ptr);
+       LDKMaxDustHTLCExposure max_dust_htlc_exposure_arg_conv = *(LDKMaxDustHTLCExposure*)(max_dust_htlc_exposure_arg_ptr);
+       max_dust_htlc_exposure_arg_conv = MaxDustHTLCExposure_clone((LDKMaxDustHTLCExposure*)untag_ptr(max_dust_htlc_exposure_arg));
+       LDKChannelConfig ret_var = ChannelConfig_new(forwarding_fee_proportional_millionths_arg, forwarding_fee_base_msat_arg, cltv_expiry_delta_arg, max_dust_htlc_exposure_arg_conv, force_close_avoidance_max_fee_satoshis_arg, accept_underpaying_htlcs_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 ChannelConfig_clone_ptr(LDKChannelConfig *NONNULL_PTR arg) {
+       LDKChannelConfig ret_var = ChannelConfig_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_ChannelConfig_clone_ptr(int64_t arg) {
+       LDKChannelConfig 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 = ChannelConfig_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelConfig_clone(int64_t orig) {
+       LDKChannelConfig 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;
+       LDKChannelConfig ret_var = ChannelConfig_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_ChannelConfig_eq(int64_t a, int64_t b) {
+       LDKChannelConfig 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;
+       LDKChannelConfig 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 = ChannelConfig_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelConfig_apply(int64_t this_arg, int64_t update) {
+       LDKChannelConfig 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;
+       LDKChannelConfigUpdate update_conv;
+       update_conv.inner = untag_ptr(update);
+       update_conv.is_owned = ptr_is_owned(update);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_conv);
+       update_conv.is_owned = false;
+       ChannelConfig_apply(&this_arg_conv, &update_conv);
+}
+
+int64_t  CS_LDK_ChannelConfig_default() {
+       LDKChannelConfig ret_var = ChannelConfig_default();
+       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_ChannelConfig_write(int64_t obj) {
+       LDKChannelConfig 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 = ChannelConfig_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_ChannelConfig_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelConfigDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelConfigDecodeErrorZ), "LDKCResult_ChannelConfigDecodeErrorZ");
+       *ret_conv = ChannelConfig_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelConfigUpdate_free(int64_t this_obj) {
+       LDKChannelConfigUpdate 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);
+       ChannelConfigUpdate_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChannelConfigUpdate_get_forwarding_fee_proportional_millionths(int64_t this_ptr) {
+       LDKChannelConfigUpdate 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_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = ChannelConfigUpdate_get_forwarding_fee_proportional_millionths(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelConfigUpdate_set_forwarding_fee_proportional_millionths(int64_t this_ptr, int64_t val) {
+       LDKChannelConfigUpdate 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_u32Z val_conv = *(LDKCOption_u32Z*)(val_ptr);
+       val_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(val));
+       ChannelConfigUpdate_set_forwarding_fee_proportional_millionths(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelConfigUpdate_get_forwarding_fee_base_msat(int64_t this_ptr) {
+       LDKChannelConfigUpdate 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_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = ChannelConfigUpdate_get_forwarding_fee_base_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelConfigUpdate_set_forwarding_fee_base_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelConfigUpdate 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_u32Z val_conv = *(LDKCOption_u32Z*)(val_ptr);
+       val_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(val));
+       ChannelConfigUpdate_set_forwarding_fee_base_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelConfigUpdate_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKChannelConfigUpdate 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_u16Z *ret_copy = MALLOC(sizeof(LDKCOption_u16Z), "LDKCOption_u16Z");
+       *ret_copy = ChannelConfigUpdate_get_cltv_expiry_delta(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelConfigUpdate_set_cltv_expiry_delta(int64_t this_ptr, int64_t val) {
+       LDKChannelConfigUpdate 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_u16Z val_conv = *(LDKCOption_u16Z*)(val_ptr);
+       val_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(val));
+       ChannelConfigUpdate_set_cltv_expiry_delta(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelConfigUpdate_get_max_dust_htlc_exposure_msat(int64_t this_ptr) {
+       LDKChannelConfigUpdate 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_MaxDustHTLCExposureZ *ret_copy = MALLOC(sizeof(LDKCOption_MaxDustHTLCExposureZ), "LDKCOption_MaxDustHTLCExposureZ");
+       *ret_copy = ChannelConfigUpdate_get_max_dust_htlc_exposure_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelConfigUpdate_set_max_dust_htlc_exposure_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelConfigUpdate 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_MaxDustHTLCExposureZ val_conv = *(LDKCOption_MaxDustHTLCExposureZ*)(val_ptr);
+       val_conv = COption_MaxDustHTLCExposureZ_clone((LDKCOption_MaxDustHTLCExposureZ*)untag_ptr(val));
+       ChannelConfigUpdate_set_max_dust_htlc_exposure_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelConfigUpdate_get_force_close_avoidance_max_fee_satoshis(int64_t this_ptr) {
+       LDKChannelConfigUpdate 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 = ChannelConfigUpdate_get_force_close_avoidance_max_fee_satoshis(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelConfigUpdate_set_force_close_avoidance_max_fee_satoshis(int64_t this_ptr, int64_t val) {
+       LDKChannelConfigUpdate 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));
+       ChannelConfigUpdate_set_force_close_avoidance_max_fee_satoshis(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelConfigUpdate_new(int64_t forwarding_fee_proportional_millionths_arg, int64_t forwarding_fee_base_msat_arg, int64_t cltv_expiry_delta_arg, int64_t max_dust_htlc_exposure_msat_arg, int64_t force_close_avoidance_max_fee_satoshis_arg) {
+       void* forwarding_fee_proportional_millionths_arg_ptr = untag_ptr(forwarding_fee_proportional_millionths_arg);
+       CHECK_ACCESS(forwarding_fee_proportional_millionths_arg_ptr);
+       LDKCOption_u32Z forwarding_fee_proportional_millionths_arg_conv = *(LDKCOption_u32Z*)(forwarding_fee_proportional_millionths_arg_ptr);
+       forwarding_fee_proportional_millionths_arg_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(forwarding_fee_proportional_millionths_arg));
+       void* forwarding_fee_base_msat_arg_ptr = untag_ptr(forwarding_fee_base_msat_arg);
+       CHECK_ACCESS(forwarding_fee_base_msat_arg_ptr);
+       LDKCOption_u32Z forwarding_fee_base_msat_arg_conv = *(LDKCOption_u32Z*)(forwarding_fee_base_msat_arg_ptr);
+       forwarding_fee_base_msat_arg_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(forwarding_fee_base_msat_arg));
+       void* cltv_expiry_delta_arg_ptr = untag_ptr(cltv_expiry_delta_arg);
+       CHECK_ACCESS(cltv_expiry_delta_arg_ptr);
+       LDKCOption_u16Z cltv_expiry_delta_arg_conv = *(LDKCOption_u16Z*)(cltv_expiry_delta_arg_ptr);
+       cltv_expiry_delta_arg_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(cltv_expiry_delta_arg));
+       void* max_dust_htlc_exposure_msat_arg_ptr = untag_ptr(max_dust_htlc_exposure_msat_arg);
+       CHECK_ACCESS(max_dust_htlc_exposure_msat_arg_ptr);
+       LDKCOption_MaxDustHTLCExposureZ max_dust_htlc_exposure_msat_arg_conv = *(LDKCOption_MaxDustHTLCExposureZ*)(max_dust_htlc_exposure_msat_arg_ptr);
+       max_dust_htlc_exposure_msat_arg_conv = COption_MaxDustHTLCExposureZ_clone((LDKCOption_MaxDustHTLCExposureZ*)untag_ptr(max_dust_htlc_exposure_msat_arg));
+       void* force_close_avoidance_max_fee_satoshis_arg_ptr = untag_ptr(force_close_avoidance_max_fee_satoshis_arg);
+       CHECK_ACCESS(force_close_avoidance_max_fee_satoshis_arg_ptr);
+       LDKCOption_u64Z force_close_avoidance_max_fee_satoshis_arg_conv = *(LDKCOption_u64Z*)(force_close_avoidance_max_fee_satoshis_arg_ptr);
+       force_close_avoidance_max_fee_satoshis_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(force_close_avoidance_max_fee_satoshis_arg));
+       LDKChannelConfigUpdate ret_var = ChannelConfigUpdate_new(forwarding_fee_proportional_millionths_arg_conv, forwarding_fee_base_msat_arg_conv, cltv_expiry_delta_arg_conv, max_dust_htlc_exposure_msat_arg_conv, force_close_avoidance_max_fee_satoshis_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_ChannelConfigUpdate_default() {
+       LDKChannelConfigUpdate ret_var = ChannelConfigUpdate_default();
+       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_UserConfig_free(int64_t this_obj) {
+       LDKUserConfig 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);
+       UserConfig_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_UserConfig_get_channel_handshake_config(int64_t this_ptr) {
+       LDKUserConfig 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;
+       LDKChannelHandshakeConfig ret_var = UserConfig_get_channel_handshake_config(&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_UserConfig_set_channel_handshake_config(int64_t this_ptr, int64_t val) {
+       LDKUserConfig 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;
+       LDKChannelHandshakeConfig 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 = ChannelHandshakeConfig_clone(&val_conv);
+       UserConfig_set_channel_handshake_config(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_UserConfig_get_channel_handshake_limits(int64_t this_ptr) {
+       LDKUserConfig 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;
+       LDKChannelHandshakeLimits ret_var = UserConfig_get_channel_handshake_limits(&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_UserConfig_set_channel_handshake_limits(int64_t this_ptr, int64_t val) {
+       LDKUserConfig 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;
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_clone(&val_conv);
+       UserConfig_set_channel_handshake_limits(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_UserConfig_get_channel_config(int64_t this_ptr) {
+       LDKUserConfig 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;
+       LDKChannelConfig ret_var = UserConfig_get_channel_config(&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_UserConfig_set_channel_config(int64_t this_ptr, int64_t val) {
+       LDKUserConfig 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;
+       LDKChannelConfig 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 = ChannelConfig_clone(&val_conv);
+       UserConfig_set_channel_config(&this_ptr_conv, val_conv);
+}
+
+jboolean  CS_LDK_UserConfig_get_accept_forwards_to_priv_channels(int64_t this_ptr) {
+       LDKUserConfig 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;
+       jboolean ret_conv = UserConfig_get_accept_forwards_to_priv_channels(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UserConfig_set_accept_forwards_to_priv_channels(int64_t this_ptr, jboolean val) {
+       LDKUserConfig 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;
+       UserConfig_set_accept_forwards_to_priv_channels(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_UserConfig_get_accept_inbound_channels(int64_t this_ptr) {
+       LDKUserConfig 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;
+       jboolean ret_conv = UserConfig_get_accept_inbound_channels(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UserConfig_set_accept_inbound_channels(int64_t this_ptr, jboolean val) {
+       LDKUserConfig 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;
+       UserConfig_set_accept_inbound_channels(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_UserConfig_get_manually_accept_inbound_channels(int64_t this_ptr) {
+       LDKUserConfig 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;
+       jboolean ret_conv = UserConfig_get_manually_accept_inbound_channels(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UserConfig_set_manually_accept_inbound_channels(int64_t this_ptr, jboolean val) {
+       LDKUserConfig 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;
+       UserConfig_set_manually_accept_inbound_channels(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_UserConfig_get_accept_intercept_htlcs(int64_t this_ptr) {
+       LDKUserConfig 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;
+       jboolean ret_conv = UserConfig_get_accept_intercept_htlcs(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UserConfig_set_accept_intercept_htlcs(int64_t this_ptr, jboolean val) {
+       LDKUserConfig 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;
+       UserConfig_set_accept_intercept_htlcs(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_UserConfig_get_accept_mpp_keysend(int64_t this_ptr) {
+       LDKUserConfig 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;
+       jboolean ret_conv = UserConfig_get_accept_mpp_keysend(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UserConfig_set_accept_mpp_keysend(int64_t this_ptr, jboolean val) {
+       LDKUserConfig 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;
+       UserConfig_set_accept_mpp_keysend(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_UserConfig_new(int64_t channel_handshake_config_arg, int64_t channel_handshake_limits_arg, int64_t channel_config_arg, jboolean accept_forwards_to_priv_channels_arg, jboolean accept_inbound_channels_arg, jboolean manually_accept_inbound_channels_arg, jboolean accept_intercept_htlcs_arg, jboolean accept_mpp_keysend_arg) {
+       LDKChannelHandshakeConfig channel_handshake_config_arg_conv;
+       channel_handshake_config_arg_conv.inner = untag_ptr(channel_handshake_config_arg);
+       channel_handshake_config_arg_conv.is_owned = ptr_is_owned(channel_handshake_config_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_handshake_config_arg_conv);
+       channel_handshake_config_arg_conv = ChannelHandshakeConfig_clone(&channel_handshake_config_arg_conv);
+       LDKChannelHandshakeLimits channel_handshake_limits_arg_conv;
+       channel_handshake_limits_arg_conv.inner = untag_ptr(channel_handshake_limits_arg);
+       channel_handshake_limits_arg_conv.is_owned = ptr_is_owned(channel_handshake_limits_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_handshake_limits_arg_conv);
+       channel_handshake_limits_arg_conv = ChannelHandshakeLimits_clone(&channel_handshake_limits_arg_conv);
+       LDKChannelConfig channel_config_arg_conv;
+       channel_config_arg_conv.inner = untag_ptr(channel_config_arg);
+       channel_config_arg_conv.is_owned = ptr_is_owned(channel_config_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_config_arg_conv);
+       channel_config_arg_conv = ChannelConfig_clone(&channel_config_arg_conv);
+       LDKUserConfig ret_var = UserConfig_new(channel_handshake_config_arg_conv, channel_handshake_limits_arg_conv, channel_config_arg_conv, accept_forwards_to_priv_channels_arg, accept_inbound_channels_arg, manually_accept_inbound_channels_arg, accept_intercept_htlcs_arg, accept_mpp_keysend_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 UserConfig_clone_ptr(LDKUserConfig *NONNULL_PTR arg) {
+       LDKUserConfig ret_var = UserConfig_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_UserConfig_clone_ptr(int64_t arg) {
+       LDKUserConfig 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 = UserConfig_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UserConfig_clone(int64_t orig) {
+       LDKUserConfig 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;
+       LDKUserConfig ret_var = UserConfig_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_UserConfig_default() {
+       LDKUserConfig ret_var = UserConfig_default();
+       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_BestBlock_free(int64_t this_obj) {
+       LDKBestBlock 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);
+       BestBlock_free(this_obj_conv);
+}
+
+static inline uint64_t BestBlock_clone_ptr(LDKBestBlock *NONNULL_PTR arg) {
+       LDKBestBlock ret_var = BestBlock_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_BestBlock_clone_ptr(int64_t arg) {
+       LDKBestBlock 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 = BestBlock_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BestBlock_clone(int64_t orig) {
+       LDKBestBlock 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;
+       LDKBestBlock ret_var = BestBlock_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_BestBlock_eq(int64_t a, int64_t b) {
+       LDKBestBlock 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;
+       LDKBestBlock 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 = BestBlock_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BestBlock_from_network(int32_t network) {
+       LDKNetwork network_conv = LDKNetwork_from_cs(network);
+       LDKBestBlock ret_var = BestBlock_from_network(network_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_BestBlock_new(int8_tArray block_hash, int32_t height) {
+       LDKThirtyTwoBytes block_hash_ref;
+       CHECK(block_hash->arr_len == 32);
+       memcpy(block_hash_ref.data, block_hash->elems, 32); FREE(block_hash);
+       LDKBestBlock ret_var = BestBlock_new(block_hash_ref, height);
+       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_BestBlock_block_hash(int64_t this_arg) {
+       LDKBestBlock 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, BestBlock_block_hash(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int32_t  CS_LDK_BestBlock_height(int64_t this_arg) {
+       LDKBestBlock 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;
+       int32_t ret_conv = BestBlock_height(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Listen_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);
+       LDKListen this_ptr_conv = *(LDKListen*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Listen_free(this_ptr_conv);
+}
+
+void  CS_LDK_Confirm_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);
+       LDKConfirm this_ptr_conv = *(LDKConfirm*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Confirm_free(this_ptr_conv);
+}
+
+int32_t  CS_LDK_ChannelMonitorUpdateStatus_clone(int64_t orig) {
+       LDKChannelMonitorUpdateStatus* orig_conv = (LDKChannelMonitorUpdateStatus*)untag_ptr(orig);
+       int32_t ret_conv = LDKChannelMonitorUpdateStatus_to_cs(ChannelMonitorUpdateStatus_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ChannelMonitorUpdateStatus_completed() {
+       int32_t ret_conv = LDKChannelMonitorUpdateStatus_to_cs(ChannelMonitorUpdateStatus_completed());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ChannelMonitorUpdateStatus_in_progress() {
+       int32_t ret_conv = LDKChannelMonitorUpdateStatus_to_cs(ChannelMonitorUpdateStatus_in_progress());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ChannelMonitorUpdateStatus_unrecoverable_error() {
+       int32_t ret_conv = LDKChannelMonitorUpdateStatus_to_cs(ChannelMonitorUpdateStatus_unrecoverable_error());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelMonitorUpdateStatus_eq(int64_t a, int64_t b) {
+       LDKChannelMonitorUpdateStatus* a_conv = (LDKChannelMonitorUpdateStatus*)untag_ptr(a);
+       LDKChannelMonitorUpdateStatus* b_conv = (LDKChannelMonitorUpdateStatus*)untag_ptr(b);
+       jboolean ret_conv = ChannelMonitorUpdateStatus_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Watch_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);
+       LDKWatch this_ptr_conv = *(LDKWatch*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Watch_free(this_ptr_conv);
+}
+
+void  CS_LDK_Filter_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);
+       LDKFilter this_ptr_conv = *(LDKFilter*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Filter_free(this_ptr_conv);
+}
+
+void  CS_LDK_WatchedOutput_free(int64_t this_obj) {
+       LDKWatchedOutput 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);
+       WatchedOutput_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_WatchedOutput_get_block_hash(int64_t this_ptr) {
+       LDKWatchedOutput 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 = WatchedOutput_get_block_hash(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_WatchedOutput_set_block_hash(int64_t this_ptr, int64_t val) {
+       LDKWatchedOutput 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));
+       WatchedOutput_set_block_hash(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_WatchedOutput_get_outpoint(int64_t this_ptr) {
+       LDKWatchedOutput 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;
+       LDKOutPoint ret_var = WatchedOutput_get_outpoint(&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_WatchedOutput_set_outpoint(int64_t this_ptr, int64_t val) {
+       LDKWatchedOutput 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;
+       LDKOutPoint 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 = OutPoint_clone(&val_conv);
+       WatchedOutput_set_outpoint(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_WatchedOutput_get_script_pubkey(int64_t this_ptr) {
+       LDKWatchedOutput 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;
+       LDKu8slice 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);
+       return ret_arr;
+}
+
+void  CS_LDK_WatchedOutput_set_script_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKWatchedOutput 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);
+       WatchedOutput_set_script_pubkey(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_WatchedOutput_new(int64_t block_hash_arg, int64_t outpoint_arg, int8_tArray script_pubkey_arg) {
+       void* block_hash_arg_ptr = untag_ptr(block_hash_arg);
+       CHECK_ACCESS(block_hash_arg_ptr);
+       LDKCOption_ThirtyTwoBytesZ block_hash_arg_conv = *(LDKCOption_ThirtyTwoBytesZ*)(block_hash_arg_ptr);
+       block_hash_arg_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(block_hash_arg));
+       LDKOutPoint outpoint_arg_conv;
+       outpoint_arg_conv.inner = untag_ptr(outpoint_arg);
+       outpoint_arg_conv.is_owned = ptr_is_owned(outpoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_arg_conv);
+       outpoint_arg_conv = OutPoint_clone(&outpoint_arg_conv);
+       LDKCVec_u8Z script_pubkey_arg_ref;
+       script_pubkey_arg_ref.datalen = script_pubkey_arg->arr_len;
+       script_pubkey_arg_ref.data = MALLOC(script_pubkey_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(script_pubkey_arg_ref.data, script_pubkey_arg->elems, script_pubkey_arg_ref.datalen); FREE(script_pubkey_arg);
+       LDKWatchedOutput ret_var = WatchedOutput_new(block_hash_arg_conv, outpoint_arg_conv, script_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 WatchedOutput_clone_ptr(LDKWatchedOutput *NONNULL_PTR arg) {
+       LDKWatchedOutput ret_var = WatchedOutput_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_WatchedOutput_clone_ptr(int64_t arg) {
+       LDKWatchedOutput 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 = WatchedOutput_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_WatchedOutput_clone(int64_t orig) {
+       LDKWatchedOutput 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;
+       LDKWatchedOutput ret_var = WatchedOutput_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_WatchedOutput_eq(int64_t a, int64_t b) {
+       LDKWatchedOutput 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;
+       LDKWatchedOutput 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 = WatchedOutput_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_WatchedOutput_hash(int64_t o) {
+       LDKWatchedOutput 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 = WatchedOutput_hash(&o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BroadcasterInterface_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);
+       LDKBroadcasterInterface this_ptr_conv = *(LDKBroadcasterInterface*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       BroadcasterInterface_free(this_ptr_conv);
+}
+
+int32_t  CS_LDK_ConfirmationTarget_clone(int64_t orig) {
+       LDKConfirmationTarget* orig_conv = (LDKConfirmationTarget*)untag_ptr(orig);
+       int32_t ret_conv = LDKConfirmationTarget_to_cs(ConfirmationTarget_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ConfirmationTarget_on_chain_sweep() {
+       int32_t ret_conv = LDKConfirmationTarget_to_cs(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;
+}
+
+int32_t  CS_LDK_ConfirmationTarget_min_allowed_non_anchor_channel_remote_fee() {
+       int32_t ret_conv = LDKConfirmationTarget_to_cs(ConfirmationTarget_min_allowed_non_anchor_channel_remote_fee());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ConfirmationTarget_anchor_channel_fee() {
+       int32_t ret_conv = LDKConfirmationTarget_to_cs(ConfirmationTarget_anchor_channel_fee());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ConfirmationTarget_non_anchor_channel_fee() {
+       int32_t ret_conv = LDKConfirmationTarget_to_cs(ConfirmationTarget_non_anchor_channel_fee());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ConfirmationTarget_channel_close_minimum() {
+       int32_t ret_conv = LDKConfirmationTarget_to_cs(ConfirmationTarget_channel_close_minimum());
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ConfirmationTarget_hash(int64_t o) {
+       LDKConfirmationTarget* o_conv = (LDKConfirmationTarget*)untag_ptr(o);
+       int64_t ret_conv = ConfirmationTarget_hash(o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ConfirmationTarget_eq(int64_t a, int64_t b) {
+       LDKConfirmationTarget* a_conv = (LDKConfirmationTarget*)untag_ptr(a);
+       LDKConfirmationTarget* b_conv = (LDKConfirmationTarget*)untag_ptr(b);
+       jboolean ret_conv = ConfirmationTarget_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_FeeEstimator_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);
+       LDKFeeEstimator this_ptr_conv = *(LDKFeeEstimator*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       FeeEstimator_free(this_ptr_conv);
+}
+
+void  CS_LDK_MonitorUpdateId_free(int64_t this_obj) {
+       LDKMonitorUpdateId 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);
+       MonitorUpdateId_free(this_obj_conv);
+}
+
+static inline uint64_t MonitorUpdateId_clone_ptr(LDKMonitorUpdateId *NONNULL_PTR arg) {
+       LDKMonitorUpdateId ret_var = MonitorUpdateId_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_MonitorUpdateId_clone_ptr(int64_t arg) {
+       LDKMonitorUpdateId 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 = MonitorUpdateId_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_MonitorUpdateId_clone(int64_t orig) {
+       LDKMonitorUpdateId 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;
+       LDKMonitorUpdateId ret_var = MonitorUpdateId_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_MonitorUpdateId_hash(int64_t o) {
+       LDKMonitorUpdateId 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 = MonitorUpdateId_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_MonitorUpdateId_eq(int64_t a, int64_t b) {
+       LDKMonitorUpdateId 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;
+       LDKMonitorUpdateId 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 = MonitorUpdateId_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Persist_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);
+       LDKPersist this_ptr_conv = *(LDKPersist*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Persist_free(this_ptr_conv);
+}
+
+void  CS_LDK_LockedChannelMonitor_free(int64_t this_obj) {
+       LDKLockedChannelMonitor 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);
+       LockedChannelMonitor_free(this_obj_conv);
+}
+
+void  CS_LDK_ChainMonitor_free(int64_t this_obj) {
+       LDKChainMonitor 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);
+       ChainMonitor_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChainMonitor_new(int64_t chain_source, int64_t broadcaster, int64_t logger, int64_t feeest, int64_t persister) {
+       void* chain_source_ptr = untag_ptr(chain_source);
+       CHECK_ACCESS(chain_source_ptr);
+       LDKCOption_FilterZ chain_source_conv = *(LDKCOption_FilterZ*)(chain_source_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKCOption_FilterZ
+       if (chain_source_conv.tag == LDKCOption_FilterZ_Some) {
+               // Manually implement clone for Java trait instances
+               if (chain_source_conv.some.free == LDKFilter_JCalls_free) {
+                       // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                       LDKFilter_JCalls_cloned(&chain_source_conv.some);
+               }
+       }
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       CHECK_ACCESS(broadcaster_ptr);
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(broadcaster_ptr);
+       if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&broadcaster_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);
+       }
+       void* feeest_ptr = untag_ptr(feeest);
+       CHECK_ACCESS(feeest_ptr);
+       LDKFeeEstimator feeest_conv = *(LDKFeeEstimator*)(feeest_ptr);
+       if (feeest_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_cloned(&feeest_conv);
+       }
+       void* persister_ptr = untag_ptr(persister);
+       CHECK_ACCESS(persister_ptr);
+       LDKPersist persister_conv = *(LDKPersist*)(persister_ptr);
+       if (persister_conv.free == LDKPersist_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKPersist_JCalls_cloned(&persister_conv);
+       }
+       LDKChainMonitor ret_var = ChainMonitor_new(chain_source_conv, broadcaster_conv, logger_conv, feeest_conv, persister_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_tArray  CS_LDK_ChainMonitor_get_claimable_balances(int64_t this_arg, int64_tArray ignored_channels) {
+       LDKChainMonitor 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;
+       LDKCVec_ChannelDetailsZ ignored_channels_constr;
+       ignored_channels_constr.datalen = ignored_channels->arr_len;
+       if (ignored_channels_constr.datalen > 0)
+               ignored_channels_constr.data = MALLOC(ignored_channels_constr.datalen * sizeof(LDKChannelDetails), "LDKCVec_ChannelDetailsZ Elements");
+       else
+               ignored_channels_constr.data = NULL;
+       int64_t* ignored_channels_vals = ignored_channels->elems;
+       for (size_t q = 0; q < ignored_channels_constr.datalen; q++) {
+               int64_t ignored_channels_conv_16 = ignored_channels_vals[q];
+               LDKChannelDetails ignored_channels_conv_16_conv;
+               ignored_channels_conv_16_conv.inner = untag_ptr(ignored_channels_conv_16);
+               ignored_channels_conv_16_conv.is_owned = ptr_is_owned(ignored_channels_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ignored_channels_conv_16_conv);
+               ignored_channels_conv_16_conv = ChannelDetails_clone(&ignored_channels_conv_16_conv);
+               ignored_channels_constr.data[q] = ignored_channels_conv_16_conv;
+       }
+       FREE(ignored_channels);
+       LDKCVec_BalanceZ ret_var = ChainMonitor_get_claimable_balances(&this_arg_conv, ignored_channels_constr);
+       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 j = 0; j < ret_var.datalen; j++) {
+               LDKBalance *ret_conv_9_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+               *ret_conv_9_copy = ret_var.data[j];
+               int64_t ret_conv_9_ref = tag_ptr(ret_conv_9_copy, true);
+               ret_arr_ptr[j] = ret_conv_9_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_ChainMonitor_get_monitor(int64_t this_arg, int64_t funding_txo) {
+       LDKChainMonitor 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;
+       LDKOutPoint funding_txo_conv;
+       funding_txo_conv.inner = untag_ptr(funding_txo);
+       funding_txo_conv.is_owned = ptr_is_owned(funding_txo);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       LDKCResult_LockedChannelMonitorNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_LockedChannelMonitorNoneZ), "LDKCResult_LockedChannelMonitorNoneZ");
+       *ret_conv = ChainMonitor_get_monitor(&this_arg_conv, funding_txo_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_tArray  CS_LDK_ChainMonitor_list_monitors(int64_t this_arg) {
+       LDKChainMonitor 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;
+       LDKCVec_OutPointZ ret_var = ChainMonitor_list_monitors(&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 k = 0; k < ret_var.datalen; k++) {
+               LDKOutPoint ret_conv_10_var = ret_var.data[k];
+               int64_t ret_conv_10_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_10_var);
+               ret_conv_10_ref = tag_ptr(ret_conv_10_var.inner, ret_conv_10_var.is_owned);
+               ret_arr_ptr[k] = ret_conv_10_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_ChainMonitor_list_pending_monitor_updates(int64_t this_arg) {
+       LDKChainMonitor 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;
+       LDKCVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ ret_var = ChainMonitor_list_pending_monitor_updates(&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 p = 0; p < ret_var.datalen; p++) {
+               LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ* ret_conv_41_conv = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ), "LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ");
+               *ret_conv_41_conv = ret_var.data[p];
+               ret_arr_ptr[p] = tag_ptr(ret_conv_41_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_ChainMonitor_channel_monitor_updated(int64_t this_arg, int64_t funding_txo, int64_t completed_update_id) {
+       LDKChainMonitor 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;
+       LDKOutPoint funding_txo_conv;
+       funding_txo_conv.inner = untag_ptr(funding_txo);
+       funding_txo_conv.is_owned = ptr_is_owned(funding_txo);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       LDKMonitorUpdateId completed_update_id_conv;
+       completed_update_id_conv.inner = untag_ptr(completed_update_id);
+       completed_update_id_conv.is_owned = ptr_is_owned(completed_update_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(completed_update_id_conv);
+       completed_update_id_conv = MonitorUpdateId_clone(&completed_update_id_conv);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChainMonitor_channel_monitor_updated(&this_arg_conv, funding_txo_conv, completed_update_id_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChainMonitor_get_update_future(int64_t this_arg) {
+       LDKChainMonitor 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;
+       LDKFuture ret_var = ChainMonitor_get_update_future(&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;
+}
+
+void  CS_LDK_ChainMonitor_rebroadcast_pending_claims(int64_t this_arg) {
+       LDKChainMonitor 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;
+       ChainMonitor_rebroadcast_pending_claims(&this_arg_conv);
+}
+
+int64_t  CS_LDK_ChainMonitor_as_Listen(int64_t this_arg) {
+       LDKChainMonitor 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;
+       LDKListen* ret_ret = MALLOC(sizeof(LDKListen), "LDKListen");
+       *ret_ret = ChainMonitor_as_Listen(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ChainMonitor_as_Confirm(int64_t this_arg) {
+       LDKChainMonitor 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;
+       LDKConfirm* ret_ret = MALLOC(sizeof(LDKConfirm), "LDKConfirm");
+       *ret_ret = ChainMonitor_as_Confirm(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ChainMonitor_as_Watch(int64_t this_arg) {
+       LDKChainMonitor 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;
+       LDKWatch* ret_ret = MALLOC(sizeof(LDKWatch), "LDKWatch");
+       *ret_ret = ChainMonitor_as_Watch(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ChainMonitor_as_EventsProvider(int64_t this_arg) {
+       LDKChainMonitor 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 = ChainMonitor_as_EventsProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_ChannelMonitorUpdate_free(int64_t this_obj) {
+       LDKChannelMonitorUpdate 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);
+       ChannelMonitorUpdate_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChannelMonitorUpdate_get_update_id(int64_t this_ptr) {
+       LDKChannelMonitorUpdate 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 = ChannelMonitorUpdate_get_update_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelMonitorUpdate_set_update_id(int64_t this_ptr, int64_t val) {
+       LDKChannelMonitorUpdate 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;
+       ChannelMonitorUpdate_set_update_id(&this_ptr_conv, val);
+}
+
+static inline uint64_t ChannelMonitorUpdate_clone_ptr(LDKChannelMonitorUpdate *NONNULL_PTR arg) {
+       LDKChannelMonitorUpdate ret_var = ChannelMonitorUpdate_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_ChannelMonitorUpdate_clone_ptr(int64_t arg) {
+       LDKChannelMonitorUpdate 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 = ChannelMonitorUpdate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelMonitorUpdate_clone(int64_t orig) {
+       LDKChannelMonitorUpdate 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;
+       LDKChannelMonitorUpdate ret_var = ChannelMonitorUpdate_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_ChannelMonitorUpdate_eq(int64_t a, int64_t b) {
+       LDKChannelMonitorUpdate 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;
+       LDKChannelMonitorUpdate 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 = ChannelMonitorUpdate_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_ChannelMonitorUpdate_write(int64_t obj) {
+       LDKChannelMonitorUpdate 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 = ChannelMonitorUpdate_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_ChannelMonitorUpdate_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateDecodeErrorZ), "LDKCResult_ChannelMonitorUpdateDecodeErrorZ");
+       *ret_conv = ChannelMonitorUpdate_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_MonitorEvent_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);
+       LDKMonitorEvent this_ptr_conv = *(LDKMonitorEvent*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       MonitorEvent_free(this_ptr_conv);
+}
+
+static inline uint64_t MonitorEvent_clone_ptr(LDKMonitorEvent *NONNULL_PTR arg) {
+       LDKMonitorEvent *ret_copy = MALLOC(sizeof(LDKMonitorEvent), "LDKMonitorEvent");
+       *ret_copy = MonitorEvent_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_MonitorEvent_clone_ptr(int64_t arg) {
+       LDKMonitorEvent* arg_conv = (LDKMonitorEvent*)untag_ptr(arg);
+       int64_t ret_conv = MonitorEvent_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_MonitorEvent_clone(int64_t orig) {
+       LDKMonitorEvent* orig_conv = (LDKMonitorEvent*)untag_ptr(orig);
+       LDKMonitorEvent *ret_copy = MALLOC(sizeof(LDKMonitorEvent), "LDKMonitorEvent");
+       *ret_copy = MonitorEvent_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MonitorEvent_htlcevent(int64_t a) {
+       LDKHTLCUpdate 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 = HTLCUpdate_clone(&a_conv);
+       LDKMonitorEvent *ret_copy = MALLOC(sizeof(LDKMonitorEvent), "LDKMonitorEvent");
+       *ret_copy = MonitorEvent_htlcevent(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MonitorEvent_holder_force_closed(int64_t a) {
+       LDKOutPoint 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 = OutPoint_clone(&a_conv);
+       LDKMonitorEvent *ret_copy = MALLOC(sizeof(LDKMonitorEvent), "LDKMonitorEvent");
+       *ret_copy = MonitorEvent_holder_force_closed(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MonitorEvent_completed(int64_t funding_txo, int64_t monitor_update_id) {
+       LDKOutPoint funding_txo_conv;
+       funding_txo_conv.inner = untag_ptr(funding_txo);
+       funding_txo_conv.is_owned = ptr_is_owned(funding_txo);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       LDKMonitorEvent *ret_copy = MALLOC(sizeof(LDKMonitorEvent), "LDKMonitorEvent");
+       *ret_copy = MonitorEvent_completed(funding_txo_conv, monitor_update_id);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_MonitorEvent_eq(int64_t a, int64_t b) {
+       LDKMonitorEvent* a_conv = (LDKMonitorEvent*)untag_ptr(a);
+       LDKMonitorEvent* b_conv = (LDKMonitorEvent*)untag_ptr(b);
+       jboolean ret_conv = MonitorEvent_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_MonitorEvent_write(int64_t obj) {
+       LDKMonitorEvent* obj_conv = (LDKMonitorEvent*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = MonitorEvent_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_MonitorEvent_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_MonitorEventZDecodeErrorZ), "LDKCResult_COption_MonitorEventZDecodeErrorZ");
+       *ret_conv = MonitorEvent_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_HTLCUpdate_free(int64_t this_obj) {
+       LDKHTLCUpdate 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);
+       HTLCUpdate_free(this_obj_conv);
+}
+
+static inline uint64_t HTLCUpdate_clone_ptr(LDKHTLCUpdate *NONNULL_PTR arg) {
+       LDKHTLCUpdate ret_var = HTLCUpdate_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_HTLCUpdate_clone_ptr(int64_t arg) {
+       LDKHTLCUpdate 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 = HTLCUpdate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_HTLCUpdate_clone(int64_t orig) {
+       LDKHTLCUpdate 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;
+       LDKHTLCUpdate ret_var = HTLCUpdate_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_HTLCUpdate_eq(int64_t a, int64_t b) {
+       LDKHTLCUpdate 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;
+       LDKHTLCUpdate 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 = HTLCUpdate_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_HTLCUpdate_write(int64_t obj) {
+       LDKHTLCUpdate 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 = HTLCUpdate_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_HTLCUpdate_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_HTLCUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCUpdateDecodeErrorZ), "LDKCResult_HTLCUpdateDecodeErrorZ");
+       *ret_conv = HTLCUpdate_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_Balance_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);
+       LDKBalance this_ptr_conv = *(LDKBalance*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Balance_free(this_ptr_conv);
+}
+
+static inline uint64_t Balance_clone_ptr(LDKBalance *NONNULL_PTR arg) {
+       LDKBalance *ret_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+       *ret_copy = Balance_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_Balance_clone_ptr(int64_t arg) {
+       LDKBalance* arg_conv = (LDKBalance*)untag_ptr(arg);
+       int64_t ret_conv = Balance_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Balance_clone(int64_t orig) {
+       LDKBalance* orig_conv = (LDKBalance*)untag_ptr(orig);
+       LDKBalance *ret_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+       *ret_copy = Balance_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Balance_claimable_on_channel_close(int64_t amount_satoshis) {
+       LDKBalance *ret_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+       *ret_copy = Balance_claimable_on_channel_close(amount_satoshis);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Balance_claimable_awaiting_confirmations(int64_t amount_satoshis, int32_t confirmation_height) {
+       LDKBalance *ret_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+       *ret_copy = Balance_claimable_awaiting_confirmations(amount_satoshis, confirmation_height);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Balance_contentious_claimable(int64_t amount_satoshis, int32_t timeout_height, int8_tArray payment_hash, int8_tArray payment_preimage) {
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKThirtyTwoBytes payment_preimage_ref;
+       CHECK(payment_preimage->arr_len == 32);
+       memcpy(payment_preimage_ref.data, payment_preimage->elems, 32); FREE(payment_preimage);
+       LDKBalance *ret_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+       *ret_copy = Balance_contentious_claimable(amount_satoshis, timeout_height, payment_hash_ref, payment_preimage_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Balance_maybe_timeout_claimable_htlc(int64_t amount_satoshis, int32_t claimable_height, int8_tArray payment_hash) {
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKBalance *ret_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+       *ret_copy = Balance_maybe_timeout_claimable_htlc(amount_satoshis, claimable_height, payment_hash_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Balance_maybe_preimage_claimable_htlc(int64_t amount_satoshis, int32_t expiry_height, int8_tArray payment_hash) {
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKBalance *ret_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+       *ret_copy = Balance_maybe_preimage_claimable_htlc(amount_satoshis, expiry_height, payment_hash_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Balance_counterparty_revoked_output_claimable(int64_t amount_satoshis) {
+       LDKBalance *ret_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+       *ret_copy = Balance_counterparty_revoked_output_claimable(amount_satoshis);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_Balance_eq(int64_t a, int64_t b) {
+       LDKBalance* a_conv = (LDKBalance*)untag_ptr(a);
+       LDKBalance* b_conv = (LDKBalance*)untag_ptr(b);
+       jboolean ret_conv = Balance_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Balance_claimable_amount_satoshis(int64_t this_arg) {
+       LDKBalance* this_arg_conv = (LDKBalance*)untag_ptr(this_arg);
+       int64_t ret_conv = Balance_claimable_amount_satoshis(this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelMonitor_free(int64_t this_obj) {
+       LDKChannelMonitor 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);
+       ChannelMonitor_free(this_obj_conv);
+}
+
+static inline uint64_t ChannelMonitor_clone_ptr(LDKChannelMonitor *NONNULL_PTR arg) {
+       LDKChannelMonitor ret_var = ChannelMonitor_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_ChannelMonitor_clone_ptr(int64_t arg) {
+       LDKChannelMonitor 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 = ChannelMonitor_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelMonitor_clone(int64_t orig) {
+       LDKChannelMonitor 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;
+       LDKChannelMonitor ret_var = ChannelMonitor_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_ChannelMonitor_write(int64_t obj) {
+       LDKChannelMonitor 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 = ChannelMonitor_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_ChannelMonitor_update_monitor(int64_t this_arg, int64_t updates, int64_t broadcaster, int64_t fee_estimator, 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);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       LDKChannelMonitorUpdate updates_conv;
+       updates_conv.inner = untag_ptr(updates);
+       updates_conv.is_owned = ptr_is_owned(updates);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(updates_conv);
+       updates_conv.is_owned = false;
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       if (ptr_is_owned(broadcaster)) { CHECK_ACCESS(broadcaster_ptr); }
+       LDKBroadcasterInterface* broadcaster_conv = (LDKBroadcasterInterface*)broadcaster_ptr;
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       if (ptr_is_owned(fee_estimator)) { CHECK_ACCESS(fee_estimator_ptr); }
+       LDKFeeEstimator* fee_estimator_conv = (LDKFeeEstimator*)fee_estimator_ptr;
+       void* logger_ptr = untag_ptr(logger);
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelMonitor_update_monitor(&this_arg_conv, &updates_conv, broadcaster_conv, fee_estimator_conv, logger_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelMonitor_get_latest_update_id(int64_t this_arg) {
+       LDKChannelMonitor 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 = ChannelMonitor_get_latest_update_id(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelMonitor_get_funding_txo(int64_t this_arg) {
+       LDKChannelMonitor 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;
+       LDKC2Tuple_OutPointCVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_u8ZZ), "LDKC2Tuple_OutPointCVec_u8ZZ");
+       *ret_conv = ChannelMonitor_get_funding_txo(&this_arg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_tArray  CS_LDK_ChannelMonitor_get_outputs_to_watch(int64_t this_arg) {
+       LDKChannelMonitor 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;
+       LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ ret_var = ChannelMonitor_get_outputs_to_watch(&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 a = 0; a < ret_var.datalen; a++) {
+               LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ* ret_conv_52_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ");
+               *ret_conv_52_conv = ret_var.data[a];
+               ret_arr_ptr[a] = tag_ptr(ret_conv_52_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelMonitor_load_outputs_to_watch(int64_t this_arg, int64_t filter) {
+       LDKChannelMonitor 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;
+       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);
+}
+
+int64_tArray  CS_LDK_ChannelMonitor_get_and_clear_pending_monitor_events(int64_t this_arg) {
+       LDKChannelMonitor 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;
+       LDKCVec_MonitorEventZ ret_var = ChannelMonitor_get_and_clear_pending_monitor_events(&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 o = 0; o < ret_var.datalen; o++) {
+               LDKMonitorEvent *ret_conv_14_copy = MALLOC(sizeof(LDKMonitorEvent), "LDKMonitorEvent");
+               *ret_conv_14_copy = ret_var.data[o];
+               int64_t ret_conv_14_ref = tag_ptr(ret_conv_14_copy, true);
+               ret_arr_ptr[o] = ret_conv_14_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelMonitor_process_pending_events(int64_t this_arg, int64_t handler) {
+       LDKChannelMonitor 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;
+       void* handler_ptr = untag_ptr(handler);
+       if (ptr_is_owned(handler)) { CHECK_ACCESS(handler_ptr); }
+       LDKEventHandler* handler_conv = (LDKEventHandler*)handler_ptr;
+       ChannelMonitor_process_pending_events(&this_arg_conv, handler_conv);
+}
+
+int64_t  CS_LDK_ChannelMonitor_initial_counterparty_commitment_tx(int64_t this_arg) {
+       LDKChannelMonitor 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;
+       LDKCommitmentTransaction ret_var = ChannelMonitor_initial_counterparty_commitment_tx(&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_tArray  CS_LDK_ChannelMonitor_counterparty_commitment_txs_from_update(int64_t this_arg, int64_t update) {
+       LDKChannelMonitor 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;
+       LDKChannelMonitorUpdate update_conv;
+       update_conv.inner = untag_ptr(update);
+       update_conv.is_owned = ptr_is_owned(update);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_conv);
+       update_conv.is_owned = false;
+       LDKCVec_CommitmentTransactionZ ret_var = ChannelMonitor_counterparty_commitment_txs_from_update(&this_arg_conv, &update_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++) {
+               LDKCommitmentTransaction ret_conv_23_var = ret_var.data[x];
+               int64_t ret_conv_23_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_23_var);
+               ret_conv_23_ref = tag_ptr(ret_conv_23_var.inner, ret_conv_23_var.is_owned);
+               ret_arr_ptr[x] = ret_conv_23_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_ChannelMonitor_sign_to_local_justice_tx(int64_t this_arg, int8_tArray justice_tx, int64_t input_idx, int64_t value, int64_t commitment_number) {
+       LDKChannelMonitor 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;
+       LDKTransaction justice_tx_ref;
+       justice_tx_ref.datalen = justice_tx->arr_len;
+       justice_tx_ref.data = MALLOC(justice_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(justice_tx_ref.data, justice_tx->elems, justice_tx_ref.datalen); FREE(justice_tx);
+       justice_tx_ref.data_is_owned = true;
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = ChannelMonitor_sign_to_local_justice_tx(&this_arg_conv, justice_tx_ref, input_idx, value, commitment_number);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelMonitor_get_counterparty_node_id(int64_t this_arg) {
+       LDKChannelMonitor 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, ChannelMonitor_get_counterparty_node_id(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+ptrArray  CS_LDK_ChannelMonitor_get_latest_holder_commitment_txn(int64_t this_arg, 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);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       void* logger_ptr = untag_ptr(logger);
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
+       LDKCVec_TransactionZ ret_var = ChannelMonitor_get_latest_holder_commitment_txn(&this_arg_conv, logger_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++) {
+               LDKTransaction 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);
+               Transaction_free(ret_conv_8_var);
+               ret_arr_ptr[i] = ret_conv_8_arr;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_ChannelMonitor_block_connected(int64_t this_arg, int8_tArray header, int64_tArray txdata, int32_t height, int64_t broadcaster, int64_t fee_estimator, 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);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       uint8_t header_arr[80];
+       CHECK(header->arr_len == 80);
+       memcpy(header_arr, header->elems, 80); FREE(header);
+       uint8_t (*header_ref)[80] = &header_arr;
+       LDKCVec_C2Tuple_usizeTransactionZZ txdata_constr;
+       txdata_constr.datalen = txdata->arr_len;
+       if (txdata_constr.datalen > 0)
+               txdata_constr.data = MALLOC(txdata_constr.datalen * sizeof(LDKC2Tuple_usizeTransactionZ), "LDKCVec_C2Tuple_usizeTransactionZZ Elements");
+       else
+               txdata_constr.data = NULL;
+       int64_t* txdata_vals = txdata->elems;
+       for (size_t c = 0; c < txdata_constr.datalen; c++) {
+               int64_t txdata_conv_28 = txdata_vals[c];
+               void* txdata_conv_28_ptr = untag_ptr(txdata_conv_28);
+               CHECK_ACCESS(txdata_conv_28_ptr);
+               LDKC2Tuple_usizeTransactionZ txdata_conv_28_conv = *(LDKC2Tuple_usizeTransactionZ*)(txdata_conv_28_ptr);
+               txdata_conv_28_conv = C2Tuple_usizeTransactionZ_clone((LDKC2Tuple_usizeTransactionZ*)untag_ptr(txdata_conv_28));
+               txdata_constr.data[c] = txdata_conv_28_conv;
+       }
+       FREE(txdata);
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       CHECK_ACCESS(broadcaster_ptr);
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(broadcaster_ptr);
+       if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&broadcaster_conv);
+       }
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       CHECK_ACCESS(fee_estimator_ptr);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(fee_estimator_ptr);
+       if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_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);
+       }
+       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__);
+       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
+       for (size_t x = 0; x < ret_var.datalen; x++) {
+               LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* ret_conv_49_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ");
+               *ret_conv_49_conv = ret_var.data[x];
+               ret_arr_ptr[x] = tag_ptr(ret_conv_49_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelMonitor_block_disconnected(int64_t this_arg, int8_tArray header, int32_t height, int64_t broadcaster, int64_t fee_estimator, 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);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       uint8_t header_arr[80];
+       CHECK(header->arr_len == 80);
+       memcpy(header_arr, header->elems, 80); FREE(header);
+       uint8_t (*header_ref)[80] = &header_arr;
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       CHECK_ACCESS(broadcaster_ptr);
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(broadcaster_ptr);
+       if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&broadcaster_conv);
+       }
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       CHECK_ACCESS(fee_estimator_ptr);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(fee_estimator_ptr);
+       if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_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);
+       }
+       ChannelMonitor_block_disconnected(&this_arg_conv, header_ref, height, broadcaster_conv, fee_estimator_conv, logger_conv);
+}
+
+int64_tArray  CS_LDK_ChannelMonitor_transactions_confirmed(int64_t this_arg, int8_tArray header, int64_tArray txdata, int32_t height, int64_t broadcaster, int64_t fee_estimator, 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);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       uint8_t header_arr[80];
+       CHECK(header->arr_len == 80);
+       memcpy(header_arr, header->elems, 80); FREE(header);
+       uint8_t (*header_ref)[80] = &header_arr;
+       LDKCVec_C2Tuple_usizeTransactionZZ txdata_constr;
+       txdata_constr.datalen = txdata->arr_len;
+       if (txdata_constr.datalen > 0)
+               txdata_constr.data = MALLOC(txdata_constr.datalen * sizeof(LDKC2Tuple_usizeTransactionZ), "LDKCVec_C2Tuple_usizeTransactionZZ Elements");
+       else
+               txdata_constr.data = NULL;
+       int64_t* txdata_vals = txdata->elems;
+       for (size_t c = 0; c < txdata_constr.datalen; c++) {
+               int64_t txdata_conv_28 = txdata_vals[c];
+               void* txdata_conv_28_ptr = untag_ptr(txdata_conv_28);
+               CHECK_ACCESS(txdata_conv_28_ptr);
+               LDKC2Tuple_usizeTransactionZ txdata_conv_28_conv = *(LDKC2Tuple_usizeTransactionZ*)(txdata_conv_28_ptr);
+               txdata_conv_28_conv = C2Tuple_usizeTransactionZ_clone((LDKC2Tuple_usizeTransactionZ*)untag_ptr(txdata_conv_28));
+               txdata_constr.data[c] = txdata_conv_28_conv;
+       }
+       FREE(txdata);
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       CHECK_ACCESS(broadcaster_ptr);
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(broadcaster_ptr);
+       if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&broadcaster_conv);
+       }
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       CHECK_ACCESS(fee_estimator_ptr);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(fee_estimator_ptr);
+       if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_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);
+       }
+       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__);
+       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
+       for (size_t x = 0; x < ret_var.datalen; x++) {
+               LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* ret_conv_49_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ");
+               *ret_conv_49_conv = ret_var.data[x];
+               ret_arr_ptr[x] = tag_ptr(ret_conv_49_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelMonitor_transaction_unconfirmed(int64_t this_arg, int8_tArray txid, int64_t broadcaster, int64_t fee_estimator, 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);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       uint8_t txid_arr[32];
+       CHECK(txid->arr_len == 32);
+       memcpy(txid_arr, txid->elems, 32); FREE(txid);
+       uint8_t (*txid_ref)[32] = &txid_arr;
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       CHECK_ACCESS(broadcaster_ptr);
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(broadcaster_ptr);
+       if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&broadcaster_conv);
+       }
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       CHECK_ACCESS(fee_estimator_ptr);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(fee_estimator_ptr);
+       if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_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);
+       }
+       ChannelMonitor_transaction_unconfirmed(&this_arg_conv, txid_ref, broadcaster_conv, fee_estimator_conv, logger_conv);
+}
+
+int64_tArray  CS_LDK_ChannelMonitor_best_block_updated(int64_t this_arg, int8_tArray header, int32_t height, int64_t broadcaster, int64_t fee_estimator, 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);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       uint8_t header_arr[80];
+       CHECK(header->arr_len == 80);
+       memcpy(header_arr, header->elems, 80); FREE(header);
+       uint8_t (*header_ref)[80] = &header_arr;
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       CHECK_ACCESS(broadcaster_ptr);
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(broadcaster_ptr);
+       if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&broadcaster_conv);
+       }
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       CHECK_ACCESS(fee_estimator_ptr);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(fee_estimator_ptr);
+       if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_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);
+       }
+       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__);
+       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
+       for (size_t x = 0; x < ret_var.datalen; x++) {
+               LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* ret_conv_49_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ");
+               *ret_conv_49_conv = ret_var.data[x];
+               ret_arr_ptr[x] = tag_ptr(ret_conv_49_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_ChannelMonitor_get_relevant_txids(int64_t this_arg) {
+       LDKChannelMonitor 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;
+       LDKCVec_C2Tuple_ThirtyTwoBytesCOption_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);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_ChannelMonitor_current_best_block(int64_t this_arg) {
+       LDKChannelMonitor 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;
+       LDKBestBlock ret_var = ChannelMonitor_current_best_block(&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;
+}
+
+void  CS_LDK_ChannelMonitor_rebroadcast_pending_claims(int64_t this_arg, int64_t broadcaster, int64_t fee_estimator, 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);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       CHECK_ACCESS(broadcaster_ptr);
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(broadcaster_ptr);
+       if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&broadcaster_conv);
+       }
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       CHECK_ACCESS(fee_estimator_ptr);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(fee_estimator_ptr);
+       if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_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);
+       }
+       ChannelMonitor_rebroadcast_pending_claims(&this_arg_conv, broadcaster_conv, fee_estimator_conv, logger_conv);
+}
+
+int64_tArray  CS_LDK_ChannelMonitor_get_spendable_outputs(int64_t this_arg, int8_tArray tx, int32_t confirmation_height) {
+       LDKChannelMonitor 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;
+       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_SpendableOutputDescriptorZ ret_var = ChannelMonitor_get_spendable_outputs(&this_arg_conv, tx_ref, confirmation_height);
+       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 b = 0; b < ret_var.datalen; b++) {
+               LDKSpendableOutputDescriptor *ret_conv_27_copy = MALLOC(sizeof(LDKSpendableOutputDescriptor), "LDKSpendableOutputDescriptor");
+               *ret_conv_27_copy = ret_var.data[b];
+               int64_t ret_conv_27_ref = tag_ptr(ret_conv_27_copy, true);
+               ret_arr_ptr[b] = ret_conv_27_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_ChannelMonitor_get_claimable_balances(int64_t this_arg) {
+       LDKChannelMonitor 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;
+       LDKCVec_BalanceZ ret_var = ChannelMonitor_get_claimable_balances(&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 j = 0; j < ret_var.datalen; j++) {
+               LDKBalance *ret_conv_9_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+               *ret_conv_9_copy = ret_var.data[j];
+               int64_t ret_conv_9_ref = tag_ptr(ret_conv_9_copy, true);
+               ret_arr_ptr[j] = ret_conv_9_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_read(int8_tArray ser, int64_t arg_a, int64_t arg_b) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       void* arg_a_ptr = untag_ptr(arg_a);
+       if (ptr_is_owned(arg_a)) { CHECK_ACCESS(arg_a_ptr); }
+       LDKEntropySource* arg_a_conv = (LDKEntropySource*)arg_a_ptr;
+       void* arg_b_ptr = untag_ptr(arg_b);
+       if (ptr_is_owned(arg_b)) { CHECK_ACCESS(arg_b_ptr); }
+       LDKSignerProvider* arg_b_conv = (LDKSignerProvider*)arg_b_ptr;
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesChannelMonitorZ_read(ser_ref, arg_a_conv, arg_b_conv);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_OutPoint_free(int64_t this_obj) {
+       LDKOutPoint 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);
+       OutPoint_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_OutPoint_get_txid(int64_t this_ptr) {
+       LDKOutPoint 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, *OutPoint_get_txid(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_OutPoint_set_txid(int64_t this_ptr, int8_tArray val) {
+       LDKOutPoint 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);
+       OutPoint_set_txid(&this_ptr_conv, val_ref);
+}
+
+int16_t  CS_LDK_OutPoint_get_index(int64_t this_ptr) {
+       LDKOutPoint 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 = OutPoint_get_index(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OutPoint_set_index(int64_t this_ptr, int16_t val) {
+       LDKOutPoint 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;
+       OutPoint_set_index(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OutPoint_new(int8_tArray txid_arg, int16_t index_arg) {
+       LDKThirtyTwoBytes txid_arg_ref;
+       CHECK(txid_arg->arr_len == 32);
+       memcpy(txid_arg_ref.data, txid_arg->elems, 32); FREE(txid_arg);
+       LDKOutPoint ret_var = OutPoint_new(txid_arg_ref, index_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 OutPoint_clone_ptr(LDKOutPoint *NONNULL_PTR arg) {
+       LDKOutPoint ret_var = OutPoint_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_OutPoint_clone_ptr(int64_t arg) {
+       LDKOutPoint 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 = OutPoint_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OutPoint_clone(int64_t orig) {
+       LDKOutPoint 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;
+       LDKOutPoint ret_var = OutPoint_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_OutPoint_eq(int64_t a, int64_t b) {
+       LDKOutPoint 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;
+       LDKOutPoint 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 = OutPoint_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OutPoint_hash(int64_t o) {
+       LDKOutPoint 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 = OutPoint_hash(&o_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_OutPoint_to_channel_id(int64_t this_arg) {
+       LDKOutPoint 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, OutPoint_to_channel_id(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_OutPoint_write(int64_t obj) {
+       LDKOutPoint 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 = OutPoint_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_OutPoint_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_OutPointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OutPointDecodeErrorZ), "LDKCResult_OutPointDecodeErrorZ");
+       *ret_conv = OutPoint_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_FailureCode_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);
+       LDKFailureCode this_ptr_conv = *(LDKFailureCode*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       FailureCode_free(this_ptr_conv);
+}
+
+static inline uint64_t FailureCode_clone_ptr(LDKFailureCode *NONNULL_PTR arg) {
+       LDKFailureCode *ret_copy = MALLOC(sizeof(LDKFailureCode), "LDKFailureCode");
+       *ret_copy = FailureCode_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_FailureCode_clone_ptr(int64_t arg) {
+       LDKFailureCode* arg_conv = (LDKFailureCode*)untag_ptr(arg);
+       int64_t ret_conv = FailureCode_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_FailureCode_clone(int64_t orig) {
+       LDKFailureCode* orig_conv = (LDKFailureCode*)untag_ptr(orig);
+       LDKFailureCode *ret_copy = MALLOC(sizeof(LDKFailureCode), "LDKFailureCode");
+       *ret_copy = FailureCode_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_FailureCode_temporary_node_failure() {
+       LDKFailureCode *ret_copy = MALLOC(sizeof(LDKFailureCode), "LDKFailureCode");
+       *ret_copy = FailureCode_temporary_node_failure();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_FailureCode_required_node_feature_missing() {
+       LDKFailureCode *ret_copy = MALLOC(sizeof(LDKFailureCode), "LDKFailureCode");
+       *ret_copy = FailureCode_required_node_feature_missing();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_FailureCode_incorrect_or_unknown_payment_details() {
+       LDKFailureCode *ret_copy = MALLOC(sizeof(LDKFailureCode), "LDKFailureCode");
+       *ret_copy = FailureCode_incorrect_or_unknown_payment_details();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_FailureCode_invalid_onion_payload(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKCOption_C2Tuple_u64u16ZZ a_conv = *(LDKCOption_C2Tuple_u64u16ZZ*)(a_ptr);
+       a_conv = COption_C2Tuple_u64u16ZZ_clone((LDKCOption_C2Tuple_u64u16ZZ*)untag_ptr(a));
+       LDKFailureCode *ret_copy = MALLOC(sizeof(LDKFailureCode), "LDKFailureCode");
+       *ret_copy = FailureCode_invalid_onion_payload(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelManager_free(int64_t this_obj) {
+       LDKChannelManager 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);
+       ChannelManager_free(this_obj_conv);
+}
+
+void  CS_LDK_ChainParameters_free(int64_t this_obj) {
+       LDKChainParameters 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);
+       ChainParameters_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_ChainParameters_get_network(int64_t this_ptr) {
+       LDKChainParameters 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 = LDKNetwork_to_cs(ChainParameters_get_network(&this_ptr_conv));
+       return ret_conv;
+}
+
+void  CS_LDK_ChainParameters_set_network(int64_t this_ptr, int32_t val) {
+       LDKChainParameters 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;
+       LDKNetwork val_conv = LDKNetwork_from_cs(val);
+       ChainParameters_set_network(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChainParameters_get_best_block(int64_t this_ptr) {
+       LDKChainParameters 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;
+       LDKBestBlock ret_var = ChainParameters_get_best_block(&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_ChainParameters_set_best_block(int64_t this_ptr, int64_t val) {
+       LDKChainParameters 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;
+       LDKBestBlock 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 = BestBlock_clone(&val_conv);
+       ChainParameters_set_best_block(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChainParameters_new(int32_t network_arg, int64_t best_block_arg) {
+       LDKNetwork network_arg_conv = LDKNetwork_from_cs(network_arg);
+       LDKBestBlock best_block_arg_conv;
+       best_block_arg_conv.inner = untag_ptr(best_block_arg);
+       best_block_arg_conv.is_owned = ptr_is_owned(best_block_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(best_block_arg_conv);
+       best_block_arg_conv = BestBlock_clone(&best_block_arg_conv);
+       LDKChainParameters ret_var = ChainParameters_new(network_arg_conv, best_block_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 ChainParameters_clone_ptr(LDKChainParameters *NONNULL_PTR arg) {
+       LDKChainParameters ret_var = ChainParameters_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_ChainParameters_clone_ptr(int64_t arg) {
+       LDKChainParameters 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 = ChainParameters_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChainParameters_clone(int64_t orig) {
+       LDKChainParameters 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;
+       LDKChainParameters ret_var = ChainParameters_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_CounterpartyForwardingInfo_free(int64_t this_obj) {
+       LDKCounterpartyForwardingInfo 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);
+       CounterpartyForwardingInfo_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_CounterpartyForwardingInfo_get_fee_base_msat(int64_t this_ptr) {
+       LDKCounterpartyForwardingInfo 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 = CounterpartyForwardingInfo_get_fee_base_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CounterpartyForwardingInfo_set_fee_base_msat(int64_t this_ptr, int32_t val) {
+       LDKCounterpartyForwardingInfo 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;
+       CounterpartyForwardingInfo_set_fee_base_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_CounterpartyForwardingInfo_get_fee_proportional_millionths(int64_t this_ptr) {
+       LDKCounterpartyForwardingInfo 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 = CounterpartyForwardingInfo_get_fee_proportional_millionths(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CounterpartyForwardingInfo_set_fee_proportional_millionths(int64_t this_ptr, int32_t val) {
+       LDKCounterpartyForwardingInfo 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;
+       CounterpartyForwardingInfo_set_fee_proportional_millionths(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_CounterpartyForwardingInfo_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKCounterpartyForwardingInfo 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 = CounterpartyForwardingInfo_get_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CounterpartyForwardingInfo_set_cltv_expiry_delta(int64_t this_ptr, int16_t val) {
+       LDKCounterpartyForwardingInfo 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;
+       CounterpartyForwardingInfo_set_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_CounterpartyForwardingInfo_new(int32_t fee_base_msat_arg, int32_t fee_proportional_millionths_arg, int16_t cltv_expiry_delta_arg) {
+       LDKCounterpartyForwardingInfo ret_var = CounterpartyForwardingInfo_new(fee_base_msat_arg, fee_proportional_millionths_arg, cltv_expiry_delta_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 CounterpartyForwardingInfo_clone_ptr(LDKCounterpartyForwardingInfo *NONNULL_PTR arg) {
+       LDKCounterpartyForwardingInfo ret_var = CounterpartyForwardingInfo_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_CounterpartyForwardingInfo_clone_ptr(int64_t arg) {
+       LDKCounterpartyForwardingInfo 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 = CounterpartyForwardingInfo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CounterpartyForwardingInfo_clone(int64_t orig) {
+       LDKCounterpartyForwardingInfo 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;
+       LDKCounterpartyForwardingInfo ret_var = CounterpartyForwardingInfo_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_ChannelCounterparty_free(int64_t this_obj) {
+       LDKChannelCounterparty 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);
+       ChannelCounterparty_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ChannelCounterparty_get_node_id(int64_t this_ptr) {
+       LDKChannelCounterparty 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, ChannelCounterparty_get_node_id(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelCounterparty_set_node_id(int64_t this_ptr, int8_tArray val) {
+       LDKChannelCounterparty 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);
+       ChannelCounterparty_set_node_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelCounterparty_get_features(int64_t this_ptr) {
+       LDKChannelCounterparty 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;
+       LDKInitFeatures ret_var = ChannelCounterparty_get_features(&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_ChannelCounterparty_set_features(int64_t this_ptr, int64_t val) {
+       LDKChannelCounterparty 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;
+       LDKInitFeatures 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 = InitFeatures_clone(&val_conv);
+       ChannelCounterparty_set_features(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelCounterparty_get_unspendable_punishment_reserve(int64_t this_ptr) {
+       LDKChannelCounterparty 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 = ChannelCounterparty_get_unspendable_punishment_reserve(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelCounterparty_set_unspendable_punishment_reserve(int64_t this_ptr, int64_t val) {
+       LDKChannelCounterparty 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;
+       ChannelCounterparty_set_unspendable_punishment_reserve(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelCounterparty_get_forwarding_info(int64_t this_ptr) {
+       LDKChannelCounterparty 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;
+       LDKCounterpartyForwardingInfo ret_var = ChannelCounterparty_get_forwarding_info(&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_ChannelCounterparty_set_forwarding_info(int64_t this_ptr, int64_t val) {
+       LDKChannelCounterparty 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;
+       LDKCounterpartyForwardingInfo 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 = CounterpartyForwardingInfo_clone(&val_conv);
+       ChannelCounterparty_set_forwarding_info(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelCounterparty_get_outbound_htlc_minimum_msat(int64_t this_ptr) {
+       LDKChannelCounterparty 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 = ChannelCounterparty_get_outbound_htlc_minimum_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelCounterparty_set_outbound_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelCounterparty 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));
+       ChannelCounterparty_set_outbound_htlc_minimum_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelCounterparty_get_outbound_htlc_maximum_msat(int64_t this_ptr) {
+       LDKChannelCounterparty 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 = ChannelCounterparty_get_outbound_htlc_maximum_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelCounterparty_set_outbound_htlc_maximum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelCounterparty 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));
+       ChannelCounterparty_set_outbound_htlc_maximum_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelCounterparty_new(int8_tArray node_id_arg, int64_t features_arg, int64_t unspendable_punishment_reserve_arg, int64_t forwarding_info_arg, int64_t outbound_htlc_minimum_msat_arg, int64_t outbound_htlc_maximum_msat_arg) {
+       LDKPublicKey node_id_arg_ref;
+       CHECK(node_id_arg->arr_len == 33);
+       memcpy(node_id_arg_ref.compressed_form, node_id_arg->elems, 33); FREE(node_id_arg);
+       LDKInitFeatures features_arg_conv;
+       features_arg_conv.inner = untag_ptr(features_arg);
+       features_arg_conv.is_owned = ptr_is_owned(features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_arg_conv);
+       features_arg_conv = InitFeatures_clone(&features_arg_conv);
+       LDKCounterpartyForwardingInfo forwarding_info_arg_conv;
+       forwarding_info_arg_conv.inner = untag_ptr(forwarding_info_arg);
+       forwarding_info_arg_conv.is_owned = ptr_is_owned(forwarding_info_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(forwarding_info_arg_conv);
+       forwarding_info_arg_conv = CounterpartyForwardingInfo_clone(&forwarding_info_arg_conv);
+       void* outbound_htlc_minimum_msat_arg_ptr = untag_ptr(outbound_htlc_minimum_msat_arg);
+       CHECK_ACCESS(outbound_htlc_minimum_msat_arg_ptr);
+       LDKCOption_u64Z outbound_htlc_minimum_msat_arg_conv = *(LDKCOption_u64Z*)(outbound_htlc_minimum_msat_arg_ptr);
+       outbound_htlc_minimum_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(outbound_htlc_minimum_msat_arg));
+       void* outbound_htlc_maximum_msat_arg_ptr = untag_ptr(outbound_htlc_maximum_msat_arg);
+       CHECK_ACCESS(outbound_htlc_maximum_msat_arg_ptr);
+       LDKCOption_u64Z outbound_htlc_maximum_msat_arg_conv = *(LDKCOption_u64Z*)(outbound_htlc_maximum_msat_arg_ptr);
+       outbound_htlc_maximum_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(outbound_htlc_maximum_msat_arg));
+       LDKChannelCounterparty ret_var = ChannelCounterparty_new(node_id_arg_ref, features_arg_conv, unspendable_punishment_reserve_arg, forwarding_info_arg_conv, outbound_htlc_minimum_msat_arg_conv, outbound_htlc_maximum_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 ChannelCounterparty_clone_ptr(LDKChannelCounterparty *NONNULL_PTR arg) {
+       LDKChannelCounterparty ret_var = ChannelCounterparty_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_ChannelCounterparty_clone_ptr(int64_t arg) {
+       LDKChannelCounterparty 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 = ChannelCounterparty_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelCounterparty_clone(int64_t orig) {
+       LDKChannelCounterparty 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;
+       LDKChannelCounterparty ret_var = ChannelCounterparty_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_ChannelDetails_free(int64_t this_obj) {
+       LDKChannelDetails 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);
+       ChannelDetails_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ChannelDetails_get_channel_id(int64_t this_ptr) {
+       LDKChannelDetails 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, *ChannelDetails_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelDetails_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKChannelDetails 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);
+       ChannelDetails_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_counterparty(int64_t this_ptr) {
+       LDKChannelDetails 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;
+       LDKChannelCounterparty ret_var = ChannelDetails_get_counterparty(&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_ChannelDetails_set_counterparty(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       LDKChannelCounterparty 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 = ChannelCounterparty_clone(&val_conv);
+       ChannelDetails_set_counterparty(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_funding_txo(int64_t this_ptr) {
+       LDKChannelDetails 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;
+       LDKOutPoint ret_var = ChannelDetails_get_funding_txo(&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_ChannelDetails_set_funding_txo(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       LDKOutPoint 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 = OutPoint_clone(&val_conv);
+       ChannelDetails_set_funding_txo(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_channel_type(int64_t this_ptr) {
+       LDKChannelDetails 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;
+       LDKChannelTypeFeatures ret_var = ChannelDetails_get_channel_type(&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_ChannelDetails_set_channel_type(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_clone(&val_conv);
+       ChannelDetails_set_channel_type(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_short_channel_id(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_short_channel_id(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_short_channel_id(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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));
+       ChannelDetails_set_short_channel_id(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_outbound_scid_alias(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_outbound_scid_alias(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_outbound_scid_alias(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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));
+       ChannelDetails_set_outbound_scid_alias(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_inbound_scid_alias(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_inbound_scid_alias(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_inbound_scid_alias(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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));
+       ChannelDetails_set_inbound_scid_alias(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_channel_value_satoshis(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_channel_value_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_channel_value_satoshis(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_channel_value_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_unspendable_punishment_reserve(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_unspendable_punishment_reserve(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_unspendable_punishment_reserve(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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));
+       ChannelDetails_set_unspendable_punishment_reserve(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_ChannelDetails_get_user_channel_id(int64_t this_ptr) {
+       LDKChannelDetails 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(16, __LINE__);
+       memcpy(ret_arr->elems, ChannelDetails_get_user_channel_id(&this_ptr_conv).le_bytes, 16);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelDetails_set_user_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKChannelDetails 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;
+       LDKU128 val_ref;
+       CHECK(val->arr_len == 16);
+       memcpy(val_ref.le_bytes, val->elems, 16); FREE(val);
+       ChannelDetails_set_user_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_feerate_sat_per_1000_weight(int64_t this_ptr) {
+       LDKChannelDetails 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_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = ChannelDetails_get_feerate_sat_per_1000_weight(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_feerate_sat_per_1000_weight(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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_u32Z val_conv = *(LDKCOption_u32Z*)(val_ptr);
+       val_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(val));
+       ChannelDetails_set_feerate_sat_per_1000_weight(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_balance_msat(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_balance_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_balance_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_balance_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_outbound_capacity_msat(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_outbound_capacity_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_outbound_capacity_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_outbound_capacity_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_next_outbound_htlc_limit_msat(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_next_outbound_htlc_limit_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_next_outbound_htlc_limit_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_next_outbound_htlc_limit_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_next_outbound_htlc_minimum_msat(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_next_outbound_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_next_outbound_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_next_outbound_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_inbound_capacity_msat(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_inbound_capacity_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_inbound_capacity_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_inbound_capacity_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_confirmations_required(int64_t this_ptr) {
+       LDKChannelDetails 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_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = ChannelDetails_get_confirmations_required(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_confirmations_required(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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_u32Z val_conv = *(LDKCOption_u32Z*)(val_ptr);
+       val_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(val));
+       ChannelDetails_set_confirmations_required(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_confirmations(int64_t this_ptr) {
+       LDKChannelDetails 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_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = ChannelDetails_get_confirmations(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_confirmations(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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_u32Z val_conv = *(LDKCOption_u32Z*)(val_ptr);
+       val_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(val));
+       ChannelDetails_set_confirmations(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_force_close_spend_delay(int64_t this_ptr) {
+       LDKChannelDetails 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_u16Z *ret_copy = MALLOC(sizeof(LDKCOption_u16Z), "LDKCOption_u16Z");
+       *ret_copy = ChannelDetails_get_force_close_spend_delay(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_force_close_spend_delay(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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_u16Z val_conv = *(LDKCOption_u16Z*)(val_ptr);
+       val_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(val));
+       ChannelDetails_set_force_close_spend_delay(&this_ptr_conv, val_conv);
+}
+
+jboolean  CS_LDK_ChannelDetails_get_is_outbound(int64_t this_ptr) {
+       LDKChannelDetails 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;
+       jboolean ret_conv = ChannelDetails_get_is_outbound(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_is_outbound(int64_t this_ptr, jboolean val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_is_outbound(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelDetails_get_is_channel_ready(int64_t this_ptr) {
+       LDKChannelDetails 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;
+       jboolean ret_conv = ChannelDetails_get_is_channel_ready(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_is_channel_ready(int64_t this_ptr, jboolean val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_is_channel_ready(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_channel_shutdown_state(int64_t this_ptr) {
+       LDKChannelDetails 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_ChannelShutdownStateZ *ret_copy = MALLOC(sizeof(LDKCOption_ChannelShutdownStateZ), "LDKCOption_ChannelShutdownStateZ");
+       *ret_copy = ChannelDetails_get_channel_shutdown_state(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_channel_shutdown_state(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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_ChannelShutdownStateZ val_conv = *(LDKCOption_ChannelShutdownStateZ*)(val_ptr);
+       val_conv = COption_ChannelShutdownStateZ_clone((LDKCOption_ChannelShutdownStateZ*)untag_ptr(val));
+       ChannelDetails_set_channel_shutdown_state(&this_ptr_conv, val_conv);
+}
+
+jboolean  CS_LDK_ChannelDetails_get_is_usable(int64_t this_ptr) {
+       LDKChannelDetails 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;
+       jboolean ret_conv = ChannelDetails_get_is_usable(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_is_usable(int64_t this_ptr, jboolean val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_is_usable(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelDetails_get_is_public(int64_t this_ptr) {
+       LDKChannelDetails 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;
+       jboolean ret_conv = ChannelDetails_get_is_public(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_is_public(int64_t this_ptr, jboolean val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_is_public(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_inbound_htlc_minimum_msat(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_inbound_htlc_minimum_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_inbound_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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));
+       ChannelDetails_set_inbound_htlc_minimum_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_inbound_htlc_maximum_msat(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_inbound_htlc_maximum_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_inbound_htlc_maximum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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));
+       ChannelDetails_set_inbound_htlc_maximum_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_config(int64_t this_ptr) {
+       LDKChannelDetails 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;
+       LDKChannelConfig ret_var = ChannelDetails_get_config(&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_ChannelDetails_set_config(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       LDKChannelConfig 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 = ChannelConfig_clone(&val_conv);
+       ChannelDetails_set_config(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_new(int8_tArray channel_id_arg, int64_t counterparty_arg, int64_t funding_txo_arg, int64_t channel_type_arg, int64_t short_channel_id_arg, int64_t outbound_scid_alias_arg, int64_t inbound_scid_alias_arg, int64_t channel_value_satoshis_arg, int64_t unspendable_punishment_reserve_arg, int8_tArray user_channel_id_arg, int64_t feerate_sat_per_1000_weight_arg, int64_t balance_msat_arg, int64_t outbound_capacity_msat_arg, int64_t next_outbound_htlc_limit_msat_arg, int64_t next_outbound_htlc_minimum_msat_arg, int64_t inbound_capacity_msat_arg, int64_t confirmations_required_arg, int64_t confirmations_arg, int64_t force_close_spend_delay_arg, jboolean is_outbound_arg, jboolean is_channel_ready_arg, int64_t channel_shutdown_state_arg, jboolean is_usable_arg, jboolean is_public_arg, int64_t inbound_htlc_minimum_msat_arg, int64_t inbound_htlc_maximum_msat_arg, int64_t config_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);
+       LDKChannelCounterparty counterparty_arg_conv;
+       counterparty_arg_conv.inner = untag_ptr(counterparty_arg);
+       counterparty_arg_conv.is_owned = ptr_is_owned(counterparty_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(counterparty_arg_conv);
+       counterparty_arg_conv = ChannelCounterparty_clone(&counterparty_arg_conv);
+       LDKOutPoint funding_txo_arg_conv;
+       funding_txo_arg_conv.inner = untag_ptr(funding_txo_arg);
+       funding_txo_arg_conv.is_owned = ptr_is_owned(funding_txo_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_arg_conv);
+       funding_txo_arg_conv = OutPoint_clone(&funding_txo_arg_conv);
+       LDKChannelTypeFeatures channel_type_arg_conv;
+       channel_type_arg_conv.inner = untag_ptr(channel_type_arg);
+       channel_type_arg_conv.is_owned = ptr_is_owned(channel_type_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_arg_conv);
+       channel_type_arg_conv = ChannelTypeFeatures_clone(&channel_type_arg_conv);
+       void* short_channel_id_arg_ptr = untag_ptr(short_channel_id_arg);
+       CHECK_ACCESS(short_channel_id_arg_ptr);
+       LDKCOption_u64Z short_channel_id_arg_conv = *(LDKCOption_u64Z*)(short_channel_id_arg_ptr);
+       short_channel_id_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(short_channel_id_arg));
+       void* outbound_scid_alias_arg_ptr = untag_ptr(outbound_scid_alias_arg);
+       CHECK_ACCESS(outbound_scid_alias_arg_ptr);
+       LDKCOption_u64Z outbound_scid_alias_arg_conv = *(LDKCOption_u64Z*)(outbound_scid_alias_arg_ptr);
+       outbound_scid_alias_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(outbound_scid_alias_arg));
+       void* inbound_scid_alias_arg_ptr = untag_ptr(inbound_scid_alias_arg);
+       CHECK_ACCESS(inbound_scid_alias_arg_ptr);
+       LDKCOption_u64Z inbound_scid_alias_arg_conv = *(LDKCOption_u64Z*)(inbound_scid_alias_arg_ptr);
+       inbound_scid_alias_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(inbound_scid_alias_arg));
+       void* unspendable_punishment_reserve_arg_ptr = untag_ptr(unspendable_punishment_reserve_arg);
+       CHECK_ACCESS(unspendable_punishment_reserve_arg_ptr);
+       LDKCOption_u64Z unspendable_punishment_reserve_arg_conv = *(LDKCOption_u64Z*)(unspendable_punishment_reserve_arg_ptr);
+       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);
+       void* feerate_sat_per_1000_weight_arg_ptr = untag_ptr(feerate_sat_per_1000_weight_arg);
+       CHECK_ACCESS(feerate_sat_per_1000_weight_arg_ptr);
+       LDKCOption_u32Z feerate_sat_per_1000_weight_arg_conv = *(LDKCOption_u32Z*)(feerate_sat_per_1000_weight_arg_ptr);
+       feerate_sat_per_1000_weight_arg_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(feerate_sat_per_1000_weight_arg));
+       void* confirmations_required_arg_ptr = untag_ptr(confirmations_required_arg);
+       CHECK_ACCESS(confirmations_required_arg_ptr);
+       LDKCOption_u32Z confirmations_required_arg_conv = *(LDKCOption_u32Z*)(confirmations_required_arg_ptr);
+       confirmations_required_arg_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(confirmations_required_arg));
+       void* confirmations_arg_ptr = untag_ptr(confirmations_arg);
+       CHECK_ACCESS(confirmations_arg_ptr);
+       LDKCOption_u32Z confirmations_arg_conv = *(LDKCOption_u32Z*)(confirmations_arg_ptr);
+       confirmations_arg_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(confirmations_arg));
+       void* force_close_spend_delay_arg_ptr = untag_ptr(force_close_spend_delay_arg);
+       CHECK_ACCESS(force_close_spend_delay_arg_ptr);
+       LDKCOption_u16Z force_close_spend_delay_arg_conv = *(LDKCOption_u16Z*)(force_close_spend_delay_arg_ptr);
+       force_close_spend_delay_arg_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(force_close_spend_delay_arg));
+       void* channel_shutdown_state_arg_ptr = untag_ptr(channel_shutdown_state_arg);
+       CHECK_ACCESS(channel_shutdown_state_arg_ptr);
+       LDKCOption_ChannelShutdownStateZ channel_shutdown_state_arg_conv = *(LDKCOption_ChannelShutdownStateZ*)(channel_shutdown_state_arg_ptr);
+       channel_shutdown_state_arg_conv = COption_ChannelShutdownStateZ_clone((LDKCOption_ChannelShutdownStateZ*)untag_ptr(channel_shutdown_state_arg));
+       void* inbound_htlc_minimum_msat_arg_ptr = untag_ptr(inbound_htlc_minimum_msat_arg);
+       CHECK_ACCESS(inbound_htlc_minimum_msat_arg_ptr);
+       LDKCOption_u64Z inbound_htlc_minimum_msat_arg_conv = *(LDKCOption_u64Z*)(inbound_htlc_minimum_msat_arg_ptr);
+       inbound_htlc_minimum_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(inbound_htlc_minimum_msat_arg));
+       void* inbound_htlc_maximum_msat_arg_ptr = untag_ptr(inbound_htlc_maximum_msat_arg);
+       CHECK_ACCESS(inbound_htlc_maximum_msat_arg_ptr);
+       LDKCOption_u64Z inbound_htlc_maximum_msat_arg_conv = *(LDKCOption_u64Z*)(inbound_htlc_maximum_msat_arg_ptr);
+       inbound_htlc_maximum_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(inbound_htlc_maximum_msat_arg));
+       LDKChannelConfig config_arg_conv;
+       config_arg_conv.inner = untag_ptr(config_arg);
+       config_arg_conv.is_owned = ptr_is_owned(config_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(config_arg_conv);
+       config_arg_conv = ChannelConfig_clone(&config_arg_conv);
+       LDKChannelDetails ret_var = ChannelDetails_new(channel_id_arg_ref, counterparty_arg_conv, funding_txo_arg_conv, channel_type_arg_conv, short_channel_id_arg_conv, outbound_scid_alias_arg_conv, inbound_scid_alias_arg_conv, channel_value_satoshis_arg, unspendable_punishment_reserve_arg_conv, user_channel_id_arg_ref, feerate_sat_per_1000_weight_arg_conv, balance_msat_arg, outbound_capacity_msat_arg, next_outbound_htlc_limit_msat_arg, next_outbound_htlc_minimum_msat_arg, inbound_capacity_msat_arg, confirmations_required_arg_conv, confirmations_arg_conv, force_close_spend_delay_arg_conv, is_outbound_arg, is_channel_ready_arg, channel_shutdown_state_arg_conv, is_usable_arg, is_public_arg, inbound_htlc_minimum_msat_arg_conv, inbound_htlc_maximum_msat_arg_conv, config_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 ChannelDetails_clone_ptr(LDKChannelDetails *NONNULL_PTR arg) {
+       LDKChannelDetails ret_var = ChannelDetails_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_ChannelDetails_clone_ptr(int64_t arg) {
+       LDKChannelDetails 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 = ChannelDetails_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelDetails_clone(int64_t orig) {
+       LDKChannelDetails 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;
+       LDKChannelDetails ret_var = ChannelDetails_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_ChannelDetails_get_inbound_payment_scid(int64_t this_arg) {
+       LDKChannelDetails 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = ChannelDetails_get_inbound_payment_scid(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ChannelDetails_get_outbound_payment_scid(int64_t this_arg) {
+       LDKChannelDetails 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = ChannelDetails_get_outbound_payment_scid(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int32_t  CS_LDK_ChannelShutdownState_clone(int64_t orig) {
+       LDKChannelShutdownState* orig_conv = (LDKChannelShutdownState*)untag_ptr(orig);
+       int32_t ret_conv = LDKChannelShutdownState_to_cs(ChannelShutdownState_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ChannelShutdownState_not_shutting_down() {
+       int32_t ret_conv = LDKChannelShutdownState_to_cs(ChannelShutdownState_not_shutting_down());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ChannelShutdownState_shutdown_initiated() {
+       int32_t ret_conv = LDKChannelShutdownState_to_cs(ChannelShutdownState_shutdown_initiated());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ChannelShutdownState_resolving_htlcs() {
+       int32_t ret_conv = LDKChannelShutdownState_to_cs(ChannelShutdownState_resolving_htlcs());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ChannelShutdownState_negotiating_closing_fee() {
+       int32_t ret_conv = LDKChannelShutdownState_to_cs(ChannelShutdownState_negotiating_closing_fee());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ChannelShutdownState_shutdown_complete() {
+       int32_t ret_conv = LDKChannelShutdownState_to_cs(ChannelShutdownState_shutdown_complete());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelShutdownState_eq(int64_t a, int64_t b) {
+       LDKChannelShutdownState* a_conv = (LDKChannelShutdownState*)untag_ptr(a);
+       LDKChannelShutdownState* b_conv = (LDKChannelShutdownState*)untag_ptr(b);
+       jboolean ret_conv = ChannelShutdownState_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RecentPaymentDetails_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);
+       LDKRecentPaymentDetails this_ptr_conv = *(LDKRecentPaymentDetails*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       RecentPaymentDetails_free(this_ptr_conv);
+}
+
+static inline uint64_t RecentPaymentDetails_clone_ptr(LDKRecentPaymentDetails *NONNULL_PTR arg) {
+       LDKRecentPaymentDetails *ret_copy = MALLOC(sizeof(LDKRecentPaymentDetails), "LDKRecentPaymentDetails");
+       *ret_copy = RecentPaymentDetails_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_RecentPaymentDetails_clone_ptr(int64_t arg) {
+       LDKRecentPaymentDetails* arg_conv = (LDKRecentPaymentDetails*)untag_ptr(arg);
+       int64_t ret_conv = RecentPaymentDetails_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RecentPaymentDetails_clone(int64_t orig) {
+       LDKRecentPaymentDetails* orig_conv = (LDKRecentPaymentDetails*)untag_ptr(orig);
+       LDKRecentPaymentDetails *ret_copy = MALLOC(sizeof(LDKRecentPaymentDetails), "LDKRecentPaymentDetails");
+       *ret_copy = RecentPaymentDetails_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RecentPaymentDetails_awaiting_invoice(int8_tArray payment_id) {
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKRecentPaymentDetails *ret_copy = MALLOC(sizeof(LDKRecentPaymentDetails), "LDKRecentPaymentDetails");
+       *ret_copy = RecentPaymentDetails_awaiting_invoice(payment_id_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RecentPaymentDetails_pending(int8_tArray payment_id, int8_tArray payment_hash, int64_t total_msat) {
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKRecentPaymentDetails *ret_copy = MALLOC(sizeof(LDKRecentPaymentDetails), "LDKRecentPaymentDetails");
+       *ret_copy = RecentPaymentDetails_pending(payment_id_ref, payment_hash_ref, total_msat);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RecentPaymentDetails_fulfilled(int8_tArray payment_id, int64_t payment_hash) {
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       void* payment_hash_ptr = untag_ptr(payment_hash);
+       CHECK_ACCESS(payment_hash_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_hash_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_hash_ptr);
+       payment_hash_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_hash));
+       LDKRecentPaymentDetails *ret_copy = MALLOC(sizeof(LDKRecentPaymentDetails), "LDKRecentPaymentDetails");
+       *ret_copy = RecentPaymentDetails_fulfilled(payment_id_ref, payment_hash_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RecentPaymentDetails_abandoned(int8_tArray payment_id, int8_tArray payment_hash) {
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKRecentPaymentDetails *ret_copy = MALLOC(sizeof(LDKRecentPaymentDetails), "LDKRecentPaymentDetails");
+       *ret_copy = RecentPaymentDetails_abandoned(payment_id_ref, payment_hash_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_PhantomRouteHints_free(int64_t this_obj) {
+       LDKPhantomRouteHints 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);
+       PhantomRouteHints_free(this_obj_conv);
+}
+
+int64_tArray  CS_LDK_PhantomRouteHints_get_channels(int64_t this_ptr) {
+       LDKPhantomRouteHints 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_ChannelDetailsZ ret_var = PhantomRouteHints_get_channels(&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 q = 0; q < ret_var.datalen; q++) {
+               LDKChannelDetails ret_conv_16_var = ret_var.data[q];
+               int64_t ret_conv_16_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_16_var);
+               ret_conv_16_ref = tag_ptr(ret_conv_16_var.inner, ret_conv_16_var.is_owned);
+               ret_arr_ptr[q] = ret_conv_16_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_PhantomRouteHints_set_channels(int64_t this_ptr, int64_tArray val) {
+       LDKPhantomRouteHints 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_ChannelDetailsZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKChannelDetails), "LDKCVec_ChannelDetailsZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t q = 0; q < val_constr.datalen; q++) {
+               int64_t val_conv_16 = val_vals[q];
+               LDKChannelDetails val_conv_16_conv;
+               val_conv_16_conv.inner = untag_ptr(val_conv_16);
+               val_conv_16_conv.is_owned = ptr_is_owned(val_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_16_conv);
+               val_conv_16_conv = ChannelDetails_clone(&val_conv_16_conv);
+               val_constr.data[q] = val_conv_16_conv;
+       }
+       FREE(val);
+       PhantomRouteHints_set_channels(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_PhantomRouteHints_get_phantom_scid(int64_t this_ptr) {
+       LDKPhantomRouteHints 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 = PhantomRouteHints_get_phantom_scid(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PhantomRouteHints_set_phantom_scid(int64_t this_ptr, int64_t val) {
+       LDKPhantomRouteHints 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;
+       PhantomRouteHints_set_phantom_scid(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_PhantomRouteHints_get_real_node_pubkey(int64_t this_ptr) {
+       LDKPhantomRouteHints 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, PhantomRouteHints_get_real_node_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_PhantomRouteHints_set_real_node_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKPhantomRouteHints 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);
+       PhantomRouteHints_set_real_node_pubkey(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_PhantomRouteHints_new(int64_tArray channels_arg, int64_t phantom_scid_arg, int8_tArray real_node_pubkey_arg) {
+       LDKCVec_ChannelDetailsZ channels_arg_constr;
+       channels_arg_constr.datalen = channels_arg->arr_len;
+       if (channels_arg_constr.datalen > 0)
+               channels_arg_constr.data = MALLOC(channels_arg_constr.datalen * sizeof(LDKChannelDetails), "LDKCVec_ChannelDetailsZ Elements");
+       else
+               channels_arg_constr.data = NULL;
+       int64_t* channels_arg_vals = channels_arg->elems;
+       for (size_t q = 0; q < channels_arg_constr.datalen; q++) {
+               int64_t channels_arg_conv_16 = channels_arg_vals[q];
+               LDKChannelDetails channels_arg_conv_16_conv;
+               channels_arg_conv_16_conv.inner = untag_ptr(channels_arg_conv_16);
+               channels_arg_conv_16_conv.is_owned = ptr_is_owned(channels_arg_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(channels_arg_conv_16_conv);
+               channels_arg_conv_16_conv = ChannelDetails_clone(&channels_arg_conv_16_conv);
+               channels_arg_constr.data[q] = channels_arg_conv_16_conv;
+       }
+       FREE(channels_arg);
+       LDKPublicKey real_node_pubkey_arg_ref;
+       CHECK(real_node_pubkey_arg->arr_len == 33);
+       memcpy(real_node_pubkey_arg_ref.compressed_form, real_node_pubkey_arg->elems, 33); FREE(real_node_pubkey_arg);
+       LDKPhantomRouteHints ret_var = PhantomRouteHints_new(channels_arg_constr, phantom_scid_arg, real_node_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 PhantomRouteHints_clone_ptr(LDKPhantomRouteHints *NONNULL_PTR arg) {
+       LDKPhantomRouteHints ret_var = PhantomRouteHints_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_PhantomRouteHints_clone_ptr(int64_t arg) {
+       LDKPhantomRouteHints 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 = PhantomRouteHints_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PhantomRouteHints_clone(int64_t orig) {
+       LDKPhantomRouteHints 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;
+       LDKPhantomRouteHints ret_var = PhantomRouteHints_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_ChannelManager_new(int64_t fee_est, int64_t chain_monitor, int64_t tx_broadcaster, int64_t router, int64_t logger, int64_t entropy_source, int64_t node_signer, int64_t signer_provider, int64_t config, int64_t params, int32_t current_timestamp) {
+       void* fee_est_ptr = untag_ptr(fee_est);
+       CHECK_ACCESS(fee_est_ptr);
+       LDKFeeEstimator fee_est_conv = *(LDKFeeEstimator*)(fee_est_ptr);
+       if (fee_est_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_cloned(&fee_est_conv);
+       }
+       void* chain_monitor_ptr = untag_ptr(chain_monitor);
+       CHECK_ACCESS(chain_monitor_ptr);
+       LDKWatch chain_monitor_conv = *(LDKWatch*)(chain_monitor_ptr);
+       if (chain_monitor_conv.free == LDKWatch_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKWatch_JCalls_cloned(&chain_monitor_conv);
+       }
+       void* tx_broadcaster_ptr = untag_ptr(tx_broadcaster);
+       CHECK_ACCESS(tx_broadcaster_ptr);
+       LDKBroadcasterInterface tx_broadcaster_conv = *(LDKBroadcasterInterface*)(tx_broadcaster_ptr);
+       if (tx_broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&tx_broadcaster_conv);
+       }
+       void* router_ptr = untag_ptr(router);
+       CHECK_ACCESS(router_ptr);
+       LDKRouter router_conv = *(LDKRouter*)(router_ptr);
+       if (router_conv.free == LDKRouter_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKRouter_JCalls_cloned(&router_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);
+       }
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_conv);
+       }
+       void* signer_provider_ptr = untag_ptr(signer_provider);
+       CHECK_ACCESS(signer_provider_ptr);
+       LDKSignerProvider signer_provider_conv = *(LDKSignerProvider*)(signer_provider_ptr);
+       if (signer_provider_conv.free == LDKSignerProvider_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKSignerProvider_JCalls_cloned(&signer_provider_conv);
+       }
+       LDKUserConfig config_conv;
+       config_conv.inner = untag_ptr(config);
+       config_conv.is_owned = ptr_is_owned(config);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(config_conv);
+       config_conv = UserConfig_clone(&config_conv);
+       LDKChainParameters params_conv;
+       params_conv.inner = untag_ptr(params);
+       params_conv.is_owned = ptr_is_owned(params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(params_conv);
+       params_conv = ChainParameters_clone(&params_conv);
+       LDKChannelManager ret_var = ChannelManager_new(fee_est_conv, chain_monitor_conv, tx_broadcaster_conv, router_conv, logger_conv, entropy_source_conv, node_signer_conv, signer_provider_conv, config_conv, params_conv, current_timestamp);
+       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_ChannelManager_get_current_default_configuration(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKUserConfig ret_var = ChannelManager_get_current_default_configuration(&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_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) {
+       LDKChannelManager 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;
+       LDKPublicKey their_network_key_ref;
+       CHECK(their_network_key->arr_len == 33);
+       memcpy(their_network_key_ref.compressed_form, their_network_key->elems, 33); FREE(their_network_key);
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_tArray  CS_LDK_ChannelManager_list_channels(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKCVec_ChannelDetailsZ ret_var = ChannelManager_list_channels(&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 q = 0; q < ret_var.datalen; q++) {
+               LDKChannelDetails ret_conv_16_var = ret_var.data[q];
+               int64_t ret_conv_16_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_16_var);
+               ret_conv_16_ref = tag_ptr(ret_conv_16_var.inner, ret_conv_16_var.is_owned);
+               ret_arr_ptr[q] = ret_conv_16_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_ChannelManager_list_usable_channels(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKCVec_ChannelDetailsZ ret_var = ChannelManager_list_usable_channels(&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 q = 0; q < ret_var.datalen; q++) {
+               LDKChannelDetails ret_conv_16_var = ret_var.data[q];
+               int64_t ret_conv_16_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_16_var);
+               ret_conv_16_ref = tag_ptr(ret_conv_16_var.inner, ret_conv_16_var.is_owned);
+               ret_arr_ptr[q] = ret_conv_16_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_ChannelManager_list_channels_with_counterparty(int64_t this_arg, int8_tArray counterparty_node_id) {
+       LDKChannelManager 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;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKCVec_ChannelDetailsZ ret_var = ChannelManager_list_channels_with_counterparty(&this_arg_conv, counterparty_node_id_ref);
+       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 q = 0; q < ret_var.datalen; q++) {
+               LDKChannelDetails ret_conv_16_var = ret_var.data[q];
+               int64_t ret_conv_16_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_16_var);
+               ret_conv_16_ref = tag_ptr(ret_conv_16_var.inner, ret_conv_16_var.is_owned);
+               ret_arr_ptr[q] = ret_conv_16_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_ChannelManager_list_recent_payments(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKCVec_RecentPaymentDetailsZ ret_var = ChannelManager_list_recent_payments(&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 w = 0; w < ret_var.datalen; w++) {
+               LDKRecentPaymentDetails *ret_conv_22_copy = MALLOC(sizeof(LDKRecentPaymentDetails), "LDKRecentPaymentDetails");
+               *ret_conv_22_copy = ret_var.data[w];
+               int64_t ret_conv_22_ref = tag_ptr(ret_conv_22_copy, true);
+               ret_arr_ptr[w] = ret_conv_22_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_ChannelManager_close_channel(int64_t this_arg, int8_tArray channel_id, int8_tArray counterparty_node_id) {
+       LDKChannelManager 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;
+       uint8_t channel_id_arr[32];
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_arr, channel_id->elems, 32); FREE(channel_id);
+       uint8_t (*channel_id_ref)[32] = &channel_id_arr;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_close_channel(&this_arg_conv, channel_id_ref, counterparty_node_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_close_channel_with_feerate_and_script(int64_t this_arg, int8_tArray channel_id, int8_tArray counterparty_node_id, int64_t target_feerate_sats_per_1000_weight, int64_t shutdown_script) {
+       LDKChannelManager 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;
+       uint8_t channel_id_arr[32];
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_arr, channel_id->elems, 32); FREE(channel_id);
+       uint8_t (*channel_id_ref)[32] = &channel_id_arr;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       void* target_feerate_sats_per_1000_weight_ptr = untag_ptr(target_feerate_sats_per_1000_weight);
+       CHECK_ACCESS(target_feerate_sats_per_1000_weight_ptr);
+       LDKCOption_u32Z target_feerate_sats_per_1000_weight_conv = *(LDKCOption_u32Z*)(target_feerate_sats_per_1000_weight_ptr);
+       target_feerate_sats_per_1000_weight_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(target_feerate_sats_per_1000_weight));
+       LDKShutdownScript shutdown_script_conv;
+       shutdown_script_conv.inner = untag_ptr(shutdown_script);
+       shutdown_script_conv.is_owned = ptr_is_owned(shutdown_script);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(shutdown_script_conv);
+       shutdown_script_conv = ShutdownScript_clone(&shutdown_script_conv);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_close_channel_with_feerate_and_script(&this_arg_conv, channel_id_ref, counterparty_node_id_ref, target_feerate_sats_per_1000_weight_conv, shutdown_script_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_force_close_broadcasting_latest_txn(int64_t this_arg, int8_tArray channel_id, int8_tArray counterparty_node_id) {
+       LDKChannelManager 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;
+       uint8_t channel_id_arr[32];
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_arr, channel_id->elems, 32); FREE(channel_id);
+       uint8_t (*channel_id_ref)[32] = &channel_id_arr;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_force_close_broadcasting_latest_txn(&this_arg_conv, channel_id_ref, counterparty_node_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_force_close_without_broadcasting_txn(int64_t this_arg, int8_tArray channel_id, int8_tArray counterparty_node_id) {
+       LDKChannelManager 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;
+       uint8_t channel_id_arr[32];
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_arr, channel_id->elems, 32); FREE(channel_id);
+       uint8_t (*channel_id_ref)[32] = &channel_id_arr;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_force_close_without_broadcasting_txn(&this_arg_conv, channel_id_ref, counterparty_node_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelManager_force_close_all_channels_broadcasting_latest_txn(int64_t this_arg) {
+       LDKChannelManager 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;
+       ChannelManager_force_close_all_channels_broadcasting_latest_txn(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelManager_force_close_all_channels_without_broadcasting_txn(int64_t this_arg) {
+       LDKChannelManager 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;
+       ChannelManager_force_close_all_channels_without_broadcasting_txn(&this_arg_conv);
+}
+
+int64_t  CS_LDK_ChannelManager_send_payment_with_route(int64_t this_arg, int64_t route, int8_tArray payment_hash, int64_t recipient_onion, int8_tArray payment_id) {
+       LDKChannelManager 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;
+       LDKRoute route_conv;
+       route_conv.inner = untag_ptr(route);
+       route_conv.is_owned = ptr_is_owned(route);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_conv);
+       route_conv.is_owned = false;
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKRecipientOnionFields recipient_onion_conv;
+       recipient_onion_conv.inner = untag_ptr(recipient_onion);
+       recipient_onion_conv.is_owned = ptr_is_owned(recipient_onion);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(recipient_onion_conv);
+       recipient_onion_conv = RecipientOnionFields_clone(&recipient_onion_conv);
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKCResult_NonePaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentSendFailureZ), "LDKCResult_NonePaymentSendFailureZ");
+       *ret_conv = ChannelManager_send_payment_with_route(&this_arg_conv, &route_conv, payment_hash_ref, recipient_onion_conv, payment_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_send_payment(int64_t this_arg, int8_tArray payment_hash, int64_t recipient_onion, int8_tArray payment_id, int64_t route_params, int64_t retry_strategy) {
+       LDKChannelManager 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;
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKRecipientOnionFields recipient_onion_conv;
+       recipient_onion_conv.inner = untag_ptr(recipient_onion);
+       recipient_onion_conv.is_owned = ptr_is_owned(recipient_onion);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(recipient_onion_conv);
+       recipient_onion_conv = RecipientOnionFields_clone(&recipient_onion_conv);
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKRouteParameters route_params_conv;
+       route_params_conv.inner = untag_ptr(route_params);
+       route_params_conv.is_owned = ptr_is_owned(route_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_conv);
+       route_params_conv = RouteParameters_clone(&route_params_conv);
+       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));
+       LDKCResult_NoneRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneRetryableSendFailureZ), "LDKCResult_NoneRetryableSendFailureZ");
+       *ret_conv = ChannelManager_send_payment(&this_arg_conv, payment_hash_ref, recipient_onion_conv, payment_id_ref, route_params_conv, retry_strategy_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelManager_abandon_payment(int64_t this_arg, int8_tArray payment_id) {
+       LDKChannelManager 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;
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       ChannelManager_abandon_payment(&this_arg_conv, payment_id_ref);
+}
+
+int64_t  CS_LDK_ChannelManager_send_spontaneous_payment(int64_t this_arg, int64_t route, int64_t payment_preimage, int64_t recipient_onion, int8_tArray payment_id) {
+       LDKChannelManager 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;
+       LDKRoute route_conv;
+       route_conv.inner = untag_ptr(route);
+       route_conv.is_owned = ptr_is_owned(route);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_conv);
+       route_conv.is_owned = false;
+       void* payment_preimage_ptr = untag_ptr(payment_preimage);
+       CHECK_ACCESS(payment_preimage_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_preimage_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_preimage_ptr);
+       payment_preimage_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_preimage));
+       LDKRecipientOnionFields recipient_onion_conv;
+       recipient_onion_conv.inner = untag_ptr(recipient_onion);
+       recipient_onion_conv.is_owned = ptr_is_owned(recipient_onion);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(recipient_onion_conv);
+       recipient_onion_conv = RecipientOnionFields_clone(&recipient_onion_conv);
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ), "LDKCResult_ThirtyTwoBytesPaymentSendFailureZ");
+       *ret_conv = ChannelManager_send_spontaneous_payment(&this_arg_conv, &route_conv, payment_preimage_conv, recipient_onion_conv, payment_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_send_spontaneous_payment_with_retry(int64_t this_arg, int64_t payment_preimage, int64_t recipient_onion, int8_tArray payment_id, int64_t route_params, int64_t retry_strategy) {
+       LDKChannelManager 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;
+       void* payment_preimage_ptr = untag_ptr(payment_preimage);
+       CHECK_ACCESS(payment_preimage_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_preimage_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_preimage_ptr);
+       payment_preimage_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_preimage));
+       LDKRecipientOnionFields recipient_onion_conv;
+       recipient_onion_conv.inner = untag_ptr(recipient_onion);
+       recipient_onion_conv.is_owned = ptr_is_owned(recipient_onion);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(recipient_onion_conv);
+       recipient_onion_conv = RecipientOnionFields_clone(&recipient_onion_conv);
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKRouteParameters route_params_conv;
+       route_params_conv.inner = untag_ptr(route_params);
+       route_params_conv.is_owned = ptr_is_owned(route_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_conv);
+       route_params_conv = RouteParameters_clone(&route_params_conv);
+       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));
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ), "LDKCResult_ThirtyTwoBytesRetryableSendFailureZ");
+       *ret_conv = ChannelManager_send_spontaneous_payment_with_retry(&this_arg_conv, payment_preimage_conv, recipient_onion_conv, payment_id_ref, route_params_conv, retry_strategy_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_send_probe(int64_t this_arg, int64_t path) {
+       LDKChannelManager 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;
+       LDKPath 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 = Path_clone(&path_conv);
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ");
+       *ret_conv = ChannelManager_send_probe(&this_arg_conv, path_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_send_spontaneous_preflight_probes(int64_t this_arg, int8_tArray node_id, int64_t amount_msat, int32_t final_cltv_expiry_delta, int64_t liquidity_limit_multiplier) {
+       LDKChannelManager 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;
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       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_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ");
+       *ret_conv = ChannelManager_send_spontaneous_preflight_probes(&this_arg_conv, node_id_ref, amount_msat, final_cltv_expiry_delta, liquidity_limit_multiplier_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_send_preflight_probes(int64_t this_arg, int64_t route_params, int64_t liquidity_limit_multiplier) {
+       LDKChannelManager 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;
+       LDKRouteParameters route_params_conv;
+       route_params_conv.inner = untag_ptr(route_params);
+       route_params_conv.is_owned = ptr_is_owned(route_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_conv);
+       route_params_conv = RouteParameters_clone(&route_params_conv);
+       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_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ");
+       *ret_conv = ChannelManager_send_preflight_probes(&this_arg_conv, route_params_conv, liquidity_limit_multiplier_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_funding_transaction_generated(int64_t this_arg, int8_tArray temporary_channel_id, int8_tArray counterparty_node_id, int8_tArray funding_transaction) {
+       LDKChannelManager 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;
+       uint8_t temporary_channel_id_arr[32];
+       CHECK(temporary_channel_id->arr_len == 32);
+       memcpy(temporary_channel_id_arr, temporary_channel_id->elems, 32); FREE(temporary_channel_id);
+       uint8_t (*temporary_channel_id_ref)[32] = &temporary_channel_id_arr;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKTransaction funding_transaction_ref;
+       funding_transaction_ref.datalen = funding_transaction->arr_len;
+       funding_transaction_ref.data = MALLOC(funding_transaction_ref.datalen, "LDKTransaction Bytes");
+       memcpy(funding_transaction_ref.data, funding_transaction->elems, funding_transaction_ref.datalen); FREE(funding_transaction);
+       funding_transaction_ref.data_is_owned = true;
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_funding_transaction_generated(&this_arg_conv, temporary_channel_id_ref, counterparty_node_id_ref, funding_transaction_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_batch_funding_transaction_generated(int64_t this_arg, int64_tArray temporary_channels, int8_tArray funding_transaction) {
+       LDKChannelManager 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;
+       LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ temporary_channels_constr;
+       temporary_channels_constr.datalen = temporary_channels->arr_len;
+       if (temporary_channels_constr.datalen > 0)
+               temporary_channels_constr.data = MALLOC(temporary_channels_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ), "LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ Elements");
+       else
+               temporary_channels_constr.data = NULL;
+       int64_t* temporary_channels_vals = temporary_channels->elems;
+       for (size_t j = 0; j < temporary_channels_constr.datalen; j++) {
+               int64_t temporary_channels_conv_35 = temporary_channels_vals[j];
+               void* temporary_channels_conv_35_ptr = untag_ptr(temporary_channels_conv_35);
+               CHECK_ACCESS(temporary_channels_conv_35_ptr);
+               LDKC2Tuple_ThirtyTwoBytesPublicKeyZ temporary_channels_conv_35_conv = *(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ*)(temporary_channels_conv_35_ptr);
+               temporary_channels_conv_35_conv = C2Tuple_ThirtyTwoBytesPublicKeyZ_clone((LDKC2Tuple_ThirtyTwoBytesPublicKeyZ*)untag_ptr(temporary_channels_conv_35));
+               temporary_channels_constr.data[j] = temporary_channels_conv_35_conv;
+       }
+       FREE(temporary_channels);
+       LDKTransaction funding_transaction_ref;
+       funding_transaction_ref.datalen = funding_transaction->arr_len;
+       funding_transaction_ref.data = MALLOC(funding_transaction_ref.datalen, "LDKTransaction Bytes");
+       memcpy(funding_transaction_ref.data, funding_transaction->elems, funding_transaction_ref.datalen); FREE(funding_transaction);
+       funding_transaction_ref.data_is_owned = true;
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_batch_funding_transaction_generated(&this_arg_conv, temporary_channels_constr, funding_transaction_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_update_partial_channel_config(int64_t this_arg, int8_tArray counterparty_node_id, ptrArray channel_ids, int64_t config_update) {
+       LDKChannelManager 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;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKCVec_ThirtyTwoBytesZ channel_ids_constr;
+       channel_ids_constr.datalen = channel_ids->arr_len;
+       if (channel_ids_constr.datalen > 0)
+               channel_ids_constr.data = MALLOC(channel_ids_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ Elements");
+       else
+               channel_ids_constr.data = NULL;
+       int8_tArray* channel_ids_vals = (void*) channel_ids->elems;
+       for (size_t i = 0; i < channel_ids_constr.datalen; i++) {
+               int8_tArray channel_ids_conv_8 = channel_ids_vals[i];
+               LDKThirtyTwoBytes channel_ids_conv_8_ref;
+               CHECK(channel_ids_conv_8->arr_len == 32);
+               memcpy(channel_ids_conv_8_ref.data, channel_ids_conv_8->elems, 32); FREE(channel_ids_conv_8);
+               channel_ids_constr.data[i] = channel_ids_conv_8_ref;
+       }
+       FREE(channel_ids);
+       LDKChannelConfigUpdate config_update_conv;
+       config_update_conv.inner = untag_ptr(config_update);
+       config_update_conv.is_owned = ptr_is_owned(config_update);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(config_update_conv);
+       config_update_conv.is_owned = false;
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_update_partial_channel_config(&this_arg_conv, counterparty_node_id_ref, channel_ids_constr, &config_update_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_update_channel_config(int64_t this_arg, int8_tArray counterparty_node_id, ptrArray channel_ids, int64_t config) {
+       LDKChannelManager 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;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKCVec_ThirtyTwoBytesZ channel_ids_constr;
+       channel_ids_constr.datalen = channel_ids->arr_len;
+       if (channel_ids_constr.datalen > 0)
+               channel_ids_constr.data = MALLOC(channel_ids_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ Elements");
+       else
+               channel_ids_constr.data = NULL;
+       int8_tArray* channel_ids_vals = (void*) channel_ids->elems;
+       for (size_t i = 0; i < channel_ids_constr.datalen; i++) {
+               int8_tArray channel_ids_conv_8 = channel_ids_vals[i];
+               LDKThirtyTwoBytes channel_ids_conv_8_ref;
+               CHECK(channel_ids_conv_8->arr_len == 32);
+               memcpy(channel_ids_conv_8_ref.data, channel_ids_conv_8->elems, 32); FREE(channel_ids_conv_8);
+               channel_ids_constr.data[i] = channel_ids_conv_8_ref;
+       }
+       FREE(channel_ids);
+       LDKChannelConfig config_conv;
+       config_conv.inner = untag_ptr(config);
+       config_conv.is_owned = ptr_is_owned(config);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(config_conv);
+       config_conv.is_owned = false;
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_update_channel_config(&this_arg_conv, counterparty_node_id_ref, channel_ids_constr, &config_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_forward_intercepted_htlc(int64_t this_arg, int8_tArray intercept_id, int8_tArray next_hop_channel_id, int8_tArray next_node_id, int64_t amt_to_forward_msat) {
+       LDKChannelManager 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;
+       LDKThirtyTwoBytes intercept_id_ref;
+       CHECK(intercept_id->arr_len == 32);
+       memcpy(intercept_id_ref.data, intercept_id->elems, 32); FREE(intercept_id);
+       uint8_t next_hop_channel_id_arr[32];
+       CHECK(next_hop_channel_id->arr_len == 32);
+       memcpy(next_hop_channel_id_arr, next_hop_channel_id->elems, 32); FREE(next_hop_channel_id);
+       uint8_t (*next_hop_channel_id_ref)[32] = &next_hop_channel_id_arr;
+       LDKPublicKey next_node_id_ref;
+       CHECK(next_node_id->arr_len == 33);
+       memcpy(next_node_id_ref.compressed_form, next_node_id->elems, 33); FREE(next_node_id);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_forward_intercepted_htlc(&this_arg_conv, intercept_id_ref, next_hop_channel_id_ref, next_node_id_ref, amt_to_forward_msat);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_fail_intercepted_htlc(int64_t this_arg, int8_tArray intercept_id) {
+       LDKChannelManager 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;
+       LDKThirtyTwoBytes intercept_id_ref;
+       CHECK(intercept_id->arr_len == 32);
+       memcpy(intercept_id_ref.data, intercept_id->elems, 32); FREE(intercept_id);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_fail_intercepted_htlc(&this_arg_conv, intercept_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelManager_process_pending_htlc_forwards(int64_t this_arg) {
+       LDKChannelManager 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;
+       ChannelManager_process_pending_htlc_forwards(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelManager_timer_tick_occurred(int64_t this_arg) {
+       LDKChannelManager 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;
+       ChannelManager_timer_tick_occurred(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelManager_fail_htlc_backwards(int64_t this_arg, int8_tArray payment_hash) {
+       LDKChannelManager 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;
+       uint8_t payment_hash_arr[32];
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_arr, payment_hash->elems, 32); FREE(payment_hash);
+       uint8_t (*payment_hash_ref)[32] = &payment_hash_arr;
+       ChannelManager_fail_htlc_backwards(&this_arg_conv, payment_hash_ref);
+}
+
+void  CS_LDK_ChannelManager_fail_htlc_backwards_with_reason(int64_t this_arg, int8_tArray payment_hash, int64_t failure_code) {
+       LDKChannelManager 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;
+       uint8_t payment_hash_arr[32];
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_arr, payment_hash->elems, 32); FREE(payment_hash);
+       uint8_t (*payment_hash_ref)[32] = &payment_hash_arr;
+       void* failure_code_ptr = untag_ptr(failure_code);
+       CHECK_ACCESS(failure_code_ptr);
+       LDKFailureCode failure_code_conv = *(LDKFailureCode*)(failure_code_ptr);
+       failure_code_conv = FailureCode_clone((LDKFailureCode*)untag_ptr(failure_code));
+       ChannelManager_fail_htlc_backwards_with_reason(&this_arg_conv, payment_hash_ref, failure_code_conv);
+}
+
+void  CS_LDK_ChannelManager_claim_funds(int64_t this_arg, int8_tArray payment_preimage) {
+       LDKChannelManager 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;
+       LDKThirtyTwoBytes payment_preimage_ref;
+       CHECK(payment_preimage->arr_len == 32);
+       memcpy(payment_preimage_ref.data, payment_preimage->elems, 32); FREE(payment_preimage);
+       ChannelManager_claim_funds(&this_arg_conv, payment_preimage_ref);
+}
+
+void  CS_LDK_ChannelManager_claim_funds_with_known_custom_tlvs(int64_t this_arg, int8_tArray payment_preimage) {
+       LDKChannelManager 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;
+       LDKThirtyTwoBytes payment_preimage_ref;
+       CHECK(payment_preimage->arr_len == 32);
+       memcpy(payment_preimage_ref.data, payment_preimage->elems, 32); FREE(payment_preimage);
+       ChannelManager_claim_funds_with_known_custom_tlvs(&this_arg_conv, payment_preimage_ref);
+}
+
+int8_tArray  CS_LDK_ChannelManager_get_our_node_id(int64_t this_arg) {
+       LDKChannelManager 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, ChannelManager_get_our_node_id(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_ChannelManager_accept_inbound_channel(int64_t this_arg, int8_tArray temporary_channel_id, int8_tArray counterparty_node_id, int8_tArray user_channel_id) {
+       LDKChannelManager 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;
+       uint8_t temporary_channel_id_arr[32];
+       CHECK(temporary_channel_id->arr_len == 32);
+       memcpy(temporary_channel_id_arr, temporary_channel_id->elems, 32); FREE(temporary_channel_id);
+       uint8_t (*temporary_channel_id_ref)[32] = &temporary_channel_id_arr;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       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);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_accept_inbound_channel(&this_arg_conv, temporary_channel_id_ref, counterparty_node_id_ref, user_channel_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_accept_inbound_channel_from_trusted_peer_0conf(int64_t this_arg, int8_tArray temporary_channel_id, int8_tArray counterparty_node_id, int8_tArray user_channel_id) {
+       LDKChannelManager 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;
+       uint8_t temporary_channel_id_arr[32];
+       CHECK(temporary_channel_id->arr_len == 32);
+       memcpy(temporary_channel_id_arr, temporary_channel_id->elems, 32); FREE(temporary_channel_id);
+       uint8_t (*temporary_channel_id_ref)[32] = &temporary_channel_id_arr;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       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);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_accept_inbound_channel_from_trusted_peer_0conf(&this_arg_conv, temporary_channel_id_ref, counterparty_node_id_ref, user_channel_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_pay_for_offer(int64_t this_arg, int64_t offer, int64_t quantity, int64_t amount_msats, int64_t payer_note, int8_tArray payment_id, int64_t retry_strategy, int64_t max_total_routing_fee_msat) {
+       LDKChannelManager 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;
+       LDKOffer offer_conv;
+       offer_conv.inner = untag_ptr(offer);
+       offer_conv.is_owned = ptr_is_owned(offer);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(offer_conv);
+       offer_conv.is_owned = false;
+       void* quantity_ptr = untag_ptr(quantity);
+       CHECK_ACCESS(quantity_ptr);
+       LDKCOption_u64Z quantity_conv = *(LDKCOption_u64Z*)(quantity_ptr);
+       quantity_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(quantity));
+       void* amount_msats_ptr = untag_ptr(amount_msats);
+       CHECK_ACCESS(amount_msats_ptr);
+       LDKCOption_u64Z amount_msats_conv = *(LDKCOption_u64Z*)(amount_msats_ptr);
+       amount_msats_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(amount_msats));
+       void* payer_note_ptr = untag_ptr(payer_note);
+       CHECK_ACCESS(payer_note_ptr);
+       LDKCOption_StrZ payer_note_conv = *(LDKCOption_StrZ*)(payer_note_ptr);
+       payer_note_conv = COption_StrZ_clone((LDKCOption_StrZ*)untag_ptr(payer_note));
+       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));
+       void* max_total_routing_fee_msat_ptr = untag_ptr(max_total_routing_fee_msat);
+       CHECK_ACCESS(max_total_routing_fee_msat_ptr);
+       LDKCOption_u64Z max_total_routing_fee_msat_conv = *(LDKCOption_u64Z*)(max_total_routing_fee_msat_ptr);
+       max_total_routing_fee_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(max_total_routing_fee_msat));
+       LDKCResult_NoneBolt12SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt12SemanticErrorZ), "LDKCResult_NoneBolt12SemanticErrorZ");
+       *ret_conv = ChannelManager_pay_for_offer(&this_arg_conv, &offer_conv, quantity_conv, amount_msats_conv, payer_note_conv, payment_id_ref, retry_strategy_conv, max_total_routing_fee_msat_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_request_refund_payment(int64_t this_arg, int64_t refund) {
+       LDKChannelManager 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;
+       LDKRefund refund_conv;
+       refund_conv.inner = untag_ptr(refund);
+       refund_conv.is_owned = ptr_is_owned(refund);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(refund_conv);
+       refund_conv.is_owned = false;
+       LDKCResult_NoneBolt12SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt12SemanticErrorZ), "LDKCResult_NoneBolt12SemanticErrorZ");
+       *ret_conv = ChannelManager_request_refund_payment(&this_arg_conv, &refund_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_create_inbound_payment(int64_t this_arg, int64_t min_value_msat, int32_t invoice_expiry_delta_secs, int64_t min_final_cltv_expiry_delta) {
+       LDKChannelManager 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;
+       void* min_value_msat_ptr = untag_ptr(min_value_msat);
+       CHECK_ACCESS(min_value_msat_ptr);
+       LDKCOption_u64Z min_value_msat_conv = *(LDKCOption_u64Z*)(min_value_msat_ptr);
+       min_value_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(min_value_msat));
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ");
+       *ret_conv = ChannelManager_create_inbound_payment(&this_arg_conv, min_value_msat_conv, invoice_expiry_delta_secs, min_final_cltv_expiry_delta_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_create_inbound_payment_for_hash(int64_t this_arg, int8_tArray payment_hash, int64_t min_value_msat, int32_t invoice_expiry_delta_secs, int64_t min_final_cltv_expiry) {
+       LDKChannelManager 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;
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       void* min_value_msat_ptr = untag_ptr(min_value_msat);
+       CHECK_ACCESS(min_value_msat_ptr);
+       LDKCOption_u64Z min_value_msat_conv = *(LDKCOption_u64Z*)(min_value_msat_ptr);
+       min_value_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(min_value_msat));
+       void* min_final_cltv_expiry_ptr = untag_ptr(min_final_cltv_expiry);
+       CHECK_ACCESS(min_final_cltv_expiry_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_ptr);
+       min_final_cltv_expiry_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry));
+       LDKCResult_ThirtyTwoBytesNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesNoneZ), "LDKCResult_ThirtyTwoBytesNoneZ");
+       *ret_conv = ChannelManager_create_inbound_payment_for_hash(&this_arg_conv, payment_hash_ref, min_value_msat_conv, invoice_expiry_delta_secs, min_final_cltv_expiry_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_get_payment_preimage(int64_t this_arg, int8_tArray payment_hash, int8_tArray payment_secret) {
+       LDKChannelManager 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;
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKThirtyTwoBytes payment_secret_ref;
+       CHECK(payment_secret->arr_len == 32);
+       memcpy(payment_secret_ref.data, payment_secret->elems, 32); FREE(payment_secret);
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesAPIErrorZ), "LDKCResult_ThirtyTwoBytesAPIErrorZ");
+       *ret_conv = ChannelManager_get_payment_preimage(&this_arg_conv, payment_hash_ref, payment_secret_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_get_phantom_scid(int64_t this_arg) {
+       LDKChannelManager 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 = ChannelManager_get_phantom_scid(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelManager_get_phantom_route_hints(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKPhantomRouteHints ret_var = ChannelManager_get_phantom_route_hints(&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_ChannelManager_get_intercept_scid(int64_t this_arg) {
+       LDKChannelManager 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 = ChannelManager_get_intercept_scid(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelManager_compute_inflight_htlcs(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKInFlightHtlcs ret_var = ChannelManager_compute_inflight_htlcs(&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_ChannelManager_as_MessageSendEventsProvider(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKMessageSendEventsProvider* ret_ret = MALLOC(sizeof(LDKMessageSendEventsProvider), "LDKMessageSendEventsProvider");
+       *ret_ret = ChannelManager_as_MessageSendEventsProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ChannelManager_as_EventsProvider(int64_t this_arg) {
+       LDKChannelManager 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 = ChannelManager_as_EventsProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ChannelManager_as_Listen(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKListen* ret_ret = MALLOC(sizeof(LDKListen), "LDKListen");
+       *ret_ret = ChannelManager_as_Listen(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ChannelManager_as_Confirm(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKConfirm* ret_ret = MALLOC(sizeof(LDKConfirm), "LDKConfirm");
+       *ret_ret = ChannelManager_as_Confirm(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ChannelManager_get_event_or_persistence_needed_future(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKFuture ret_var = ChannelManager_get_event_or_persistence_needed_future(&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;
+}
+
+jboolean  CS_LDK_ChannelManager_get_and_clear_needs_persistence(int64_t this_arg) {
+       LDKChannelManager 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 = ChannelManager_get_and_clear_needs_persistence(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelManager_current_best_block(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKBestBlock ret_var = ChannelManager_current_best_block(&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_ChannelManager_node_features(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKNodeFeatures ret_var = ChannelManager_node_features(&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_ChannelManager_channel_features(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKChannelFeatures ret_var = ChannelManager_channel_features(&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_ChannelManager_channel_type_features(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKChannelTypeFeatures ret_var = ChannelManager_channel_type_features(&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_ChannelManager_init_features(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKInitFeatures ret_var = ChannelManager_init_features(&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_ChannelManager_as_ChannelMessageHandler(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKChannelMessageHandler* ret_ret = MALLOC(sizeof(LDKChannelMessageHandler), "LDKChannelMessageHandler");
+       *ret_ret = ChannelManager_as_ChannelMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ChannelManager_as_OffersMessageHandler(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKOffersMessageHandler* ret_ret = MALLOC(sizeof(LDKOffersMessageHandler), "LDKOffersMessageHandler");
+       *ret_ret = ChannelManager_as_OffersMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_provided_init_features(int64_t config) {
+       LDKUserConfig config_conv;
+       config_conv.inner = untag_ptr(config);
+       config_conv.is_owned = ptr_is_owned(config);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(config_conv);
+       config_conv.is_owned = false;
+       LDKInitFeatures ret_var = provided_init_features(&config_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_CounterpartyForwardingInfo_write(int64_t obj) {
+       LDKCounterpartyForwardingInfo 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 = CounterpartyForwardingInfo_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_CounterpartyForwardingInfo_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ), "LDKCResult_CounterpartyForwardingInfoDecodeErrorZ");
+       *ret_conv = CounterpartyForwardingInfo_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelCounterparty_write(int64_t obj) {
+       LDKChannelCounterparty 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 = ChannelCounterparty_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_ChannelCounterparty_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelCounterpartyDecodeErrorZ), "LDKCResult_ChannelCounterpartyDecodeErrorZ");
+       *ret_conv = ChannelCounterparty_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelDetails_write(int64_t obj) {
+       LDKChannelDetails 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 = ChannelDetails_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_ChannelDetails_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelDetailsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDetailsDecodeErrorZ), "LDKCResult_ChannelDetailsDecodeErrorZ");
+       *ret_conv = ChannelDetails_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_PhantomRouteHints_write(int64_t obj) {
+       LDKPhantomRouteHints 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 = PhantomRouteHints_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_PhantomRouteHints_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PhantomRouteHintsDecodeErrorZ), "LDKCResult_PhantomRouteHintsDecodeErrorZ");
+       *ret_conv = PhantomRouteHints_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);
+       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 = ChannelManager_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;
+}
+
+int8_tArray  CS_LDK_ChannelShutdownState_write(int64_t obj) {
+       LDKChannelShutdownState* obj_conv = (LDKChannelShutdownState*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = ChannelShutdownState_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_ChannelShutdownState_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelShutdownStateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelShutdownStateDecodeErrorZ), "LDKCResult_ChannelShutdownStateDecodeErrorZ");
+       *ret_conv = ChannelShutdownState_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelManagerReadArgs_free(int64_t this_obj) {
+       LDKChannelManagerReadArgs 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);
+       ChannelManagerReadArgs_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_entropy_source(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(ChannelManagerReadArgs_get_entropy_source(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_ChannelManagerReadArgs_set_entropy_source(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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);
+       LDKEntropySource val_conv = *(LDKEntropySource*)(val_ptr);
+       if (val_conv.free == LDKEntropySource_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKEntropySource_JCalls_cloned(&val_conv);
+       }
+       ChannelManagerReadArgs_set_entropy_source(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_node_signer(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(ChannelManagerReadArgs_get_node_signer(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_ChannelManagerReadArgs_set_node_signer(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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);
+       LDKNodeSigner val_conv = *(LDKNodeSigner*)(val_ptr);
+       if (val_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&val_conv);
+       }
+       ChannelManagerReadArgs_set_node_signer(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_signer_provider(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(ChannelManagerReadArgs_get_signer_provider(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_ChannelManagerReadArgs_set_signer_provider(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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);
+       LDKSignerProvider val_conv = *(LDKSignerProvider*)(val_ptr);
+       if (val_conv.free == LDKSignerProvider_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKSignerProvider_JCalls_cloned(&val_conv);
+       }
+       ChannelManagerReadArgs_set_signer_provider(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_fee_estimator(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(ChannelManagerReadArgs_get_fee_estimator(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_ChannelManagerReadArgs_set_fee_estimator(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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);
+       LDKFeeEstimator val_conv = *(LDKFeeEstimator*)(val_ptr);
+       if (val_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_cloned(&val_conv);
+       }
+       ChannelManagerReadArgs_set_fee_estimator(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_chain_monitor(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(ChannelManagerReadArgs_get_chain_monitor(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_ChannelManagerReadArgs_set_chain_monitor(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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);
+       LDKWatch val_conv = *(LDKWatch*)(val_ptr);
+       if (val_conv.free == LDKWatch_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKWatch_JCalls_cloned(&val_conv);
+       }
+       ChannelManagerReadArgs_set_chain_monitor(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_tx_broadcaster(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(ChannelManagerReadArgs_get_tx_broadcaster(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_ChannelManagerReadArgs_set_tx_broadcaster(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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);
+       LDKBroadcasterInterface val_conv = *(LDKBroadcasterInterface*)(val_ptr);
+       if (val_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&val_conv);
+       }
+       ChannelManagerReadArgs_set_tx_broadcaster(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_router(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(ChannelManagerReadArgs_get_router(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_ChannelManagerReadArgs_set_router(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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);
+       LDKRouter val_conv = *(LDKRouter*)(val_ptr);
+       if (val_conv.free == LDKRouter_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKRouter_JCalls_cloned(&val_conv);
+       }
+       ChannelManagerReadArgs_set_router(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_logger(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(ChannelManagerReadArgs_get_logger(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_ChannelManagerReadArgs_set_logger(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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);
+       LDKLogger val_conv = *(LDKLogger*)(val_ptr);
+       if (val_conv.free == LDKLogger_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKLogger_JCalls_cloned(&val_conv);
+       }
+       ChannelManagerReadArgs_set_logger(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_default_config(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       LDKUserConfig ret_var = ChannelManagerReadArgs_get_default_config(&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_ChannelManagerReadArgs_set_default_config(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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;
+       LDKUserConfig 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 = UserConfig_clone(&val_conv);
+       ChannelManagerReadArgs_set_default_config(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_new(int64_t entropy_source, int64_t node_signer, int64_t signer_provider, int64_t fee_estimator, int64_t chain_monitor, int64_t tx_broadcaster, int64_t router, int64_t logger, int64_t default_config, int64_tArray channel_monitors) {
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_conv);
+       }
+       void* signer_provider_ptr = untag_ptr(signer_provider);
+       CHECK_ACCESS(signer_provider_ptr);
+       LDKSignerProvider signer_provider_conv = *(LDKSignerProvider*)(signer_provider_ptr);
+       if (signer_provider_conv.free == LDKSignerProvider_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKSignerProvider_JCalls_cloned(&signer_provider_conv);
+       }
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       CHECK_ACCESS(fee_estimator_ptr);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(fee_estimator_ptr);
+       if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_cloned(&fee_estimator_conv);
+       }
+       void* chain_monitor_ptr = untag_ptr(chain_monitor);
+       CHECK_ACCESS(chain_monitor_ptr);
+       LDKWatch chain_monitor_conv = *(LDKWatch*)(chain_monitor_ptr);
+       if (chain_monitor_conv.free == LDKWatch_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKWatch_JCalls_cloned(&chain_monitor_conv);
+       }
+       void* tx_broadcaster_ptr = untag_ptr(tx_broadcaster);
+       CHECK_ACCESS(tx_broadcaster_ptr);
+       LDKBroadcasterInterface tx_broadcaster_conv = *(LDKBroadcasterInterface*)(tx_broadcaster_ptr);
+       if (tx_broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&tx_broadcaster_conv);
+       }
+       void* router_ptr = untag_ptr(router);
+       CHECK_ACCESS(router_ptr);
+       LDKRouter router_conv = *(LDKRouter*)(router_ptr);
+       if (router_conv.free == LDKRouter_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKRouter_JCalls_cloned(&router_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);
+       }
+       LDKUserConfig default_config_conv;
+       default_config_conv.inner = untag_ptr(default_config);
+       default_config_conv.is_owned = ptr_is_owned(default_config);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(default_config_conv);
+       default_config_conv = UserConfig_clone(&default_config_conv);
+       LDKCVec_ChannelMonitorZ channel_monitors_constr;
+       channel_monitors_constr.datalen = channel_monitors->arr_len;
+       if (channel_monitors_constr.datalen > 0)
+               channel_monitors_constr.data = MALLOC(channel_monitors_constr.datalen * sizeof(LDKChannelMonitor), "LDKCVec_ChannelMonitorZ Elements");
+       else
+               channel_monitors_constr.data = NULL;
+       int64_t* channel_monitors_vals = channel_monitors->elems;
+       for (size_t q = 0; q < channel_monitors_constr.datalen; q++) {
+               int64_t channel_monitors_conv_16 = channel_monitors_vals[q];
+               LDKChannelMonitor channel_monitors_conv_16_conv;
+               channel_monitors_conv_16_conv.inner = untag_ptr(channel_monitors_conv_16);
+               channel_monitors_conv_16_conv.is_owned = ptr_is_owned(channel_monitors_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_monitors_conv_16_conv);
+               channel_monitors_conv_16_conv.is_owned = false;
+               channel_monitors_constr.data[q] = channel_monitors_conv_16_conv;
+       }
+       FREE(channel_monitors);
+       LDKChannelManagerReadArgs ret_var = ChannelManagerReadArgs_new(entropy_source_conv, node_signer_conv, signer_provider_conv, fee_estimator_conv, chain_monitor_conv, tx_broadcaster_conv, router_conv, logger_conv, default_config_conv, channel_monitors_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);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_read(int8_tArray ser, int64_t arg) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKChannelManagerReadArgs arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       // WARNING: we need a move here but no clone is available for LDKChannelManagerReadArgs
+       
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesChannelManagerZ_read(ser_ref, arg_conv);
+       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);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       ExpandedKey_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ExpandedKey_new(int8_tArray key_material) {
+       uint8_t key_material_arr[32];
+       CHECK(key_material->arr_len == 32);
+       memcpy(key_material_arr, key_material->elems, 32); FREE(key_material);
+       uint8_t (*key_material_ref)[32] = &key_material_arr;
+       LDKExpandedKey ret_var = ExpandedKey_new(key_material_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_create(int64_t keys, int64_t min_value_msat, int32_t invoice_expiry_delta_secs, int64_t entropy_source, int64_t current_time, int64_t min_final_cltv_expiry_delta) {
+       LDKExpandedKey keys_conv;
+       keys_conv.inner = untag_ptr(keys);
+       keys_conv.is_owned = ptr_is_owned(keys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(keys_conv);
+       keys_conv.is_owned = false;
+       void* min_value_msat_ptr = untag_ptr(min_value_msat);
+       CHECK_ACCESS(min_value_msat_ptr);
+       LDKCOption_u64Z min_value_msat_conv = *(LDKCOption_u64Z*)(min_value_msat_ptr);
+       min_value_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(min_value_msat));
+       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;
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ");
+       *ret_conv = create(&keys_conv, min_value_msat_conv, invoice_expiry_delta_secs, entropy_source_conv, current_time, min_final_cltv_expiry_delta_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_create_from_hash(int64_t keys, int64_t min_value_msat, int8_tArray payment_hash, int32_t invoice_expiry_delta_secs, int64_t current_time, int64_t min_final_cltv_expiry_delta) {
+       LDKExpandedKey keys_conv;
+       keys_conv.inner = untag_ptr(keys);
+       keys_conv.is_owned = ptr_is_owned(keys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(keys_conv);
+       keys_conv.is_owned = false;
+       void* min_value_msat_ptr = untag_ptr(min_value_msat);
+       CHECK_ACCESS(min_value_msat_ptr);
+       LDKCOption_u64Z min_value_msat_conv = *(LDKCOption_u64Z*)(min_value_msat_ptr);
+       min_value_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(min_value_msat));
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_ThirtyTwoBytesNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesNoneZ), "LDKCResult_ThirtyTwoBytesNoneZ");
+       *ret_conv = create_from_hash(&keys_conv, min_value_msat_conv, payment_hash_ref, invoice_expiry_delta_secs, current_time, min_final_cltv_expiry_delta_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_DecodeError_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);
+       LDKDecodeError this_ptr_conv = *(LDKDecodeError*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       DecodeError_free(this_ptr_conv);
+}
+
+static inline uint64_t DecodeError_clone_ptr(LDKDecodeError *NONNULL_PTR arg) {
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_DecodeError_clone_ptr(int64_t arg) {
+       LDKDecodeError* arg_conv = (LDKDecodeError*)untag_ptr(arg);
+       int64_t ret_conv = DecodeError_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_DecodeError_clone(int64_t orig) {
+       LDKDecodeError* orig_conv = (LDKDecodeError*)untag_ptr(orig);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DecodeError_unknown_version() {
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_unknown_version();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DecodeError_unknown_required_feature() {
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_unknown_required_feature();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DecodeError_invalid_value() {
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_invalid_value();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DecodeError_short_read() {
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_short_read();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DecodeError_bad_length_descriptor() {
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_bad_length_descriptor();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DecodeError_io(int32_t a) {
+       LDKIOError a_conv = LDKIOError_from_cs(a);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_io(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DecodeError_unsupported_compression() {
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_unsupported_compression();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+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);
+       jboolean ret_conv = DecodeError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Init_free(int64_t this_obj) {
+       LDKInit 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);
+       Init_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_Init_get_features(int64_t this_ptr) {
+       LDKInit 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;
+       LDKInitFeatures ret_var = Init_get_features(&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_Init_set_features(int64_t this_ptr, int64_t val) {
+       LDKInit 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;
+       LDKInitFeatures 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 = InitFeatures_clone(&val_conv);
+       Init_set_features(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Init_get_networks(int64_t this_ptr) {
+       LDKInit 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_ThirtyTwoBytesZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_ThirtyTwoBytesZZ), "LDKCOption_CVec_ThirtyTwoBytesZZ");
+       *ret_copy = Init_get_networks(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_Init_set_networks(int64_t this_ptr, int64_t val) {
+       LDKInit 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_ThirtyTwoBytesZZ val_conv = *(LDKCOption_CVec_ThirtyTwoBytesZZ*)(val_ptr);
+       val_conv = COption_CVec_ThirtyTwoBytesZZ_clone((LDKCOption_CVec_ThirtyTwoBytesZZ*)untag_ptr(val));
+       Init_set_networks(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Init_get_remote_network_address(int64_t this_ptr) {
+       LDKInit 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_SocketAddressZ *ret_copy = MALLOC(sizeof(LDKCOption_SocketAddressZ), "LDKCOption_SocketAddressZ");
+       *ret_copy = Init_get_remote_network_address(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_Init_set_remote_network_address(int64_t this_ptr, int64_t val) {
+       LDKInit 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_SocketAddressZ val_conv = *(LDKCOption_SocketAddressZ*)(val_ptr);
+       val_conv = COption_SocketAddressZ_clone((LDKCOption_SocketAddressZ*)untag_ptr(val));
+       Init_set_remote_network_address(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Init_new(int64_t features_arg, int64_t networks_arg, int64_t remote_network_address_arg) {
+       LDKInitFeatures features_arg_conv;
+       features_arg_conv.inner = untag_ptr(features_arg);
+       features_arg_conv.is_owned = ptr_is_owned(features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_arg_conv);
+       features_arg_conv = InitFeatures_clone(&features_arg_conv);
+       void* networks_arg_ptr = untag_ptr(networks_arg);
+       CHECK_ACCESS(networks_arg_ptr);
+       LDKCOption_CVec_ThirtyTwoBytesZZ networks_arg_conv = *(LDKCOption_CVec_ThirtyTwoBytesZZ*)(networks_arg_ptr);
+       networks_arg_conv = COption_CVec_ThirtyTwoBytesZZ_clone((LDKCOption_CVec_ThirtyTwoBytesZZ*)untag_ptr(networks_arg));
+       void* remote_network_address_arg_ptr = untag_ptr(remote_network_address_arg);
+       CHECK_ACCESS(remote_network_address_arg_ptr);
+       LDKCOption_SocketAddressZ remote_network_address_arg_conv = *(LDKCOption_SocketAddressZ*)(remote_network_address_arg_ptr);
+       LDKInit ret_var = Init_new(features_arg_conv, networks_arg_conv, remote_network_address_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 Init_clone_ptr(LDKInit *NONNULL_PTR arg) {
+       LDKInit ret_var = Init_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_Init_clone_ptr(int64_t arg) {
+       LDKInit 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 = Init_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Init_clone(int64_t orig) {
+       LDKInit 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;
+       LDKInit ret_var = Init_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_Init_eq(int64_t a, int64_t b) {
+       LDKInit 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;
+       LDKInit 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 = Init_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ErrorMessage_free(int64_t this_obj) {
+       LDKErrorMessage 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);
+       ErrorMessage_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ErrorMessage_get_channel_id(int64_t this_ptr) {
+       LDKErrorMessage 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, *ErrorMessage_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ErrorMessage_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKErrorMessage 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);
+       ErrorMessage_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+jstring  CS_LDK_ErrorMessage_get_data(int64_t this_ptr) {
+       LDKErrorMessage 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 = ErrorMessage_get_data(&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_ErrorMessage_set_data(int64_t this_ptr, jstring val) {
+       LDKErrorMessage 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);
+       ErrorMessage_set_data(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ErrorMessage_new(int8_tArray channel_id_arg, jstring data_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);
+       LDKStr data_arg_conv = str_ref_to_owned_c(data_arg);
+       LDKErrorMessage ret_var = ErrorMessage_new(channel_id_arg_ref, data_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 ErrorMessage_clone_ptr(LDKErrorMessage *NONNULL_PTR arg) {
+       LDKErrorMessage ret_var = ErrorMessage_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_ErrorMessage_clone_ptr(int64_t arg) {
+       LDKErrorMessage 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 = ErrorMessage_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ErrorMessage_clone(int64_t orig) {
+       LDKErrorMessage 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;
+       LDKErrorMessage ret_var = ErrorMessage_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_ErrorMessage_eq(int64_t a, int64_t b) {
+       LDKErrorMessage 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;
+       LDKErrorMessage 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 = ErrorMessage_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_WarningMessage_free(int64_t this_obj) {
+       LDKWarningMessage 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);
+       WarningMessage_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_WarningMessage_get_channel_id(int64_t this_ptr) {
+       LDKWarningMessage 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, *WarningMessage_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_WarningMessage_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKWarningMessage 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);
+       WarningMessage_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+jstring  CS_LDK_WarningMessage_get_data(int64_t this_ptr) {
+       LDKWarningMessage 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 = WarningMessage_get_data(&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_WarningMessage_set_data(int64_t this_ptr, jstring val) {
+       LDKWarningMessage 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);
+       WarningMessage_set_data(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_WarningMessage_new(int8_tArray channel_id_arg, jstring data_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);
+       LDKStr data_arg_conv = str_ref_to_owned_c(data_arg);
+       LDKWarningMessage ret_var = WarningMessage_new(channel_id_arg_ref, data_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 WarningMessage_clone_ptr(LDKWarningMessage *NONNULL_PTR arg) {
+       LDKWarningMessage ret_var = WarningMessage_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_WarningMessage_clone_ptr(int64_t arg) {
+       LDKWarningMessage 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 = WarningMessage_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_WarningMessage_clone(int64_t orig) {
+       LDKWarningMessage 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;
+       LDKWarningMessage ret_var = WarningMessage_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_WarningMessage_eq(int64_t a, int64_t b) {
+       LDKWarningMessage 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;
+       LDKWarningMessage 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 = WarningMessage_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Ping_free(int64_t this_obj) {
+       LDKPing 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);
+       Ping_free(this_obj_conv);
+}
+
+int16_t  CS_LDK_Ping_get_ponglen(int64_t this_ptr) {
+       LDKPing 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 = Ping_get_ponglen(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Ping_set_ponglen(int64_t this_ptr, int16_t val) {
+       LDKPing 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;
+       Ping_set_ponglen(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_Ping_get_byteslen(int64_t this_ptr) {
+       LDKPing 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 = Ping_get_byteslen(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Ping_set_byteslen(int64_t this_ptr, int16_t val) {
+       LDKPing 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;
+       Ping_set_byteslen(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_Ping_new(int16_t ponglen_arg, int16_t byteslen_arg) {
+       LDKPing ret_var = Ping_new(ponglen_arg, byteslen_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 Ping_clone_ptr(LDKPing *NONNULL_PTR arg) {
+       LDKPing ret_var = Ping_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_Ping_clone_ptr(int64_t arg) {
+       LDKPing 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 = Ping_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Ping_clone(int64_t orig) {
+       LDKPing 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;
+       LDKPing ret_var = Ping_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_Ping_eq(int64_t a, int64_t b) {
+       LDKPing 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;
+       LDKPing 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 = Ping_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Pong_free(int64_t this_obj) {
+       LDKPong 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);
+       Pong_free(this_obj_conv);
+}
+
+int16_t  CS_LDK_Pong_get_byteslen(int64_t this_ptr) {
+       LDKPong 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 = Pong_get_byteslen(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Pong_set_byteslen(int64_t this_ptr, int16_t val) {
+       LDKPong 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;
+       Pong_set_byteslen(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_Pong_new(int16_t byteslen_arg) {
+       LDKPong ret_var = Pong_new(byteslen_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 Pong_clone_ptr(LDKPong *NONNULL_PTR arg) {
+       LDKPong ret_var = Pong_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_Pong_clone_ptr(int64_t arg) {
+       LDKPong 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 = Pong_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Pong_clone(int64_t orig) {
+       LDKPong 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;
+       LDKPong ret_var = Pong_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_Pong_eq(int64_t a, int64_t b) {
+       LDKPong 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;
+       LDKPong 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 = Pong_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_free(int64_t this_obj) {
+       LDKOpenChannel 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);
+       OpenChannel_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_OpenChannel_get_chain_hash(int64_t this_ptr) {
+       LDKOpenChannel 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, *OpenChannel_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannel_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannel 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);
+       OpenChannel_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannel_get_temporary_channel_id(int64_t this_ptr) {
+       LDKOpenChannel 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, *OpenChannel_get_temporary_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannel_set_temporary_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannel 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);
+       OpenChannel_set_temporary_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_OpenChannel_get_funding_satoshis(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_funding_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_funding_satoshis(int64_t this_ptr, int64_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_funding_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannel_get_push_msat(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_push_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_push_msat(int64_t this_ptr, int64_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_push_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannel_get_dust_limit_satoshis(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_dust_limit_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_dust_limit_satoshis(int64_t this_ptr, int64_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_dust_limit_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannel_get_max_htlc_value_in_flight_msat(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_max_htlc_value_in_flight_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_max_htlc_value_in_flight_msat(int64_t this_ptr, int64_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_max_htlc_value_in_flight_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannel_get_channel_reserve_satoshis(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_channel_reserve_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_channel_reserve_satoshis(int64_t this_ptr, int64_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_channel_reserve_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannel_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_OpenChannel_get_feerate_per_kw(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_feerate_per_kw(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_feerate_per_kw(int64_t this_ptr, int32_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_feerate_per_kw(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_OpenChannel_get_to_self_delay(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_to_self_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_to_self_delay(int64_t this_ptr, int16_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_to_self_delay(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_OpenChannel_get_max_accepted_htlcs(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_max_accepted_htlcs(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_max_accepted_htlcs(int64_t this_ptr, int16_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_max_accepted_htlcs(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_OpenChannel_get_funding_pubkey(int64_t this_ptr) {
+       LDKOpenChannel 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, OpenChannel_get_funding_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannel_set_funding_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannel 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);
+       OpenChannel_set_funding_pubkey(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannel_get_revocation_basepoint(int64_t this_ptr) {
+       LDKOpenChannel 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, OpenChannel_get_revocation_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannel_set_revocation_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannel 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);
+       OpenChannel_set_revocation_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannel_get_payment_point(int64_t this_ptr) {
+       LDKOpenChannel 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, OpenChannel_get_payment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannel_set_payment_point(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannel 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);
+       OpenChannel_set_payment_point(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannel_get_delayed_payment_basepoint(int64_t this_ptr) {
+       LDKOpenChannel 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, OpenChannel_get_delayed_payment_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannel_set_delayed_payment_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannel 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);
+       OpenChannel_set_delayed_payment_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannel_get_htlc_basepoint(int64_t this_ptr) {
+       LDKOpenChannel 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, OpenChannel_get_htlc_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannel_set_htlc_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannel 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);
+       OpenChannel_set_htlc_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannel_get_first_per_commitment_point(int64_t this_ptr) {
+       LDKOpenChannel 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, OpenChannel_get_first_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannel_set_first_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannel 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);
+       OpenChannel_set_first_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int8_t  CS_LDK_OpenChannel_get_channel_flags(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_channel_flags(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_channel_flags(int64_t this_ptr, int8_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_channel_flags(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannel_get_shutdown_scriptpubkey(int64_t this_ptr) {
+       LDKOpenChannel 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_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = OpenChannel_get_shutdown_scriptpubkey(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_OpenChannel_set_shutdown_scriptpubkey(int64_t this_ptr, int64_t val) {
+       LDKOpenChannel 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_u8ZZ val_conv = *(LDKCOption_CVec_u8ZZ*)(val_ptr);
+       val_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(val));
+       OpenChannel_set_shutdown_scriptpubkey(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_OpenChannel_get_channel_type(int64_t this_ptr) {
+       LDKOpenChannel 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;
+       LDKChannelTypeFeatures ret_var = OpenChannel_get_channel_type(&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_OpenChannel_set_channel_type(int64_t this_ptr, int64_t val) {
+       LDKOpenChannel 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;
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_clone(&val_conv);
+       OpenChannel_set_channel_type(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_OpenChannel_new(int8_tArray chain_hash_arg, int8_tArray temporary_channel_id_arg, int64_t funding_satoshis_arg, int64_t push_msat_arg, int64_t dust_limit_satoshis_arg, int64_t max_htlc_value_in_flight_msat_arg, int64_t channel_reserve_satoshis_arg, int64_t htlc_minimum_msat_arg, int32_t feerate_per_kw_arg, int16_t to_self_delay_arg, int16_t max_accepted_htlcs_arg, 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, int8_tArray first_per_commitment_point_arg, int8_t channel_flags_arg, int64_t shutdown_scriptpubkey_arg, int64_t channel_type_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);
+       LDKThirtyTwoBytes temporary_channel_id_arg_ref;
+       CHECK(temporary_channel_id_arg->arr_len == 32);
+       memcpy(temporary_channel_id_arg_ref.data, temporary_channel_id_arg->elems, 32); FREE(temporary_channel_id_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);
+       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);
+       LDKPublicKey first_per_commitment_point_arg_ref;
+       CHECK(first_per_commitment_point_arg->arr_len == 33);
+       memcpy(first_per_commitment_point_arg_ref.compressed_form, first_per_commitment_point_arg->elems, 33); FREE(first_per_commitment_point_arg);
+       void* shutdown_scriptpubkey_arg_ptr = untag_ptr(shutdown_scriptpubkey_arg);
+       CHECK_ACCESS(shutdown_scriptpubkey_arg_ptr);
+       LDKCOption_CVec_u8ZZ shutdown_scriptpubkey_arg_conv = *(LDKCOption_CVec_u8ZZ*)(shutdown_scriptpubkey_arg_ptr);
+       shutdown_scriptpubkey_arg_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(shutdown_scriptpubkey_arg));
+       LDKChannelTypeFeatures channel_type_arg_conv;
+       channel_type_arg_conv.inner = untag_ptr(channel_type_arg);
+       channel_type_arg_conv.is_owned = ptr_is_owned(channel_type_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_arg_conv);
+       channel_type_arg_conv = ChannelTypeFeatures_clone(&channel_type_arg_conv);
+       LDKOpenChannel ret_var = OpenChannel_new(chain_hash_arg_ref, temporary_channel_id_arg_ref, funding_satoshis_arg, push_msat_arg, dust_limit_satoshis_arg, max_htlc_value_in_flight_msat_arg, channel_reserve_satoshis_arg, htlc_minimum_msat_arg, feerate_per_kw_arg, to_self_delay_arg, max_accepted_htlcs_arg, funding_pubkey_arg_ref, revocation_basepoint_arg_ref, payment_point_arg_ref, delayed_payment_basepoint_arg_ref, htlc_basepoint_arg_ref, first_per_commitment_point_arg_ref, channel_flags_arg, shutdown_scriptpubkey_arg_conv, channel_type_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 OpenChannel_clone_ptr(LDKOpenChannel *NONNULL_PTR arg) {
+       LDKOpenChannel ret_var = OpenChannel_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_OpenChannel_clone_ptr(int64_t arg) {
+       LDKOpenChannel 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 = OpenChannel_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OpenChannel_clone(int64_t orig) {
+       LDKOpenChannel 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;
+       LDKOpenChannel ret_var = OpenChannel_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_OpenChannel_eq(int64_t a, int64_t b) {
+       LDKOpenChannel 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;
+       LDKOpenChannel 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 = OpenChannel_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_free(int64_t this_obj) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_chain_hash(int64_t this_ptr) {
+       LDKOpenChannelV2 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, *OpenChannelV2_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_temporary_channel_id(int64_t this_ptr) {
+       LDKOpenChannelV2 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, *OpenChannelV2_get_temporary_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_temporary_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_temporary_channel_id(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_OpenChannelV2_get_funding_feerate_sat_per_1000_weight(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_funding_feerate_sat_per_1000_weight(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_funding_feerate_sat_per_1000_weight(int64_t this_ptr, int32_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_funding_feerate_sat_per_1000_weight(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_OpenChannelV2_get_commitment_feerate_sat_per_1000_weight(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_commitment_feerate_sat_per_1000_weight(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_commitment_feerate_sat_per_1000_weight(int64_t this_ptr, int32_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_commitment_feerate_sat_per_1000_weight(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannelV2_get_funding_satoshis(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_funding_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_funding_satoshis(int64_t this_ptr, int64_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_funding_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannelV2_get_dust_limit_satoshis(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_dust_limit_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_dust_limit_satoshis(int64_t this_ptr, int64_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_dust_limit_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannelV2_get_max_htlc_value_in_flight_msat(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_max_htlc_value_in_flight_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_max_htlc_value_in_flight_msat(int64_t this_ptr, int64_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_max_htlc_value_in_flight_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannelV2_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_OpenChannelV2_get_to_self_delay(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_to_self_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_to_self_delay(int64_t this_ptr, int16_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_to_self_delay(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_OpenChannelV2_get_max_accepted_htlcs(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_max_accepted_htlcs(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_max_accepted_htlcs(int64_t this_ptr, int16_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_max_accepted_htlcs(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_OpenChannelV2_get_locktime(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_locktime(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_locktime(int64_t this_ptr, int32_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_locktime(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_funding_pubkey(int64_t this_ptr) {
+       LDKOpenChannelV2 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, OpenChannelV2_get_funding_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_funding_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_funding_pubkey(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_revocation_basepoint(int64_t this_ptr) {
+       LDKOpenChannelV2 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, OpenChannelV2_get_revocation_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_revocation_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_revocation_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_payment_basepoint(int64_t this_ptr) {
+       LDKOpenChannelV2 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, OpenChannelV2_get_payment_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_payment_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_payment_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_delayed_payment_basepoint(int64_t this_ptr) {
+       LDKOpenChannelV2 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, OpenChannelV2_get_delayed_payment_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_delayed_payment_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_delayed_payment_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_htlc_basepoint(int64_t this_ptr) {
+       LDKOpenChannelV2 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, OpenChannelV2_get_htlc_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_htlc_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_htlc_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_first_per_commitment_point(int64_t this_ptr) {
+       LDKOpenChannelV2 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, OpenChannelV2_get_first_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_first_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_first_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_second_per_commitment_point(int64_t this_ptr) {
+       LDKOpenChannelV2 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, OpenChannelV2_get_second_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_second_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_second_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int8_t  CS_LDK_OpenChannelV2_get_channel_flags(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_channel_flags(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_channel_flags(int64_t this_ptr, int8_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_channel_flags(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannelV2_get_shutdown_scriptpubkey(int64_t this_ptr) {
+       LDKOpenChannelV2 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_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = OpenChannelV2_get_shutdown_scriptpubkey(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_OpenChannelV2_set_shutdown_scriptpubkey(int64_t this_ptr, int64_t val) {
+       LDKOpenChannelV2 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_u8ZZ val_conv = *(LDKCOption_CVec_u8ZZ*)(val_ptr);
+       val_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(val));
+       OpenChannelV2_set_shutdown_scriptpubkey(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_OpenChannelV2_get_channel_type(int64_t this_ptr) {
+       LDKOpenChannelV2 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;
+       LDKChannelTypeFeatures ret_var = OpenChannelV2_get_channel_type(&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_OpenChannelV2_set_channel_type(int64_t this_ptr, int64_t val) {
+       LDKOpenChannelV2 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;
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_clone(&val_conv);
+       OpenChannelV2_set_channel_type(&this_ptr_conv, val_conv);
+}
+
+int32_t  CS_LDK_OpenChannelV2_get_require_confirmed_inputs(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = LDKCOption_NoneZ_to_cs(OpenChannelV2_get_require_confirmed_inputs(&this_ptr_conv));
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_require_confirmed_inputs(int64_t this_ptr, int32_t val) {
+       LDKOpenChannelV2 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_NoneZ val_conv = LDKCOption_NoneZ_from_cs(val);
+       OpenChannelV2_set_require_confirmed_inputs(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_OpenChannelV2_new(int8_tArray chain_hash_arg, int8_tArray temporary_channel_id_arg, int32_t funding_feerate_sat_per_1000_weight_arg, int32_t commitment_feerate_sat_per_1000_weight_arg, int64_t funding_satoshis_arg, int64_t dust_limit_satoshis_arg, int64_t max_htlc_value_in_flight_msat_arg, int64_t htlc_minimum_msat_arg, int16_t to_self_delay_arg, int16_t max_accepted_htlcs_arg, int32_t locktime_arg, int8_tArray funding_pubkey_arg, int8_tArray revocation_basepoint_arg, int8_tArray payment_basepoint_arg, int8_tArray delayed_payment_basepoint_arg, int8_tArray htlc_basepoint_arg, int8_tArray first_per_commitment_point_arg, int8_tArray second_per_commitment_point_arg, int8_t channel_flags_arg, int64_t shutdown_scriptpubkey_arg, int64_t channel_type_arg, int32_t require_confirmed_inputs_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);
+       LDKThirtyTwoBytes temporary_channel_id_arg_ref;
+       CHECK(temporary_channel_id_arg->arr_len == 32);
+       memcpy(temporary_channel_id_arg_ref.data, temporary_channel_id_arg->elems, 32); FREE(temporary_channel_id_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);
+       LDKPublicKey payment_basepoint_arg_ref;
+       CHECK(payment_basepoint_arg->arr_len == 33);
+       memcpy(payment_basepoint_arg_ref.compressed_form, payment_basepoint_arg->elems, 33); FREE(payment_basepoint_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);
+       LDKPublicKey first_per_commitment_point_arg_ref;
+       CHECK(first_per_commitment_point_arg->arr_len == 33);
+       memcpy(first_per_commitment_point_arg_ref.compressed_form, first_per_commitment_point_arg->elems, 33); FREE(first_per_commitment_point_arg);
+       LDKPublicKey second_per_commitment_point_arg_ref;
+       CHECK(second_per_commitment_point_arg->arr_len == 33);
+       memcpy(second_per_commitment_point_arg_ref.compressed_form, second_per_commitment_point_arg->elems, 33); FREE(second_per_commitment_point_arg);
+       void* shutdown_scriptpubkey_arg_ptr = untag_ptr(shutdown_scriptpubkey_arg);
+       CHECK_ACCESS(shutdown_scriptpubkey_arg_ptr);
+       LDKCOption_CVec_u8ZZ shutdown_scriptpubkey_arg_conv = *(LDKCOption_CVec_u8ZZ*)(shutdown_scriptpubkey_arg_ptr);
+       shutdown_scriptpubkey_arg_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(shutdown_scriptpubkey_arg));
+       LDKChannelTypeFeatures channel_type_arg_conv;
+       channel_type_arg_conv.inner = untag_ptr(channel_type_arg);
+       channel_type_arg_conv.is_owned = ptr_is_owned(channel_type_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_arg_conv);
+       channel_type_arg_conv = ChannelTypeFeatures_clone(&channel_type_arg_conv);
+       LDKCOption_NoneZ require_confirmed_inputs_arg_conv = LDKCOption_NoneZ_from_cs(require_confirmed_inputs_arg);
+       LDKOpenChannelV2 ret_var = OpenChannelV2_new(chain_hash_arg_ref, temporary_channel_id_arg_ref, funding_feerate_sat_per_1000_weight_arg, commitment_feerate_sat_per_1000_weight_arg, funding_satoshis_arg, dust_limit_satoshis_arg, max_htlc_value_in_flight_msat_arg, htlc_minimum_msat_arg, to_self_delay_arg, max_accepted_htlcs_arg, locktime_arg, funding_pubkey_arg_ref, revocation_basepoint_arg_ref, payment_basepoint_arg_ref, delayed_payment_basepoint_arg_ref, htlc_basepoint_arg_ref, first_per_commitment_point_arg_ref, second_per_commitment_point_arg_ref, channel_flags_arg, shutdown_scriptpubkey_arg_conv, channel_type_arg_conv, require_confirmed_inputs_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 OpenChannelV2_clone_ptr(LDKOpenChannelV2 *NONNULL_PTR arg) {
+       LDKOpenChannelV2 ret_var = OpenChannelV2_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_OpenChannelV2_clone_ptr(int64_t arg) {
+       LDKOpenChannelV2 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 = OpenChannelV2_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OpenChannelV2_clone(int64_t orig) {
+       LDKOpenChannelV2 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;
+       LDKOpenChannelV2 ret_var = OpenChannelV2_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_OpenChannelV2_eq(int64_t a, int64_t b) {
+       LDKOpenChannelV2 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;
+       LDKOpenChannelV2 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 = OpenChannelV2_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannel_free(int64_t this_obj) {
+       LDKAcceptChannel 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);
+       AcceptChannel_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_AcceptChannel_get_temporary_channel_id(int64_t this_ptr) {
+       LDKAcceptChannel 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, *AcceptChannel_get_temporary_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannel_set_temporary_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannel 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);
+       AcceptChannel_set_temporary_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_AcceptChannel_get_dust_limit_satoshis(int64_t this_ptr) {
+       LDKAcceptChannel 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 = AcceptChannel_get_dust_limit_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannel_set_dust_limit_satoshis(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannel 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;
+       AcceptChannel_set_dust_limit_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_AcceptChannel_get_max_htlc_value_in_flight_msat(int64_t this_ptr) {
+       LDKAcceptChannel 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 = AcceptChannel_get_max_htlc_value_in_flight_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannel_set_max_htlc_value_in_flight_msat(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannel 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;
+       AcceptChannel_set_max_htlc_value_in_flight_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_AcceptChannel_get_channel_reserve_satoshis(int64_t this_ptr) {
+       LDKAcceptChannel 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 = AcceptChannel_get_channel_reserve_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannel_set_channel_reserve_satoshis(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannel 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;
+       AcceptChannel_set_channel_reserve_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_AcceptChannel_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKAcceptChannel 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 = AcceptChannel_get_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannel_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannel 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;
+       AcceptChannel_set_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_AcceptChannel_get_minimum_depth(int64_t this_ptr) {
+       LDKAcceptChannel 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 = AcceptChannel_get_minimum_depth(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannel_set_minimum_depth(int64_t this_ptr, int32_t val) {
+       LDKAcceptChannel 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;
+       AcceptChannel_set_minimum_depth(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_AcceptChannel_get_to_self_delay(int64_t this_ptr) {
+       LDKAcceptChannel 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 = AcceptChannel_get_to_self_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannel_set_to_self_delay(int64_t this_ptr, int16_t val) {
+       LDKAcceptChannel 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;
+       AcceptChannel_set_to_self_delay(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_AcceptChannel_get_max_accepted_htlcs(int64_t this_ptr) {
+       LDKAcceptChannel 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 = AcceptChannel_get_max_accepted_htlcs(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannel_set_max_accepted_htlcs(int64_t this_ptr, int16_t val) {
+       LDKAcceptChannel 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;
+       AcceptChannel_set_max_accepted_htlcs(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_AcceptChannel_get_funding_pubkey(int64_t this_ptr) {
+       LDKAcceptChannel 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, AcceptChannel_get_funding_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannel_set_funding_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannel 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);
+       AcceptChannel_set_funding_pubkey(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannel_get_revocation_basepoint(int64_t this_ptr) {
+       LDKAcceptChannel 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, AcceptChannel_get_revocation_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannel_set_revocation_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannel 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);
+       AcceptChannel_set_revocation_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannel_get_payment_point(int64_t this_ptr) {
+       LDKAcceptChannel 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, AcceptChannel_get_payment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannel_set_payment_point(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannel 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);
+       AcceptChannel_set_payment_point(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannel_get_delayed_payment_basepoint(int64_t this_ptr) {
+       LDKAcceptChannel 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, AcceptChannel_get_delayed_payment_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannel_set_delayed_payment_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannel 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);
+       AcceptChannel_set_delayed_payment_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannel_get_htlc_basepoint(int64_t this_ptr) {
+       LDKAcceptChannel 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, AcceptChannel_get_htlc_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannel_set_htlc_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannel 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);
+       AcceptChannel_set_htlc_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannel_get_first_per_commitment_point(int64_t this_ptr) {
+       LDKAcceptChannel 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, AcceptChannel_get_first_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannel_set_first_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannel 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);
+       AcceptChannel_set_first_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_AcceptChannel_get_shutdown_scriptpubkey(int64_t this_ptr) {
+       LDKAcceptChannel 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_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = AcceptChannel_get_shutdown_scriptpubkey(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_AcceptChannel_set_shutdown_scriptpubkey(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannel 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_u8ZZ val_conv = *(LDKCOption_CVec_u8ZZ*)(val_ptr);
+       val_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(val));
+       AcceptChannel_set_shutdown_scriptpubkey(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_AcceptChannel_get_channel_type(int64_t this_ptr) {
+       LDKAcceptChannel 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;
+       LDKChannelTypeFeatures ret_var = AcceptChannel_get_channel_type(&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_AcceptChannel_set_channel_type(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannel 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;
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_clone(&val_conv);
+       AcceptChannel_set_channel_type(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_AcceptChannel_new(int8_tArray temporary_channel_id_arg, int64_t dust_limit_satoshis_arg, int64_t max_htlc_value_in_flight_msat_arg, int64_t channel_reserve_satoshis_arg, int64_t htlc_minimum_msat_arg, int32_t minimum_depth_arg, int16_t to_self_delay_arg, int16_t max_accepted_htlcs_arg, 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, int8_tArray first_per_commitment_point_arg, int64_t shutdown_scriptpubkey_arg, int64_t channel_type_arg) {
+       LDKThirtyTwoBytes temporary_channel_id_arg_ref;
+       CHECK(temporary_channel_id_arg->arr_len == 32);
+       memcpy(temporary_channel_id_arg_ref.data, temporary_channel_id_arg->elems, 32); FREE(temporary_channel_id_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);
+       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);
+       LDKPublicKey first_per_commitment_point_arg_ref;
+       CHECK(first_per_commitment_point_arg->arr_len == 33);
+       memcpy(first_per_commitment_point_arg_ref.compressed_form, first_per_commitment_point_arg->elems, 33); FREE(first_per_commitment_point_arg);
+       void* shutdown_scriptpubkey_arg_ptr = untag_ptr(shutdown_scriptpubkey_arg);
+       CHECK_ACCESS(shutdown_scriptpubkey_arg_ptr);
+       LDKCOption_CVec_u8ZZ shutdown_scriptpubkey_arg_conv = *(LDKCOption_CVec_u8ZZ*)(shutdown_scriptpubkey_arg_ptr);
+       shutdown_scriptpubkey_arg_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(shutdown_scriptpubkey_arg));
+       LDKChannelTypeFeatures channel_type_arg_conv;
+       channel_type_arg_conv.inner = untag_ptr(channel_type_arg);
+       channel_type_arg_conv.is_owned = ptr_is_owned(channel_type_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_arg_conv);
+       channel_type_arg_conv = ChannelTypeFeatures_clone(&channel_type_arg_conv);
+       LDKAcceptChannel ret_var = AcceptChannel_new(temporary_channel_id_arg_ref, dust_limit_satoshis_arg, max_htlc_value_in_flight_msat_arg, channel_reserve_satoshis_arg, htlc_minimum_msat_arg, minimum_depth_arg, to_self_delay_arg, max_accepted_htlcs_arg, funding_pubkey_arg_ref, revocation_basepoint_arg_ref, payment_point_arg_ref, delayed_payment_basepoint_arg_ref, htlc_basepoint_arg_ref, first_per_commitment_point_arg_ref, shutdown_scriptpubkey_arg_conv, channel_type_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 AcceptChannel_clone_ptr(LDKAcceptChannel *NONNULL_PTR arg) {
+       LDKAcceptChannel ret_var = AcceptChannel_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_AcceptChannel_clone_ptr(int64_t arg) {
+       LDKAcceptChannel 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 = AcceptChannel_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_AcceptChannel_clone(int64_t orig) {
+       LDKAcceptChannel 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;
+       LDKAcceptChannel ret_var = AcceptChannel_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_AcceptChannel_eq(int64_t a, int64_t b) {
+       LDKAcceptChannel 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;
+       LDKAcceptChannel 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 = AcceptChannel_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_free(int64_t this_obj) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_get_temporary_channel_id(int64_t this_ptr) {
+       LDKAcceptChannelV2 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, *AcceptChannelV2_get_temporary_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannelV2_set_temporary_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_set_temporary_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_AcceptChannelV2_get_funding_satoshis(int64_t this_ptr) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_get_funding_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_set_funding_satoshis(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannelV2 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;
+       AcceptChannelV2_set_funding_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_AcceptChannelV2_get_dust_limit_satoshis(int64_t this_ptr) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_get_dust_limit_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_set_dust_limit_satoshis(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannelV2 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;
+       AcceptChannelV2_set_dust_limit_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_AcceptChannelV2_get_max_htlc_value_in_flight_msat(int64_t this_ptr) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_get_max_htlc_value_in_flight_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_set_max_htlc_value_in_flight_msat(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannelV2 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;
+       AcceptChannelV2_set_max_htlc_value_in_flight_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_AcceptChannelV2_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_get_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannelV2 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;
+       AcceptChannelV2_set_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_AcceptChannelV2_get_minimum_depth(int64_t this_ptr) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_get_minimum_depth(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_set_minimum_depth(int64_t this_ptr, int32_t val) {
+       LDKAcceptChannelV2 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;
+       AcceptChannelV2_set_minimum_depth(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_AcceptChannelV2_get_to_self_delay(int64_t this_ptr) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_get_to_self_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_set_to_self_delay(int64_t this_ptr, int16_t val) {
+       LDKAcceptChannelV2 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;
+       AcceptChannelV2_set_to_self_delay(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_AcceptChannelV2_get_max_accepted_htlcs(int64_t this_ptr) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_get_max_accepted_htlcs(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_set_max_accepted_htlcs(int64_t this_ptr, int16_t val) {
+       LDKAcceptChannelV2 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;
+       AcceptChannelV2_set_max_accepted_htlcs(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_get_funding_pubkey(int64_t this_ptr) {
+       LDKAcceptChannelV2 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, AcceptChannelV2_get_funding_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannelV2_set_funding_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_set_funding_pubkey(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_get_revocation_basepoint(int64_t this_ptr) {
+       LDKAcceptChannelV2 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, AcceptChannelV2_get_revocation_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannelV2_set_revocation_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_set_revocation_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_get_payment_basepoint(int64_t this_ptr) {
+       LDKAcceptChannelV2 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, AcceptChannelV2_get_payment_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannelV2_set_payment_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_set_payment_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_get_delayed_payment_basepoint(int64_t this_ptr) {
+       LDKAcceptChannelV2 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, AcceptChannelV2_get_delayed_payment_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannelV2_set_delayed_payment_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_set_delayed_payment_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_get_htlc_basepoint(int64_t this_ptr) {
+       LDKAcceptChannelV2 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, AcceptChannelV2_get_htlc_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannelV2_set_htlc_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_set_htlc_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_get_first_per_commitment_point(int64_t this_ptr) {
+       LDKAcceptChannelV2 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, AcceptChannelV2_get_first_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannelV2_set_first_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_set_first_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_get_second_per_commitment_point(int64_t this_ptr) {
+       LDKAcceptChannelV2 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, AcceptChannelV2_get_second_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannelV2_set_second_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_set_second_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_AcceptChannelV2_get_shutdown_scriptpubkey(int64_t this_ptr) {
+       LDKAcceptChannelV2 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_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = AcceptChannelV2_get_shutdown_scriptpubkey(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_AcceptChannelV2_set_shutdown_scriptpubkey(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannelV2 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_u8ZZ val_conv = *(LDKCOption_CVec_u8ZZ*)(val_ptr);
+       val_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(val));
+       AcceptChannelV2_set_shutdown_scriptpubkey(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_AcceptChannelV2_get_channel_type(int64_t this_ptr) {
+       LDKAcceptChannelV2 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;
+       LDKChannelTypeFeatures ret_var = AcceptChannelV2_get_channel_type(&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_AcceptChannelV2_set_channel_type(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannelV2 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;
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_clone(&val_conv);
+       AcceptChannelV2_set_channel_type(&this_ptr_conv, val_conv);
+}
+
+int32_t  CS_LDK_AcceptChannelV2_get_require_confirmed_inputs(int64_t this_ptr) {
+       LDKAcceptChannelV2 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 = LDKCOption_NoneZ_to_cs(AcceptChannelV2_get_require_confirmed_inputs(&this_ptr_conv));
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_set_require_confirmed_inputs(int64_t this_ptr, int32_t val) {
+       LDKAcceptChannelV2 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_NoneZ val_conv = LDKCOption_NoneZ_from_cs(val);
+       AcceptChannelV2_set_require_confirmed_inputs(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_AcceptChannelV2_new(int8_tArray temporary_channel_id_arg, int64_t funding_satoshis_arg, int64_t dust_limit_satoshis_arg, int64_t max_htlc_value_in_flight_msat_arg, int64_t htlc_minimum_msat_arg, int32_t minimum_depth_arg, int16_t to_self_delay_arg, int16_t max_accepted_htlcs_arg, int8_tArray funding_pubkey_arg, int8_tArray revocation_basepoint_arg, int8_tArray payment_basepoint_arg, int8_tArray delayed_payment_basepoint_arg, int8_tArray htlc_basepoint_arg, int8_tArray first_per_commitment_point_arg, int8_tArray second_per_commitment_point_arg, int64_t shutdown_scriptpubkey_arg, int64_t channel_type_arg, int32_t require_confirmed_inputs_arg) {
+       LDKThirtyTwoBytes temporary_channel_id_arg_ref;
+       CHECK(temporary_channel_id_arg->arr_len == 32);
+       memcpy(temporary_channel_id_arg_ref.data, temporary_channel_id_arg->elems, 32); FREE(temporary_channel_id_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);
+       LDKPublicKey payment_basepoint_arg_ref;
+       CHECK(payment_basepoint_arg->arr_len == 33);
+       memcpy(payment_basepoint_arg_ref.compressed_form, payment_basepoint_arg->elems, 33); FREE(payment_basepoint_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);
+       LDKPublicKey first_per_commitment_point_arg_ref;
+       CHECK(first_per_commitment_point_arg->arr_len == 33);
+       memcpy(first_per_commitment_point_arg_ref.compressed_form, first_per_commitment_point_arg->elems, 33); FREE(first_per_commitment_point_arg);
+       LDKPublicKey second_per_commitment_point_arg_ref;
+       CHECK(second_per_commitment_point_arg->arr_len == 33);
+       memcpy(second_per_commitment_point_arg_ref.compressed_form, second_per_commitment_point_arg->elems, 33); FREE(second_per_commitment_point_arg);
+       void* shutdown_scriptpubkey_arg_ptr = untag_ptr(shutdown_scriptpubkey_arg);
+       CHECK_ACCESS(shutdown_scriptpubkey_arg_ptr);
+       LDKCOption_CVec_u8ZZ shutdown_scriptpubkey_arg_conv = *(LDKCOption_CVec_u8ZZ*)(shutdown_scriptpubkey_arg_ptr);
+       shutdown_scriptpubkey_arg_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(shutdown_scriptpubkey_arg));
+       LDKChannelTypeFeatures channel_type_arg_conv;
+       channel_type_arg_conv.inner = untag_ptr(channel_type_arg);
+       channel_type_arg_conv.is_owned = ptr_is_owned(channel_type_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_arg_conv);
+       channel_type_arg_conv = ChannelTypeFeatures_clone(&channel_type_arg_conv);
+       LDKCOption_NoneZ require_confirmed_inputs_arg_conv = LDKCOption_NoneZ_from_cs(require_confirmed_inputs_arg);
+       LDKAcceptChannelV2 ret_var = AcceptChannelV2_new(temporary_channel_id_arg_ref, funding_satoshis_arg, dust_limit_satoshis_arg, max_htlc_value_in_flight_msat_arg, htlc_minimum_msat_arg, minimum_depth_arg, to_self_delay_arg, max_accepted_htlcs_arg, funding_pubkey_arg_ref, revocation_basepoint_arg_ref, payment_basepoint_arg_ref, delayed_payment_basepoint_arg_ref, htlc_basepoint_arg_ref, first_per_commitment_point_arg_ref, second_per_commitment_point_arg_ref, shutdown_scriptpubkey_arg_conv, channel_type_arg_conv, require_confirmed_inputs_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 AcceptChannelV2_clone_ptr(LDKAcceptChannelV2 *NONNULL_PTR arg) {
+       LDKAcceptChannelV2 ret_var = AcceptChannelV2_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_AcceptChannelV2_clone_ptr(int64_t arg) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_AcceptChannelV2_clone(int64_t orig) {
+       LDKAcceptChannelV2 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;
+       LDKAcceptChannelV2 ret_var = AcceptChannelV2_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_AcceptChannelV2_eq(int64_t a, int64_t b) {
+       LDKAcceptChannelV2 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;
+       LDKAcceptChannelV2 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 = AcceptChannelV2_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_FundingCreated_free(int64_t this_obj) {
+       LDKFundingCreated 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);
+       FundingCreated_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_FundingCreated_get_temporary_channel_id(int64_t this_ptr) {
+       LDKFundingCreated 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, *FundingCreated_get_temporary_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_FundingCreated_set_temporary_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKFundingCreated 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);
+       FundingCreated_set_temporary_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_FundingCreated_get_funding_txid(int64_t this_ptr) {
+       LDKFundingCreated 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, *FundingCreated_get_funding_txid(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_FundingCreated_set_funding_txid(int64_t this_ptr, int8_tArray val) {
+       LDKFundingCreated 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);
+       FundingCreated_set_funding_txid(&this_ptr_conv, val_ref);
+}
+
+int16_t  CS_LDK_FundingCreated_get_funding_output_index(int64_t this_ptr) {
+       LDKFundingCreated 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 = FundingCreated_get_funding_output_index(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_FundingCreated_set_funding_output_index(int64_t this_ptr, int16_t val) {
+       LDKFundingCreated 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;
+       FundingCreated_set_funding_output_index(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_FundingCreated_get_signature(int64_t this_ptr) {
+       LDKFundingCreated 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(64, __LINE__);
+       memcpy(ret_arr->elems, FundingCreated_get_signature(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_FundingCreated_set_signature(int64_t this_ptr, int8_tArray val) {
+       LDKFundingCreated 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       FundingCreated_set_signature(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_FundingCreated_new(int8_tArray temporary_channel_id_arg, int8_tArray funding_txid_arg, int16_t funding_output_index_arg, int8_tArray signature_arg) {
+       LDKThirtyTwoBytes temporary_channel_id_arg_ref;
+       CHECK(temporary_channel_id_arg->arr_len == 32);
+       memcpy(temporary_channel_id_arg_ref.data, temporary_channel_id_arg->elems, 32); FREE(temporary_channel_id_arg);
+       LDKThirtyTwoBytes funding_txid_arg_ref;
+       CHECK(funding_txid_arg->arr_len == 32);
+       memcpy(funding_txid_arg_ref.data, funding_txid_arg->elems, 32); FREE(funding_txid_arg);
+       LDKECDSASignature signature_arg_ref;
+       CHECK(signature_arg->arr_len == 64);
+       memcpy(signature_arg_ref.compact_form, signature_arg->elems, 64); FREE(signature_arg);
+       LDKFundingCreated ret_var = FundingCreated_new(temporary_channel_id_arg_ref, funding_txid_arg_ref, funding_output_index_arg, signature_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 FundingCreated_clone_ptr(LDKFundingCreated *NONNULL_PTR arg) {
+       LDKFundingCreated ret_var = FundingCreated_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_FundingCreated_clone_ptr(int64_t arg) {
+       LDKFundingCreated 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 = FundingCreated_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_FundingCreated_clone(int64_t orig) {
+       LDKFundingCreated 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;
+       LDKFundingCreated ret_var = FundingCreated_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_FundingCreated_eq(int64_t a, int64_t b) {
+       LDKFundingCreated 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;
+       LDKFundingCreated 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 = FundingCreated_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_FundingSigned_free(int64_t this_obj) {
+       LDKFundingSigned 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);
+       FundingSigned_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_FundingSigned_get_channel_id(int64_t this_ptr) {
+       LDKFundingSigned 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, *FundingSigned_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_FundingSigned_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKFundingSigned 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);
+       FundingSigned_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_FundingSigned_get_signature(int64_t this_ptr) {
+       LDKFundingSigned 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(64, __LINE__);
+       memcpy(ret_arr->elems, FundingSigned_get_signature(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_FundingSigned_set_signature(int64_t this_ptr, int8_tArray val) {
+       LDKFundingSigned 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       FundingSigned_set_signature(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_FundingSigned_new(int8_tArray channel_id_arg, int8_tArray signature_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);
+       LDKECDSASignature signature_arg_ref;
+       CHECK(signature_arg->arr_len == 64);
+       memcpy(signature_arg_ref.compact_form, signature_arg->elems, 64); FREE(signature_arg);
+       LDKFundingSigned ret_var = FundingSigned_new(channel_id_arg_ref, signature_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 FundingSigned_clone_ptr(LDKFundingSigned *NONNULL_PTR arg) {
+       LDKFundingSigned ret_var = FundingSigned_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_FundingSigned_clone_ptr(int64_t arg) {
+       LDKFundingSigned 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 = FundingSigned_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_FundingSigned_clone(int64_t orig) {
+       LDKFundingSigned 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;
+       LDKFundingSigned ret_var = FundingSigned_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_FundingSigned_eq(int64_t a, int64_t b) {
+       LDKFundingSigned 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;
+       LDKFundingSigned 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 = FundingSigned_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelReady_free(int64_t this_obj) {
+       LDKChannelReady 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);
+       ChannelReady_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ChannelReady_get_channel_id(int64_t this_ptr) {
+       LDKChannelReady 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, *ChannelReady_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelReady_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKChannelReady 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);
+       ChannelReady_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_ChannelReady_get_next_per_commitment_point(int64_t this_ptr) {
+       LDKChannelReady 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, ChannelReady_get_next_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelReady_set_next_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKChannelReady 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);
+       ChannelReady_set_next_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelReady_get_short_channel_id_alias(int64_t this_ptr) {
+       LDKChannelReady 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 = ChannelReady_get_short_channel_id_alias(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelReady_set_short_channel_id_alias(int64_t this_ptr, int64_t val) {
+       LDKChannelReady 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));
+       ChannelReady_set_short_channel_id_alias(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelReady_new(int8_tArray channel_id_arg, int8_tArray next_per_commitment_point_arg, int64_t short_channel_id_alias_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);
+       LDKPublicKey next_per_commitment_point_arg_ref;
+       CHECK(next_per_commitment_point_arg->arr_len == 33);
+       memcpy(next_per_commitment_point_arg_ref.compressed_form, next_per_commitment_point_arg->elems, 33); FREE(next_per_commitment_point_arg);
+       void* short_channel_id_alias_arg_ptr = untag_ptr(short_channel_id_alias_arg);
+       CHECK_ACCESS(short_channel_id_alias_arg_ptr);
+       LDKCOption_u64Z short_channel_id_alias_arg_conv = *(LDKCOption_u64Z*)(short_channel_id_alias_arg_ptr);
+       short_channel_id_alias_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(short_channel_id_alias_arg));
+       LDKChannelReady ret_var = ChannelReady_new(channel_id_arg_ref, next_per_commitment_point_arg_ref, short_channel_id_alias_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 ChannelReady_clone_ptr(LDKChannelReady *NONNULL_PTR arg) {
+       LDKChannelReady ret_var = ChannelReady_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_ChannelReady_clone_ptr(int64_t arg) {
+       LDKChannelReady 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 = ChannelReady_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelReady_clone(int64_t orig) {
+       LDKChannelReady 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;
+       LDKChannelReady ret_var = ChannelReady_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_ChannelReady_eq(int64_t a, int64_t b) {
+       LDKChannelReady 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;
+       LDKChannelReady 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 = ChannelReady_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);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       TxAddInput_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxAddInput_get_channel_id(int64_t this_ptr) {
+       LDKTxAddInput 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, *TxAddInput_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxAddInput_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxAddInput 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);
+       TxAddInput_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_TxAddInput_get_serial_id(int64_t this_ptr) {
+       LDKTxAddInput 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 = TxAddInput_get_serial_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxAddInput_set_serial_id(int64_t this_ptr, int64_t val) {
+       LDKTxAddInput 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;
+       TxAddInput_set_serial_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_TxAddInput_get_prevtx(int64_t this_ptr) {
+       LDKTxAddInput 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;
+       LDKTransactionU16LenLimited ret_var = TxAddInput_get_prevtx(&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_TxAddInput_set_prevtx(int64_t this_ptr, int64_t val) {
+       LDKTxAddInput 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;
+       LDKTransactionU16LenLimited 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 = TransactionU16LenLimited_clone(&val_conv);
+       TxAddInput_set_prevtx(&this_ptr_conv, val_conv);
+}
+
+int32_t  CS_LDK_TxAddInput_get_prevtx_out(int64_t this_ptr) {
+       LDKTxAddInput 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 = TxAddInput_get_prevtx_out(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxAddInput_set_prevtx_out(int64_t this_ptr, int32_t val) {
+       LDKTxAddInput 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;
+       TxAddInput_set_prevtx_out(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_TxAddInput_get_sequence(int64_t this_ptr) {
+       LDKTxAddInput 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 = TxAddInput_get_sequence(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxAddInput_set_sequence(int64_t this_ptr, int32_t val) {
+       LDKTxAddInput 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;
+       TxAddInput_set_sequence(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_TxAddInput_new(int8_tArray channel_id_arg, int64_t serial_id_arg, int64_t prevtx_arg, int32_t prevtx_out_arg, int32_t sequence_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);
+       LDKTransactionU16LenLimited prevtx_arg_conv;
+       prevtx_arg_conv.inner = untag_ptr(prevtx_arg);
+       prevtx_arg_conv.is_owned = ptr_is_owned(prevtx_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(prevtx_arg_conv);
+       prevtx_arg_conv = TransactionU16LenLimited_clone(&prevtx_arg_conv);
+       LDKTxAddInput ret_var = TxAddInput_new(channel_id_arg_ref, serial_id_arg, prevtx_arg_conv, prevtx_out_arg, sequence_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 TxAddInput_clone_ptr(LDKTxAddInput *NONNULL_PTR arg) {
+       LDKTxAddInput ret_var = TxAddInput_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_TxAddInput_clone_ptr(int64_t arg) {
+       LDKTxAddInput 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 = TxAddInput_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxAddInput_clone(int64_t orig) {
+       LDKTxAddInput 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;
+       LDKTxAddInput ret_var = TxAddInput_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_TxAddInput_eq(int64_t a, int64_t b) {
+       LDKTxAddInput 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;
+       LDKTxAddInput 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 = TxAddInput_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxAddOutput_free(int64_t this_obj) {
+       LDKTxAddOutput 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);
+       TxAddOutput_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxAddOutput_get_channel_id(int64_t this_ptr) {
+       LDKTxAddOutput 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, *TxAddOutput_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxAddOutput_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxAddOutput 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);
+       TxAddOutput_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_TxAddOutput_get_serial_id(int64_t this_ptr) {
+       LDKTxAddOutput 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 = TxAddOutput_get_serial_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxAddOutput_set_serial_id(int64_t this_ptr, int64_t val) {
+       LDKTxAddOutput 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;
+       TxAddOutput_set_serial_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_TxAddOutput_get_sats(int64_t this_ptr) {
+       LDKTxAddOutput 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 = TxAddOutput_get_sats(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxAddOutput_set_sats(int64_t this_ptr, int64_t val) {
+       LDKTxAddOutput 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;
+       TxAddOutput_set_sats(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_TxAddOutput_get_script(int64_t this_ptr) {
+       LDKTxAddOutput 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;
+       LDKu8slice 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);
+       return ret_arr;
+}
+
+void  CS_LDK_TxAddOutput_set_script(int64_t this_ptr, int8_tArray val) {
+       LDKTxAddOutput 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);
+       TxAddOutput_set_script(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_TxAddOutput_new(int8_tArray channel_id_arg, int64_t serial_id_arg, int64_t sats_arg, int8_tArray script_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);
+       LDKCVec_u8Z script_arg_ref;
+       script_arg_ref.datalen = script_arg->arr_len;
+       script_arg_ref.data = MALLOC(script_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(script_arg_ref.data, script_arg->elems, script_arg_ref.datalen); FREE(script_arg);
+       LDKTxAddOutput ret_var = TxAddOutput_new(channel_id_arg_ref, serial_id_arg, sats_arg, script_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 TxAddOutput_clone_ptr(LDKTxAddOutput *NONNULL_PTR arg) {
+       LDKTxAddOutput ret_var = TxAddOutput_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_TxAddOutput_clone_ptr(int64_t arg) {
+       LDKTxAddOutput 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 = TxAddOutput_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxAddOutput_clone(int64_t orig) {
+       LDKTxAddOutput 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;
+       LDKTxAddOutput ret_var = TxAddOutput_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_TxAddOutput_eq(int64_t a, int64_t b) {
+       LDKTxAddOutput 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;
+       LDKTxAddOutput 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 = TxAddOutput_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxRemoveInput_free(int64_t this_obj) {
+       LDKTxRemoveInput 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);
+       TxRemoveInput_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxRemoveInput_get_channel_id(int64_t this_ptr) {
+       LDKTxRemoveInput 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, *TxRemoveInput_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxRemoveInput_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxRemoveInput 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);
+       TxRemoveInput_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_TxRemoveInput_get_serial_id(int64_t this_ptr) {
+       LDKTxRemoveInput 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 = TxRemoveInput_get_serial_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxRemoveInput_set_serial_id(int64_t this_ptr, int64_t val) {
+       LDKTxRemoveInput 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;
+       TxRemoveInput_set_serial_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_TxRemoveInput_new(int8_tArray channel_id_arg, int64_t serial_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);
+       LDKTxRemoveInput ret_var = TxRemoveInput_new(channel_id_arg_ref, serial_id_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 TxRemoveInput_clone_ptr(LDKTxRemoveInput *NONNULL_PTR arg) {
+       LDKTxRemoveInput ret_var = TxRemoveInput_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_TxRemoveInput_clone_ptr(int64_t arg) {
+       LDKTxRemoveInput 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 = TxRemoveInput_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxRemoveInput_clone(int64_t orig) {
+       LDKTxRemoveInput 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;
+       LDKTxRemoveInput ret_var = TxRemoveInput_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_TxRemoveInput_eq(int64_t a, int64_t b) {
+       LDKTxRemoveInput 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;
+       LDKTxRemoveInput 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 = TxRemoveInput_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxRemoveOutput_free(int64_t this_obj) {
+       LDKTxRemoveOutput 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);
+       TxRemoveOutput_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxRemoveOutput_get_channel_id(int64_t this_ptr) {
+       LDKTxRemoveOutput 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, *TxRemoveOutput_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxRemoveOutput_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxRemoveOutput 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);
+       TxRemoveOutput_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_TxRemoveOutput_get_serial_id(int64_t this_ptr) {
+       LDKTxRemoveOutput 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 = TxRemoveOutput_get_serial_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxRemoveOutput_set_serial_id(int64_t this_ptr, int64_t val) {
+       LDKTxRemoveOutput 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;
+       TxRemoveOutput_set_serial_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_TxRemoveOutput_new(int8_tArray channel_id_arg, int64_t serial_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);
+       LDKTxRemoveOutput ret_var = TxRemoveOutput_new(channel_id_arg_ref, serial_id_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 TxRemoveOutput_clone_ptr(LDKTxRemoveOutput *NONNULL_PTR arg) {
+       LDKTxRemoveOutput ret_var = TxRemoveOutput_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_TxRemoveOutput_clone_ptr(int64_t arg) {
+       LDKTxRemoveOutput 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 = TxRemoveOutput_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxRemoveOutput_clone(int64_t orig) {
+       LDKTxRemoveOutput 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;
+       LDKTxRemoveOutput ret_var = TxRemoveOutput_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_TxRemoveOutput_eq(int64_t a, int64_t b) {
+       LDKTxRemoveOutput 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;
+       LDKTxRemoveOutput 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 = TxRemoveOutput_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxComplete_free(int64_t this_obj) {
+       LDKTxComplete 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);
+       TxComplete_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxComplete_get_channel_id(int64_t this_ptr) {
+       LDKTxComplete 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, *TxComplete_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxComplete_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxComplete 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);
+       TxComplete_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_TxComplete_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);
+       LDKTxComplete ret_var = TxComplete_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 TxComplete_clone_ptr(LDKTxComplete *NONNULL_PTR arg) {
+       LDKTxComplete ret_var = TxComplete_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_TxComplete_clone_ptr(int64_t arg) {
+       LDKTxComplete 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 = TxComplete_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxComplete_clone(int64_t orig) {
+       LDKTxComplete 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;
+       LDKTxComplete ret_var = TxComplete_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_TxComplete_eq(int64_t a, int64_t b) {
+       LDKTxComplete 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;
+       LDKTxComplete 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 = TxComplete_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxSignatures_free(int64_t this_obj) {
+       LDKTxSignatures 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);
+       TxSignatures_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxSignatures_get_channel_id(int64_t this_ptr) {
+       LDKTxSignatures 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, *TxSignatures_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxSignatures_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxSignatures 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);
+       TxSignatures_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_TxSignatures_get_tx_hash(int64_t this_ptr) {
+       LDKTxSignatures 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, *TxSignatures_get_tx_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxSignatures_set_tx_hash(int64_t this_ptr, int8_tArray val) {
+       LDKTxSignatures 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);
+       TxSignatures_set_tx_hash(&this_ptr_conv, val_ref);
+}
+
+ptrArray  CS_LDK_TxSignatures_get_witnesses(int64_t this_ptr) {
+       LDKTxSignatures 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_WitnessZ ret_var = TxSignatures_get_witnesses(&this_ptr_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++) {
+               LDKWitness 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);
+               Witness_free(ret_conv_8_var);
+               ret_arr_ptr[i] = ret_conv_8_arr;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_TxSignatures_set_witnesses(int64_t this_ptr, ptrArray val) {
+       LDKTxSignatures 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_WitnessZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKWitness), "LDKCVec_WitnessZ Elements");
+       else
+               val_constr.data = NULL;
+       int8_tArray* val_vals = (void*) val->elems;
+       for (size_t i = 0; i < val_constr.datalen; i++) {
+               int8_tArray val_conv_8 = val_vals[i];
+               LDKWitness val_conv_8_ref;
+               val_conv_8_ref.datalen = val_conv_8->arr_len;
+               val_conv_8_ref.data = MALLOC(val_conv_8_ref.datalen, "LDKWitness Bytes");
+               memcpy(val_conv_8_ref.data, val_conv_8->elems, val_conv_8_ref.datalen); FREE(val_conv_8);
+               val_conv_8_ref.data_is_owned = true;
+               val_constr.data[i] = val_conv_8_ref;
+       }
+       FREE(val);
+       TxSignatures_set_witnesses(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_TxSignatures_new(int8_tArray channel_id_arg, int8_tArray tx_hash_arg, ptrArray witnesses_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 tx_hash_arg_ref;
+       CHECK(tx_hash_arg->arr_len == 32);
+       memcpy(tx_hash_arg_ref.data, tx_hash_arg->elems, 32); FREE(tx_hash_arg);
+       LDKCVec_WitnessZ witnesses_arg_constr;
+       witnesses_arg_constr.datalen = witnesses_arg->arr_len;
+       if (witnesses_arg_constr.datalen > 0)
+               witnesses_arg_constr.data = MALLOC(witnesses_arg_constr.datalen * sizeof(LDKWitness), "LDKCVec_WitnessZ Elements");
+       else
+               witnesses_arg_constr.data = NULL;
+       int8_tArray* witnesses_arg_vals = (void*) witnesses_arg->elems;
+       for (size_t i = 0; i < witnesses_arg_constr.datalen; i++) {
+               int8_tArray witnesses_arg_conv_8 = witnesses_arg_vals[i];
+               LDKWitness witnesses_arg_conv_8_ref;
+               witnesses_arg_conv_8_ref.datalen = witnesses_arg_conv_8->arr_len;
+               witnesses_arg_conv_8_ref.data = MALLOC(witnesses_arg_conv_8_ref.datalen, "LDKWitness Bytes");
+               memcpy(witnesses_arg_conv_8_ref.data, witnesses_arg_conv_8->elems, witnesses_arg_conv_8_ref.datalen); FREE(witnesses_arg_conv_8);
+               witnesses_arg_conv_8_ref.data_is_owned = true;
+               witnesses_arg_constr.data[i] = witnesses_arg_conv_8_ref;
+       }
+       FREE(witnesses_arg);
+       LDKTxSignatures ret_var = TxSignatures_new(channel_id_arg_ref, tx_hash_arg_ref, witnesses_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);
+       return ret_ref;
+}
+
+static inline uint64_t TxSignatures_clone_ptr(LDKTxSignatures *NONNULL_PTR arg) {
+       LDKTxSignatures ret_var = TxSignatures_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_TxSignatures_clone_ptr(int64_t arg) {
+       LDKTxSignatures 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 = TxSignatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxSignatures_clone(int64_t orig) {
+       LDKTxSignatures 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;
+       LDKTxSignatures ret_var = TxSignatures_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_TxSignatures_eq(int64_t a, int64_t b) {
+       LDKTxSignatures 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;
+       LDKTxSignatures 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 = TxSignatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxInitRbf_free(int64_t this_obj) {
+       LDKTxInitRbf 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);
+       TxInitRbf_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxInitRbf_get_channel_id(int64_t this_ptr) {
+       LDKTxInitRbf 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, *TxInitRbf_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxInitRbf_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxInitRbf 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);
+       TxInitRbf_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_TxInitRbf_get_locktime(int64_t this_ptr) {
+       LDKTxInitRbf 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 = TxInitRbf_get_locktime(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxInitRbf_set_locktime(int64_t this_ptr, int32_t val) {
+       LDKTxInitRbf 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;
+       TxInitRbf_set_locktime(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_TxInitRbf_get_feerate_sat_per_1000_weight(int64_t this_ptr) {
+       LDKTxInitRbf 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 = TxInitRbf_get_feerate_sat_per_1000_weight(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxInitRbf_set_feerate_sat_per_1000_weight(int64_t this_ptr, int32_t val) {
+       LDKTxInitRbf 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;
+       TxInitRbf_set_feerate_sat_per_1000_weight(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_TxInitRbf_get_funding_output_contribution(int64_t this_ptr) {
+       LDKTxInitRbf 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_i64Z *ret_copy = MALLOC(sizeof(LDKCOption_i64Z), "LDKCOption_i64Z");
+       *ret_copy = TxInitRbf_get_funding_output_contribution(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_TxInitRbf_set_funding_output_contribution(int64_t this_ptr, int64_t val) {
+       LDKTxInitRbf 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_i64Z val_conv = *(LDKCOption_i64Z*)(val_ptr);
+       val_conv = COption_i64Z_clone((LDKCOption_i64Z*)untag_ptr(val));
+       TxInitRbf_set_funding_output_contribution(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_TxInitRbf_new(int8_tArray channel_id_arg, int32_t locktime_arg, int32_t feerate_sat_per_1000_weight_arg, int64_t funding_output_contribution_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);
+       void* funding_output_contribution_arg_ptr = untag_ptr(funding_output_contribution_arg);
+       CHECK_ACCESS(funding_output_contribution_arg_ptr);
+       LDKCOption_i64Z funding_output_contribution_arg_conv = *(LDKCOption_i64Z*)(funding_output_contribution_arg_ptr);
+       funding_output_contribution_arg_conv = COption_i64Z_clone((LDKCOption_i64Z*)untag_ptr(funding_output_contribution_arg));
+       LDKTxInitRbf ret_var = TxInitRbf_new(channel_id_arg_ref, locktime_arg, feerate_sat_per_1000_weight_arg, funding_output_contribution_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 TxInitRbf_clone_ptr(LDKTxInitRbf *NONNULL_PTR arg) {
+       LDKTxInitRbf ret_var = TxInitRbf_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_TxInitRbf_clone_ptr(int64_t arg) {
+       LDKTxInitRbf 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 = TxInitRbf_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxInitRbf_clone(int64_t orig) {
+       LDKTxInitRbf 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;
+       LDKTxInitRbf ret_var = TxInitRbf_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_TxInitRbf_eq(int64_t a, int64_t b) {
+       LDKTxInitRbf 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;
+       LDKTxInitRbf 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 = TxInitRbf_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxAckRbf_free(int64_t this_obj) {
+       LDKTxAckRbf 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);
+       TxAckRbf_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxAckRbf_get_channel_id(int64_t this_ptr) {
+       LDKTxAckRbf 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, *TxAckRbf_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxAckRbf_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxAckRbf 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);
+       TxAckRbf_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_TxAckRbf_get_funding_output_contribution(int64_t this_ptr) {
+       LDKTxAckRbf 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_i64Z *ret_copy = MALLOC(sizeof(LDKCOption_i64Z), "LDKCOption_i64Z");
+       *ret_copy = TxAckRbf_get_funding_output_contribution(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_TxAckRbf_set_funding_output_contribution(int64_t this_ptr, int64_t val) {
+       LDKTxAckRbf 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_i64Z val_conv = *(LDKCOption_i64Z*)(val_ptr);
+       val_conv = COption_i64Z_clone((LDKCOption_i64Z*)untag_ptr(val));
+       TxAckRbf_set_funding_output_contribution(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_TxAckRbf_new(int8_tArray channel_id_arg, int64_t funding_output_contribution_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);
+       void* funding_output_contribution_arg_ptr = untag_ptr(funding_output_contribution_arg);
+       CHECK_ACCESS(funding_output_contribution_arg_ptr);
+       LDKCOption_i64Z funding_output_contribution_arg_conv = *(LDKCOption_i64Z*)(funding_output_contribution_arg_ptr);
+       funding_output_contribution_arg_conv = COption_i64Z_clone((LDKCOption_i64Z*)untag_ptr(funding_output_contribution_arg));
+       LDKTxAckRbf ret_var = TxAckRbf_new(channel_id_arg_ref, funding_output_contribution_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 TxAckRbf_clone_ptr(LDKTxAckRbf *NONNULL_PTR arg) {
+       LDKTxAckRbf ret_var = TxAckRbf_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_TxAckRbf_clone_ptr(int64_t arg) {
+       LDKTxAckRbf 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 = TxAckRbf_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxAckRbf_clone(int64_t orig) {
+       LDKTxAckRbf 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;
+       LDKTxAckRbf ret_var = TxAckRbf_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_TxAckRbf_eq(int64_t a, int64_t b) {
+       LDKTxAckRbf 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;
+       LDKTxAckRbf 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 = TxAckRbf_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxAbort_free(int64_t this_obj) {
+       LDKTxAbort 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);
+       TxAbort_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxAbort_get_channel_id(int64_t this_ptr) {
+       LDKTxAbort 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, *TxAbort_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxAbort_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxAbort 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);
+       TxAbort_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_TxAbort_get_data(int64_t this_ptr) {
+       LDKTxAbort 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 = TxAbort_get_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_TxAbort_set_data(int64_t this_ptr, int8_tArray val) {
+       LDKTxAbort 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);
+       TxAbort_set_data(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_TxAbort_new(int8_tArray channel_id_arg, int8_tArray data_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);
+       LDKCVec_u8Z data_arg_ref;
+       data_arg_ref.datalen = data_arg->arr_len;
+       data_arg_ref.data = MALLOC(data_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(data_arg_ref.data, data_arg->elems, data_arg_ref.datalen); FREE(data_arg);
+       LDKTxAbort ret_var = TxAbort_new(channel_id_arg_ref, data_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 TxAbort_clone_ptr(LDKTxAbort *NONNULL_PTR arg) {
+       LDKTxAbort ret_var = TxAbort_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_TxAbort_clone_ptr(int64_t arg) {
+       LDKTxAbort 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 = TxAbort_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxAbort_clone(int64_t orig) {
+       LDKTxAbort 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;
+       LDKTxAbort ret_var = TxAbort_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_TxAbort_eq(int64_t a, int64_t b) {
+       LDKTxAbort 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;
+       LDKTxAbort 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 = TxAbort_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Shutdown_free(int64_t this_obj) {
+       LDKShutdown 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);
+       Shutdown_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_Shutdown_get_channel_id(int64_t this_ptr) {
+       LDKShutdown 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, *Shutdown_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_Shutdown_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKShutdown 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);
+       Shutdown_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_Shutdown_get_scriptpubkey(int64_t this_ptr) {
+       LDKShutdown 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;
+       LDKu8slice 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);
+       return ret_arr;
+}
+
+void  CS_LDK_Shutdown_set_scriptpubkey(int64_t this_ptr, int8_tArray val) {
+       LDKShutdown 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);
+       Shutdown_set_scriptpubkey(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_Shutdown_new(int8_tArray channel_id_arg, int8_tArray scriptpubkey_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);
+       LDKCVec_u8Z scriptpubkey_arg_ref;
+       scriptpubkey_arg_ref.datalen = scriptpubkey_arg->arr_len;
+       scriptpubkey_arg_ref.data = MALLOC(scriptpubkey_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(scriptpubkey_arg_ref.data, scriptpubkey_arg->elems, scriptpubkey_arg_ref.datalen); FREE(scriptpubkey_arg);
+       LDKShutdown ret_var = Shutdown_new(channel_id_arg_ref, scriptpubkey_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 Shutdown_clone_ptr(LDKShutdown *NONNULL_PTR arg) {
+       LDKShutdown ret_var = Shutdown_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_Shutdown_clone_ptr(int64_t arg) {
+       LDKShutdown 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 = Shutdown_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Shutdown_clone(int64_t orig) {
+       LDKShutdown 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;
+       LDKShutdown ret_var = Shutdown_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_Shutdown_eq(int64_t a, int64_t b) {
+       LDKShutdown 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;
+       LDKShutdown 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 = Shutdown_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ClosingSignedFeeRange_free(int64_t this_obj) {
+       LDKClosingSignedFeeRange 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);
+       ClosingSignedFeeRange_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ClosingSignedFeeRange_get_min_fee_satoshis(int64_t this_ptr) {
+       LDKClosingSignedFeeRange 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 = ClosingSignedFeeRange_get_min_fee_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ClosingSignedFeeRange_set_min_fee_satoshis(int64_t this_ptr, int64_t val) {
+       LDKClosingSignedFeeRange 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;
+       ClosingSignedFeeRange_set_min_fee_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ClosingSignedFeeRange_get_max_fee_satoshis(int64_t this_ptr) {
+       LDKClosingSignedFeeRange 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 = ClosingSignedFeeRange_get_max_fee_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ClosingSignedFeeRange_set_max_fee_satoshis(int64_t this_ptr, int64_t val) {
+       LDKClosingSignedFeeRange 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;
+       ClosingSignedFeeRange_set_max_fee_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ClosingSignedFeeRange_new(int64_t min_fee_satoshis_arg, int64_t max_fee_satoshis_arg) {
+       LDKClosingSignedFeeRange ret_var = ClosingSignedFeeRange_new(min_fee_satoshis_arg, max_fee_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);
+       return ret_ref;
+}
+
+static inline uint64_t ClosingSignedFeeRange_clone_ptr(LDKClosingSignedFeeRange *NONNULL_PTR arg) {
+       LDKClosingSignedFeeRange ret_var = ClosingSignedFeeRange_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_ClosingSignedFeeRange_clone_ptr(int64_t arg) {
+       LDKClosingSignedFeeRange 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 = ClosingSignedFeeRange_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ClosingSignedFeeRange_clone(int64_t orig) {
+       LDKClosingSignedFeeRange 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;
+       LDKClosingSignedFeeRange ret_var = ClosingSignedFeeRange_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_ClosingSignedFeeRange_eq(int64_t a, int64_t b) {
+       LDKClosingSignedFeeRange 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;
+       LDKClosingSignedFeeRange 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 = ClosingSignedFeeRange_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ClosingSigned_free(int64_t this_obj) {
+       LDKClosingSigned 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);
+       ClosingSigned_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ClosingSigned_get_channel_id(int64_t this_ptr) {
+       LDKClosingSigned 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, *ClosingSigned_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ClosingSigned_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKClosingSigned 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);
+       ClosingSigned_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ClosingSigned_get_fee_satoshis(int64_t this_ptr) {
+       LDKClosingSigned 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 = ClosingSigned_get_fee_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ClosingSigned_set_fee_satoshis(int64_t this_ptr, int64_t val) {
+       LDKClosingSigned 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;
+       ClosingSigned_set_fee_satoshis(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_ClosingSigned_get_signature(int64_t this_ptr) {
+       LDKClosingSigned 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(64, __LINE__);
+       memcpy(ret_arr->elems, ClosingSigned_get_signature(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_ClosingSigned_set_signature(int64_t this_ptr, int8_tArray val) {
+       LDKClosingSigned 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       ClosingSigned_set_signature(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ClosingSigned_get_fee_range(int64_t this_ptr) {
+       LDKClosingSigned 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;
+       LDKClosingSignedFeeRange ret_var = ClosingSigned_get_fee_range(&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_ClosingSigned_set_fee_range(int64_t this_ptr, int64_t val) {
+       LDKClosingSigned 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;
+       LDKClosingSignedFeeRange 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 = ClosingSignedFeeRange_clone(&val_conv);
+       ClosingSigned_set_fee_range(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ClosingSigned_new(int8_tArray channel_id_arg, int64_t fee_satoshis_arg, int8_tArray signature_arg, int64_t fee_range_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);
+       LDKECDSASignature signature_arg_ref;
+       CHECK(signature_arg->arr_len == 64);
+       memcpy(signature_arg_ref.compact_form, signature_arg->elems, 64); FREE(signature_arg);
+       LDKClosingSignedFeeRange fee_range_arg_conv;
+       fee_range_arg_conv.inner = untag_ptr(fee_range_arg);
+       fee_range_arg_conv.is_owned = ptr_is_owned(fee_range_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(fee_range_arg_conv);
+       fee_range_arg_conv = ClosingSignedFeeRange_clone(&fee_range_arg_conv);
+       LDKClosingSigned ret_var = ClosingSigned_new(channel_id_arg_ref, fee_satoshis_arg, signature_arg_ref, fee_range_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 ClosingSigned_clone_ptr(LDKClosingSigned *NONNULL_PTR arg) {
+       LDKClosingSigned ret_var = ClosingSigned_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_ClosingSigned_clone_ptr(int64_t arg) {
+       LDKClosingSigned 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 = ClosingSigned_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ClosingSigned_clone(int64_t orig) {
+       LDKClosingSigned 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;
+       LDKClosingSigned ret_var = ClosingSigned_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_ClosingSigned_eq(int64_t a, int64_t b) {
+       LDKClosingSigned 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;
+       LDKClosingSigned 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 = ClosingSigned_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateAddHTLC_free(int64_t this_obj) {
+       LDKUpdateAddHTLC 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);
+       UpdateAddHTLC_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_UpdateAddHTLC_get_channel_id(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(32, __LINE__);
+       memcpy(ret_arr->elems, *UpdateAddHTLC_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UpdateAddHTLC_set_channel_id(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;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       UpdateAddHTLC_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UpdateAddHTLC_get_htlc_id(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;
+       int64_t ret_conv = UpdateAddHTLC_get_htlc_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateAddHTLC_set_htlc_id(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;
+       UpdateAddHTLC_set_htlc_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_UpdateAddHTLC_get_amount_msat(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;
+       int64_t ret_conv = UpdateAddHTLC_get_amount_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateAddHTLC_set_amount_msat(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;
+       UpdateAddHTLC_set_amount_msat(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_UpdateAddHTLC_get_payment_hash(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(32, __LINE__);
+       memcpy(ret_arr->elems, *UpdateAddHTLC_get_payment_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UpdateAddHTLC_set_payment_hash(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;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       UpdateAddHTLC_set_payment_hash(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_UpdateAddHTLC_get_cltv_expiry(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;
+       int32_t ret_conv = UpdateAddHTLC_get_cltv_expiry(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateAddHTLC_set_cltv_expiry(int64_t this_ptr, int32_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;
+       UpdateAddHTLC_set_cltv_expiry(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_UpdateAddHTLC_get_skimmed_fee_msat(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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = UpdateAddHTLC_get_skimmed_fee_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_UpdateAddHTLC_set_skimmed_fee_msat(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;
+       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));
+       UpdateAddHTLC_set_skimmed_fee_msat(&this_ptr_conv, val_conv);
+}
+
+static inline uint64_t UpdateAddHTLC_clone_ptr(LDKUpdateAddHTLC *NONNULL_PTR arg) {
+       LDKUpdateAddHTLC ret_var = UpdateAddHTLC_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_UpdateAddHTLC_clone_ptr(int64_t arg) {
+       LDKUpdateAddHTLC 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 = UpdateAddHTLC_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UpdateAddHTLC_clone(int64_t orig) {
+       LDKUpdateAddHTLC 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;
+       LDKUpdateAddHTLC ret_var = UpdateAddHTLC_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_UpdateAddHTLC_eq(int64_t a, int64_t b) {
+       LDKUpdateAddHTLC 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;
+       LDKUpdateAddHTLC 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 = UpdateAddHTLC_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OnionMessage_free(int64_t this_obj) {
+       LDKOnionMessage 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);
+       OnionMessage_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_OnionMessage_get_blinding_point(int64_t this_ptr) {
+       LDKOnionMessage 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, OnionMessage_get_blinding_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OnionMessage_set_blinding_point(int64_t this_ptr, int8_tArray val) {
+       LDKOnionMessage 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);
+       OnionMessage_set_blinding_point(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_OnionMessage_get_onion_routing_packet(int64_t this_ptr) {
+       LDKOnionMessage 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;
+       LDKPacket ret_var = OnionMessage_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_OnionMessage_set_onion_routing_packet(int64_t this_ptr, int64_t val) {
+       LDKOnionMessage 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;
+       LDKPacket 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 = Packet_clone(&val_conv);
+       OnionMessage_set_onion_routing_packet(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_OnionMessage_new(int8_tArray blinding_point_arg, int64_t onion_routing_packet_arg) {
+       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);
+       LDKPacket 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 = Packet_clone(&onion_routing_packet_arg_conv);
+       LDKOnionMessage ret_var = OnionMessage_new(blinding_point_arg_ref, onion_routing_packet_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 OnionMessage_clone_ptr(LDKOnionMessage *NONNULL_PTR arg) {
+       LDKOnionMessage ret_var = OnionMessage_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_OnionMessage_clone_ptr(int64_t arg) {
+       LDKOnionMessage 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 = OnionMessage_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OnionMessage_clone(int64_t orig) {
+       LDKOnionMessage 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;
+       LDKOnionMessage ret_var = OnionMessage_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_OnionMessage_eq(int64_t a, int64_t b) {
+       LDKOnionMessage 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;
+       LDKOnionMessage 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 = OnionMessage_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFulfillHTLC_free(int64_t this_obj) {
+       LDKUpdateFulfillHTLC 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);
+       UpdateFulfillHTLC_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_UpdateFulfillHTLC_get_channel_id(int64_t this_ptr) {
+       LDKUpdateFulfillHTLC 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, *UpdateFulfillHTLC_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UpdateFulfillHTLC_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKUpdateFulfillHTLC 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);
+       UpdateFulfillHTLC_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UpdateFulfillHTLC_get_htlc_id(int64_t this_ptr) {
+       LDKUpdateFulfillHTLC 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 = UpdateFulfillHTLC_get_htlc_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFulfillHTLC_set_htlc_id(int64_t this_ptr, int64_t val) {
+       LDKUpdateFulfillHTLC 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;
+       UpdateFulfillHTLC_set_htlc_id(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_UpdateFulfillHTLC_get_payment_preimage(int64_t this_ptr) {
+       LDKUpdateFulfillHTLC 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, *UpdateFulfillHTLC_get_payment_preimage(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UpdateFulfillHTLC_set_payment_preimage(int64_t this_ptr, int8_tArray val) {
+       LDKUpdateFulfillHTLC 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);
+       UpdateFulfillHTLC_set_payment_preimage(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UpdateFulfillHTLC_new(int8_tArray channel_id_arg, int64_t htlc_id_arg, int8_tArray payment_preimage_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_preimage_arg_ref;
+       CHECK(payment_preimage_arg->arr_len == 32);
+       memcpy(payment_preimage_arg_ref.data, payment_preimage_arg->elems, 32); FREE(payment_preimage_arg);
+       LDKUpdateFulfillHTLC ret_var = UpdateFulfillHTLC_new(channel_id_arg_ref, htlc_id_arg, payment_preimage_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 UpdateFulfillHTLC_clone_ptr(LDKUpdateFulfillHTLC *NONNULL_PTR arg) {
+       LDKUpdateFulfillHTLC ret_var = UpdateFulfillHTLC_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_UpdateFulfillHTLC_clone_ptr(int64_t arg) {
+       LDKUpdateFulfillHTLC 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 = UpdateFulfillHTLC_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UpdateFulfillHTLC_clone(int64_t orig) {
+       LDKUpdateFulfillHTLC 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;
+       LDKUpdateFulfillHTLC ret_var = UpdateFulfillHTLC_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_UpdateFulfillHTLC_eq(int64_t a, int64_t b) {
+       LDKUpdateFulfillHTLC 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;
+       LDKUpdateFulfillHTLC 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 = UpdateFulfillHTLC_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFailHTLC_free(int64_t this_obj) {
+       LDKUpdateFailHTLC 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);
+       UpdateFailHTLC_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_UpdateFailHTLC_get_channel_id(int64_t this_ptr) {
+       LDKUpdateFailHTLC 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, *UpdateFailHTLC_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UpdateFailHTLC_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKUpdateFailHTLC 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);
+       UpdateFailHTLC_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UpdateFailHTLC_get_htlc_id(int64_t this_ptr) {
+       LDKUpdateFailHTLC 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 = UpdateFailHTLC_get_htlc_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFailHTLC_set_htlc_id(int64_t this_ptr, int64_t val) {
+       LDKUpdateFailHTLC 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;
+       UpdateFailHTLC_set_htlc_id(&this_ptr_conv, val);
+}
+
+static inline uint64_t UpdateFailHTLC_clone_ptr(LDKUpdateFailHTLC *NONNULL_PTR arg) {
+       LDKUpdateFailHTLC ret_var = UpdateFailHTLC_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_UpdateFailHTLC_clone_ptr(int64_t arg) {
+       LDKUpdateFailHTLC 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 = UpdateFailHTLC_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UpdateFailHTLC_clone(int64_t orig) {
+       LDKUpdateFailHTLC 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;
+       LDKUpdateFailHTLC ret_var = UpdateFailHTLC_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_UpdateFailHTLC_eq(int64_t a, int64_t b) {
+       LDKUpdateFailHTLC 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;
+       LDKUpdateFailHTLC 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 = UpdateFailHTLC_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFailMalformedHTLC_free(int64_t this_obj) {
+       LDKUpdateFailMalformedHTLC 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);
+       UpdateFailMalformedHTLC_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_UpdateFailMalformedHTLC_get_channel_id(int64_t this_ptr) {
+       LDKUpdateFailMalformedHTLC 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, *UpdateFailMalformedHTLC_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UpdateFailMalformedHTLC_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKUpdateFailMalformedHTLC 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);
+       UpdateFailMalformedHTLC_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UpdateFailMalformedHTLC_get_htlc_id(int64_t this_ptr) {
+       LDKUpdateFailMalformedHTLC 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 = UpdateFailMalformedHTLC_get_htlc_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFailMalformedHTLC_set_htlc_id(int64_t this_ptr, int64_t val) {
+       LDKUpdateFailMalformedHTLC 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;
+       UpdateFailMalformedHTLC_set_htlc_id(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_UpdateFailMalformedHTLC_get_failure_code(int64_t this_ptr) {
+       LDKUpdateFailMalformedHTLC 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 = UpdateFailMalformedHTLC_get_failure_code(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFailMalformedHTLC_set_failure_code(int64_t this_ptr, int16_t val) {
+       LDKUpdateFailMalformedHTLC 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;
+       UpdateFailMalformedHTLC_set_failure_code(&this_ptr_conv, val);
+}
+
+static inline uint64_t UpdateFailMalformedHTLC_clone_ptr(LDKUpdateFailMalformedHTLC *NONNULL_PTR arg) {
+       LDKUpdateFailMalformedHTLC ret_var = UpdateFailMalformedHTLC_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_UpdateFailMalformedHTLC_clone_ptr(int64_t arg) {
+       LDKUpdateFailMalformedHTLC 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 = UpdateFailMalformedHTLC_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UpdateFailMalformedHTLC_clone(int64_t orig) {
+       LDKUpdateFailMalformedHTLC 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;
+       LDKUpdateFailMalformedHTLC ret_var = UpdateFailMalformedHTLC_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_UpdateFailMalformedHTLC_eq(int64_t a, int64_t b) {
+       LDKUpdateFailMalformedHTLC 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;
+       LDKUpdateFailMalformedHTLC 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 = UpdateFailMalformedHTLC_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CommitmentSigned_free(int64_t this_obj) {
+       LDKCommitmentSigned 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);
+       CommitmentSigned_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_CommitmentSigned_get_channel_id(int64_t this_ptr) {
+       LDKCommitmentSigned 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, *CommitmentSigned_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_CommitmentSigned_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKCommitmentSigned 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);
+       CommitmentSigned_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_CommitmentSigned_get_signature(int64_t this_ptr) {
+       LDKCommitmentSigned 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(64, __LINE__);
+       memcpy(ret_arr->elems, CommitmentSigned_get_signature(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_CommitmentSigned_set_signature(int64_t this_ptr, int8_tArray val) {
+       LDKCommitmentSigned 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       CommitmentSigned_set_signature(&this_ptr_conv, val_ref);
+}
+
+ptrArray  CS_LDK_CommitmentSigned_get_htlc_signatures(int64_t this_ptr) {
+       LDKCommitmentSigned 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_ECDSASignatureZ ret_var = CommitmentSigned_get_htlc_signatures(&this_ptr_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;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_CommitmentSigned_set_htlc_signatures(int64_t this_ptr, ptrArray val) {
+       LDKCommitmentSigned 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_ECDSASignatureZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKECDSASignature), "LDKCVec_ECDSASignatureZ Elements");
+       else
+               val_constr.data = NULL;
+       int8_tArray* val_vals = (void*) val->elems;
+       for (size_t i = 0; i < val_constr.datalen; i++) {
+               int8_tArray val_conv_8 = val_vals[i];
+               LDKECDSASignature val_conv_8_ref;
+               CHECK(val_conv_8->arr_len == 64);
+               memcpy(val_conv_8_ref.compact_form, val_conv_8->elems, 64); FREE(val_conv_8);
+               val_constr.data[i] = val_conv_8_ref;
+       }
+       FREE(val);
+       CommitmentSigned_set_htlc_signatures(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_CommitmentSigned_new(int8_tArray channel_id_arg, int8_tArray signature_arg, ptrArray htlc_signatures_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);
+       LDKECDSASignature signature_arg_ref;
+       CHECK(signature_arg->arr_len == 64);
+       memcpy(signature_arg_ref.compact_form, signature_arg->elems, 64); FREE(signature_arg);
+       LDKCVec_ECDSASignatureZ htlc_signatures_arg_constr;
+       htlc_signatures_arg_constr.datalen = htlc_signatures_arg->arr_len;
+       if (htlc_signatures_arg_constr.datalen > 0)
+               htlc_signatures_arg_constr.data = MALLOC(htlc_signatures_arg_constr.datalen * sizeof(LDKECDSASignature), "LDKCVec_ECDSASignatureZ Elements");
+       else
+               htlc_signatures_arg_constr.data = NULL;
+       int8_tArray* htlc_signatures_arg_vals = (void*) htlc_signatures_arg->elems;
+       for (size_t i = 0; i < htlc_signatures_arg_constr.datalen; i++) {
+               int8_tArray htlc_signatures_arg_conv_8 = htlc_signatures_arg_vals[i];
+               LDKECDSASignature htlc_signatures_arg_conv_8_ref;
+               CHECK(htlc_signatures_arg_conv_8->arr_len == 64);
+               memcpy(htlc_signatures_arg_conv_8_ref.compact_form, htlc_signatures_arg_conv_8->elems, 64); FREE(htlc_signatures_arg_conv_8);
+               htlc_signatures_arg_constr.data[i] = htlc_signatures_arg_conv_8_ref;
+       }
+       FREE(htlc_signatures_arg);
+       LDKCommitmentSigned ret_var = CommitmentSigned_new(channel_id_arg_ref, signature_arg_ref, htlc_signatures_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);
+       return ret_ref;
+}
+
+static inline uint64_t CommitmentSigned_clone_ptr(LDKCommitmentSigned *NONNULL_PTR arg) {
+       LDKCommitmentSigned ret_var = CommitmentSigned_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_CommitmentSigned_clone_ptr(int64_t arg) {
+       LDKCommitmentSigned 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 = CommitmentSigned_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CommitmentSigned_clone(int64_t orig) {
+       LDKCommitmentSigned 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;
+       LDKCommitmentSigned ret_var = CommitmentSigned_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_CommitmentSigned_eq(int64_t a, int64_t b) {
+       LDKCommitmentSigned 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;
+       LDKCommitmentSigned 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 = CommitmentSigned_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RevokeAndACK_free(int64_t this_obj) {
+       LDKRevokeAndACK 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);
+       RevokeAndACK_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_RevokeAndACK_get_channel_id(int64_t this_ptr) {
+       LDKRevokeAndACK 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, *RevokeAndACK_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_RevokeAndACK_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKRevokeAndACK 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);
+       RevokeAndACK_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_RevokeAndACK_get_per_commitment_secret(int64_t this_ptr) {
+       LDKRevokeAndACK 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, *RevokeAndACK_get_per_commitment_secret(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_RevokeAndACK_set_per_commitment_secret(int64_t this_ptr, int8_tArray val) {
+       LDKRevokeAndACK 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);
+       RevokeAndACK_set_per_commitment_secret(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_RevokeAndACK_get_next_per_commitment_point(int64_t this_ptr) {
+       LDKRevokeAndACK 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, RevokeAndACK_get_next_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_RevokeAndACK_set_next_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKRevokeAndACK 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);
+       RevokeAndACK_set_next_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_RevokeAndACK_new(int8_tArray channel_id_arg, int8_tArray per_commitment_secret_arg, int8_tArray next_per_commitment_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 per_commitment_secret_arg_ref;
+       CHECK(per_commitment_secret_arg->arr_len == 32);
+       memcpy(per_commitment_secret_arg_ref.data, per_commitment_secret_arg->elems, 32); FREE(per_commitment_secret_arg);
+       LDKPublicKey next_per_commitment_point_arg_ref;
+       CHECK(next_per_commitment_point_arg->arr_len == 33);
+       memcpy(next_per_commitment_point_arg_ref.compressed_form, next_per_commitment_point_arg->elems, 33); FREE(next_per_commitment_point_arg);
+       LDKRevokeAndACK ret_var = RevokeAndACK_new(channel_id_arg_ref, per_commitment_secret_arg_ref, next_per_commitment_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 RevokeAndACK_clone_ptr(LDKRevokeAndACK *NONNULL_PTR arg) {
+       LDKRevokeAndACK ret_var = RevokeAndACK_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_RevokeAndACK_clone_ptr(int64_t arg) {
+       LDKRevokeAndACK 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 = RevokeAndACK_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RevokeAndACK_clone(int64_t orig) {
+       LDKRevokeAndACK 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;
+       LDKRevokeAndACK ret_var = RevokeAndACK_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_RevokeAndACK_eq(int64_t a, int64_t b) {
+       LDKRevokeAndACK 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;
+       LDKRevokeAndACK 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 = RevokeAndACK_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFee_free(int64_t this_obj) {
+       LDKUpdateFee 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);
+       UpdateFee_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_UpdateFee_get_channel_id(int64_t this_ptr) {
+       LDKUpdateFee 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, *UpdateFee_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UpdateFee_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKUpdateFee 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);
+       UpdateFee_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_UpdateFee_get_feerate_per_kw(int64_t this_ptr) {
+       LDKUpdateFee 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 = UpdateFee_get_feerate_per_kw(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFee_set_feerate_per_kw(int64_t this_ptr, int32_t val) {
+       LDKUpdateFee 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;
+       UpdateFee_set_feerate_per_kw(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_UpdateFee_new(int8_tArray channel_id_arg, int32_t feerate_per_kw_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);
+       LDKUpdateFee ret_var = UpdateFee_new(channel_id_arg_ref, feerate_per_kw_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 UpdateFee_clone_ptr(LDKUpdateFee *NONNULL_PTR arg) {
+       LDKUpdateFee ret_var = UpdateFee_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_UpdateFee_clone_ptr(int64_t arg) {
+       LDKUpdateFee 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 = UpdateFee_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UpdateFee_clone(int64_t orig) {
+       LDKUpdateFee 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;
+       LDKUpdateFee ret_var = UpdateFee_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_UpdateFee_eq(int64_t a, int64_t b) {
+       LDKUpdateFee 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;
+       LDKUpdateFee 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 = UpdateFee_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelReestablish_free(int64_t this_obj) {
+       LDKChannelReestablish 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);
+       ChannelReestablish_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ChannelReestablish_get_channel_id(int64_t this_ptr) {
+       LDKChannelReestablish 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, *ChannelReestablish_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelReestablish_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKChannelReestablish 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);
+       ChannelReestablish_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelReestablish_get_next_local_commitment_number(int64_t this_ptr) {
+       LDKChannelReestablish 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 = ChannelReestablish_get_next_local_commitment_number(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelReestablish_set_next_local_commitment_number(int64_t this_ptr, int64_t val) {
+       LDKChannelReestablish 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;
+       ChannelReestablish_set_next_local_commitment_number(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelReestablish_get_next_remote_commitment_number(int64_t this_ptr) {
+       LDKChannelReestablish 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 = ChannelReestablish_get_next_remote_commitment_number(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelReestablish_set_next_remote_commitment_number(int64_t this_ptr, int64_t val) {
+       LDKChannelReestablish 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;
+       ChannelReestablish_set_next_remote_commitment_number(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_ChannelReestablish_get_your_last_per_commitment_secret(int64_t this_ptr) {
+       LDKChannelReestablish 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, *ChannelReestablish_get_your_last_per_commitment_secret(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelReestablish_set_your_last_per_commitment_secret(int64_t this_ptr, int8_tArray val) {
+       LDKChannelReestablish 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);
+       ChannelReestablish_set_your_last_per_commitment_secret(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_ChannelReestablish_get_my_current_per_commitment_point(int64_t this_ptr) {
+       LDKChannelReestablish 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, ChannelReestablish_get_my_current_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelReestablish_set_my_current_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKChannelReestablish 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);
+       ChannelReestablish_set_my_current_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelReestablish_get_next_funding_txid(int64_t this_ptr) {
+       LDKChannelReestablish 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 = ChannelReestablish_get_next_funding_txid(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelReestablish_set_next_funding_txid(int64_t this_ptr, int64_t val) {
+       LDKChannelReestablish 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));
+       ChannelReestablish_set_next_funding_txid(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelReestablish_new(int8_tArray channel_id_arg, int64_t next_local_commitment_number_arg, int64_t next_remote_commitment_number_arg, int8_tArray your_last_per_commitment_secret_arg, int8_tArray my_current_per_commitment_point_arg, int64_t next_funding_txid_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 your_last_per_commitment_secret_arg_ref;
+       CHECK(your_last_per_commitment_secret_arg->arr_len == 32);
+       memcpy(your_last_per_commitment_secret_arg_ref.data, your_last_per_commitment_secret_arg->elems, 32); FREE(your_last_per_commitment_secret_arg);
+       LDKPublicKey my_current_per_commitment_point_arg_ref;
+       CHECK(my_current_per_commitment_point_arg->arr_len == 33);
+       memcpy(my_current_per_commitment_point_arg_ref.compressed_form, my_current_per_commitment_point_arg->elems, 33); FREE(my_current_per_commitment_point_arg);
+       void* next_funding_txid_arg_ptr = untag_ptr(next_funding_txid_arg);
+       CHECK_ACCESS(next_funding_txid_arg_ptr);
+       LDKCOption_ThirtyTwoBytesZ next_funding_txid_arg_conv = *(LDKCOption_ThirtyTwoBytesZ*)(next_funding_txid_arg_ptr);
+       next_funding_txid_arg_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(next_funding_txid_arg));
+       LDKChannelReestablish ret_var = ChannelReestablish_new(channel_id_arg_ref, next_local_commitment_number_arg, next_remote_commitment_number_arg, your_last_per_commitment_secret_arg_ref, my_current_per_commitment_point_arg_ref, next_funding_txid_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 ChannelReestablish_clone_ptr(LDKChannelReestablish *NONNULL_PTR arg) {
+       LDKChannelReestablish ret_var = ChannelReestablish_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_ChannelReestablish_clone_ptr(int64_t arg) {
+       LDKChannelReestablish 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 = ChannelReestablish_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelReestablish_clone(int64_t orig) {
+       LDKChannelReestablish 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;
+       LDKChannelReestablish ret_var = ChannelReestablish_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_ChannelReestablish_eq(int64_t a, int64_t b) {
+       LDKChannelReestablish 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;
+       LDKChannelReestablish 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 = ChannelReestablish_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AnnouncementSignatures_free(int64_t this_obj) {
+       LDKAnnouncementSignatures 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);
+       AnnouncementSignatures_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_AnnouncementSignatures_get_channel_id(int64_t this_ptr) {
+       LDKAnnouncementSignatures 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, *AnnouncementSignatures_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_AnnouncementSignatures_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKAnnouncementSignatures 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);
+       AnnouncementSignatures_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_AnnouncementSignatures_get_short_channel_id(int64_t this_ptr) {
+       LDKAnnouncementSignatures 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 = AnnouncementSignatures_get_short_channel_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AnnouncementSignatures_set_short_channel_id(int64_t this_ptr, int64_t val) {
+       LDKAnnouncementSignatures 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;
+       AnnouncementSignatures_set_short_channel_id(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_AnnouncementSignatures_get_node_signature(int64_t this_ptr) {
+       LDKAnnouncementSignatures 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(64, __LINE__);
+       memcpy(ret_arr->elems, AnnouncementSignatures_get_node_signature(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_AnnouncementSignatures_set_node_signature(int64_t this_ptr, int8_tArray val) {
+       LDKAnnouncementSignatures 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       AnnouncementSignatures_set_node_signature(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AnnouncementSignatures_get_bitcoin_signature(int64_t this_ptr) {
+       LDKAnnouncementSignatures 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(64, __LINE__);
+       memcpy(ret_arr->elems, AnnouncementSignatures_get_bitcoin_signature(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_AnnouncementSignatures_set_bitcoin_signature(int64_t this_ptr, int8_tArray val) {
+       LDKAnnouncementSignatures 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       AnnouncementSignatures_set_bitcoin_signature(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_AnnouncementSignatures_new(int8_tArray channel_id_arg, int64_t short_channel_id_arg, int8_tArray node_signature_arg, int8_tArray bitcoin_signature_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);
+       LDKECDSASignature node_signature_arg_ref;
+       CHECK(node_signature_arg->arr_len == 64);
+       memcpy(node_signature_arg_ref.compact_form, node_signature_arg->elems, 64); FREE(node_signature_arg);
+       LDKECDSASignature bitcoin_signature_arg_ref;
+       CHECK(bitcoin_signature_arg->arr_len == 64);
+       memcpy(bitcoin_signature_arg_ref.compact_form, bitcoin_signature_arg->elems, 64); FREE(bitcoin_signature_arg);
+       LDKAnnouncementSignatures ret_var = AnnouncementSignatures_new(channel_id_arg_ref, short_channel_id_arg, node_signature_arg_ref, bitcoin_signature_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 AnnouncementSignatures_clone_ptr(LDKAnnouncementSignatures *NONNULL_PTR arg) {
+       LDKAnnouncementSignatures ret_var = AnnouncementSignatures_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_AnnouncementSignatures_clone_ptr(int64_t arg) {
+       LDKAnnouncementSignatures 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 = AnnouncementSignatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_AnnouncementSignatures_clone(int64_t orig) {
+       LDKAnnouncementSignatures 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;
+       LDKAnnouncementSignatures ret_var = AnnouncementSignatures_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_AnnouncementSignatures_eq(int64_t a, int64_t b) {
+       LDKAnnouncementSignatures 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;
+       LDKAnnouncementSignatures 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 = AnnouncementSignatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_SocketAddress_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);
+       LDKSocketAddress this_ptr_conv = *(LDKSocketAddress*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       SocketAddress_free(this_ptr_conv);
+}
+
+static inline uint64_t SocketAddress_clone_ptr(LDKSocketAddress *NONNULL_PTR arg) {
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = SocketAddress_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_SocketAddress_clone_ptr(int64_t arg) {
+       LDKSocketAddress* arg_conv = (LDKSocketAddress*)untag_ptr(arg);
+       int64_t ret_conv = SocketAddress_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SocketAddress_clone(int64_t orig) {
+       LDKSocketAddress* orig_conv = (LDKSocketAddress*)untag_ptr(orig);
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = SocketAddress_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SocketAddress_tcp_ip_v4(int8_tArray addr, int16_t port) {
+       LDKFourBytes addr_ref;
+       CHECK(addr->arr_len == 4);
+       memcpy(addr_ref.data, addr->elems, 4); FREE(addr);
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = SocketAddress_tcp_ip_v4(addr_ref, port);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SocketAddress_tcp_ip_v6(int8_tArray addr, int16_t port) {
+       LDKSixteenBytes addr_ref;
+       CHECK(addr->arr_len == 16);
+       memcpy(addr_ref.data, addr->elems, 16); FREE(addr);
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = SocketAddress_tcp_ip_v6(addr_ref, port);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SocketAddress_onion_v2(int8_tArray a) {
+       LDKTwelveBytes a_ref;
+       CHECK(a->arr_len == 12);
+       memcpy(a_ref.data, a->elems, 12); FREE(a);
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = SocketAddress_onion_v2(a_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SocketAddress_onion_v3(int8_tArray ed25519_pubkey, int16_t checksum, int8_t version, int16_t port) {
+       LDKThirtyTwoBytes ed25519_pubkey_ref;
+       CHECK(ed25519_pubkey->arr_len == 32);
+       memcpy(ed25519_pubkey_ref.data, ed25519_pubkey->elems, 32); FREE(ed25519_pubkey);
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = SocketAddress_onion_v3(ed25519_pubkey_ref, checksum, version, port);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SocketAddress_hostname(int64_t hostname, int16_t port) {
+       LDKHostname hostname_conv;
+       hostname_conv.inner = untag_ptr(hostname);
+       hostname_conv.is_owned = ptr_is_owned(hostname);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(hostname_conv);
+       hostname_conv = Hostname_clone(&hostname_conv);
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = SocketAddress_hostname(hostname_conv, port);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+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);
+       jboolean ret_conv = SocketAddress_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_SocketAddress_write(int64_t obj) {
+       LDKSocketAddress* obj_conv = (LDKSocketAddress*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = SocketAddress_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_SocketAddress_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_SocketAddressDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressDecodeErrorZ), "LDKCResult_SocketAddressDecodeErrorZ");
+       *ret_conv = SocketAddress_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int32_t  CS_LDK_SocketAddressParseError_clone(int64_t orig) {
+       LDKSocketAddressParseError* orig_conv = (LDKSocketAddressParseError*)untag_ptr(orig);
+       int32_t ret_conv = LDKSocketAddressParseError_to_cs(SocketAddressParseError_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SocketAddressParseError_socket_addr_parse() {
+       int32_t ret_conv = LDKSocketAddressParseError_to_cs(SocketAddressParseError_socket_addr_parse());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SocketAddressParseError_invalid_input() {
+       int32_t ret_conv = LDKSocketAddressParseError_to_cs(SocketAddressParseError_invalid_input());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SocketAddressParseError_invalid_port() {
+       int32_t ret_conv = LDKSocketAddressParseError_to_cs(SocketAddressParseError_invalid_port());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SocketAddressParseError_invalid_onion_v3() {
+       int32_t ret_conv = LDKSocketAddressParseError_to_cs(SocketAddressParseError_invalid_onion_v3());
+       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);
+       jboolean ret_conv = SocketAddressParseError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_parse_onion_address(jstring host, int16_t port) {
+       LDKStr host_conv = str_ref_to_owned_c(host);
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressSocketAddressParseErrorZ), "LDKCResult_SocketAddressSocketAddressParseErrorZ");
+       *ret_conv = parse_onion_address(host_conv, port);
+       return tag_ptr(ret_conv, true);
+}
+
+jstring  CS_LDK_SocketAddress_to_str(int64_t o) {
+       LDKSocketAddress* o_conv = (LDKSocketAddress*)untag_ptr(o);
+       LDKStr ret_str = SocketAddress_to_str(o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SocketAddress_from_str(jstring s) {
+       LDKStr s_conv = str_ref_to_owned_c(s);
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressSocketAddressParseErrorZ), "LDKCResult_SocketAddressSocketAddressParseErrorZ");
+       *ret_conv = SocketAddress_from_str(s_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_UnsignedGossipMessage_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);
+       LDKUnsignedGossipMessage this_ptr_conv = *(LDKUnsignedGossipMessage*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       UnsignedGossipMessage_free(this_ptr_conv);
+}
+
+static inline uint64_t UnsignedGossipMessage_clone_ptr(LDKUnsignedGossipMessage *NONNULL_PTR arg) {
+       LDKUnsignedGossipMessage *ret_copy = MALLOC(sizeof(LDKUnsignedGossipMessage), "LDKUnsignedGossipMessage");
+       *ret_copy = UnsignedGossipMessage_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_UnsignedGossipMessage_clone_ptr(int64_t arg) {
+       LDKUnsignedGossipMessage* arg_conv = (LDKUnsignedGossipMessage*)untag_ptr(arg);
+       int64_t ret_conv = UnsignedGossipMessage_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UnsignedGossipMessage_clone(int64_t orig) {
+       LDKUnsignedGossipMessage* orig_conv = (LDKUnsignedGossipMessage*)untag_ptr(orig);
+       LDKUnsignedGossipMessage *ret_copy = MALLOC(sizeof(LDKUnsignedGossipMessage), "LDKUnsignedGossipMessage");
+       *ret_copy = UnsignedGossipMessage_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UnsignedGossipMessage_channel_announcement(int64_t a) {
+       LDKUnsignedChannelAnnouncement 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 = UnsignedChannelAnnouncement_clone(&a_conv);
+       LDKUnsignedGossipMessage *ret_copy = MALLOC(sizeof(LDKUnsignedGossipMessage), "LDKUnsignedGossipMessage");
+       *ret_copy = UnsignedGossipMessage_channel_announcement(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UnsignedGossipMessage_channel_update(int64_t a) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_clone(&a_conv);
+       LDKUnsignedGossipMessage *ret_copy = MALLOC(sizeof(LDKUnsignedGossipMessage), "LDKUnsignedGossipMessage");
+       *ret_copy = UnsignedGossipMessage_channel_update(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UnsignedGossipMessage_node_announcement(int64_t a) {
+       LDKUnsignedNodeAnnouncement 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 = UnsignedNodeAnnouncement_clone(&a_conv);
+       LDKUnsignedGossipMessage *ret_copy = MALLOC(sizeof(LDKUnsignedGossipMessage), "LDKUnsignedGossipMessage");
+       *ret_copy = UnsignedGossipMessage_node_announcement(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_UnsignedGossipMessage_write(int64_t obj) {
+       LDKUnsignedGossipMessage* obj_conv = (LDKUnsignedGossipMessage*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = UnsignedGossipMessage_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;
+}
+
+void  CS_LDK_UnsignedNodeAnnouncement_free(int64_t this_obj) {
+       LDKUnsignedNodeAnnouncement 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);
+       UnsignedNodeAnnouncement_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_UnsignedNodeAnnouncement_get_features(int64_t this_ptr) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKNodeFeatures ret_var = UnsignedNodeAnnouncement_get_features(&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_UnsignedNodeAnnouncement_set_features(int64_t this_ptr, int64_t val) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKNodeFeatures 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 = NodeFeatures_clone(&val_conv);
+       UnsignedNodeAnnouncement_set_features(&this_ptr_conv, val_conv);
+}
+
+int32_t  CS_LDK_UnsignedNodeAnnouncement_get_timestamp(int64_t this_ptr) {
+       LDKUnsignedNodeAnnouncement 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 = UnsignedNodeAnnouncement_get_timestamp(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedNodeAnnouncement_set_timestamp(int64_t this_ptr, int32_t val) {
+       LDKUnsignedNodeAnnouncement 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;
+       UnsignedNodeAnnouncement_set_timestamp(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_UnsignedNodeAnnouncement_get_node_id(int64_t this_ptr) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKNodeId ret_var = UnsignedNodeAnnouncement_get_node_id(&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_UnsignedNodeAnnouncement_set_node_id(int64_t this_ptr, int64_t val) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKNodeId 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 = NodeId_clone(&val_conv);
+       UnsignedNodeAnnouncement_set_node_id(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_UnsignedNodeAnnouncement_get_rgb(int64_t this_ptr) {
+       LDKUnsignedNodeAnnouncement 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(3, __LINE__);
+       memcpy(ret_arr->elems, *UnsignedNodeAnnouncement_get_rgb(&this_ptr_conv), 3);
+       return ret_arr;
+}
+
+void  CS_LDK_UnsignedNodeAnnouncement_set_rgb(int64_t this_ptr, int8_tArray val) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKThreeBytes val_ref;
+       CHECK(val->arr_len == 3);
+       memcpy(val_ref.data, val->elems, 3); FREE(val);
+       UnsignedNodeAnnouncement_set_rgb(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UnsignedNodeAnnouncement_get_alias(int64_t this_ptr) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKNodeAlias ret_var = UnsignedNodeAnnouncement_get_alias(&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_UnsignedNodeAnnouncement_set_alias(int64_t this_ptr, int64_t val) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKNodeAlias 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 = NodeAlias_clone(&val_conv);
+       UnsignedNodeAnnouncement_set_alias(&this_ptr_conv, val_conv);
+}
+
+int64_tArray  CS_LDK_UnsignedNodeAnnouncement_get_addresses(int64_t this_ptr) {
+       LDKUnsignedNodeAnnouncement 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_SocketAddressZ ret_var = UnsignedNodeAnnouncement_get_addresses(&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 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;
+}
+
+void  CS_LDK_UnsignedNodeAnnouncement_set_addresses(int64_t this_ptr, int64_tArray val) {
+       LDKUnsignedNodeAnnouncement 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_SocketAddressZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKSocketAddress), "LDKCVec_SocketAddressZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t p = 0; p < val_constr.datalen; p++) {
+               int64_t val_conv_15 = val_vals[p];
+               void* val_conv_15_ptr = untag_ptr(val_conv_15);
+               CHECK_ACCESS(val_conv_15_ptr);
+               LDKSocketAddress val_conv_15_conv = *(LDKSocketAddress*)(val_conv_15_ptr);
+               val_conv_15_conv = SocketAddress_clone((LDKSocketAddress*)untag_ptr(val_conv_15));
+               val_constr.data[p] = val_conv_15_conv;
+       }
+       FREE(val);
+       UnsignedNodeAnnouncement_set_addresses(&this_ptr_conv, val_constr);
+}
+
+static inline uint64_t UnsignedNodeAnnouncement_clone_ptr(LDKUnsignedNodeAnnouncement *NONNULL_PTR arg) {
+       LDKUnsignedNodeAnnouncement ret_var = UnsignedNodeAnnouncement_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_UnsignedNodeAnnouncement_clone_ptr(int64_t arg) {
+       LDKUnsignedNodeAnnouncement 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 = UnsignedNodeAnnouncement_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UnsignedNodeAnnouncement_clone(int64_t orig) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKUnsignedNodeAnnouncement ret_var = UnsignedNodeAnnouncement_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_UnsignedNodeAnnouncement_eq(int64_t a, int64_t b) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKUnsignedNodeAnnouncement 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 = UnsignedNodeAnnouncement_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeAnnouncement_free(int64_t this_obj) {
+       LDKNodeAnnouncement 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);
+       NodeAnnouncement_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_NodeAnnouncement_get_signature(int64_t this_ptr) {
+       LDKNodeAnnouncement 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(64, __LINE__);
+       memcpy(ret_arr->elems, NodeAnnouncement_get_signature(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_NodeAnnouncement_set_signature(int64_t this_ptr, int8_tArray val) {
+       LDKNodeAnnouncement 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       NodeAnnouncement_set_signature(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_NodeAnnouncement_get_contents(int64_t this_ptr) {
+       LDKNodeAnnouncement 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;
+       LDKUnsignedNodeAnnouncement ret_var = NodeAnnouncement_get_contents(&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_NodeAnnouncement_set_contents(int64_t this_ptr, int64_t val) {
+       LDKNodeAnnouncement 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;
+       LDKUnsignedNodeAnnouncement 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 = UnsignedNodeAnnouncement_clone(&val_conv);
+       NodeAnnouncement_set_contents(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_NodeAnnouncement_new(int8_tArray signature_arg, int64_t contents_arg) {
+       LDKECDSASignature signature_arg_ref;
+       CHECK(signature_arg->arr_len == 64);
+       memcpy(signature_arg_ref.compact_form, signature_arg->elems, 64); FREE(signature_arg);
+       LDKUnsignedNodeAnnouncement contents_arg_conv;
+       contents_arg_conv.inner = untag_ptr(contents_arg);
+       contents_arg_conv.is_owned = ptr_is_owned(contents_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(contents_arg_conv);
+       contents_arg_conv = UnsignedNodeAnnouncement_clone(&contents_arg_conv);
+       LDKNodeAnnouncement ret_var = NodeAnnouncement_new(signature_arg_ref, contents_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 NodeAnnouncement_clone_ptr(LDKNodeAnnouncement *NONNULL_PTR arg) {
+       LDKNodeAnnouncement ret_var = NodeAnnouncement_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_NodeAnnouncement_clone_ptr(int64_t arg) {
+       LDKNodeAnnouncement 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 = NodeAnnouncement_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NodeAnnouncement_clone(int64_t orig) {
+       LDKNodeAnnouncement 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;
+       LDKNodeAnnouncement ret_var = NodeAnnouncement_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_NodeAnnouncement_eq(int64_t a, int64_t b) {
+       LDKNodeAnnouncement 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;
+       LDKNodeAnnouncement 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 = NodeAnnouncement_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelAnnouncement_free(int64_t this_obj) {
+       LDKUnsignedChannelAnnouncement 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);
+       UnsignedChannelAnnouncement_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_UnsignedChannelAnnouncement_get_features(int64_t this_ptr) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKChannelFeatures ret_var = UnsignedChannelAnnouncement_get_features(&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_UnsignedChannelAnnouncement_set_features(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKChannelFeatures 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 = ChannelFeatures_clone(&val_conv);
+       UnsignedChannelAnnouncement_set_features(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_UnsignedChannelAnnouncement_get_chain_hash(int64_t this_ptr) {
+       LDKUnsignedChannelAnnouncement 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, *UnsignedChannelAnnouncement_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UnsignedChannelAnnouncement_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKUnsignedChannelAnnouncement 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);
+       UnsignedChannelAnnouncement_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UnsignedChannelAnnouncement_get_short_channel_id(int64_t this_ptr) {
+       LDKUnsignedChannelAnnouncement 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 = UnsignedChannelAnnouncement_get_short_channel_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelAnnouncement_set_short_channel_id(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelAnnouncement 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;
+       UnsignedChannelAnnouncement_set_short_channel_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_UnsignedChannelAnnouncement_get_node_id_1(int64_t this_ptr) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKNodeId ret_var = UnsignedChannelAnnouncement_get_node_id_1(&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_UnsignedChannelAnnouncement_set_node_id_1(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKNodeId 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 = NodeId_clone(&val_conv);
+       UnsignedChannelAnnouncement_set_node_id_1(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_UnsignedChannelAnnouncement_get_node_id_2(int64_t this_ptr) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKNodeId ret_var = UnsignedChannelAnnouncement_get_node_id_2(&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_UnsignedChannelAnnouncement_set_node_id_2(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKNodeId 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 = NodeId_clone(&val_conv);
+       UnsignedChannelAnnouncement_set_node_id_2(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_UnsignedChannelAnnouncement_get_bitcoin_key_1(int64_t this_ptr) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKNodeId ret_var = UnsignedChannelAnnouncement_get_bitcoin_key_1(&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_UnsignedChannelAnnouncement_set_bitcoin_key_1(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKNodeId 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 = NodeId_clone(&val_conv);
+       UnsignedChannelAnnouncement_set_bitcoin_key_1(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_UnsignedChannelAnnouncement_get_bitcoin_key_2(int64_t this_ptr) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKNodeId ret_var = UnsignedChannelAnnouncement_get_bitcoin_key_2(&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_UnsignedChannelAnnouncement_set_bitcoin_key_2(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKNodeId 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 = NodeId_clone(&val_conv);
+       UnsignedChannelAnnouncement_set_bitcoin_key_2(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_UnsignedChannelAnnouncement_get_excess_data(int64_t this_ptr) {
+       LDKUnsignedChannelAnnouncement 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 = UnsignedChannelAnnouncement_get_excess_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_UnsignedChannelAnnouncement_set_excess_data(int64_t this_ptr, int8_tArray val) {
+       LDKUnsignedChannelAnnouncement 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);
+       UnsignedChannelAnnouncement_set_excess_data(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UnsignedChannelAnnouncement_new(int64_t features_arg, int8_tArray chain_hash_arg, int64_t short_channel_id_arg, int64_t node_id_1_arg, int64_t node_id_2_arg, int64_t bitcoin_key_1_arg, int64_t bitcoin_key_2_arg, int8_tArray excess_data_arg) {
+       LDKChannelFeatures features_arg_conv;
+       features_arg_conv.inner = untag_ptr(features_arg);
+       features_arg_conv.is_owned = ptr_is_owned(features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_arg_conv);
+       features_arg_conv = ChannelFeatures_clone(&features_arg_conv);
+       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);
+       LDKNodeId node_id_1_arg_conv;
+       node_id_1_arg_conv.inner = untag_ptr(node_id_1_arg);
+       node_id_1_arg_conv.is_owned = ptr_is_owned(node_id_1_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_id_1_arg_conv);
+       node_id_1_arg_conv = NodeId_clone(&node_id_1_arg_conv);
+       LDKNodeId node_id_2_arg_conv;
+       node_id_2_arg_conv.inner = untag_ptr(node_id_2_arg);
+       node_id_2_arg_conv.is_owned = ptr_is_owned(node_id_2_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_id_2_arg_conv);
+       node_id_2_arg_conv = NodeId_clone(&node_id_2_arg_conv);
+       LDKNodeId bitcoin_key_1_arg_conv;
+       bitcoin_key_1_arg_conv.inner = untag_ptr(bitcoin_key_1_arg);
+       bitcoin_key_1_arg_conv.is_owned = ptr_is_owned(bitcoin_key_1_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(bitcoin_key_1_arg_conv);
+       bitcoin_key_1_arg_conv = NodeId_clone(&bitcoin_key_1_arg_conv);
+       LDKNodeId bitcoin_key_2_arg_conv;
+       bitcoin_key_2_arg_conv.inner = untag_ptr(bitcoin_key_2_arg);
+       bitcoin_key_2_arg_conv.is_owned = ptr_is_owned(bitcoin_key_2_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(bitcoin_key_2_arg_conv);
+       bitcoin_key_2_arg_conv = NodeId_clone(&bitcoin_key_2_arg_conv);
+       LDKCVec_u8Z excess_data_arg_ref;
+       excess_data_arg_ref.datalen = excess_data_arg->arr_len;
+       excess_data_arg_ref.data = MALLOC(excess_data_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(excess_data_arg_ref.data, excess_data_arg->elems, excess_data_arg_ref.datalen); FREE(excess_data_arg);
+       LDKUnsignedChannelAnnouncement ret_var = UnsignedChannelAnnouncement_new(features_arg_conv, chain_hash_arg_ref, short_channel_id_arg, node_id_1_arg_conv, node_id_2_arg_conv, bitcoin_key_1_arg_conv, bitcoin_key_2_arg_conv, excess_data_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 UnsignedChannelAnnouncement_clone_ptr(LDKUnsignedChannelAnnouncement *NONNULL_PTR arg) {
+       LDKUnsignedChannelAnnouncement ret_var = UnsignedChannelAnnouncement_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_UnsignedChannelAnnouncement_clone_ptr(int64_t arg) {
+       LDKUnsignedChannelAnnouncement 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 = UnsignedChannelAnnouncement_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UnsignedChannelAnnouncement_clone(int64_t orig) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKUnsignedChannelAnnouncement ret_var = UnsignedChannelAnnouncement_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_UnsignedChannelAnnouncement_eq(int64_t a, int64_t b) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKUnsignedChannelAnnouncement 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 = UnsignedChannelAnnouncement_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelAnnouncement_free(int64_t this_obj) {
+       LDKChannelAnnouncement 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);
+       ChannelAnnouncement_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ChannelAnnouncement_get_node_signature_1(int64_t this_ptr) {
+       LDKChannelAnnouncement 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(64, __LINE__);
+       memcpy(ret_arr->elems, ChannelAnnouncement_get_node_signature_1(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelAnnouncement_set_node_signature_1(int64_t this_ptr, int8_tArray val) {
+       LDKChannelAnnouncement 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       ChannelAnnouncement_set_node_signature_1(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_ChannelAnnouncement_get_node_signature_2(int64_t this_ptr) {
+       LDKChannelAnnouncement 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(64, __LINE__);
+       memcpy(ret_arr->elems, ChannelAnnouncement_get_node_signature_2(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelAnnouncement_set_node_signature_2(int64_t this_ptr, int8_tArray val) {
+       LDKChannelAnnouncement 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       ChannelAnnouncement_set_node_signature_2(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_ChannelAnnouncement_get_bitcoin_signature_1(int64_t this_ptr) {
+       LDKChannelAnnouncement 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(64, __LINE__);
+       memcpy(ret_arr->elems, ChannelAnnouncement_get_bitcoin_signature_1(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelAnnouncement_set_bitcoin_signature_1(int64_t this_ptr, int8_tArray val) {
+       LDKChannelAnnouncement 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       ChannelAnnouncement_set_bitcoin_signature_1(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_ChannelAnnouncement_get_bitcoin_signature_2(int64_t this_ptr) {
+       LDKChannelAnnouncement 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(64, __LINE__);
+       memcpy(ret_arr->elems, ChannelAnnouncement_get_bitcoin_signature_2(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelAnnouncement_set_bitcoin_signature_2(int64_t this_ptr, int8_tArray val) {
+       LDKChannelAnnouncement 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       ChannelAnnouncement_set_bitcoin_signature_2(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelAnnouncement_get_contents(int64_t this_ptr) {
+       LDKChannelAnnouncement 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;
+       LDKUnsignedChannelAnnouncement ret_var = ChannelAnnouncement_get_contents(&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_ChannelAnnouncement_set_contents(int64_t this_ptr, int64_t val) {
+       LDKChannelAnnouncement 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;
+       LDKUnsignedChannelAnnouncement 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 = UnsignedChannelAnnouncement_clone(&val_conv);
+       ChannelAnnouncement_set_contents(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelAnnouncement_new(int8_tArray node_signature_1_arg, int8_tArray node_signature_2_arg, int8_tArray bitcoin_signature_1_arg, int8_tArray bitcoin_signature_2_arg, int64_t contents_arg) {
+       LDKECDSASignature node_signature_1_arg_ref;
+       CHECK(node_signature_1_arg->arr_len == 64);
+       memcpy(node_signature_1_arg_ref.compact_form, node_signature_1_arg->elems, 64); FREE(node_signature_1_arg);
+       LDKECDSASignature node_signature_2_arg_ref;
+       CHECK(node_signature_2_arg->arr_len == 64);
+       memcpy(node_signature_2_arg_ref.compact_form, node_signature_2_arg->elems, 64); FREE(node_signature_2_arg);
+       LDKECDSASignature bitcoin_signature_1_arg_ref;
+       CHECK(bitcoin_signature_1_arg->arr_len == 64);
+       memcpy(bitcoin_signature_1_arg_ref.compact_form, bitcoin_signature_1_arg->elems, 64); FREE(bitcoin_signature_1_arg);
+       LDKECDSASignature bitcoin_signature_2_arg_ref;
+       CHECK(bitcoin_signature_2_arg->arr_len == 64);
+       memcpy(bitcoin_signature_2_arg_ref.compact_form, bitcoin_signature_2_arg->elems, 64); FREE(bitcoin_signature_2_arg);
+       LDKUnsignedChannelAnnouncement contents_arg_conv;
+       contents_arg_conv.inner = untag_ptr(contents_arg);
+       contents_arg_conv.is_owned = ptr_is_owned(contents_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(contents_arg_conv);
+       contents_arg_conv = UnsignedChannelAnnouncement_clone(&contents_arg_conv);
+       LDKChannelAnnouncement ret_var = ChannelAnnouncement_new(node_signature_1_arg_ref, node_signature_2_arg_ref, bitcoin_signature_1_arg_ref, bitcoin_signature_2_arg_ref, contents_arg_conv);
+       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 ChannelAnnouncement_clone_ptr(LDKChannelAnnouncement *NONNULL_PTR arg) {
+       LDKChannelAnnouncement ret_var = ChannelAnnouncement_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_ChannelAnnouncement_clone_ptr(int64_t arg) {
+       LDKChannelAnnouncement 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 = ChannelAnnouncement_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelAnnouncement_clone(int64_t orig) {
+       LDKChannelAnnouncement 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;
+       LDKChannelAnnouncement ret_var = ChannelAnnouncement_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_ChannelAnnouncement_eq(int64_t a, int64_t b) {
+       LDKChannelAnnouncement 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;
+       LDKChannelAnnouncement 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 = ChannelAnnouncement_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_free(int64_t this_obj) {
+       LDKUnsignedChannelUpdate 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);
+       UnsignedChannelUpdate_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_UnsignedChannelUpdate_get_chain_hash(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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, *UnsignedChannelUpdate_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKUnsignedChannelUpdate 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);
+       UnsignedChannelUpdate_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UnsignedChannelUpdate_get_short_channel_id(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_short_channel_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_short_channel_id(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelUpdate 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;
+       UnsignedChannelUpdate_set_short_channel_id(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_UnsignedChannelUpdate_get_timestamp(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_timestamp(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_timestamp(int64_t this_ptr, int32_t val) {
+       LDKUnsignedChannelUpdate 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;
+       UnsignedChannelUpdate_set_timestamp(&this_ptr_conv, val);
+}
+
+int8_t  CS_LDK_UnsignedChannelUpdate_get_flags(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_flags(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_flags(int64_t this_ptr, int8_t val) {
+       LDKUnsignedChannelUpdate 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;
+       UnsignedChannelUpdate_set_flags(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_UnsignedChannelUpdate_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_cltv_expiry_delta(int64_t this_ptr, int16_t val) {
+       LDKUnsignedChannelUpdate 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;
+       UnsignedChannelUpdate_set_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_UnsignedChannelUpdate_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelUpdate 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;
+       UnsignedChannelUpdate_set_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_UnsignedChannelUpdate_get_htlc_maximum_msat(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_htlc_maximum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_htlc_maximum_msat(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelUpdate 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;
+       UnsignedChannelUpdate_set_htlc_maximum_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_UnsignedChannelUpdate_get_fee_base_msat(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_fee_base_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_fee_base_msat(int64_t this_ptr, int32_t val) {
+       LDKUnsignedChannelUpdate 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;
+       UnsignedChannelUpdate_set_fee_base_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_UnsignedChannelUpdate_get_fee_proportional_millionths(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_fee_proportional_millionths(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_fee_proportional_millionths(int64_t this_ptr, int32_t val) {
+       LDKUnsignedChannelUpdate 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;
+       UnsignedChannelUpdate_set_fee_proportional_millionths(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_UnsignedChannelUpdate_get_excess_data(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_excess_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_UnsignedChannelUpdate_set_excess_data(int64_t this_ptr, int8_tArray val) {
+       LDKUnsignedChannelUpdate 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);
+       UnsignedChannelUpdate_set_excess_data(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UnsignedChannelUpdate_new(int8_tArray chain_hash_arg, int64_t short_channel_id_arg, int32_t timestamp_arg, int8_t flags_arg, int16_t cltv_expiry_delta_arg, int64_t htlc_minimum_msat_arg, int64_t htlc_maximum_msat_arg, int32_t fee_base_msat_arg, int32_t fee_proportional_millionths_arg, int8_tArray excess_data_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);
+       LDKCVec_u8Z excess_data_arg_ref;
+       excess_data_arg_ref.datalen = excess_data_arg->arr_len;
+       excess_data_arg_ref.data = MALLOC(excess_data_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(excess_data_arg_ref.data, excess_data_arg->elems, excess_data_arg_ref.datalen); FREE(excess_data_arg);
+       LDKUnsignedChannelUpdate ret_var = UnsignedChannelUpdate_new(chain_hash_arg_ref, short_channel_id_arg, timestamp_arg, flags_arg, cltv_expiry_delta_arg, htlc_minimum_msat_arg, htlc_maximum_msat_arg, fee_base_msat_arg, fee_proportional_millionths_arg, excess_data_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 UnsignedChannelUpdate_clone_ptr(LDKUnsignedChannelUpdate *NONNULL_PTR arg) {
+       LDKUnsignedChannelUpdate ret_var = UnsignedChannelUpdate_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_UnsignedChannelUpdate_clone_ptr(int64_t arg) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UnsignedChannelUpdate_clone(int64_t orig) {
+       LDKUnsignedChannelUpdate 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;
+       LDKUnsignedChannelUpdate ret_var = UnsignedChannelUpdate_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_UnsignedChannelUpdate_eq(int64_t a, int64_t b) {
+       LDKUnsignedChannelUpdate 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;
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelUpdate_free(int64_t this_obj) {
+       LDKChannelUpdate 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);
+       ChannelUpdate_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ChannelUpdate_get_signature(int64_t this_ptr) {
+       LDKChannelUpdate 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(64, __LINE__);
+       memcpy(ret_arr->elems, ChannelUpdate_get_signature(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelUpdate_set_signature(int64_t this_ptr, int8_tArray val) {
+       LDKChannelUpdate 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       ChannelUpdate_set_signature(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelUpdate_get_contents(int64_t this_ptr) {
+       LDKChannelUpdate 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;
+       LDKUnsignedChannelUpdate ret_var = ChannelUpdate_get_contents(&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_ChannelUpdate_set_contents(int64_t this_ptr, int64_t val) {
+       LDKChannelUpdate 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;
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_clone(&val_conv);
+       ChannelUpdate_set_contents(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelUpdate_new(int8_tArray signature_arg, int64_t contents_arg) {
+       LDKECDSASignature signature_arg_ref;
+       CHECK(signature_arg->arr_len == 64);
+       memcpy(signature_arg_ref.compact_form, signature_arg->elems, 64); FREE(signature_arg);
+       LDKUnsignedChannelUpdate contents_arg_conv;
+       contents_arg_conv.inner = untag_ptr(contents_arg);
+       contents_arg_conv.is_owned = ptr_is_owned(contents_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(contents_arg_conv);
+       contents_arg_conv = UnsignedChannelUpdate_clone(&contents_arg_conv);
+       LDKChannelUpdate ret_var = ChannelUpdate_new(signature_arg_ref, contents_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 ChannelUpdate_clone_ptr(LDKChannelUpdate *NONNULL_PTR arg) {
+       LDKChannelUpdate ret_var = ChannelUpdate_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_ChannelUpdate_clone_ptr(int64_t arg) {
+       LDKChannelUpdate 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 = ChannelUpdate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelUpdate_clone(int64_t orig) {
+       LDKChannelUpdate 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;
+       LDKChannelUpdate ret_var = ChannelUpdate_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_ChannelUpdate_eq(int64_t a, int64_t b) {
+       LDKChannelUpdate 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;
+       LDKChannelUpdate 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 = ChannelUpdate_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_QueryChannelRange_free(int64_t this_obj) {
+       LDKQueryChannelRange 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);
+       QueryChannelRange_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_QueryChannelRange_get_chain_hash(int64_t this_ptr) {
+       LDKQueryChannelRange 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, *QueryChannelRange_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_QueryChannelRange_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKQueryChannelRange 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);
+       QueryChannelRange_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_QueryChannelRange_get_first_blocknum(int64_t this_ptr) {
+       LDKQueryChannelRange 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 = QueryChannelRange_get_first_blocknum(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_QueryChannelRange_set_first_blocknum(int64_t this_ptr, int32_t val) {
+       LDKQueryChannelRange 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;
+       QueryChannelRange_set_first_blocknum(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_QueryChannelRange_get_number_of_blocks(int64_t this_ptr) {
+       LDKQueryChannelRange 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 = QueryChannelRange_get_number_of_blocks(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_QueryChannelRange_set_number_of_blocks(int64_t this_ptr, int32_t val) {
+       LDKQueryChannelRange 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;
+       QueryChannelRange_set_number_of_blocks(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_QueryChannelRange_new(int8_tArray chain_hash_arg, int32_t first_blocknum_arg, int32_t number_of_blocks_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);
+       LDKQueryChannelRange ret_var = QueryChannelRange_new(chain_hash_arg_ref, first_blocknum_arg, number_of_blocks_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 QueryChannelRange_clone_ptr(LDKQueryChannelRange *NONNULL_PTR arg) {
+       LDKQueryChannelRange ret_var = QueryChannelRange_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_QueryChannelRange_clone_ptr(int64_t arg) {
+       LDKQueryChannelRange 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 = QueryChannelRange_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_QueryChannelRange_clone(int64_t orig) {
+       LDKQueryChannelRange 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;
+       LDKQueryChannelRange ret_var = QueryChannelRange_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_QueryChannelRange_eq(int64_t a, int64_t b) {
+       LDKQueryChannelRange 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;
+       LDKQueryChannelRange 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 = QueryChannelRange_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ReplyChannelRange_free(int64_t this_obj) {
+       LDKReplyChannelRange 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);
+       ReplyChannelRange_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ReplyChannelRange_get_chain_hash(int64_t this_ptr) {
+       LDKReplyChannelRange 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, *ReplyChannelRange_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ReplyChannelRange_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKReplyChannelRange 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);
+       ReplyChannelRange_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_ReplyChannelRange_get_first_blocknum(int64_t this_ptr) {
+       LDKReplyChannelRange 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 = ReplyChannelRange_get_first_blocknum(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ReplyChannelRange_set_first_blocknum(int64_t this_ptr, int32_t val) {
+       LDKReplyChannelRange 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;
+       ReplyChannelRange_set_first_blocknum(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_ReplyChannelRange_get_number_of_blocks(int64_t this_ptr) {
+       LDKReplyChannelRange 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 = ReplyChannelRange_get_number_of_blocks(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ReplyChannelRange_set_number_of_blocks(int64_t this_ptr, int32_t val) {
+       LDKReplyChannelRange 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;
+       ReplyChannelRange_set_number_of_blocks(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ReplyChannelRange_get_sync_complete(int64_t this_ptr) {
+       LDKReplyChannelRange 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;
+       jboolean ret_conv = ReplyChannelRange_get_sync_complete(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ReplyChannelRange_set_sync_complete(int64_t this_ptr, jboolean val) {
+       LDKReplyChannelRange 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;
+       ReplyChannelRange_set_sync_complete(&this_ptr_conv, val);
+}
+
+int64_tArray  CS_LDK_ReplyChannelRange_get_short_channel_ids(int64_t this_ptr) {
+       LDKReplyChannelRange 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 = ReplyChannelRange_get_short_channel_ids(&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_ReplyChannelRange_set_short_channel_ids(int64_t this_ptr, int64_tArray val) {
+       LDKReplyChannelRange 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);
+       ReplyChannelRange_set_short_channel_ids(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_ReplyChannelRange_new(int8_tArray chain_hash_arg, int32_t first_blocknum_arg, int32_t number_of_blocks_arg, jboolean sync_complete_arg, int64_tArray short_channel_ids_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);
+       LDKCVec_u64Z short_channel_ids_arg_constr;
+       short_channel_ids_arg_constr.datalen = short_channel_ids_arg->arr_len;
+       if (short_channel_ids_arg_constr.datalen > 0)
+               short_channel_ids_arg_constr.data = MALLOC(short_channel_ids_arg_constr.datalen * sizeof(int64_t), "LDKCVec_u64Z Elements");
+       else
+               short_channel_ids_arg_constr.data = NULL;
+       int64_t* short_channel_ids_arg_vals = short_channel_ids_arg->elems;
+       for (size_t g = 0; g < short_channel_ids_arg_constr.datalen; g++) {
+               int64_t short_channel_ids_arg_conv_6 = short_channel_ids_arg_vals[g];
+               short_channel_ids_arg_constr.data[g] = short_channel_ids_arg_conv_6;
+       }
+       FREE(short_channel_ids_arg);
+       LDKReplyChannelRange ret_var = ReplyChannelRange_new(chain_hash_arg_ref, first_blocknum_arg, number_of_blocks_arg, sync_complete_arg, short_channel_ids_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);
+       return ret_ref;
+}
+
+static inline uint64_t ReplyChannelRange_clone_ptr(LDKReplyChannelRange *NONNULL_PTR arg) {
+       LDKReplyChannelRange ret_var = ReplyChannelRange_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_ReplyChannelRange_clone_ptr(int64_t arg) {
+       LDKReplyChannelRange 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 = ReplyChannelRange_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ReplyChannelRange_clone(int64_t orig) {
+       LDKReplyChannelRange 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;
+       LDKReplyChannelRange ret_var = ReplyChannelRange_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_ReplyChannelRange_eq(int64_t a, int64_t b) {
+       LDKReplyChannelRange 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;
+       LDKReplyChannelRange 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 = ReplyChannelRange_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_QueryShortChannelIds_free(int64_t this_obj) {
+       LDKQueryShortChannelIds 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);
+       QueryShortChannelIds_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_QueryShortChannelIds_get_chain_hash(int64_t this_ptr) {
+       LDKQueryShortChannelIds 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, *QueryShortChannelIds_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_QueryShortChannelIds_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKQueryShortChannelIds 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);
+       QueryShortChannelIds_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int64_tArray  CS_LDK_QueryShortChannelIds_get_short_channel_ids(int64_t this_ptr) {
+       LDKQueryShortChannelIds 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 = QueryShortChannelIds_get_short_channel_ids(&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_QueryShortChannelIds_set_short_channel_ids(int64_t this_ptr, int64_tArray val) {
+       LDKQueryShortChannelIds 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);
+       QueryShortChannelIds_set_short_channel_ids(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_QueryShortChannelIds_new(int8_tArray chain_hash_arg, int64_tArray short_channel_ids_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);
+       LDKCVec_u64Z short_channel_ids_arg_constr;
+       short_channel_ids_arg_constr.datalen = short_channel_ids_arg->arr_len;
+       if (short_channel_ids_arg_constr.datalen > 0)
+               short_channel_ids_arg_constr.data = MALLOC(short_channel_ids_arg_constr.datalen * sizeof(int64_t), "LDKCVec_u64Z Elements");
+       else
+               short_channel_ids_arg_constr.data = NULL;
+       int64_t* short_channel_ids_arg_vals = short_channel_ids_arg->elems;
+       for (size_t g = 0; g < short_channel_ids_arg_constr.datalen; g++) {
+               int64_t short_channel_ids_arg_conv_6 = short_channel_ids_arg_vals[g];
+               short_channel_ids_arg_constr.data[g] = short_channel_ids_arg_conv_6;
+       }
+       FREE(short_channel_ids_arg);
+       LDKQueryShortChannelIds ret_var = QueryShortChannelIds_new(chain_hash_arg_ref, short_channel_ids_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);
+       return ret_ref;
+}
+
+static inline uint64_t QueryShortChannelIds_clone_ptr(LDKQueryShortChannelIds *NONNULL_PTR arg) {
+       LDKQueryShortChannelIds ret_var = QueryShortChannelIds_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_QueryShortChannelIds_clone_ptr(int64_t arg) {
+       LDKQueryShortChannelIds 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 = QueryShortChannelIds_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_QueryShortChannelIds_clone(int64_t orig) {
+       LDKQueryShortChannelIds 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;
+       LDKQueryShortChannelIds ret_var = QueryShortChannelIds_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_QueryShortChannelIds_eq(int64_t a, int64_t b) {
+       LDKQueryShortChannelIds 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;
+       LDKQueryShortChannelIds 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 = QueryShortChannelIds_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ReplyShortChannelIdsEnd_free(int64_t this_obj) {
+       LDKReplyShortChannelIdsEnd 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);
+       ReplyShortChannelIdsEnd_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ReplyShortChannelIdsEnd_get_chain_hash(int64_t this_ptr) {
+       LDKReplyShortChannelIdsEnd 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, *ReplyShortChannelIdsEnd_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ReplyShortChannelIdsEnd_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKReplyShortChannelIdsEnd 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);
+       ReplyShortChannelIdsEnd_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+jboolean  CS_LDK_ReplyShortChannelIdsEnd_get_full_information(int64_t this_ptr) {
+       LDKReplyShortChannelIdsEnd 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;
+       jboolean ret_conv = ReplyShortChannelIdsEnd_get_full_information(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ReplyShortChannelIdsEnd_set_full_information(int64_t this_ptr, jboolean val) {
+       LDKReplyShortChannelIdsEnd 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;
+       ReplyShortChannelIdsEnd_set_full_information(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ReplyShortChannelIdsEnd_new(int8_tArray chain_hash_arg, jboolean full_information_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);
+       LDKReplyShortChannelIdsEnd ret_var = ReplyShortChannelIdsEnd_new(chain_hash_arg_ref, full_information_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 ReplyShortChannelIdsEnd_clone_ptr(LDKReplyShortChannelIdsEnd *NONNULL_PTR arg) {
+       LDKReplyShortChannelIdsEnd ret_var = ReplyShortChannelIdsEnd_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_ReplyShortChannelIdsEnd_clone_ptr(int64_t arg) {
+       LDKReplyShortChannelIdsEnd 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 = ReplyShortChannelIdsEnd_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ReplyShortChannelIdsEnd_clone(int64_t orig) {
+       LDKReplyShortChannelIdsEnd 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;
+       LDKReplyShortChannelIdsEnd ret_var = ReplyShortChannelIdsEnd_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_ReplyShortChannelIdsEnd_eq(int64_t a, int64_t b) {
+       LDKReplyShortChannelIdsEnd 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;
+       LDKReplyShortChannelIdsEnd 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 = ReplyShortChannelIdsEnd_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_GossipTimestampFilter_free(int64_t this_obj) {
+       LDKGossipTimestampFilter 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);
+       GossipTimestampFilter_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_GossipTimestampFilter_get_chain_hash(int64_t this_ptr) {
+       LDKGossipTimestampFilter 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, *GossipTimestampFilter_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_GossipTimestampFilter_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKGossipTimestampFilter 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);
+       GossipTimestampFilter_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_GossipTimestampFilter_get_first_timestamp(int64_t this_ptr) {
+       LDKGossipTimestampFilter 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 = GossipTimestampFilter_get_first_timestamp(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_GossipTimestampFilter_set_first_timestamp(int64_t this_ptr, int32_t val) {
+       LDKGossipTimestampFilter 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;
+       GossipTimestampFilter_set_first_timestamp(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_GossipTimestampFilter_get_timestamp_range(int64_t this_ptr) {
+       LDKGossipTimestampFilter 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 = GossipTimestampFilter_get_timestamp_range(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_GossipTimestampFilter_set_timestamp_range(int64_t this_ptr, int32_t val) {
+       LDKGossipTimestampFilter 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;
+       GossipTimestampFilter_set_timestamp_range(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_GossipTimestampFilter_new(int8_tArray chain_hash_arg, int32_t first_timestamp_arg, int32_t timestamp_range_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);
+       LDKGossipTimestampFilter ret_var = GossipTimestampFilter_new(chain_hash_arg_ref, first_timestamp_arg, timestamp_range_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 GossipTimestampFilter_clone_ptr(LDKGossipTimestampFilter *NONNULL_PTR arg) {
+       LDKGossipTimestampFilter ret_var = GossipTimestampFilter_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_GossipTimestampFilter_clone_ptr(int64_t arg) {
+       LDKGossipTimestampFilter 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 = GossipTimestampFilter_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_GossipTimestampFilter_clone(int64_t orig) {
+       LDKGossipTimestampFilter 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;
+       LDKGossipTimestampFilter ret_var = GossipTimestampFilter_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_GossipTimestampFilter_eq(int64_t a, int64_t b) {
+       LDKGossipTimestampFilter 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;
+       LDKGossipTimestampFilter 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 = GossipTimestampFilter_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ErrorAction_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);
+       LDKErrorAction this_ptr_conv = *(LDKErrorAction*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       ErrorAction_free(this_ptr_conv);
+}
+
+static inline uint64_t ErrorAction_clone_ptr(LDKErrorAction *NONNULL_PTR arg) {
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_ErrorAction_clone_ptr(int64_t arg) {
+       LDKErrorAction* arg_conv = (LDKErrorAction*)untag_ptr(arg);
+       int64_t ret_conv = ErrorAction_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ErrorAction_clone(int64_t orig) {
+       LDKErrorAction* orig_conv = (LDKErrorAction*)untag_ptr(orig);
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ErrorAction_disconnect_peer(int64_t msg) {
+       LDKErrorMessage 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 = ErrorMessage_clone(&msg_conv);
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_disconnect_peer(msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ErrorAction_disconnect_peer_with_warning(int64_t msg) {
+       LDKWarningMessage 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 = WarningMessage_clone(&msg_conv);
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_disconnect_peer_with_warning(msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ErrorAction_ignore_error() {
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_ignore_error();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ErrorAction_ignore_and_log(int32_t a) {
+       LDKLevel a_conv = LDKLevel_from_cs(a);
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_ignore_and_log(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ErrorAction_ignore_duplicate_gossip() {
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_ignore_duplicate_gossip();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ErrorAction_send_error_message(int64_t msg) {
+       LDKErrorMessage 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 = ErrorMessage_clone(&msg_conv);
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_send_error_message(msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ErrorAction_send_warning_message(int64_t msg, int32_t log_level) {
+       LDKWarningMessage 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 = WarningMessage_clone(&msg_conv);
+       LDKLevel log_level_conv = LDKLevel_from_cs(log_level);
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_send_warning_message(msg_conv, log_level_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_LightningError_free(int64_t this_obj) {
+       LDKLightningError 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);
+       LightningError_free(this_obj_conv);
+}
+
+jstring  CS_LDK_LightningError_get_err(int64_t this_ptr) {
+       LDKLightningError 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 = LightningError_get_err(&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_LightningError_set_err(int64_t this_ptr, jstring val) {
+       LDKLightningError 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);
+       LightningError_set_err(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_LightningError_get_action(int64_t this_ptr) {
+       LDKLightningError 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;
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = LightningError_get_action(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_LightningError_set_action(int64_t this_ptr, int64_t val) {
+       LDKLightningError 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);
+       LDKErrorAction val_conv = *(LDKErrorAction*)(val_ptr);
+       val_conv = ErrorAction_clone((LDKErrorAction*)untag_ptr(val));
+       LightningError_set_action(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_LightningError_new(jstring err_arg, int64_t action_arg) {
+       LDKStr err_arg_conv = str_ref_to_owned_c(err_arg);
+       void* action_arg_ptr = untag_ptr(action_arg);
+       CHECK_ACCESS(action_arg_ptr);
+       LDKErrorAction action_arg_conv = *(LDKErrorAction*)(action_arg_ptr);
+       action_arg_conv = ErrorAction_clone((LDKErrorAction*)untag_ptr(action_arg));
+       LDKLightningError ret_var = LightningError_new(err_arg_conv, action_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 LightningError_clone_ptr(LDKLightningError *NONNULL_PTR arg) {
+       LDKLightningError ret_var = LightningError_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_LightningError_clone_ptr(int64_t arg) {
+       LDKLightningError 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 = LightningError_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_LightningError_clone(int64_t orig) {
+       LDKLightningError 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;
+       LDKLightningError ret_var = LightningError_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_CommitmentUpdate_free(int64_t this_obj) {
+       LDKCommitmentUpdate 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);
+       CommitmentUpdate_free(this_obj_conv);
+}
+
+int64_tArray  CS_LDK_CommitmentUpdate_get_update_add_htlcs(int64_t this_ptr) {
+       LDKCommitmentUpdate 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_UpdateAddHTLCZ ret_var = CommitmentUpdate_get_update_add_htlcs(&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 p = 0; p < ret_var.datalen; p++) {
+               LDKUpdateAddHTLC ret_conv_15_var = ret_var.data[p];
+               int64_t ret_conv_15_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_15_var);
+               ret_conv_15_ref = tag_ptr(ret_conv_15_var.inner, ret_conv_15_var.is_owned);
+               ret_arr_ptr[p] = ret_conv_15_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_CommitmentUpdate_set_update_add_htlcs(int64_t this_ptr, int64_tArray val) {
+       LDKCommitmentUpdate 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_UpdateAddHTLCZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKUpdateAddHTLC), "LDKCVec_UpdateAddHTLCZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t p = 0; p < val_constr.datalen; p++) {
+               int64_t val_conv_15 = val_vals[p];
+               LDKUpdateAddHTLC val_conv_15_conv;
+               val_conv_15_conv.inner = untag_ptr(val_conv_15);
+               val_conv_15_conv.is_owned = ptr_is_owned(val_conv_15);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_15_conv);
+               val_conv_15_conv = UpdateAddHTLC_clone(&val_conv_15_conv);
+               val_constr.data[p] = val_conv_15_conv;
+       }
+       FREE(val);
+       CommitmentUpdate_set_update_add_htlcs(&this_ptr_conv, val_constr);
+}
+
+int64_tArray  CS_LDK_CommitmentUpdate_get_update_fulfill_htlcs(int64_t this_ptr) {
+       LDKCommitmentUpdate 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_UpdateFulfillHTLCZ ret_var = CommitmentUpdate_get_update_fulfill_htlcs(&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 t = 0; t < ret_var.datalen; t++) {
+               LDKUpdateFulfillHTLC ret_conv_19_var = ret_var.data[t];
+               int64_t ret_conv_19_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_19_var);
+               ret_conv_19_ref = tag_ptr(ret_conv_19_var.inner, ret_conv_19_var.is_owned);
+               ret_arr_ptr[t] = ret_conv_19_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_CommitmentUpdate_set_update_fulfill_htlcs(int64_t this_ptr, int64_tArray val) {
+       LDKCommitmentUpdate 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_UpdateFulfillHTLCZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKUpdateFulfillHTLC), "LDKCVec_UpdateFulfillHTLCZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t t = 0; t < val_constr.datalen; t++) {
+               int64_t val_conv_19 = val_vals[t];
+               LDKUpdateFulfillHTLC val_conv_19_conv;
+               val_conv_19_conv.inner = untag_ptr(val_conv_19);
+               val_conv_19_conv.is_owned = ptr_is_owned(val_conv_19);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_19_conv);
+               val_conv_19_conv = UpdateFulfillHTLC_clone(&val_conv_19_conv);
+               val_constr.data[t] = val_conv_19_conv;
+       }
+       FREE(val);
+       CommitmentUpdate_set_update_fulfill_htlcs(&this_ptr_conv, val_constr);
+}
+
+int64_tArray  CS_LDK_CommitmentUpdate_get_update_fail_htlcs(int64_t this_ptr) {
+       LDKCommitmentUpdate 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_UpdateFailHTLCZ ret_var = CommitmentUpdate_get_update_fail_htlcs(&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 q = 0; q < ret_var.datalen; q++) {
+               LDKUpdateFailHTLC ret_conv_16_var = ret_var.data[q];
+               int64_t ret_conv_16_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_16_var);
+               ret_conv_16_ref = tag_ptr(ret_conv_16_var.inner, ret_conv_16_var.is_owned);
+               ret_arr_ptr[q] = ret_conv_16_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_CommitmentUpdate_set_update_fail_htlcs(int64_t this_ptr, int64_tArray val) {
+       LDKCommitmentUpdate 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_UpdateFailHTLCZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKUpdateFailHTLC), "LDKCVec_UpdateFailHTLCZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t q = 0; q < val_constr.datalen; q++) {
+               int64_t val_conv_16 = val_vals[q];
+               LDKUpdateFailHTLC val_conv_16_conv;
+               val_conv_16_conv.inner = untag_ptr(val_conv_16);
+               val_conv_16_conv.is_owned = ptr_is_owned(val_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_16_conv);
+               val_conv_16_conv = UpdateFailHTLC_clone(&val_conv_16_conv);
+               val_constr.data[q] = val_conv_16_conv;
+       }
+       FREE(val);
+       CommitmentUpdate_set_update_fail_htlcs(&this_ptr_conv, val_constr);
+}
+
+int64_tArray  CS_LDK_CommitmentUpdate_get_update_fail_malformed_htlcs(int64_t this_ptr) {
+       LDKCommitmentUpdate 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_UpdateFailMalformedHTLCZ ret_var = CommitmentUpdate_get_update_fail_malformed_htlcs(&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 z = 0; z < ret_var.datalen; z++) {
+               LDKUpdateFailMalformedHTLC ret_conv_25_var = ret_var.data[z];
+               int64_t ret_conv_25_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_25_var);
+               ret_conv_25_ref = tag_ptr(ret_conv_25_var.inner, ret_conv_25_var.is_owned);
+               ret_arr_ptr[z] = ret_conv_25_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_CommitmentUpdate_set_update_fail_malformed_htlcs(int64_t this_ptr, int64_tArray val) {
+       LDKCommitmentUpdate 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_UpdateFailMalformedHTLCZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKUpdateFailMalformedHTLC), "LDKCVec_UpdateFailMalformedHTLCZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t z = 0; z < val_constr.datalen; z++) {
+               int64_t val_conv_25 = val_vals[z];
+               LDKUpdateFailMalformedHTLC val_conv_25_conv;
+               val_conv_25_conv.inner = untag_ptr(val_conv_25);
+               val_conv_25_conv.is_owned = ptr_is_owned(val_conv_25);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_25_conv);
+               val_conv_25_conv = UpdateFailMalformedHTLC_clone(&val_conv_25_conv);
+               val_constr.data[z] = val_conv_25_conv;
+       }
+       FREE(val);
+       CommitmentUpdate_set_update_fail_malformed_htlcs(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_CommitmentUpdate_get_update_fee(int64_t this_ptr) {
+       LDKCommitmentUpdate 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;
+       LDKUpdateFee ret_var = CommitmentUpdate_get_update_fee(&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_CommitmentUpdate_set_update_fee(int64_t this_ptr, int64_t val) {
+       LDKCommitmentUpdate 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;
+       LDKUpdateFee 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 = UpdateFee_clone(&val_conv);
+       CommitmentUpdate_set_update_fee(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_CommitmentUpdate_get_commitment_signed(int64_t this_ptr) {
+       LDKCommitmentUpdate 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;
+       LDKCommitmentSigned ret_var = CommitmentUpdate_get_commitment_signed(&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_CommitmentUpdate_set_commitment_signed(int64_t this_ptr, int64_t val) {
+       LDKCommitmentUpdate 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;
+       LDKCommitmentSigned 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 = CommitmentSigned_clone(&val_conv);
+       CommitmentUpdate_set_commitment_signed(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_CommitmentUpdate_new(int64_tArray update_add_htlcs_arg, int64_tArray update_fulfill_htlcs_arg, int64_tArray update_fail_htlcs_arg, int64_tArray update_fail_malformed_htlcs_arg, int64_t update_fee_arg, int64_t commitment_signed_arg) {
+       LDKCVec_UpdateAddHTLCZ update_add_htlcs_arg_constr;
+       update_add_htlcs_arg_constr.datalen = update_add_htlcs_arg->arr_len;
+       if (update_add_htlcs_arg_constr.datalen > 0)
+               update_add_htlcs_arg_constr.data = MALLOC(update_add_htlcs_arg_constr.datalen * sizeof(LDKUpdateAddHTLC), "LDKCVec_UpdateAddHTLCZ Elements");
+       else
+               update_add_htlcs_arg_constr.data = NULL;
+       int64_t* update_add_htlcs_arg_vals = update_add_htlcs_arg->elems;
+       for (size_t p = 0; p < update_add_htlcs_arg_constr.datalen; p++) {
+               int64_t update_add_htlcs_arg_conv_15 = update_add_htlcs_arg_vals[p];
+               LDKUpdateAddHTLC update_add_htlcs_arg_conv_15_conv;
+               update_add_htlcs_arg_conv_15_conv.inner = untag_ptr(update_add_htlcs_arg_conv_15);
+               update_add_htlcs_arg_conv_15_conv.is_owned = ptr_is_owned(update_add_htlcs_arg_conv_15);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(update_add_htlcs_arg_conv_15_conv);
+               update_add_htlcs_arg_conv_15_conv = UpdateAddHTLC_clone(&update_add_htlcs_arg_conv_15_conv);
+               update_add_htlcs_arg_constr.data[p] = update_add_htlcs_arg_conv_15_conv;
+       }
+       FREE(update_add_htlcs_arg);
+       LDKCVec_UpdateFulfillHTLCZ update_fulfill_htlcs_arg_constr;
+       update_fulfill_htlcs_arg_constr.datalen = update_fulfill_htlcs_arg->arr_len;
+       if (update_fulfill_htlcs_arg_constr.datalen > 0)
+               update_fulfill_htlcs_arg_constr.data = MALLOC(update_fulfill_htlcs_arg_constr.datalen * sizeof(LDKUpdateFulfillHTLC), "LDKCVec_UpdateFulfillHTLCZ Elements");
+       else
+               update_fulfill_htlcs_arg_constr.data = NULL;
+       int64_t* update_fulfill_htlcs_arg_vals = update_fulfill_htlcs_arg->elems;
+       for (size_t t = 0; t < update_fulfill_htlcs_arg_constr.datalen; t++) {
+               int64_t update_fulfill_htlcs_arg_conv_19 = update_fulfill_htlcs_arg_vals[t];
+               LDKUpdateFulfillHTLC update_fulfill_htlcs_arg_conv_19_conv;
+               update_fulfill_htlcs_arg_conv_19_conv.inner = untag_ptr(update_fulfill_htlcs_arg_conv_19);
+               update_fulfill_htlcs_arg_conv_19_conv.is_owned = ptr_is_owned(update_fulfill_htlcs_arg_conv_19);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(update_fulfill_htlcs_arg_conv_19_conv);
+               update_fulfill_htlcs_arg_conv_19_conv = UpdateFulfillHTLC_clone(&update_fulfill_htlcs_arg_conv_19_conv);
+               update_fulfill_htlcs_arg_constr.data[t] = update_fulfill_htlcs_arg_conv_19_conv;
+       }
+       FREE(update_fulfill_htlcs_arg);
+       LDKCVec_UpdateFailHTLCZ update_fail_htlcs_arg_constr;
+       update_fail_htlcs_arg_constr.datalen = update_fail_htlcs_arg->arr_len;
+       if (update_fail_htlcs_arg_constr.datalen > 0)
+               update_fail_htlcs_arg_constr.data = MALLOC(update_fail_htlcs_arg_constr.datalen * sizeof(LDKUpdateFailHTLC), "LDKCVec_UpdateFailHTLCZ Elements");
+       else
+               update_fail_htlcs_arg_constr.data = NULL;
+       int64_t* update_fail_htlcs_arg_vals = update_fail_htlcs_arg->elems;
+       for (size_t q = 0; q < update_fail_htlcs_arg_constr.datalen; q++) {
+               int64_t update_fail_htlcs_arg_conv_16 = update_fail_htlcs_arg_vals[q];
+               LDKUpdateFailHTLC update_fail_htlcs_arg_conv_16_conv;
+               update_fail_htlcs_arg_conv_16_conv.inner = untag_ptr(update_fail_htlcs_arg_conv_16);
+               update_fail_htlcs_arg_conv_16_conv.is_owned = ptr_is_owned(update_fail_htlcs_arg_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(update_fail_htlcs_arg_conv_16_conv);
+               update_fail_htlcs_arg_conv_16_conv = UpdateFailHTLC_clone(&update_fail_htlcs_arg_conv_16_conv);
+               update_fail_htlcs_arg_constr.data[q] = update_fail_htlcs_arg_conv_16_conv;
+       }
+       FREE(update_fail_htlcs_arg);
+       LDKCVec_UpdateFailMalformedHTLCZ update_fail_malformed_htlcs_arg_constr;
+       update_fail_malformed_htlcs_arg_constr.datalen = update_fail_malformed_htlcs_arg->arr_len;
+       if (update_fail_malformed_htlcs_arg_constr.datalen > 0)
+               update_fail_malformed_htlcs_arg_constr.data = MALLOC(update_fail_malformed_htlcs_arg_constr.datalen * sizeof(LDKUpdateFailMalformedHTLC), "LDKCVec_UpdateFailMalformedHTLCZ Elements");
+       else
+               update_fail_malformed_htlcs_arg_constr.data = NULL;
+       int64_t* update_fail_malformed_htlcs_arg_vals = update_fail_malformed_htlcs_arg->elems;
+       for (size_t z = 0; z < update_fail_malformed_htlcs_arg_constr.datalen; z++) {
+               int64_t update_fail_malformed_htlcs_arg_conv_25 = update_fail_malformed_htlcs_arg_vals[z];
+               LDKUpdateFailMalformedHTLC update_fail_malformed_htlcs_arg_conv_25_conv;
+               update_fail_malformed_htlcs_arg_conv_25_conv.inner = untag_ptr(update_fail_malformed_htlcs_arg_conv_25);
+               update_fail_malformed_htlcs_arg_conv_25_conv.is_owned = ptr_is_owned(update_fail_malformed_htlcs_arg_conv_25);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(update_fail_malformed_htlcs_arg_conv_25_conv);
+               update_fail_malformed_htlcs_arg_conv_25_conv = UpdateFailMalformedHTLC_clone(&update_fail_malformed_htlcs_arg_conv_25_conv);
+               update_fail_malformed_htlcs_arg_constr.data[z] = update_fail_malformed_htlcs_arg_conv_25_conv;
+       }
+       FREE(update_fail_malformed_htlcs_arg);
+       LDKUpdateFee update_fee_arg_conv;
+       update_fee_arg_conv.inner = untag_ptr(update_fee_arg);
+       update_fee_arg_conv.is_owned = ptr_is_owned(update_fee_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_fee_arg_conv);
+       update_fee_arg_conv = UpdateFee_clone(&update_fee_arg_conv);
+       LDKCommitmentSigned commitment_signed_arg_conv;
+       commitment_signed_arg_conv.inner = untag_ptr(commitment_signed_arg);
+       commitment_signed_arg_conv.is_owned = ptr_is_owned(commitment_signed_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(commitment_signed_arg_conv);
+       commitment_signed_arg_conv = CommitmentSigned_clone(&commitment_signed_arg_conv);
+       LDKCommitmentUpdate ret_var = CommitmentUpdate_new(update_add_htlcs_arg_constr, update_fulfill_htlcs_arg_constr, update_fail_htlcs_arg_constr, update_fail_malformed_htlcs_arg_constr, update_fee_arg_conv, commitment_signed_arg_conv);
+       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 CommitmentUpdate_clone_ptr(LDKCommitmentUpdate *NONNULL_PTR arg) {
+       LDKCommitmentUpdate ret_var = CommitmentUpdate_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_CommitmentUpdate_clone_ptr(int64_t arg) {
+       LDKCommitmentUpdate 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 = CommitmentUpdate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CommitmentUpdate_clone(int64_t orig) {
+       LDKCommitmentUpdate 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;
+       LDKCommitmentUpdate ret_var = CommitmentUpdate_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_CommitmentUpdate_eq(int64_t a, int64_t b) {
+       LDKCommitmentUpdate 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;
+       LDKCommitmentUpdate 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 = CommitmentUpdate_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelMessageHandler_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);
+       LDKChannelMessageHandler this_ptr_conv = *(LDKChannelMessageHandler*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       ChannelMessageHandler_free(this_ptr_conv);
+}
+
+void  CS_LDK_RoutingMessageHandler_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);
+       LDKRoutingMessageHandler this_ptr_conv = *(LDKRoutingMessageHandler*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       RoutingMessageHandler_free(this_ptr_conv);
+}
+
+void  CS_LDK_OnionMessageHandler_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);
+       LDKOnionMessageHandler this_ptr_conv = *(LDKOnionMessageHandler*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       OnionMessageHandler_free(this_ptr_conv);
+}
+
+int8_tArray  CS_LDK_AcceptChannel_write(int64_t obj) {
+       LDKAcceptChannel 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 = AcceptChannel_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_AcceptChannel_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_AcceptChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelDecodeErrorZ), "LDKCResult_AcceptChannelDecodeErrorZ");
+       *ret_conv = AcceptChannel_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_write(int64_t obj) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_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_AcceptChannelV2_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_AcceptChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelV2DecodeErrorZ), "LDKCResult_AcceptChannelV2DecodeErrorZ");
+       *ret_conv = AcceptChannelV2_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);
+       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 = TxAddInput_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_TxAddInput_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxAddInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddInputDecodeErrorZ), "LDKCResult_TxAddInputDecodeErrorZ");
+       *ret_conv = TxAddInput_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TxAddOutput_write(int64_t obj) {
+       LDKTxAddOutput 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 = TxAddOutput_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_TxAddOutput_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxAddOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddOutputDecodeErrorZ), "LDKCResult_TxAddOutputDecodeErrorZ");
+       *ret_conv = TxAddOutput_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TxRemoveInput_write(int64_t obj) {
+       LDKTxRemoveInput 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 = TxRemoveInput_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_TxRemoveInput_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxRemoveInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveInputDecodeErrorZ), "LDKCResult_TxRemoveInputDecodeErrorZ");
+       *ret_conv = TxRemoveInput_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TxRemoveOutput_write(int64_t obj) {
+       LDKTxRemoveOutput 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 = TxRemoveOutput_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_TxRemoveOutput_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxRemoveOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveOutputDecodeErrorZ), "LDKCResult_TxRemoveOutputDecodeErrorZ");
+       *ret_conv = TxRemoveOutput_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TxComplete_write(int64_t obj) {
+       LDKTxComplete 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 = TxComplete_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_TxComplete_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxCompleteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCompleteDecodeErrorZ), "LDKCResult_TxCompleteDecodeErrorZ");
+       *ret_conv = TxComplete_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TxSignatures_write(int64_t obj) {
+       LDKTxSignatures 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 = TxSignatures_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_TxSignatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxSignaturesDecodeErrorZ), "LDKCResult_TxSignaturesDecodeErrorZ");
+       *ret_conv = TxSignatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TxInitRbf_write(int64_t obj) {
+       LDKTxInitRbf 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 = TxInitRbf_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_TxInitRbf_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxInitRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxInitRbfDecodeErrorZ), "LDKCResult_TxInitRbfDecodeErrorZ");
+       *ret_conv = TxInitRbf_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TxAckRbf_write(int64_t obj) {
+       LDKTxAckRbf 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 = TxAckRbf_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_TxAckRbf_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxAckRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAckRbfDecodeErrorZ), "LDKCResult_TxAckRbfDecodeErrorZ");
+       *ret_conv = TxAckRbf_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TxAbort_write(int64_t obj) {
+       LDKTxAbort 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 = TxAbort_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_TxAbort_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxAbortDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAbortDecodeErrorZ), "LDKCResult_TxAbortDecodeErrorZ");
+       *ret_conv = TxAbort_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_AnnouncementSignatures_write(int64_t obj) {
+       LDKAnnouncementSignatures 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 = AnnouncementSignatures_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_AnnouncementSignatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AnnouncementSignaturesDecodeErrorZ), "LDKCResult_AnnouncementSignaturesDecodeErrorZ");
+       *ret_conv = AnnouncementSignatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelReestablish_write(int64_t obj) {
+       LDKChannelReestablish 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 = ChannelReestablish_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_ChannelReestablish_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelReestablishDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReestablishDecodeErrorZ), "LDKCResult_ChannelReestablishDecodeErrorZ");
+       *ret_conv = ChannelReestablish_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ClosingSigned_write(int64_t obj) {
+       LDKClosingSigned 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 = ClosingSigned_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_ClosingSigned_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ClosingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedDecodeErrorZ), "LDKCResult_ClosingSignedDecodeErrorZ");
+       *ret_conv = ClosingSigned_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ClosingSignedFeeRange_write(int64_t obj) {
+       LDKClosingSignedFeeRange 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 = ClosingSignedFeeRange_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_ClosingSignedFeeRange_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ), "LDKCResult_ClosingSignedFeeRangeDecodeErrorZ");
+       *ret_conv = ClosingSignedFeeRange_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_CommitmentSigned_write(int64_t obj) {
+       LDKCommitmentSigned 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 = CommitmentSigned_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_CommitmentSigned_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_CommitmentSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentSignedDecodeErrorZ), "LDKCResult_CommitmentSignedDecodeErrorZ");
+       *ret_conv = CommitmentSigned_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_FundingCreated_write(int64_t obj) {
+       LDKFundingCreated 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 = FundingCreated_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_FundingCreated_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_FundingCreatedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingCreatedDecodeErrorZ), "LDKCResult_FundingCreatedDecodeErrorZ");
+       *ret_conv = FundingCreated_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_FundingSigned_write(int64_t obj) {
+       LDKFundingSigned 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 = FundingSigned_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_FundingSigned_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_FundingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingSignedDecodeErrorZ), "LDKCResult_FundingSignedDecodeErrorZ");
+       *ret_conv = FundingSigned_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelReady_write(int64_t obj) {
+       LDKChannelReady 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 = ChannelReady_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_ChannelReady_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelReadyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReadyDecodeErrorZ), "LDKCResult_ChannelReadyDecodeErrorZ");
+       *ret_conv = ChannelReady_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_Init_write(int64_t obj) {
+       LDKInit 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 = Init_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_Init_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_InitDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitDecodeErrorZ), "LDKCResult_InitDecodeErrorZ");
+       *ret_conv = Init_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_OpenChannel_write(int64_t obj) {
+       LDKOpenChannel 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 = OpenChannel_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_OpenChannel_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_OpenChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelDecodeErrorZ), "LDKCResult_OpenChannelDecodeErrorZ");
+       *ret_conv = OpenChannel_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_write(int64_t obj) {
+       LDKOpenChannelV2 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 = OpenChannelV2_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_OpenChannelV2_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_OpenChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelV2DecodeErrorZ), "LDKCResult_OpenChannelV2DecodeErrorZ");
+       *ret_conv = OpenChannelV2_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_RevokeAndACK_write(int64_t obj) {
+       LDKRevokeAndACK 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 = RevokeAndACK_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_RevokeAndACK_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RevokeAndACKDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevokeAndACKDecodeErrorZ), "LDKCResult_RevokeAndACKDecodeErrorZ");
+       *ret_conv = RevokeAndACK_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_Shutdown_write(int64_t obj) {
+       LDKShutdown 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 = Shutdown_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_Shutdown_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ShutdownDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownDecodeErrorZ), "LDKCResult_ShutdownDecodeErrorZ");
+       *ret_conv = Shutdown_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_UpdateFailHTLC_write(int64_t obj) {
+       LDKUpdateFailHTLC 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 = UpdateFailHTLC_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_UpdateFailHTLC_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailHTLCDecodeErrorZ), "LDKCResult_UpdateFailHTLCDecodeErrorZ");
+       *ret_conv = UpdateFailHTLC_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_UpdateFailMalformedHTLC_write(int64_t obj) {
+       LDKUpdateFailMalformedHTLC 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 = UpdateFailMalformedHTLC_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_UpdateFailMalformedHTLC_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ), "LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ");
+       *ret_conv = UpdateFailMalformedHTLC_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_UpdateFee_write(int64_t obj) {
+       LDKUpdateFee 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 = UpdateFee_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_UpdateFee_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UpdateFeeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFeeDecodeErrorZ), "LDKCResult_UpdateFeeDecodeErrorZ");
+       *ret_conv = UpdateFee_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_UpdateFulfillHTLC_write(int64_t obj) {
+       LDKUpdateFulfillHTLC 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 = UpdateFulfillHTLC_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_UpdateFulfillHTLC_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFulfillHTLCDecodeErrorZ), "LDKCResult_UpdateFulfillHTLCDecodeErrorZ");
+       *ret_conv = UpdateFulfillHTLC_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);
+       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 = UpdateAddHTLC_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_UpdateAddHTLC_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateAddHTLCDecodeErrorZ), "LDKCResult_UpdateAddHTLCDecodeErrorZ");
+       *ret_conv = UpdateAddHTLC_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_OnionMessage_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_OnionMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessageDecodeErrorZ), "LDKCResult_OnionMessageDecodeErrorZ");
+       *ret_conv = OnionMessage_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_OnionMessage_write(int64_t obj) {
+       LDKOnionMessage 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 = OnionMessage_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;
+}
+
+int8_tArray  CS_LDK_Ping_write(int64_t obj) {
+       LDKPing 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 = Ping_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_Ping_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PingDecodeErrorZ), "LDKCResult_PingDecodeErrorZ");
+       *ret_conv = Ping_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_Pong_write(int64_t obj) {
+       LDKPong 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 = Pong_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_Pong_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PongDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PongDecodeErrorZ), "LDKCResult_PongDecodeErrorZ");
+       *ret_conv = Pong_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_UnsignedChannelAnnouncement_write(int64_t obj) {
+       LDKUnsignedChannelAnnouncement 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 = UnsignedChannelAnnouncement_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_UnsignedChannelAnnouncement_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ), "LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ");
+       *ret_conv = UnsignedChannelAnnouncement_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelAnnouncement_write(int64_t obj) {
+       LDKChannelAnnouncement 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 = ChannelAnnouncement_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_ChannelAnnouncement_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelAnnouncementDecodeErrorZ), "LDKCResult_ChannelAnnouncementDecodeErrorZ");
+       *ret_conv = ChannelAnnouncement_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_UnsignedChannelUpdate_write(int64_t obj) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_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_UnsignedChannelUpdate_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelUpdateDecodeErrorZ), "LDKCResult_UnsignedChannelUpdateDecodeErrorZ");
+       *ret_conv = UnsignedChannelUpdate_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelUpdate_write(int64_t obj) {
+       LDKChannelUpdate 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 = ChannelUpdate_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_ChannelUpdate_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateDecodeErrorZ), "LDKCResult_ChannelUpdateDecodeErrorZ");
+       *ret_conv = ChannelUpdate_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ErrorMessage_write(int64_t obj) {
+       LDKErrorMessage 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 = ErrorMessage_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_ErrorMessage_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ErrorMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ErrorMessageDecodeErrorZ), "LDKCResult_ErrorMessageDecodeErrorZ");
+       *ret_conv = ErrorMessage_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_WarningMessage_write(int64_t obj) {
+       LDKWarningMessage 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 = WarningMessage_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_WarningMessage_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_WarningMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WarningMessageDecodeErrorZ), "LDKCResult_WarningMessageDecodeErrorZ");
+       *ret_conv = WarningMessage_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_UnsignedNodeAnnouncement_write(int64_t obj) {
+       LDKUnsignedNodeAnnouncement 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 = UnsignedNodeAnnouncement_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_UnsignedNodeAnnouncement_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ), "LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ");
+       *ret_conv = UnsignedNodeAnnouncement_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_NodeAnnouncement_write(int64_t obj) {
+       LDKNodeAnnouncement 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 = NodeAnnouncement_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_NodeAnnouncement_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_NodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementDecodeErrorZ), "LDKCResult_NodeAnnouncementDecodeErrorZ");
+       *ret_conv = NodeAnnouncement_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_QueryShortChannelIds_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryShortChannelIdsDecodeErrorZ), "LDKCResult_QueryShortChannelIdsDecodeErrorZ");
+       *ret_conv = QueryShortChannelIds_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_QueryShortChannelIds_write(int64_t obj) {
+       LDKQueryShortChannelIds 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 = QueryShortChannelIds_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;
+}
+
+int8_tArray  CS_LDK_ReplyShortChannelIdsEnd_write(int64_t obj) {
+       LDKReplyShortChannelIdsEnd 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 = ReplyShortChannelIdsEnd_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_ReplyShortChannelIdsEnd_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ), "LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ");
+       *ret_conv = ReplyShortChannelIdsEnd_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int32_t  CS_LDK_QueryChannelRange_end_blocknum(int64_t this_arg) {
+       LDKQueryChannelRange 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;
+       int32_t ret_conv = QueryChannelRange_end_blocknum(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_QueryChannelRange_write(int64_t obj) {
+       LDKQueryChannelRange 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 = QueryChannelRange_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_QueryChannelRange_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_QueryChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryChannelRangeDecodeErrorZ), "LDKCResult_QueryChannelRangeDecodeErrorZ");
+       *ret_conv = QueryChannelRange_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ReplyChannelRange_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyChannelRangeDecodeErrorZ), "LDKCResult_ReplyChannelRangeDecodeErrorZ");
+       *ret_conv = ReplyChannelRange_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ReplyChannelRange_write(int64_t obj) {
+       LDKReplyChannelRange 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 = ReplyChannelRange_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;
+}
+
+int8_tArray  CS_LDK_GossipTimestampFilter_write(int64_t obj) {
+       LDKGossipTimestampFilter 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 = GossipTimestampFilter_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_GossipTimestampFilter_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_GossipTimestampFilterDecodeErrorZ), "LDKCResult_GossipTimestampFilterDecodeErrorZ");
+       *ret_conv = GossipTimestampFilter_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CustomMessageHandler_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);
+       LDKCustomMessageHandler this_ptr_conv = *(LDKCustomMessageHandler*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       CustomMessageHandler_free(this_ptr_conv);
+}
+
+void  CS_LDK_IgnoringMessageHandler_free(int64_t this_obj) {
+       LDKIgnoringMessageHandler 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);
+       IgnoringMessageHandler_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_IgnoringMessageHandler_new() {
+       LDKIgnoringMessageHandler ret_var = IgnoringMessageHandler_new();
+       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_IgnoringMessageHandler_as_MessageSendEventsProvider(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;
+       LDKMessageSendEventsProvider* ret_ret = MALLOC(sizeof(LDKMessageSendEventsProvider), "LDKMessageSendEventsProvider");
+       *ret_ret = IgnoringMessageHandler_as_MessageSendEventsProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_IgnoringMessageHandler_as_RoutingMessageHandler(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;
+       LDKRoutingMessageHandler* ret_ret = MALLOC(sizeof(LDKRoutingMessageHandler), "LDKRoutingMessageHandler");
+       *ret_ret = IgnoringMessageHandler_as_RoutingMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_IgnoringMessageHandler_as_OnionMessageHandler(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;
+       LDKOnionMessageHandler* ret_ret = MALLOC(sizeof(LDKOnionMessageHandler), "LDKOnionMessageHandler");
+       *ret_ret = IgnoringMessageHandler_as_OnionMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_IgnoringMessageHandler_as_OffersMessageHandler(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;
+       LDKOffersMessageHandler* ret_ret = MALLOC(sizeof(LDKOffersMessageHandler), "LDKOffersMessageHandler");
+       *ret_ret = IgnoringMessageHandler_as_OffersMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_IgnoringMessageHandler_as_CustomOnionMessageHandler(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;
+       LDKCustomOnionMessageHandler* ret_ret = MALLOC(sizeof(LDKCustomOnionMessageHandler), "LDKCustomOnionMessageHandler");
+       *ret_ret = IgnoringMessageHandler_as_CustomOnionMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_IgnoringMessageHandler_as_CustomMessageReader(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;
+       LDKCustomMessageReader* ret_ret = MALLOC(sizeof(LDKCustomMessageReader), "LDKCustomMessageReader");
+       *ret_ret = IgnoringMessageHandler_as_CustomMessageReader(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_IgnoringMessageHandler_as_CustomMessageHandler(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;
+       LDKCustomMessageHandler* ret_ret = MALLOC(sizeof(LDKCustomMessageHandler), "LDKCustomMessageHandler");
+       *ret_ret = IgnoringMessageHandler_as_CustomMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_ErroringMessageHandler_free(int64_t this_obj) {
+       LDKErroringMessageHandler 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);
+       ErroringMessageHandler_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ErroringMessageHandler_new() {
+       LDKErroringMessageHandler ret_var = ErroringMessageHandler_new();
+       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_ErroringMessageHandler_as_MessageSendEventsProvider(int64_t this_arg) {
+       LDKErroringMessageHandler 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;
+       LDKMessageSendEventsProvider* ret_ret = MALLOC(sizeof(LDKMessageSendEventsProvider), "LDKMessageSendEventsProvider");
+       *ret_ret = ErroringMessageHandler_as_MessageSendEventsProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ErroringMessageHandler_as_ChannelMessageHandler(int64_t this_arg) {
+       LDKErroringMessageHandler 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;
+       LDKChannelMessageHandler* ret_ret = MALLOC(sizeof(LDKChannelMessageHandler), "LDKChannelMessageHandler");
+       *ret_ret = ErroringMessageHandler_as_ChannelMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_MessageHandler_free(int64_t this_obj) {
+       LDKMessageHandler 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);
+       MessageHandler_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_MessageHandler_get_chan_handler(int64_t this_ptr) {
+       LDKMessageHandler 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(MessageHandler_get_chan_handler(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_MessageHandler_set_chan_handler(int64_t this_ptr, int64_t val) {
+       LDKMessageHandler 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);
+       LDKChannelMessageHandler val_conv = *(LDKChannelMessageHandler*)(val_ptr);
+       if (val_conv.free == LDKChannelMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKChannelMessageHandler_JCalls_cloned(&val_conv);
+       }
+       MessageHandler_set_chan_handler(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_MessageHandler_get_route_handler(int64_t this_ptr) {
+       LDKMessageHandler 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(MessageHandler_get_route_handler(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_MessageHandler_set_route_handler(int64_t this_ptr, int64_t val) {
+       LDKMessageHandler 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);
+       LDKRoutingMessageHandler val_conv = *(LDKRoutingMessageHandler*)(val_ptr);
+       if (val_conv.free == LDKRoutingMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKRoutingMessageHandler_JCalls_cloned(&val_conv);
+       }
+       MessageHandler_set_route_handler(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_MessageHandler_get_onion_message_handler(int64_t this_ptr) {
+       LDKMessageHandler 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(MessageHandler_get_onion_message_handler(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_MessageHandler_set_onion_message_handler(int64_t this_ptr, int64_t val) {
+       LDKMessageHandler 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);
+       LDKOnionMessageHandler val_conv = *(LDKOnionMessageHandler*)(val_ptr);
+       if (val_conv.free == LDKOnionMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOnionMessageHandler_JCalls_cloned(&val_conv);
+       }
+       MessageHandler_set_onion_message_handler(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_MessageHandler_get_custom_message_handler(int64_t this_ptr) {
+       LDKMessageHandler 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(MessageHandler_get_custom_message_handler(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_MessageHandler_set_custom_message_handler(int64_t this_ptr, int64_t val) {
+       LDKMessageHandler 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);
+       LDKCustomMessageHandler val_conv = *(LDKCustomMessageHandler*)(val_ptr);
+       if (val_conv.free == LDKCustomMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKCustomMessageHandler_JCalls_cloned(&val_conv);
+       }
+       MessageHandler_set_custom_message_handler(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_MessageHandler_new(int64_t chan_handler_arg, int64_t route_handler_arg, int64_t onion_message_handler_arg, int64_t custom_message_handler_arg) {
+       void* chan_handler_arg_ptr = untag_ptr(chan_handler_arg);
+       CHECK_ACCESS(chan_handler_arg_ptr);
+       LDKChannelMessageHandler chan_handler_arg_conv = *(LDKChannelMessageHandler*)(chan_handler_arg_ptr);
+       if (chan_handler_arg_conv.free == LDKChannelMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKChannelMessageHandler_JCalls_cloned(&chan_handler_arg_conv);
+       }
+       void* route_handler_arg_ptr = untag_ptr(route_handler_arg);
+       CHECK_ACCESS(route_handler_arg_ptr);
+       LDKRoutingMessageHandler route_handler_arg_conv = *(LDKRoutingMessageHandler*)(route_handler_arg_ptr);
+       if (route_handler_arg_conv.free == LDKRoutingMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKRoutingMessageHandler_JCalls_cloned(&route_handler_arg_conv);
+       }
+       void* onion_message_handler_arg_ptr = untag_ptr(onion_message_handler_arg);
+       CHECK_ACCESS(onion_message_handler_arg_ptr);
+       LDKOnionMessageHandler onion_message_handler_arg_conv = *(LDKOnionMessageHandler*)(onion_message_handler_arg_ptr);
+       if (onion_message_handler_arg_conv.free == LDKOnionMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOnionMessageHandler_JCalls_cloned(&onion_message_handler_arg_conv);
+       }
+       void* custom_message_handler_arg_ptr = untag_ptr(custom_message_handler_arg);
+       CHECK_ACCESS(custom_message_handler_arg_ptr);
+       LDKCustomMessageHandler custom_message_handler_arg_conv = *(LDKCustomMessageHandler*)(custom_message_handler_arg_ptr);
+       if (custom_message_handler_arg_conv.free == LDKCustomMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKCustomMessageHandler_JCalls_cloned(&custom_message_handler_arg_conv);
+       }
+       LDKMessageHandler ret_var = MessageHandler_new(chan_handler_arg_conv, route_handler_arg_conv, onion_message_handler_arg_conv, custom_message_handler_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 SocketDescriptor_clone_ptr(LDKSocketDescriptor *NONNULL_PTR arg) {
+       LDKSocketDescriptor* ret_ret = MALLOC(sizeof(LDKSocketDescriptor), "LDKSocketDescriptor");
+       *ret_ret = SocketDescriptor_clone(arg);
+       return tag_ptr(ret_ret, true);
+}
+int64_t  CS_LDK_SocketDescriptor_clone_ptr(int64_t arg) {
+       void* arg_ptr = untag_ptr(arg);
+       if (ptr_is_owned(arg)) { CHECK_ACCESS(arg_ptr); }
+       LDKSocketDescriptor* arg_conv = (LDKSocketDescriptor*)arg_ptr;
+       int64_t ret_conv = SocketDescriptor_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SocketDescriptor_clone(int64_t orig) {
+       void* orig_ptr = untag_ptr(orig);
+       if (ptr_is_owned(orig)) { CHECK_ACCESS(orig_ptr); }
+       LDKSocketDescriptor* orig_conv = (LDKSocketDescriptor*)orig_ptr;
+       LDKSocketDescriptor* ret_ret = MALLOC(sizeof(LDKSocketDescriptor), "LDKSocketDescriptor");
+       *ret_ret = SocketDescriptor_clone(orig_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_SocketDescriptor_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);
+       LDKSocketDescriptor this_ptr_conv = *(LDKSocketDescriptor*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       SocketDescriptor_free(this_ptr_conv);
+}
+
+void  CS_LDK_PeerHandleError_free(int64_t this_obj) {
+       LDKPeerHandleError 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);
+       PeerHandleError_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_PeerHandleError_new() {
+       LDKPeerHandleError ret_var = PeerHandleError_new();
+       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 PeerHandleError_clone_ptr(LDKPeerHandleError *NONNULL_PTR arg) {
+       LDKPeerHandleError ret_var = PeerHandleError_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_PeerHandleError_clone_ptr(int64_t arg) {
+       LDKPeerHandleError 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 = PeerHandleError_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PeerHandleError_clone(int64_t orig) {
+       LDKPeerHandleError 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;
+       LDKPeerHandleError ret_var = PeerHandleError_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_PeerManager_free(int64_t this_obj) {
+       LDKPeerManager 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);
+       PeerManager_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_PeerManager_new(int64_t message_handler, int32_t current_time, int8_tArray ephemeral_random_data, int64_t logger, int64_t node_signer) {
+       LDKMessageHandler message_handler_conv;
+       message_handler_conv.inner = untag_ptr(message_handler);
+       message_handler_conv.is_owned = ptr_is_owned(message_handler);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(message_handler_conv);
+       // WARNING: we need a move here but no clone is available for LDKMessageHandler
+       
+       uint8_t ephemeral_random_data_arr[32];
+       CHECK(ephemeral_random_data->arr_len == 32);
+       memcpy(ephemeral_random_data_arr, ephemeral_random_data->elems, 32); FREE(ephemeral_random_data);
+       uint8_t (*ephemeral_random_data_ref)[32] = &ephemeral_random_data_arr;
+       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);
+       }
+       void* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_conv);
+       }
+       LDKPeerManager ret_var = PeerManager_new(message_handler_conv, current_time, ephemeral_random_data_ref, logger_conv, node_signer_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_tArray  CS_LDK_PeerManager_get_peer_node_ids(int64_t this_arg) {
+       LDKPeerManager 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;
+       LDKCVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ ret_var = PeerManager_get_peer_node_ids(&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 r = 0; r < ret_var.datalen; r++) {
+               LDKC2Tuple_PublicKeyCOption_SocketAddressZZ* ret_conv_43_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ), "LDKC2Tuple_PublicKeyCOption_SocketAddressZZ");
+               *ret_conv_43_conv = ret_var.data[r];
+               ret_arr_ptr[r] = tag_ptr(ret_conv_43_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_PeerManager_new_outbound_connection(int64_t this_arg, int8_tArray their_node_id, int64_t descriptor, int64_t remote_network_address) {
+       LDKPeerManager 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;
+       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);
+       void* descriptor_ptr = untag_ptr(descriptor);
+       CHECK_ACCESS(descriptor_ptr);
+       LDKSocketDescriptor descriptor_conv = *(LDKSocketDescriptor*)(descriptor_ptr);
+       if (descriptor_conv.free == LDKSocketDescriptor_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKSocketDescriptor_JCalls_cloned(&descriptor_conv);
+       }
+       void* remote_network_address_ptr = untag_ptr(remote_network_address);
+       CHECK_ACCESS(remote_network_address_ptr);
+       LDKCOption_SocketAddressZ remote_network_address_conv = *(LDKCOption_SocketAddressZ*)(remote_network_address_ptr);
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZPeerHandleErrorZ), "LDKCResult_CVec_u8ZPeerHandleErrorZ");
+       *ret_conv = PeerManager_new_outbound_connection(&this_arg_conv, their_node_id_ref, descriptor_conv, remote_network_address_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PeerManager_new_inbound_connection(int64_t this_arg, int64_t descriptor, int64_t remote_network_address) {
+       LDKPeerManager 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;
+       void* descriptor_ptr = untag_ptr(descriptor);
+       CHECK_ACCESS(descriptor_ptr);
+       LDKSocketDescriptor descriptor_conv = *(LDKSocketDescriptor*)(descriptor_ptr);
+       if (descriptor_conv.free == LDKSocketDescriptor_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKSocketDescriptor_JCalls_cloned(&descriptor_conv);
+       }
+       void* remote_network_address_ptr = untag_ptr(remote_network_address);
+       CHECK_ACCESS(remote_network_address_ptr);
+       LDKCOption_SocketAddressZ remote_network_address_conv = *(LDKCOption_SocketAddressZ*)(remote_network_address_ptr);
+       LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
+       *ret_conv = PeerManager_new_inbound_connection(&this_arg_conv, descriptor_conv, remote_network_address_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PeerManager_write_buffer_space_avail(int64_t this_arg, int64_t descriptor) {
+       LDKPeerManager 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;
+       void* descriptor_ptr = untag_ptr(descriptor);
+       if (ptr_is_owned(descriptor)) { CHECK_ACCESS(descriptor_ptr); }
+       LDKSocketDescriptor* descriptor_conv = (LDKSocketDescriptor*)descriptor_ptr;
+       LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
+       *ret_conv = PeerManager_write_buffer_space_avail(&this_arg_conv, descriptor_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PeerManager_read_event(int64_t this_arg, int64_t peer_descriptor, int8_tArray data) {
+       LDKPeerManager 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;
+       void* peer_descriptor_ptr = untag_ptr(peer_descriptor);
+       if (ptr_is_owned(peer_descriptor)) { CHECK_ACCESS(peer_descriptor_ptr); }
+       LDKSocketDescriptor* peer_descriptor_conv = (LDKSocketDescriptor*)peer_descriptor_ptr;
+       LDKu8slice data_ref;
+       data_ref.datalen = data->arr_len;
+       data_ref.data = data->elems;
+       LDKCResult_boolPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolPeerHandleErrorZ), "LDKCResult_boolPeerHandleErrorZ");
+       *ret_conv = PeerManager_read_event(&this_arg_conv, peer_descriptor_conv, data_ref);
+       FREE(data);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_PeerManager_process_events(int64_t this_arg) {
+       LDKPeerManager 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;
+       PeerManager_process_events(&this_arg_conv);
+}
+
+void  CS_LDK_PeerManager_socket_disconnected(int64_t this_arg, int64_t descriptor) {
+       LDKPeerManager 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;
+       void* descriptor_ptr = untag_ptr(descriptor);
+       if (ptr_is_owned(descriptor)) { CHECK_ACCESS(descriptor_ptr); }
+       LDKSocketDescriptor* descriptor_conv = (LDKSocketDescriptor*)descriptor_ptr;
+       PeerManager_socket_disconnected(&this_arg_conv, descriptor_conv);
+}
+
+void  CS_LDK_PeerManager_disconnect_by_node_id(int64_t this_arg, int8_tArray node_id) {
+       LDKPeerManager 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;
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       PeerManager_disconnect_by_node_id(&this_arg_conv, node_id_ref);
+}
+
+void  CS_LDK_PeerManager_disconnect_all_peers(int64_t this_arg) {
+       LDKPeerManager 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;
+       PeerManager_disconnect_all_peers(&this_arg_conv);
+}
+
+void  CS_LDK_PeerManager_timer_tick_occurred(int64_t this_arg) {
+       LDKPeerManager 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;
+       PeerManager_timer_tick_occurred(&this_arg_conv);
+}
+
+void  CS_LDK_PeerManager_broadcast_node_announcement(int64_t this_arg, int8_tArray rgb, int8_tArray alias, int64_tArray addresses) {
+       LDKPeerManager 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;
+       LDKThreeBytes rgb_ref;
+       CHECK(rgb->arr_len == 3);
+       memcpy(rgb_ref.data, rgb->elems, 3); FREE(rgb);
+       LDKThirtyTwoBytes alias_ref;
+       CHECK(alias->arr_len == 32);
+       memcpy(alias_ref.data, alias->elems, 32); FREE(alias);
+       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);
+       PeerManager_broadcast_node_announcement(&this_arg_conv, rgb_ref, alias_ref, addresses_constr);
+}
+
+int64_t  CS_LDK_htlc_success_tx_weight(int64_t channel_type_features) {
+       LDKChannelTypeFeatures channel_type_features_conv;
+       channel_type_features_conv.inner = untag_ptr(channel_type_features);
+       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;
+       int64_t ret_conv = htlc_success_tx_weight(&channel_type_features_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_htlc_timeout_tx_weight(int64_t channel_type_features) {
+       LDKChannelTypeFeatures channel_type_features_conv;
+       channel_type_features_conv.inner = untag_ptr(channel_type_features);
+       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;
+       int64_t ret_conv = htlc_timeout_tx_weight(&channel_type_features_conv);
+       return ret_conv;
+}
+
+int32_t  CS_LDK_HTLCClaim_clone(int64_t orig) {
+       LDKHTLCClaim* orig_conv = (LDKHTLCClaim*)untag_ptr(orig);
+       int32_t ret_conv = LDKHTLCClaim_to_cs(HTLCClaim_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_HTLCClaim_offered_timeout() {
+       int32_t ret_conv = LDKHTLCClaim_to_cs(HTLCClaim_offered_timeout());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_HTLCClaim_offered_preimage() {
+       int32_t ret_conv = LDKHTLCClaim_to_cs(HTLCClaim_offered_preimage());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_HTLCClaim_accepted_timeout() {
+       int32_t ret_conv = LDKHTLCClaim_to_cs(HTLCClaim_accepted_timeout());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_HTLCClaim_accepted_preimage() {
+       int32_t ret_conv = LDKHTLCClaim_to_cs(HTLCClaim_accepted_preimage());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_HTLCClaim_revocation() {
+       int32_t ret_conv = LDKHTLCClaim_to_cs(HTLCClaim_revocation());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_HTLCClaim_eq(int64_t a, int64_t b) {
+       LDKHTLCClaim* a_conv = (LDKHTLCClaim*)untag_ptr(a);
+       LDKHTLCClaim* b_conv = (LDKHTLCClaim*)untag_ptr(b);
+       jboolean ret_conv = HTLCClaim_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_HTLCClaim_from_witness(int8_tArray witness) {
+       LDKWitness witness_ref;
+       witness_ref.datalen = witness->arr_len;
+       witness_ref.data = MALLOC(witness_ref.datalen, "LDKWitness Bytes");
+       memcpy(witness_ref.data, witness->elems, witness_ref.datalen); FREE(witness);
+       witness_ref.data_is_owned = true;
+       LDKCOption_HTLCClaimZ *ret_copy = MALLOC(sizeof(LDKCOption_HTLCClaimZ), "LDKCOption_HTLCClaimZ");
+       *ret_copy = HTLCClaim_from_witness(witness_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_build_commitment_secret(int8_tArray commitment_seed, int64_t idx) {
+       uint8_t commitment_seed_arr[32];
+       CHECK(commitment_seed->arr_len == 32);
+       memcpy(commitment_seed_arr, commitment_seed->elems, 32); FREE(commitment_seed);
+       uint8_t (*commitment_seed_ref)[32] = &commitment_seed_arr;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, build_commitment_secret(commitment_seed_ref, idx).data, 32);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_build_closing_transaction(int64_t to_holder_value_sat, int64_t to_counterparty_value_sat, int8_tArray to_holder_script, int8_tArray to_counterparty_script, int64_t funding_outpoint) {
+       LDKCVec_u8Z to_holder_script_ref;
+       to_holder_script_ref.datalen = to_holder_script->arr_len;
+       to_holder_script_ref.data = MALLOC(to_holder_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(to_holder_script_ref.data, to_holder_script->elems, to_holder_script_ref.datalen); FREE(to_holder_script);
+       LDKCVec_u8Z to_counterparty_script_ref;
+       to_counterparty_script_ref.datalen = to_counterparty_script->arr_len;
+       to_counterparty_script_ref.data = MALLOC(to_counterparty_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(to_counterparty_script_ref.data, to_counterparty_script->elems, to_counterparty_script_ref.datalen); FREE(to_counterparty_script);
+       LDKOutPoint funding_outpoint_conv;
+       funding_outpoint_conv.inner = untag_ptr(funding_outpoint);
+       funding_outpoint_conv.is_owned = ptr_is_owned(funding_outpoint);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_outpoint_conv);
+       funding_outpoint_conv = OutPoint_clone(&funding_outpoint_conv);
+       LDKTransaction ret_var = build_closing_transaction(to_holder_value_sat, to_counterparty_value_sat, to_holder_script_ref, to_counterparty_script_ref, funding_outpoint_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);
+       return ret_arr;
+}
+
+void  CS_LDK_CounterpartyCommitmentSecrets_free(int64_t this_obj) {
+       LDKCounterpartyCommitmentSecrets 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);
+       CounterpartyCommitmentSecrets_free(this_obj_conv);
+}
+
+static inline uint64_t CounterpartyCommitmentSecrets_clone_ptr(LDKCounterpartyCommitmentSecrets *NONNULL_PTR arg) {
+       LDKCounterpartyCommitmentSecrets ret_var = CounterpartyCommitmentSecrets_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_CounterpartyCommitmentSecrets_clone_ptr(int64_t arg) {
+       LDKCounterpartyCommitmentSecrets 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 = CounterpartyCommitmentSecrets_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CounterpartyCommitmentSecrets_clone(int64_t orig) {
+       LDKCounterpartyCommitmentSecrets 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;
+       LDKCounterpartyCommitmentSecrets ret_var = CounterpartyCommitmentSecrets_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_CounterpartyCommitmentSecrets_new() {
+       LDKCounterpartyCommitmentSecrets ret_var = CounterpartyCommitmentSecrets_new();
+       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_CounterpartyCommitmentSecrets_get_min_seen_secret(int64_t this_arg) {
+       LDKCounterpartyCommitmentSecrets 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 = CounterpartyCommitmentSecrets_get_min_seen_secret(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CounterpartyCommitmentSecrets_provide_secret(int64_t this_arg, int64_t idx, int8_tArray secret) {
+       LDKCounterpartyCommitmentSecrets 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;
+       LDKThirtyTwoBytes secret_ref;
+       CHECK(secret->arr_len == 32);
+       memcpy(secret_ref.data, secret->elems, 32); FREE(secret);
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = CounterpartyCommitmentSecrets_provide_secret(&this_arg_conv, idx, secret_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_CounterpartyCommitmentSecrets_get_secret(int64_t this_arg, int64_t idx) {
+       LDKCounterpartyCommitmentSecrets 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, CounterpartyCommitmentSecrets_get_secret(&this_arg_conv, idx).data, 32);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_CounterpartyCommitmentSecrets_write(int64_t obj) {
+       LDKCounterpartyCommitmentSecrets 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 = CounterpartyCommitmentSecrets_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_CounterpartyCommitmentSecrets_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ), "LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ");
+       *ret_conv = CounterpartyCommitmentSecrets_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_derive_private_key(int8_tArray per_commitment_point, int8_tArray base_secret) {
+       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);
+       uint8_t base_secret_arr[32];
+       CHECK(base_secret->arr_len == 32);
+       memcpy(base_secret_arr, base_secret->elems, 32); FREE(base_secret);
+       uint8_t (*base_secret_ref)[32] = &base_secret_arr;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, derive_private_key(per_commitment_point_ref, base_secret_ref).bytes, 32);
+       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);
+       memcpy(per_commitment_secret_arr, per_commitment_secret->elems, 32); FREE(per_commitment_secret);
+       uint8_t (*per_commitment_secret_ref)[32] = &per_commitment_secret_arr;
+       uint8_t countersignatory_revocation_base_secret_arr[32];
+       CHECK(countersignatory_revocation_base_secret->arr_len == 32);
+       memcpy(countersignatory_revocation_base_secret_arr, countersignatory_revocation_base_secret->elems, 32); FREE(countersignatory_revocation_base_secret);
+       uint8_t (*countersignatory_revocation_base_secret_ref)[32] = &countersignatory_revocation_base_secret_arr;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, derive_private_revocation_key(per_commitment_secret_ref, countersignatory_revocation_base_secret_ref).bytes, 32);
+       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);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       TxCreationKeys_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxCreationKeys_get_per_commitment_point(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_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_TxCreationKeys_set_per_commitment_point(int64_t this_ptr, int8_tArray 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_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  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;
+}
+
+void  CS_LDK_TxCreationKeys_set_revocation_key(int64_t this_ptr, int8_tArray 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);
+}
+
+int8_tArray  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;
+}
+
+void  CS_LDK_TxCreationKeys_set_broadcaster_htlc_key(int64_t this_ptr, int8_tArray 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);
+}
+
+int8_tArray  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;
+}
+
+void  CS_LDK_TxCreationKeys_set_countersignatory_htlc_key(int64_t this_ptr, int8_tArray 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);
+}
+
+int8_tArray  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;
+}
+
+void  CS_LDK_TxCreationKeys_set_broadcaster_delayed_payment_key(int64_t this_ptr, int8_tArray 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);
+}
+
+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) {
+       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);
+       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_TxCreationKeys_eq(int64_t a, int64_t b) {
+       LDKTxCreationKeys 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;
+       LDKTxCreationKeys 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 = TxCreationKeys_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t TxCreationKeys_clone_ptr(LDKTxCreationKeys *NONNULL_PTR arg) {
+       LDKTxCreationKeys ret_var = TxCreationKeys_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_TxCreationKeys_clone_ptr(int64_t arg) {
+       LDKTxCreationKeys 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 = TxCreationKeys_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxCreationKeys_clone(int64_t orig) {
+       LDKTxCreationKeys 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;
+       LDKTxCreationKeys ret_var = TxCreationKeys_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_TxCreationKeys_write(int64_t obj) {
+       LDKTxCreationKeys 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 = TxCreationKeys_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_TxCreationKeys_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxCreationKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCreationKeysDecodeErrorZ), "LDKCResult_TxCreationKeysDecodeErrorZ");
+       *ret_conv = TxCreationKeys_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelPublicKeys_free(int64_t this_obj) {
+       LDKChannelPublicKeys 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);
+       ChannelPublicKeys_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ChannelPublicKeys_get_funding_pubkey(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_funding_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelPublicKeys_set_funding_pubkey(int64_t this_ptr, int8_tArray 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_funding_pubkey(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  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;
+}
+
+void  CS_LDK_ChannelPublicKeys_set_revocation_basepoint(int64_t this_ptr, int8_tArray 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);
+}
+
+int8_tArray  CS_LDK_ChannelPublicKeys_get_payment_point(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_payment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelPublicKeys_set_payment_point(int64_t this_ptr, int8_tArray 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_payment_point(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  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;
+}
+
+void  CS_LDK_ChannelPublicKeys_set_delayed_payment_basepoint(int64_t this_ptr, int8_tArray 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);
+}
+
+int8_tArray  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;
+}
+
+void  CS_LDK_ChannelPublicKeys_set_htlc_basepoint(int64_t this_ptr, int8_tArray 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);
+}
+
+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) {
+       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);
+       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);
+       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 ChannelPublicKeys_clone_ptr(LDKChannelPublicKeys *NONNULL_PTR arg) {
+       LDKChannelPublicKeys ret_var = ChannelPublicKeys_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_ChannelPublicKeys_clone_ptr(int64_t arg) {
+       LDKChannelPublicKeys 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 = ChannelPublicKeys_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelPublicKeys_clone(int64_t orig) {
+       LDKChannelPublicKeys 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;
+       LDKChannelPublicKeys ret_var = ChannelPublicKeys_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_ChannelPublicKeys_hash(int64_t o) {
+       LDKChannelPublicKeys 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 = ChannelPublicKeys_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelPublicKeys_eq(int64_t a, int64_t b) {
+       LDKChannelPublicKeys 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;
+       LDKChannelPublicKeys 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 = ChannelPublicKeys_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_ChannelPublicKeys_write(int64_t obj) {
+       LDKChannelPublicKeys 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 = ChannelPublicKeys_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_ChannelPublicKeys_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelPublicKeysDecodeErrorZ), "LDKCResult_ChannelPublicKeysDecodeErrorZ");
+       *ret_conv = ChannelPublicKeys_read(ser_ref);
+       FREE(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) {
+       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);
+       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_TxCreationKeys_from_channel_static_keys(int8_tArray per_commitment_point, int64_t broadcaster_keys, int64_t countersignatory_keys) {
+       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);
+       LDKChannelPublicKeys broadcaster_keys_conv;
+       broadcaster_keys_conv.inner = untag_ptr(broadcaster_keys);
+       broadcaster_keys_conv.is_owned = ptr_is_owned(broadcaster_keys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(broadcaster_keys_conv);
+       broadcaster_keys_conv.is_owned = false;
+       LDKChannelPublicKeys countersignatory_keys_conv;
+       countersignatory_keys_conv.inner = untag_ptr(countersignatory_keys);
+       countersignatory_keys_conv.is_owned = ptr_is_owned(countersignatory_keys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(countersignatory_keys_conv);
+       countersignatory_keys_conv.is_owned = false;
+       LDKTxCreationKeys ret_var = TxCreationKeys_from_channel_static_keys(per_commitment_point_ref, &broadcaster_keys_conv, &countersignatory_keys_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_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 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;
+}
+
+int8_tArray  CS_LDK_get_counterparty_payment_script(int64_t channel_type_features, int8_tArray payment_key) {
+       LDKChannelTypeFeatures channel_type_features_conv;
+       channel_type_features_conv.inner = untag_ptr(channel_type_features);
+       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 payment_key_ref;
+       CHECK(payment_key->arr_len == 33);
+       memcpy(payment_key_ref.compressed_form, payment_key->elems, 33); FREE(payment_key);
+       LDKCVec_u8Z ret_var = get_counterparty_payment_script(&channel_type_features_conv, payment_key_ref);
+       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_HTLCOutputInCommitment_free(int64_t this_obj) {
+       LDKHTLCOutputInCommitment 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);
+       HTLCOutputInCommitment_free(this_obj_conv);
+}
+
+jboolean  CS_LDK_HTLCOutputInCommitment_get_offered(int64_t this_ptr) {
+       LDKHTLCOutputInCommitment 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;
+       jboolean ret_conv = HTLCOutputInCommitment_get_offered(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_HTLCOutputInCommitment_set_offered(int64_t this_ptr, jboolean val) {
+       LDKHTLCOutputInCommitment 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;
+       HTLCOutputInCommitment_set_offered(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_HTLCOutputInCommitment_get_amount_msat(int64_t this_ptr) {
+       LDKHTLCOutputInCommitment 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 = HTLCOutputInCommitment_get_amount_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_HTLCOutputInCommitment_set_amount_msat(int64_t this_ptr, int64_t val) {
+       LDKHTLCOutputInCommitment 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;
+       HTLCOutputInCommitment_set_amount_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_HTLCOutputInCommitment_get_cltv_expiry(int64_t this_ptr) {
+       LDKHTLCOutputInCommitment 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 = HTLCOutputInCommitment_get_cltv_expiry(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_HTLCOutputInCommitment_set_cltv_expiry(int64_t this_ptr, int32_t val) {
+       LDKHTLCOutputInCommitment 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;
+       HTLCOutputInCommitment_set_cltv_expiry(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_HTLCOutputInCommitment_get_payment_hash(int64_t this_ptr) {
+       LDKHTLCOutputInCommitment 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, *HTLCOutputInCommitment_get_payment_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_HTLCOutputInCommitment_set_payment_hash(int64_t this_ptr, int8_tArray val) {
+       LDKHTLCOutputInCommitment 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);
+       HTLCOutputInCommitment_set_payment_hash(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_HTLCOutputInCommitment_get_transaction_output_index(int64_t this_ptr) {
+       LDKHTLCOutputInCommitment 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_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = HTLCOutputInCommitment_get_transaction_output_index(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_HTLCOutputInCommitment_set_transaction_output_index(int64_t this_ptr, int64_t val) {
+       LDKHTLCOutputInCommitment 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_u32Z val_conv = *(LDKCOption_u32Z*)(val_ptr);
+       val_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(val));
+       HTLCOutputInCommitment_set_transaction_output_index(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_HTLCOutputInCommitment_new(jboolean offered_arg, int64_t amount_msat_arg, int32_t cltv_expiry_arg, int8_tArray payment_hash_arg, int64_t transaction_output_index_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* transaction_output_index_arg_ptr = untag_ptr(transaction_output_index_arg);
+       CHECK_ACCESS(transaction_output_index_arg_ptr);
+       LDKCOption_u32Z transaction_output_index_arg_conv = *(LDKCOption_u32Z*)(transaction_output_index_arg_ptr);
+       transaction_output_index_arg_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(transaction_output_index_arg));
+       LDKHTLCOutputInCommitment ret_var = HTLCOutputInCommitment_new(offered_arg, amount_msat_arg, cltv_expiry_arg, payment_hash_arg_ref, transaction_output_index_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 HTLCOutputInCommitment_clone_ptr(LDKHTLCOutputInCommitment *NONNULL_PTR arg) {
+       LDKHTLCOutputInCommitment ret_var = HTLCOutputInCommitment_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_HTLCOutputInCommitment_clone_ptr(int64_t arg) {
+       LDKHTLCOutputInCommitment 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 = HTLCOutputInCommitment_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_HTLCOutputInCommitment_clone(int64_t orig) {
+       LDKHTLCOutputInCommitment 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;
+       LDKHTLCOutputInCommitment ret_var = HTLCOutputInCommitment_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_HTLCOutputInCommitment_eq(int64_t a, int64_t b) {
+       LDKHTLCOutputInCommitment 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;
+       LDKHTLCOutputInCommitment 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 = HTLCOutputInCommitment_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_HTLCOutputInCommitment_write(int64_t obj) {
+       LDKHTLCOutputInCommitment 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 = HTLCOutputInCommitment_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_HTLCOutputInCommitment_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ), "LDKCResult_HTLCOutputInCommitmentDecodeErrorZ");
+       *ret_conv = HTLCOutputInCommitment_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_get_htlc_redeemscript(int64_t htlc, int64_t channel_type_features, int64_t keys) {
+       LDKHTLCOutputInCommitment htlc_conv;
+       htlc_conv.inner = untag_ptr(htlc);
+       htlc_conv.is_owned = ptr_is_owned(htlc);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_conv);
+       htlc_conv.is_owned = false;
+       LDKChannelTypeFeatures channel_type_features_conv;
+       channel_type_features_conv.inner = untag_ptr(channel_type_features);
+       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;
+       LDKTxCreationKeys keys_conv;
+       keys_conv.inner = untag_ptr(keys);
+       keys_conv.is_owned = ptr_is_owned(keys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(keys_conv);
+       keys_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = get_htlc_redeemscript(&htlc_conv, &channel_type_features_conv, &keys_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;
+}
+
+int8_tArray  CS_LDK_make_funding_redeemscript(int8_tArray broadcaster, int8_tArray countersignatory) {
+       LDKPublicKey broadcaster_ref;
+       CHECK(broadcaster->arr_len == 33);
+       memcpy(broadcaster_ref.compressed_form, broadcaster->elems, 33); FREE(broadcaster);
+       LDKPublicKey countersignatory_ref;
+       CHECK(countersignatory->arr_len == 33);
+       memcpy(countersignatory_ref.compressed_form, countersignatory->elems, 33); FREE(countersignatory);
+       LDKCVec_u8Z ret_var = make_funding_redeemscript(broadcaster_ref, countersignatory_ref);
+       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;
+}
+
+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) {
+       uint8_t commitment_txid_arr[32];
+       CHECK(commitment_txid->arr_len == 32);
+       memcpy(commitment_txid_arr, commitment_txid->elems, 32); FREE(commitment_txid);
+       uint8_t (*commitment_txid_ref)[32] = &commitment_txid_arr;
+       LDKHTLCOutputInCommitment htlc_conv;
+       htlc_conv.inner = untag_ptr(htlc);
+       htlc_conv.is_owned = ptr_is_owned(htlc);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_conv);
+       htlc_conv.is_owned = false;
+       LDKChannelTypeFeatures channel_type_features_conv;
+       channel_type_features_conv.inner = untag_ptr(channel_type_features);
+       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);
+       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);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_build_htlc_input_witness(int8_tArray local_sig, int8_tArray remote_sig, int64_t preimage, int8_tArray redeem_script, int64_t channel_type_features) {
+       LDKECDSASignature local_sig_ref;
+       CHECK(local_sig->arr_len == 64);
+       memcpy(local_sig_ref.compact_form, local_sig->elems, 64); FREE(local_sig);
+       LDKECDSASignature remote_sig_ref;
+       CHECK(remote_sig->arr_len == 64);
+       memcpy(remote_sig_ref.compact_form, remote_sig->elems, 64); FREE(remote_sig);
+       void* preimage_ptr = untag_ptr(preimage);
+       CHECK_ACCESS(preimage_ptr);
+       LDKCOption_ThirtyTwoBytesZ preimage_conv = *(LDKCOption_ThirtyTwoBytesZ*)(preimage_ptr);
+       preimage_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(preimage));
+       LDKu8slice redeem_script_ref;
+       redeem_script_ref.datalen = redeem_script->arr_len;
+       redeem_script_ref.data = redeem_script->elems;
+       LDKChannelTypeFeatures channel_type_features_conv;
+       channel_type_features_conv.inner = untag_ptr(channel_type_features);
+       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;
+       LDKWitness ret_var = build_htlc_input_witness(local_sig_ref, remote_sig_ref, preimage_conv, redeem_script_ref, &channel_type_features_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);
+       FREE(redeem_script);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_get_to_countersignatory_with_anchors_redeemscript(int8_tArray payment_point) {
+       LDKPublicKey payment_point_ref;
+       CHECK(payment_point->arr_len == 33);
+       memcpy(payment_point_ref.compressed_form, payment_point->elems, 33); FREE(payment_point);
+       LDKCVec_u8Z ret_var = get_to_countersignatory_with_anchors_redeemscript(payment_point_ref);
+       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;
+}
+
+int8_tArray  CS_LDK_get_anchor_redeemscript(int8_tArray funding_pubkey) {
+       LDKPublicKey funding_pubkey_ref;
+       CHECK(funding_pubkey->arr_len == 33);
+       memcpy(funding_pubkey_ref.compressed_form, funding_pubkey->elems, 33); FREE(funding_pubkey);
+       LDKCVec_u8Z ret_var = get_anchor_redeemscript(funding_pubkey_ref);
+       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;
+}
+
+int8_tArray  CS_LDK_build_anchor_input_witness(int8_tArray funding_key, int8_tArray funding_sig) {
+       LDKPublicKey funding_key_ref;
+       CHECK(funding_key->arr_len == 33);
+       memcpy(funding_key_ref.compressed_form, funding_key->elems, 33); FREE(funding_key);
+       LDKECDSASignature funding_sig_ref;
+       CHECK(funding_sig->arr_len == 64);
+       memcpy(funding_sig_ref.compact_form, funding_sig->elems, 64); FREE(funding_sig);
+       LDKWitness ret_var = build_anchor_input_witness(funding_key_ref, funding_sig_ref);
+       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;
+}
+
+void  CS_LDK_ChannelTransactionParameters_free(int64_t this_obj) {
+       LDKChannelTransactionParameters 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);
+       ChannelTransactionParameters_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChannelTransactionParameters_get_holder_pubkeys(int64_t this_ptr) {
+       LDKChannelTransactionParameters 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;
+       LDKChannelPublicKeys ret_var = ChannelTransactionParameters_get_holder_pubkeys(&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_ChannelTransactionParameters_set_holder_pubkeys(int64_t this_ptr, int64_t val) {
+       LDKChannelTransactionParameters 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;
+       LDKChannelPublicKeys 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 = ChannelPublicKeys_clone(&val_conv);
+       ChannelTransactionParameters_set_holder_pubkeys(&this_ptr_conv, val_conv);
+}
+
+int16_t  CS_LDK_ChannelTransactionParameters_get_holder_selected_contest_delay(int64_t this_ptr) {
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_get_holder_selected_contest_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelTransactionParameters_set_holder_selected_contest_delay(int64_t this_ptr, int16_t val) {
+       LDKChannelTransactionParameters 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;
+       ChannelTransactionParameters_set_holder_selected_contest_delay(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelTransactionParameters_get_is_outbound_from_holder(int64_t this_ptr) {
+       LDKChannelTransactionParameters 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;
+       jboolean ret_conv = ChannelTransactionParameters_get_is_outbound_from_holder(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelTransactionParameters_set_is_outbound_from_holder(int64_t this_ptr, jboolean val) {
+       LDKChannelTransactionParameters 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;
+       ChannelTransactionParameters_set_is_outbound_from_holder(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelTransactionParameters_get_counterparty_parameters(int64_t this_ptr) {
+       LDKChannelTransactionParameters 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;
+       LDKCounterpartyChannelTransactionParameters ret_var = ChannelTransactionParameters_get_counterparty_parameters(&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_ChannelTransactionParameters_set_counterparty_parameters(int64_t this_ptr, int64_t val) {
+       LDKChannelTransactionParameters 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;
+       LDKCounterpartyChannelTransactionParameters 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 = CounterpartyChannelTransactionParameters_clone(&val_conv);
+       ChannelTransactionParameters_set_counterparty_parameters(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelTransactionParameters_get_funding_outpoint(int64_t this_ptr) {
+       LDKChannelTransactionParameters 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;
+       LDKOutPoint ret_var = ChannelTransactionParameters_get_funding_outpoint(&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_ChannelTransactionParameters_set_funding_outpoint(int64_t this_ptr, int64_t val) {
+       LDKChannelTransactionParameters 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;
+       LDKOutPoint 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 = OutPoint_clone(&val_conv);
+       ChannelTransactionParameters_set_funding_outpoint(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelTransactionParameters_get_channel_type_features(int64_t this_ptr) {
+       LDKChannelTransactionParameters 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;
+       LDKChannelTypeFeatures ret_var = ChannelTransactionParameters_get_channel_type_features(&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_ChannelTransactionParameters_set_channel_type_features(int64_t this_ptr, int64_t val) {
+       LDKChannelTransactionParameters 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;
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_clone(&val_conv);
+       ChannelTransactionParameters_set_channel_type_features(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelTransactionParameters_new(int64_t holder_pubkeys_arg, int16_t holder_selected_contest_delay_arg, jboolean is_outbound_from_holder_arg, int64_t counterparty_parameters_arg, int64_t funding_outpoint_arg, int64_t channel_type_features_arg) {
+       LDKChannelPublicKeys holder_pubkeys_arg_conv;
+       holder_pubkeys_arg_conv.inner = untag_ptr(holder_pubkeys_arg);
+       holder_pubkeys_arg_conv.is_owned = ptr_is_owned(holder_pubkeys_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(holder_pubkeys_arg_conv);
+       holder_pubkeys_arg_conv = ChannelPublicKeys_clone(&holder_pubkeys_arg_conv);
+       LDKCounterpartyChannelTransactionParameters counterparty_parameters_arg_conv;
+       counterparty_parameters_arg_conv.inner = untag_ptr(counterparty_parameters_arg);
+       counterparty_parameters_arg_conv.is_owned = ptr_is_owned(counterparty_parameters_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(counterparty_parameters_arg_conv);
+       counterparty_parameters_arg_conv = CounterpartyChannelTransactionParameters_clone(&counterparty_parameters_arg_conv);
+       LDKOutPoint funding_outpoint_arg_conv;
+       funding_outpoint_arg_conv.inner = untag_ptr(funding_outpoint_arg);
+       funding_outpoint_arg_conv.is_owned = ptr_is_owned(funding_outpoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_outpoint_arg_conv);
+       funding_outpoint_arg_conv = OutPoint_clone(&funding_outpoint_arg_conv);
+       LDKChannelTypeFeatures channel_type_features_arg_conv;
+       channel_type_features_arg_conv.inner = untag_ptr(channel_type_features_arg);
+       channel_type_features_arg_conv.is_owned = ptr_is_owned(channel_type_features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_features_arg_conv);
+       channel_type_features_arg_conv = ChannelTypeFeatures_clone(&channel_type_features_arg_conv);
+       LDKChannelTransactionParameters ret_var = ChannelTransactionParameters_new(holder_pubkeys_arg_conv, holder_selected_contest_delay_arg, is_outbound_from_holder_arg, counterparty_parameters_arg_conv, funding_outpoint_arg_conv, channel_type_features_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 ChannelTransactionParameters_clone_ptr(LDKChannelTransactionParameters *NONNULL_PTR arg) {
+       LDKChannelTransactionParameters ret_var = ChannelTransactionParameters_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_ChannelTransactionParameters_clone_ptr(int64_t arg) {
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelTransactionParameters_clone(int64_t orig) {
+       LDKChannelTransactionParameters 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;
+       LDKChannelTransactionParameters ret_var = ChannelTransactionParameters_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_ChannelTransactionParameters_hash(int64_t o) {
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTransactionParameters_eq(int64_t a, int64_t b) {
+       LDKChannelTransactionParameters 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;
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CounterpartyChannelTransactionParameters_free(int64_t this_obj) {
+       LDKCounterpartyChannelTransactionParameters 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);
+       CounterpartyChannelTransactionParameters_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_CounterpartyChannelTransactionParameters_get_pubkeys(int64_t this_ptr) {
+       LDKCounterpartyChannelTransactionParameters 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;
+       LDKChannelPublicKeys ret_var = CounterpartyChannelTransactionParameters_get_pubkeys(&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_CounterpartyChannelTransactionParameters_set_pubkeys(int64_t this_ptr, int64_t val) {
+       LDKCounterpartyChannelTransactionParameters 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;
+       LDKChannelPublicKeys 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 = ChannelPublicKeys_clone(&val_conv);
+       CounterpartyChannelTransactionParameters_set_pubkeys(&this_ptr_conv, val_conv);
+}
+
+int16_t  CS_LDK_CounterpartyChannelTransactionParameters_get_selected_contest_delay(int64_t this_ptr) {
+       LDKCounterpartyChannelTransactionParameters 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 = CounterpartyChannelTransactionParameters_get_selected_contest_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CounterpartyChannelTransactionParameters_set_selected_contest_delay(int64_t this_ptr, int16_t val) {
+       LDKCounterpartyChannelTransactionParameters 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;
+       CounterpartyChannelTransactionParameters_set_selected_contest_delay(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_CounterpartyChannelTransactionParameters_new(int64_t pubkeys_arg, int16_t selected_contest_delay_arg) {
+       LDKChannelPublicKeys pubkeys_arg_conv;
+       pubkeys_arg_conv.inner = untag_ptr(pubkeys_arg);
+       pubkeys_arg_conv.is_owned = ptr_is_owned(pubkeys_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(pubkeys_arg_conv);
+       pubkeys_arg_conv = ChannelPublicKeys_clone(&pubkeys_arg_conv);
+       LDKCounterpartyChannelTransactionParameters ret_var = CounterpartyChannelTransactionParameters_new(pubkeys_arg_conv, selected_contest_delay_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 CounterpartyChannelTransactionParameters_clone_ptr(LDKCounterpartyChannelTransactionParameters *NONNULL_PTR arg) {
+       LDKCounterpartyChannelTransactionParameters ret_var = CounterpartyChannelTransactionParameters_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_CounterpartyChannelTransactionParameters_clone_ptr(int64_t arg) {
+       LDKCounterpartyChannelTransactionParameters 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 = CounterpartyChannelTransactionParameters_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CounterpartyChannelTransactionParameters_clone(int64_t orig) {
+       LDKCounterpartyChannelTransactionParameters 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;
+       LDKCounterpartyChannelTransactionParameters ret_var = CounterpartyChannelTransactionParameters_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_CounterpartyChannelTransactionParameters_hash(int64_t o) {
+       LDKCounterpartyChannelTransactionParameters 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 = CounterpartyChannelTransactionParameters_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_CounterpartyChannelTransactionParameters_eq(int64_t a, int64_t b) {
+       LDKCounterpartyChannelTransactionParameters 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;
+       LDKCounterpartyChannelTransactionParameters 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 = CounterpartyChannelTransactionParameters_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTransactionParameters_is_populated(int64_t this_arg) {
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_is_populated(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelTransactionParameters_as_holder_broadcastable(int64_t this_arg) {
+       LDKChannelTransactionParameters 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;
+       LDKDirectedChannelTransactionParameters ret_var = ChannelTransactionParameters_as_holder_broadcastable(&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_ChannelTransactionParameters_as_counterparty_broadcastable(int64_t this_arg) {
+       LDKChannelTransactionParameters 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;
+       LDKDirectedChannelTransactionParameters ret_var = ChannelTransactionParameters_as_counterparty_broadcastable(&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;
+}
+
+int8_tArray  CS_LDK_CounterpartyChannelTransactionParameters_write(int64_t obj) {
+       LDKCounterpartyChannelTransactionParameters 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 = CounterpartyChannelTransactionParameters_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_CounterpartyChannelTransactionParameters_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ), "LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CounterpartyChannelTransactionParameters_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelTransactionParameters_write(int64_t obj) {
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_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_ChannelTransactionParameters_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTransactionParametersDecodeErrorZ), "LDKCResult_ChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = ChannelTransactionParameters_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_DirectedChannelTransactionParameters_free(int64_t this_obj) {
+       LDKDirectedChannelTransactionParameters 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);
+       DirectedChannelTransactionParameters_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_DirectedChannelTransactionParameters_broadcaster_pubkeys(int64_t this_arg) {
+       LDKDirectedChannelTransactionParameters 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;
+       LDKChannelPublicKeys ret_var = DirectedChannelTransactionParameters_broadcaster_pubkeys(&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_DirectedChannelTransactionParameters_countersignatory_pubkeys(int64_t this_arg) {
+       LDKDirectedChannelTransactionParameters 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;
+       LDKChannelPublicKeys ret_var = DirectedChannelTransactionParameters_countersignatory_pubkeys(&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;
+}
+
+int16_t  CS_LDK_DirectedChannelTransactionParameters_contest_delay(int64_t this_arg) {
+       LDKDirectedChannelTransactionParameters 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;
+       int16_t ret_conv = DirectedChannelTransactionParameters_contest_delay(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_DirectedChannelTransactionParameters_is_outbound(int64_t this_arg) {
+       LDKDirectedChannelTransactionParameters 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 = DirectedChannelTransactionParameters_is_outbound(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_DirectedChannelTransactionParameters_funding_outpoint(int64_t this_arg) {
+       LDKDirectedChannelTransactionParameters 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;
+       LDKOutPoint ret_var = DirectedChannelTransactionParameters_funding_outpoint(&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_DirectedChannelTransactionParameters_channel_type_features(int64_t this_arg) {
+       LDKDirectedChannelTransactionParameters 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;
+       LDKChannelTypeFeatures ret_var = DirectedChannelTransactionParameters_channel_type_features(&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;
+}
+
+void  CS_LDK_HolderCommitmentTransaction_free(int64_t this_obj) {
+       LDKHolderCommitmentTransaction 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);
+       HolderCommitmentTransaction_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_HolderCommitmentTransaction_get_counterparty_sig(int64_t this_ptr) {
+       LDKHolderCommitmentTransaction 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(64, __LINE__);
+       memcpy(ret_arr->elems, HolderCommitmentTransaction_get_counterparty_sig(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_HolderCommitmentTransaction_set_counterparty_sig(int64_t this_ptr, int8_tArray val) {
+       LDKHolderCommitmentTransaction 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       HolderCommitmentTransaction_set_counterparty_sig(&this_ptr_conv, val_ref);
+}
+
+ptrArray  CS_LDK_HolderCommitmentTransaction_get_counterparty_htlc_sigs(int64_t this_ptr) {
+       LDKHolderCommitmentTransaction 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_ECDSASignatureZ ret_var = HolderCommitmentTransaction_get_counterparty_htlc_sigs(&this_ptr_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;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_HolderCommitmentTransaction_set_counterparty_htlc_sigs(int64_t this_ptr, ptrArray val) {
+       LDKHolderCommitmentTransaction 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_ECDSASignatureZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKECDSASignature), "LDKCVec_ECDSASignatureZ Elements");
+       else
+               val_constr.data = NULL;
+       int8_tArray* val_vals = (void*) val->elems;
+       for (size_t i = 0; i < val_constr.datalen; i++) {
+               int8_tArray val_conv_8 = val_vals[i];
+               LDKECDSASignature val_conv_8_ref;
+               CHECK(val_conv_8->arr_len == 64);
+               memcpy(val_conv_8_ref.compact_form, val_conv_8->elems, 64); FREE(val_conv_8);
+               val_constr.data[i] = val_conv_8_ref;
+       }
+       FREE(val);
+       HolderCommitmentTransaction_set_counterparty_htlc_sigs(&this_ptr_conv, val_constr);
+}
+
+static inline uint64_t HolderCommitmentTransaction_clone_ptr(LDKHolderCommitmentTransaction *NONNULL_PTR arg) {
+       LDKHolderCommitmentTransaction ret_var = HolderCommitmentTransaction_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_HolderCommitmentTransaction_clone_ptr(int64_t arg) {
+       LDKHolderCommitmentTransaction 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 = HolderCommitmentTransaction_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_HolderCommitmentTransaction_clone(int64_t orig) {
+       LDKHolderCommitmentTransaction 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;
+       LDKHolderCommitmentTransaction ret_var = HolderCommitmentTransaction_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_HolderCommitmentTransaction_write(int64_t obj) {
+       LDKHolderCommitmentTransaction 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 = HolderCommitmentTransaction_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_HolderCommitmentTransaction_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HolderCommitmentTransactionDecodeErrorZ), "LDKCResult_HolderCommitmentTransactionDecodeErrorZ");
+       *ret_conv = HolderCommitmentTransaction_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_HolderCommitmentTransaction_new(int64_t commitment_tx, int8_tArray counterparty_sig, ptrArray counterparty_htlc_sigs, int8_tArray holder_funding_key, int8_tArray counterparty_funding_key) {
+       LDKCommitmentTransaction commitment_tx_conv;
+       commitment_tx_conv.inner = untag_ptr(commitment_tx);
+       commitment_tx_conv.is_owned = ptr_is_owned(commitment_tx);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(commitment_tx_conv);
+       commitment_tx_conv = CommitmentTransaction_clone(&commitment_tx_conv);
+       LDKECDSASignature counterparty_sig_ref;
+       CHECK(counterparty_sig->arr_len == 64);
+       memcpy(counterparty_sig_ref.compact_form, counterparty_sig->elems, 64); FREE(counterparty_sig);
+       LDKCVec_ECDSASignatureZ counterparty_htlc_sigs_constr;
+       counterparty_htlc_sigs_constr.datalen = counterparty_htlc_sigs->arr_len;
+       if (counterparty_htlc_sigs_constr.datalen > 0)
+               counterparty_htlc_sigs_constr.data = MALLOC(counterparty_htlc_sigs_constr.datalen * sizeof(LDKECDSASignature), "LDKCVec_ECDSASignatureZ Elements");
+       else
+               counterparty_htlc_sigs_constr.data = NULL;
+       int8_tArray* counterparty_htlc_sigs_vals = (void*) counterparty_htlc_sigs->elems;
+       for (size_t i = 0; i < counterparty_htlc_sigs_constr.datalen; i++) {
+               int8_tArray counterparty_htlc_sigs_conv_8 = counterparty_htlc_sigs_vals[i];
+               LDKECDSASignature counterparty_htlc_sigs_conv_8_ref;
+               CHECK(counterparty_htlc_sigs_conv_8->arr_len == 64);
+               memcpy(counterparty_htlc_sigs_conv_8_ref.compact_form, counterparty_htlc_sigs_conv_8->elems, 64); FREE(counterparty_htlc_sigs_conv_8);
+               counterparty_htlc_sigs_constr.data[i] = counterparty_htlc_sigs_conv_8_ref;
+       }
+       FREE(counterparty_htlc_sigs);
+       LDKPublicKey holder_funding_key_ref;
+       CHECK(holder_funding_key->arr_len == 33);
+       memcpy(holder_funding_key_ref.compressed_form, holder_funding_key->elems, 33); FREE(holder_funding_key);
+       LDKPublicKey counterparty_funding_key_ref;
+       CHECK(counterparty_funding_key->arr_len == 33);
+       memcpy(counterparty_funding_key_ref.compressed_form, counterparty_funding_key->elems, 33); FREE(counterparty_funding_key);
+       LDKHolderCommitmentTransaction ret_var = HolderCommitmentTransaction_new(commitment_tx_conv, counterparty_sig_ref, counterparty_htlc_sigs_constr, holder_funding_key_ref, counterparty_funding_key_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;
+}
+
+void  CS_LDK_BuiltCommitmentTransaction_free(int64_t this_obj) {
+       LDKBuiltCommitmentTransaction 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);
+       BuiltCommitmentTransaction_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_BuiltCommitmentTransaction_get_transaction(int64_t this_ptr) {
+       LDKBuiltCommitmentTransaction 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;
+       LDKTransaction ret_var = BuiltCommitmentTransaction_get_transaction(&this_ptr_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);
+       return ret_arr;
+}
+
+void  CS_LDK_BuiltCommitmentTransaction_set_transaction(int64_t this_ptr, int8_tArray val) {
+       LDKBuiltCommitmentTransaction 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;
+       LDKTransaction val_ref;
+       val_ref.datalen = val->arr_len;
+       val_ref.data = MALLOC(val_ref.datalen, "LDKTransaction Bytes");
+       memcpy(val_ref.data, val->elems, val_ref.datalen); FREE(val);
+       val_ref.data_is_owned = true;
+       BuiltCommitmentTransaction_set_transaction(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_BuiltCommitmentTransaction_get_txid(int64_t this_ptr) {
+       LDKBuiltCommitmentTransaction 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, *BuiltCommitmentTransaction_get_txid(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_BuiltCommitmentTransaction_set_txid(int64_t this_ptr, int8_tArray val) {
+       LDKBuiltCommitmentTransaction 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);
+       BuiltCommitmentTransaction_set_txid(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_BuiltCommitmentTransaction_new(int8_tArray transaction_arg, int8_tArray txid_arg) {
+       LDKTransaction transaction_arg_ref;
+       transaction_arg_ref.datalen = transaction_arg->arr_len;
+       transaction_arg_ref.data = MALLOC(transaction_arg_ref.datalen, "LDKTransaction Bytes");
+       memcpy(transaction_arg_ref.data, transaction_arg->elems, transaction_arg_ref.datalen); FREE(transaction_arg);
+       transaction_arg_ref.data_is_owned = true;
+       LDKThirtyTwoBytes txid_arg_ref;
+       CHECK(txid_arg->arr_len == 32);
+       memcpy(txid_arg_ref.data, txid_arg->elems, 32); FREE(txid_arg);
+       LDKBuiltCommitmentTransaction ret_var = BuiltCommitmentTransaction_new(transaction_arg_ref, txid_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 BuiltCommitmentTransaction_clone_ptr(LDKBuiltCommitmentTransaction *NONNULL_PTR arg) {
+       LDKBuiltCommitmentTransaction ret_var = BuiltCommitmentTransaction_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_BuiltCommitmentTransaction_clone_ptr(int64_t arg) {
+       LDKBuiltCommitmentTransaction 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 = BuiltCommitmentTransaction_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BuiltCommitmentTransaction_clone(int64_t orig) {
+       LDKBuiltCommitmentTransaction 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;
+       LDKBuiltCommitmentTransaction ret_var = BuiltCommitmentTransaction_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_BuiltCommitmentTransaction_write(int64_t obj) {
+       LDKBuiltCommitmentTransaction 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 = BuiltCommitmentTransaction_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_BuiltCommitmentTransaction_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ), "LDKCResult_BuiltCommitmentTransactionDecodeErrorZ");
+       *ret_conv = BuiltCommitmentTransaction_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_BuiltCommitmentTransaction_get_sighash_all(int64_t this_arg, int8_tArray funding_redeemscript, int64_t channel_value_satoshis) {
+       LDKBuiltCommitmentTransaction 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;
+       LDKu8slice funding_redeemscript_ref;
+       funding_redeemscript_ref.datalen = funding_redeemscript->arr_len;
+       funding_redeemscript_ref.data = funding_redeemscript->elems;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, BuiltCommitmentTransaction_get_sighash_all(&this_arg_conv, funding_redeemscript_ref, channel_value_satoshis).data, 32);
+       FREE(funding_redeemscript);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_BuiltCommitmentTransaction_sign_counterparty_commitment(int64_t this_arg, int8_tArray funding_key, int8_tArray funding_redeemscript, int64_t channel_value_satoshis) {
+       LDKBuiltCommitmentTransaction 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;
+       uint8_t funding_key_arr[32];
+       CHECK(funding_key->arr_len == 32);
+       memcpy(funding_key_arr, funding_key->elems, 32); FREE(funding_key);
+       uint8_t (*funding_key_ref)[32] = &funding_key_arr;
+       LDKu8slice funding_redeemscript_ref;
+       funding_redeemscript_ref.datalen = funding_redeemscript->arr_len;
+       funding_redeemscript_ref.data = funding_redeemscript->elems;
+       int8_tArray ret_arr = init_int8_tArray(64, __LINE__);
+       memcpy(ret_arr->elems, BuiltCommitmentTransaction_sign_counterparty_commitment(&this_arg_conv, funding_key_ref, funding_redeemscript_ref, channel_value_satoshis).compact_form, 64);
+       FREE(funding_redeemscript);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_BuiltCommitmentTransaction_sign_holder_commitment(int64_t this_arg, int8_tArray funding_key, int8_tArray funding_redeemscript, int64_t channel_value_satoshis, int64_t entropy_source) {
+       LDKBuiltCommitmentTransaction 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;
+       uint8_t funding_key_arr[32];
+       CHECK(funding_key->arr_len == 32);
+       memcpy(funding_key_arr, funding_key->elems, 32); FREE(funding_key);
+       uint8_t (*funding_key_ref)[32] = &funding_key_arr;
+       LDKu8slice funding_redeemscript_ref;
+       funding_redeemscript_ref.datalen = funding_redeemscript->arr_len;
+       funding_redeemscript_ref.data = funding_redeemscript->elems;
+       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;
+       int8_tArray ret_arr = init_int8_tArray(64, __LINE__);
+       memcpy(ret_arr->elems, BuiltCommitmentTransaction_sign_holder_commitment(&this_arg_conv, funding_key_ref, funding_redeemscript_ref, channel_value_satoshis, entropy_source_conv).compact_form, 64);
+       FREE(funding_redeemscript);
+       return ret_arr;
+}
+
+void  CS_LDK_ClosingTransaction_free(int64_t this_obj) {
+       LDKClosingTransaction 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);
+       ClosingTransaction_free(this_obj_conv);
+}
+
+static inline uint64_t ClosingTransaction_clone_ptr(LDKClosingTransaction *NONNULL_PTR arg) {
+       LDKClosingTransaction ret_var = ClosingTransaction_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_ClosingTransaction_clone_ptr(int64_t arg) {
+       LDKClosingTransaction 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 = ClosingTransaction_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ClosingTransaction_clone(int64_t orig) {
+       LDKClosingTransaction 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;
+       LDKClosingTransaction ret_var = ClosingTransaction_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_ClosingTransaction_hash(int64_t o) {
+       LDKClosingTransaction 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 = ClosingTransaction_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ClosingTransaction_eq(int64_t a, int64_t b) {
+       LDKClosingTransaction 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;
+       LDKClosingTransaction 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 = ClosingTransaction_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ClosingTransaction_new(int64_t to_holder_value_sat, int64_t to_counterparty_value_sat, int8_tArray to_holder_script, int8_tArray to_counterparty_script, int64_t funding_outpoint) {
+       LDKCVec_u8Z to_holder_script_ref;
+       to_holder_script_ref.datalen = to_holder_script->arr_len;
+       to_holder_script_ref.data = MALLOC(to_holder_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(to_holder_script_ref.data, to_holder_script->elems, to_holder_script_ref.datalen); FREE(to_holder_script);
+       LDKCVec_u8Z to_counterparty_script_ref;
+       to_counterparty_script_ref.datalen = to_counterparty_script->arr_len;
+       to_counterparty_script_ref.data = MALLOC(to_counterparty_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(to_counterparty_script_ref.data, to_counterparty_script->elems, to_counterparty_script_ref.datalen); FREE(to_counterparty_script);
+       LDKOutPoint funding_outpoint_conv;
+       funding_outpoint_conv.inner = untag_ptr(funding_outpoint);
+       funding_outpoint_conv.is_owned = ptr_is_owned(funding_outpoint);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_outpoint_conv);
+       funding_outpoint_conv = OutPoint_clone(&funding_outpoint_conv);
+       LDKClosingTransaction ret_var = ClosingTransaction_new(to_holder_value_sat, to_counterparty_value_sat, to_holder_script_ref, to_counterparty_script_ref, funding_outpoint_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_ClosingTransaction_trust(int64_t this_arg) {
+       LDKClosingTransaction 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;
+       LDKTrustedClosingTransaction ret_var = ClosingTransaction_trust(&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_ClosingTransaction_verify(int64_t this_arg, int64_t funding_outpoint) {
+       LDKClosingTransaction 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;
+       LDKOutPoint funding_outpoint_conv;
+       funding_outpoint_conv.inner = untag_ptr(funding_outpoint);
+       funding_outpoint_conv.is_owned = ptr_is_owned(funding_outpoint);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_outpoint_conv);
+       funding_outpoint_conv = OutPoint_clone(&funding_outpoint_conv);
+       LDKCResult_TrustedClosingTransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TrustedClosingTransactionNoneZ), "LDKCResult_TrustedClosingTransactionNoneZ");
+       *ret_conv = ClosingTransaction_verify(&this_arg_conv, funding_outpoint_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ClosingTransaction_to_holder_value_sat(int64_t this_arg) {
+       LDKClosingTransaction 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 = ClosingTransaction_to_holder_value_sat(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ClosingTransaction_to_counterparty_value_sat(int64_t this_arg) {
+       LDKClosingTransaction 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 = ClosingTransaction_to_counterparty_value_sat(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_ClosingTransaction_to_holder_script(int64_t this_arg) {
+       LDKClosingTransaction 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;
+       LDKu8slice ret_var = ClosingTransaction_to_holder_script(&this_arg_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;
+}
+
+int8_tArray  CS_LDK_ClosingTransaction_to_counterparty_script(int64_t this_arg) {
+       LDKClosingTransaction 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;
+       LDKu8slice ret_var = ClosingTransaction_to_counterparty_script(&this_arg_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;
+}
+
+void  CS_LDK_TrustedClosingTransaction_free(int64_t this_obj) {
+       LDKTrustedClosingTransaction 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);
+       TrustedClosingTransaction_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TrustedClosingTransaction_built_transaction(int64_t this_arg) {
+       LDKTrustedClosingTransaction 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;
+       LDKTransaction ret_var = TrustedClosingTransaction_built_transaction(&this_arg_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);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_TrustedClosingTransaction_get_sighash_all(int64_t this_arg, int8_tArray funding_redeemscript, int64_t channel_value_satoshis) {
+       LDKTrustedClosingTransaction 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;
+       LDKu8slice funding_redeemscript_ref;
+       funding_redeemscript_ref.datalen = funding_redeemscript->arr_len;
+       funding_redeemscript_ref.data = funding_redeemscript->elems;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, TrustedClosingTransaction_get_sighash_all(&this_arg_conv, funding_redeemscript_ref, channel_value_satoshis).data, 32);
+       FREE(funding_redeemscript);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_TrustedClosingTransaction_sign(int64_t this_arg, int8_tArray funding_key, int8_tArray funding_redeemscript, int64_t channel_value_satoshis) {
+       LDKTrustedClosingTransaction 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;
+       uint8_t funding_key_arr[32];
+       CHECK(funding_key->arr_len == 32);
+       memcpy(funding_key_arr, funding_key->elems, 32); FREE(funding_key);
+       uint8_t (*funding_key_ref)[32] = &funding_key_arr;
+       LDKu8slice funding_redeemscript_ref;
+       funding_redeemscript_ref.datalen = funding_redeemscript->arr_len;
+       funding_redeemscript_ref.data = funding_redeemscript->elems;
+       int8_tArray ret_arr = init_int8_tArray(64, __LINE__);
+       memcpy(ret_arr->elems, TrustedClosingTransaction_sign(&this_arg_conv, funding_key_ref, funding_redeemscript_ref, channel_value_satoshis).compact_form, 64);
+       FREE(funding_redeemscript);
+       return ret_arr;
+}
+
+void  CS_LDK_CommitmentTransaction_free(int64_t this_obj) {
+       LDKCommitmentTransaction 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);
+       CommitmentTransaction_free(this_obj_conv);
+}
+
+static inline uint64_t CommitmentTransaction_clone_ptr(LDKCommitmentTransaction *NONNULL_PTR arg) {
+       LDKCommitmentTransaction ret_var = CommitmentTransaction_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_CommitmentTransaction_clone_ptr(int64_t arg) {
+       LDKCommitmentTransaction 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 = CommitmentTransaction_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CommitmentTransaction_clone(int64_t orig) {
+       LDKCommitmentTransaction 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;
+       LDKCommitmentTransaction ret_var = CommitmentTransaction_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_CommitmentTransaction_write(int64_t obj) {
+       LDKCommitmentTransaction 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 = CommitmentTransaction_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_CommitmentTransaction_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_CommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentTransactionDecodeErrorZ), "LDKCResult_CommitmentTransactionDecodeErrorZ");
+       *ret_conv = CommitmentTransaction_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CommitmentTransaction_commitment_number(int64_t this_arg) {
+       LDKCommitmentTransaction 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 = CommitmentTransaction_commitment_number(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_CommitmentTransaction_per_commitment_point(int64_t this_arg) {
+       LDKCommitmentTransaction 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, CommitmentTransaction_per_commitment_point(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_CommitmentTransaction_to_broadcaster_value_sat(int64_t this_arg) {
+       LDKCommitmentTransaction 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 = CommitmentTransaction_to_broadcaster_value_sat(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CommitmentTransaction_to_countersignatory_value_sat(int64_t this_arg) {
+       LDKCommitmentTransaction 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 = CommitmentTransaction_to_countersignatory_value_sat(&this_arg_conv);
+       return ret_conv;
+}
+
+int32_t  CS_LDK_CommitmentTransaction_feerate_per_kw(int64_t this_arg) {
+       LDKCommitmentTransaction 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;
+       int32_t ret_conv = CommitmentTransaction_feerate_per_kw(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CommitmentTransaction_trust(int64_t this_arg) {
+       LDKCommitmentTransaction 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;
+       LDKTrustedCommitmentTransaction ret_var = CommitmentTransaction_trust(&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_CommitmentTransaction_verify(int64_t this_arg, int64_t channel_parameters, int64_t broadcaster_keys, int64_t countersignatory_keys) {
+       LDKCommitmentTransaction 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;
+       LDKDirectedChannelTransactionParameters channel_parameters_conv;
+       channel_parameters_conv.inner = untag_ptr(channel_parameters);
+       channel_parameters_conv.is_owned = ptr_is_owned(channel_parameters);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_parameters_conv);
+       channel_parameters_conv.is_owned = false;
+       LDKChannelPublicKeys broadcaster_keys_conv;
+       broadcaster_keys_conv.inner = untag_ptr(broadcaster_keys);
+       broadcaster_keys_conv.is_owned = ptr_is_owned(broadcaster_keys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(broadcaster_keys_conv);
+       broadcaster_keys_conv.is_owned = false;
+       LDKChannelPublicKeys countersignatory_keys_conv;
+       countersignatory_keys_conv.inner = untag_ptr(countersignatory_keys);
+       countersignatory_keys_conv.is_owned = ptr_is_owned(countersignatory_keys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(countersignatory_keys_conv);
+       countersignatory_keys_conv.is_owned = false;
+       LDKCResult_TrustedCommitmentTransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TrustedCommitmentTransactionNoneZ), "LDKCResult_TrustedCommitmentTransactionNoneZ");
+       *ret_conv = CommitmentTransaction_verify(&this_arg_conv, &channel_parameters_conv, &broadcaster_keys_conv, &countersignatory_keys_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_TrustedCommitmentTransaction_free(int64_t this_obj) {
+       LDKTrustedCommitmentTransaction 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);
+       TrustedCommitmentTransaction_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TrustedCommitmentTransaction_txid(int64_t this_arg) {
+       LDKTrustedCommitmentTransaction 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, TrustedCommitmentTransaction_txid(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_TrustedCommitmentTransaction_built_transaction(int64_t this_arg) {
+       LDKTrustedCommitmentTransaction 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;
+       LDKBuiltCommitmentTransaction ret_var = TrustedCommitmentTransaction_built_transaction(&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_TrustedCommitmentTransaction_keys(int64_t this_arg) {
+       LDKTrustedCommitmentTransaction 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;
+       LDKTxCreationKeys ret_var = TrustedCommitmentTransaction_keys(&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_TrustedCommitmentTransaction_channel_type_features(int64_t this_arg) {
+       LDKTrustedCommitmentTransaction 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;
+       LDKChannelTypeFeatures ret_var = TrustedCommitmentTransaction_channel_type_features(&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_TrustedCommitmentTransaction_get_htlc_sigs(int64_t this_arg, int8_tArray htlc_base_key, int64_t channel_parameters, int64_t entropy_source) {
+       LDKTrustedCommitmentTransaction 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;
+       uint8_t htlc_base_key_arr[32];
+       CHECK(htlc_base_key->arr_len == 32);
+       memcpy(htlc_base_key_arr, htlc_base_key->elems, 32); FREE(htlc_base_key);
+       uint8_t (*htlc_base_key_ref)[32] = &htlc_base_key_arr;
+       LDKDirectedChannelTransactionParameters channel_parameters_conv;
+       channel_parameters_conv.inner = untag_ptr(channel_parameters);
+       channel_parameters_conv.is_owned = ptr_is_owned(channel_parameters);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_parameters_conv);
+       channel_parameters_conv.is_owned = false;
+       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_CVec_ECDSASignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_ECDSASignatureZNoneZ), "LDKCResult_CVec_ECDSASignatureZNoneZ");
+       *ret_conv = TrustedCommitmentTransaction_get_htlc_sigs(&this_arg_conv, htlc_base_key_ref, &channel_parameters_conv, entropy_source_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_TrustedCommitmentTransaction_revokeable_output_index(int64_t this_arg) {
+       LDKTrustedCommitmentTransaction 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;
+       LDKCOption_usizeZ *ret_copy = MALLOC(sizeof(LDKCOption_usizeZ), "LDKCOption_usizeZ");
+       *ret_copy = TrustedCommitmentTransaction_revokeable_output_index(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_TrustedCommitmentTransaction_build_to_local_justice_tx(int64_t this_arg, int64_t feerate_per_kw, int8_tArray destination_script) {
+       LDKTrustedCommitmentTransaction 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;
+       LDKCVec_u8Z destination_script_ref;
+       destination_script_ref.datalen = destination_script->arr_len;
+       destination_script_ref.data = MALLOC(destination_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(destination_script_ref.data, destination_script->elems, destination_script_ref.datalen); FREE(destination_script);
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = TrustedCommitmentTransaction_build_to_local_justice_tx(&this_arg_conv, feerate_per_kw, destination_script_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_get_commitment_transaction_number_obscure_factor(int8_tArray broadcaster_payment_basepoint, int8_tArray countersignatory_payment_basepoint, jboolean outbound_from_broadcaster) {
+       LDKPublicKey broadcaster_payment_basepoint_ref;
+       CHECK(broadcaster_payment_basepoint->arr_len == 33);
+       memcpy(broadcaster_payment_basepoint_ref.compressed_form, broadcaster_payment_basepoint->elems, 33); FREE(broadcaster_payment_basepoint);
+       LDKPublicKey countersignatory_payment_basepoint_ref;
+       CHECK(countersignatory_payment_basepoint->arr_len == 33);
+       memcpy(countersignatory_payment_basepoint_ref.compressed_form, countersignatory_payment_basepoint->elems, 33); FREE(countersignatory_payment_basepoint);
+       int64_t ret_conv = get_commitment_transaction_number_obscure_factor(broadcaster_payment_basepoint_ref, countersignatory_payment_basepoint_ref, outbound_from_broadcaster);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_eq(int64_t a, int64_t b) {
+       LDKInitFeatures 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;
+       LDKInitFeatures 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 = InitFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_eq(int64_t a, int64_t b) {
+       LDKNodeFeatures 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;
+       LDKNodeFeatures 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 = NodeFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelFeatures_eq(int64_t a, int64_t b) {
+       LDKChannelFeatures 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;
+       LDKChannelFeatures 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 = ChannelFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_eq(int64_t a, int64_t b) {
+       LDKBolt11InvoiceFeatures 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;
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_OfferFeatures_eq(int64_t a, int64_t b) {
+       LDKOfferFeatures 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;
+       LDKOfferFeatures 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 = OfferFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InvoiceRequestFeatures_eq(int64_t a, int64_t b) {
+       LDKInvoiceRequestFeatures 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;
+       LDKInvoiceRequestFeatures 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 = InvoiceRequestFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt12InvoiceFeatures_eq(int64_t a, int64_t b) {
+       LDKBolt12InvoiceFeatures 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;
+       LDKBolt12InvoiceFeatures 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 = Bolt12InvoiceFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BlindedHopFeatures_eq(int64_t a, int64_t b) {
+       LDKBlindedHopFeatures 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;
+       LDKBlindedHopFeatures 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 = BlindedHopFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_eq(int64_t a, int64_t b) {
+       LDKChannelTypeFeatures 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;
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t InitFeatures_clone_ptr(LDKInitFeatures *NONNULL_PTR arg) {
+       LDKInitFeatures ret_var = InitFeatures_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_InitFeatures_clone_ptr(int64_t arg) {
+       LDKInitFeatures 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 = InitFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InitFeatures_clone(int64_t orig) {
+       LDKInitFeatures 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;
+       LDKInitFeatures ret_var = InitFeatures_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;
+}
+
+static inline uint64_t NodeFeatures_clone_ptr(LDKNodeFeatures *NONNULL_PTR arg) {
+       LDKNodeFeatures ret_var = NodeFeatures_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_NodeFeatures_clone_ptr(int64_t arg) {
+       LDKNodeFeatures 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 = NodeFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NodeFeatures_clone(int64_t orig) {
+       LDKNodeFeatures 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;
+       LDKNodeFeatures ret_var = NodeFeatures_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;
+}
+
+static inline uint64_t ChannelFeatures_clone_ptr(LDKChannelFeatures *NONNULL_PTR arg) {
+       LDKChannelFeatures ret_var = ChannelFeatures_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_ChannelFeatures_clone_ptr(int64_t arg) {
+       LDKChannelFeatures 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 = ChannelFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelFeatures_clone(int64_t orig) {
+       LDKChannelFeatures 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;
+       LDKChannelFeatures ret_var = ChannelFeatures_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;
+}
+
+static inline uint64_t Bolt11InvoiceFeatures_clone_ptr(LDKBolt11InvoiceFeatures *NONNULL_PTR arg) {
+       LDKBolt11InvoiceFeatures ret_var = Bolt11InvoiceFeatures_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_Bolt11InvoiceFeatures_clone_ptr(int64_t arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11InvoiceFeatures_clone(int64_t orig) {
+       LDKBolt11InvoiceFeatures 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;
+       LDKBolt11InvoiceFeatures ret_var = Bolt11InvoiceFeatures_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;
+}
+
+static inline uint64_t OfferFeatures_clone_ptr(LDKOfferFeatures *NONNULL_PTR arg) {
+       LDKOfferFeatures ret_var = OfferFeatures_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_OfferFeatures_clone_ptr(int64_t arg) {
+       LDKOfferFeatures 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 = OfferFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OfferFeatures_clone(int64_t orig) {
+       LDKOfferFeatures 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;
+       LDKOfferFeatures ret_var = OfferFeatures_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;
+}
+
+static inline uint64_t InvoiceRequestFeatures_clone_ptr(LDKInvoiceRequestFeatures *NONNULL_PTR arg) {
+       LDKInvoiceRequestFeatures ret_var = InvoiceRequestFeatures_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_InvoiceRequestFeatures_clone_ptr(int64_t arg) {
+       LDKInvoiceRequestFeatures 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 = InvoiceRequestFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InvoiceRequestFeatures_clone(int64_t orig) {
+       LDKInvoiceRequestFeatures 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;
+       LDKInvoiceRequestFeatures ret_var = InvoiceRequestFeatures_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;
+}
+
+static inline uint64_t Bolt12InvoiceFeatures_clone_ptr(LDKBolt12InvoiceFeatures *NONNULL_PTR arg) {
+       LDKBolt12InvoiceFeatures ret_var = Bolt12InvoiceFeatures_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_Bolt12InvoiceFeatures_clone_ptr(int64_t arg) {
+       LDKBolt12InvoiceFeatures 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 = Bolt12InvoiceFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt12InvoiceFeatures_clone(int64_t orig) {
+       LDKBolt12InvoiceFeatures 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;
+       LDKBolt12InvoiceFeatures ret_var = Bolt12InvoiceFeatures_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;
+}
+
+static inline uint64_t BlindedHopFeatures_clone_ptr(LDKBlindedHopFeatures *NONNULL_PTR arg) {
+       LDKBlindedHopFeatures ret_var = BlindedHopFeatures_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_BlindedHopFeatures_clone_ptr(int64_t arg) {
+       LDKBlindedHopFeatures 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 = BlindedHopFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedHopFeatures_clone(int64_t orig) {
+       LDKBlindedHopFeatures 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;
+       LDKBlindedHopFeatures ret_var = BlindedHopFeatures_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;
+}
+
+static inline uint64_t ChannelTypeFeatures_clone_ptr(LDKChannelTypeFeatures *NONNULL_PTR arg) {
+       LDKChannelTypeFeatures ret_var = ChannelTypeFeatures_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_ChannelTypeFeatures_clone_ptr(int64_t arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelTypeFeatures_clone(int64_t orig) {
+       LDKChannelTypeFeatures 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;
+       LDKChannelTypeFeatures ret_var = ChannelTypeFeatures_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_InitFeatures_free(int64_t this_obj) {
+       LDKInitFeatures 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);
+       InitFeatures_free(this_obj_conv);
+}
+
+void  CS_LDK_NodeFeatures_free(int64_t this_obj) {
+       LDKNodeFeatures 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);
+       NodeFeatures_free(this_obj_conv);
+}
+
+void  CS_LDK_ChannelFeatures_free(int64_t this_obj) {
+       LDKChannelFeatures 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);
+       ChannelFeatures_free(this_obj_conv);
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_free(int64_t this_obj) {
+       LDKBolt11InvoiceFeatures 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);
+       Bolt11InvoiceFeatures_free(this_obj_conv);
+}
+
+void  CS_LDK_OfferFeatures_free(int64_t this_obj) {
+       LDKOfferFeatures 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);
+       OfferFeatures_free(this_obj_conv);
+}
+
+void  CS_LDK_InvoiceRequestFeatures_free(int64_t this_obj) {
+       LDKInvoiceRequestFeatures 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);
+       InvoiceRequestFeatures_free(this_obj_conv);
+}
+
+void  CS_LDK_Bolt12InvoiceFeatures_free(int64_t this_obj) {
+       LDKBolt12InvoiceFeatures 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);
+       Bolt12InvoiceFeatures_free(this_obj_conv);
+}
+
+void  CS_LDK_BlindedHopFeatures_free(int64_t this_obj) {
+       LDKBlindedHopFeatures 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);
+       BlindedHopFeatures_free(this_obj_conv);
+}
+
+void  CS_LDK_ChannelTypeFeatures_free(int64_t this_obj) {
+       LDKChannelTypeFeatures 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);
+       ChannelTypeFeatures_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_InitFeatures_empty() {
+       LDKInitFeatures ret_var = InitFeatures_empty();
+       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_InitFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       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;
+       LDKInitFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = InitFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_unknown_bits(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_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InitFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = InitFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InitFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = InitFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InitFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = InitFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InitFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = InitFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeFeatures_empty() {
+       LDKNodeFeatures ret_var = NodeFeatures_empty();
+       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_NodeFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       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;
+       LDKNodeFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = NodeFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_unknown_bits(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_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NodeFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = NodeFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = NodeFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = NodeFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = NodeFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelFeatures_empty() {
+       LDKChannelFeatures ret_var = ChannelFeatures_empty();
+       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_ChannelFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       LDKChannelFeatures 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;
+       LDKChannelFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = ChannelFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelFeatures_requires_unknown_bits(int64_t this_arg) {
+       LDKChannelFeatures 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 = ChannelFeatures_requires_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKChannelFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKChannelFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKChannelFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKChannelFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt11InvoiceFeatures_empty() {
+       LDKBolt11InvoiceFeatures ret_var = Bolt11InvoiceFeatures_empty();
+       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_Bolt11InvoiceFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       LDKBolt11InvoiceFeatures 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;
+       LDKBolt11InvoiceFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = Bolt11InvoiceFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_requires_unknown_bits(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_requires_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11InvoiceFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKBolt11InvoiceFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = Bolt11InvoiceFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt11InvoiceFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKBolt11InvoiceFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = Bolt11InvoiceFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt11InvoiceFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKBolt11InvoiceFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = Bolt11InvoiceFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt11InvoiceFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKBolt11InvoiceFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = Bolt11InvoiceFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_OfferFeatures_empty() {
+       LDKOfferFeatures ret_var = OfferFeatures_empty();
+       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_OfferFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       LDKOfferFeatures 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;
+       LDKOfferFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = OfferFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_OfferFeatures_requires_unknown_bits(int64_t this_arg) {
+       LDKOfferFeatures 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 = OfferFeatures_requires_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OfferFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKOfferFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = OfferFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_OfferFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKOfferFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = OfferFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_OfferFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKOfferFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = OfferFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_OfferFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKOfferFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = OfferFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InvoiceRequestFeatures_empty() {
+       LDKInvoiceRequestFeatures ret_var = InvoiceRequestFeatures_empty();
+       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_InvoiceRequestFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       LDKInvoiceRequestFeatures 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;
+       LDKInvoiceRequestFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = InvoiceRequestFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InvoiceRequestFeatures_requires_unknown_bits(int64_t this_arg) {
+       LDKInvoiceRequestFeatures 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 = InvoiceRequestFeatures_requires_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InvoiceRequestFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKInvoiceRequestFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = InvoiceRequestFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InvoiceRequestFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKInvoiceRequestFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = InvoiceRequestFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InvoiceRequestFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKInvoiceRequestFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = InvoiceRequestFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InvoiceRequestFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKInvoiceRequestFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = InvoiceRequestFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt12InvoiceFeatures_empty() {
+       LDKBolt12InvoiceFeatures ret_var = Bolt12InvoiceFeatures_empty();
+       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_Bolt12InvoiceFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       LDKBolt12InvoiceFeatures 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;
+       LDKBolt12InvoiceFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = Bolt12InvoiceFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt12InvoiceFeatures_requires_unknown_bits(int64_t this_arg) {
+       LDKBolt12InvoiceFeatures 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 = Bolt12InvoiceFeatures_requires_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt12InvoiceFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKBolt12InvoiceFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = Bolt12InvoiceFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt12InvoiceFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKBolt12InvoiceFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = Bolt12InvoiceFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt12InvoiceFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKBolt12InvoiceFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = Bolt12InvoiceFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt12InvoiceFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKBolt12InvoiceFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = Bolt12InvoiceFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_BlindedHopFeatures_empty() {
+       LDKBlindedHopFeatures ret_var = BlindedHopFeatures_empty();
+       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_BlindedHopFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       LDKBlindedHopFeatures 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;
+       LDKBlindedHopFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = BlindedHopFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BlindedHopFeatures_requires_unknown_bits(int64_t this_arg) {
+       LDKBlindedHopFeatures 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 = BlindedHopFeatures_requires_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedHopFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKBlindedHopFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = BlindedHopFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_BlindedHopFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKBlindedHopFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = BlindedHopFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_BlindedHopFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKBlindedHopFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = BlindedHopFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_BlindedHopFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKBlindedHopFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = BlindedHopFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelTypeFeatures_empty() {
+       LDKChannelTypeFeatures ret_var = ChannelTypeFeatures_empty();
+       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_ChannelTypeFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       LDKChannelTypeFeatures 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;
+       LDKChannelTypeFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = ChannelTypeFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_requires_unknown_bits(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_requires_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelTypeFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKChannelTypeFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelTypeFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelTypeFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKChannelTypeFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelTypeFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelTypeFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKChannelTypeFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelTypeFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelTypeFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKChannelTypeFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelTypeFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_InitFeatures_write(int64_t obj) {
+       LDKInitFeatures 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 = InitFeatures_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_InitFeatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_InitFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitFeaturesDecodeErrorZ), "LDKCResult_InitFeaturesDecodeErrorZ");
+       *ret_conv = InitFeatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelFeatures_write(int64_t obj) {
+       LDKChannelFeatures 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 = ChannelFeatures_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_ChannelFeatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelFeaturesDecodeErrorZ), "LDKCResult_ChannelFeaturesDecodeErrorZ");
+       *ret_conv = ChannelFeatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_NodeFeatures_write(int64_t obj) {
+       LDKNodeFeatures 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 = NodeFeatures_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_NodeFeatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_NodeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeFeaturesDecodeErrorZ), "LDKCResult_NodeFeaturesDecodeErrorZ");
+       *ret_conv = NodeFeatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_Bolt11InvoiceFeatures_write(int64_t obj) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_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_Bolt11InvoiceFeatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = Bolt11InvoiceFeatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_Bolt12InvoiceFeatures_write(int64_t obj) {
+       LDKBolt12InvoiceFeatures 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 = Bolt12InvoiceFeatures_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_Bolt12InvoiceFeatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = Bolt12InvoiceFeatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_BlindedHopFeatures_write(int64_t obj) {
+       LDKBlindedHopFeatures 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 = BlindedHopFeatures_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_BlindedHopFeatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopFeaturesDecodeErrorZ), "LDKCResult_BlindedHopFeaturesDecodeErrorZ");
+       *ret_conv = BlindedHopFeatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelTypeFeatures_write(int64_t obj) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_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_ChannelTypeFeatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTypeFeaturesDecodeErrorZ), "LDKCResult_ChannelTypeFeaturesDecodeErrorZ");
+       *ret_conv = ChannelTypeFeatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_InitFeatures_set_data_loss_protect_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_data_loss_protect_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_data_loss_protect_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_data_loss_protect_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_data_loss_protect(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_data_loss_protect(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_data_loss_protect_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_data_loss_protect_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_data_loss_protect_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_data_loss_protect_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_data_loss_protect(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_data_loss_protect(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_data_loss_protect(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_data_loss_protect(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_data_loss_protect(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_data_loss_protect(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_initial_routing_sync_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_initial_routing_sync_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_initial_routing_sync_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_initial_routing_sync_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_initial_routing_sync(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_initial_routing_sync(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_upfront_shutdown_script_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_upfront_shutdown_script_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_upfront_shutdown_script_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_upfront_shutdown_script_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_upfront_shutdown_script(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_upfront_shutdown_script(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_upfront_shutdown_script_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_upfront_shutdown_script_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_upfront_shutdown_script_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_upfront_shutdown_script_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_upfront_shutdown_script(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_upfront_shutdown_script(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_upfront_shutdown_script(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_upfront_shutdown_script(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_upfront_shutdown_script(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_upfront_shutdown_script(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_gossip_queries_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_gossip_queries_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_gossip_queries_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_gossip_queries_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_gossip_queries(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_gossip_queries(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_gossip_queries_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_gossip_queries_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_gossip_queries_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_gossip_queries_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_gossip_queries(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_gossip_queries(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_gossip_queries(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_gossip_queries(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_gossip_queries(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_gossip_queries(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_variable_length_onion_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_variable_length_onion_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_variable_length_onion_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_variable_length_onion_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_variable_length_onion(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_variable_length_onion(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_variable_length_onion_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_variable_length_onion_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_variable_length_onion_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_variable_length_onion_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_variable_length_onion(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_variable_length_onion(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_set_variable_length_onion_optional(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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;
+       Bolt11InvoiceFeatures_set_variable_length_onion_optional(&this_arg_conv);
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_set_variable_length_onion_required(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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;
+       Bolt11InvoiceFeatures_set_variable_length_onion_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_supports_variable_length_onion(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_supports_variable_length_onion(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_variable_length_onion(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_variable_length_onion(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_variable_length_onion(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_variable_length_onion(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_requires_variable_length_onion(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_requires_variable_length_onion(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_static_remote_key_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_static_remote_key_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_static_remote_key_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_static_remote_key_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_static_remote_key(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_static_remote_key(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_static_remote_key_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_static_remote_key_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_static_remote_key_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_static_remote_key_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_static_remote_key(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_static_remote_key(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_static_remote_key_optional(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_static_remote_key_optional(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_static_remote_key_required(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_static_remote_key_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_supports_static_remote_key(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_supports_static_remote_key(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_static_remote_key(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_static_remote_key(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_static_remote_key(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_static_remote_key(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_requires_static_remote_key(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_requires_static_remote_key(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_payment_secret_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_payment_secret_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_payment_secret_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_payment_secret_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_payment_secret(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_payment_secret(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_payment_secret_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_payment_secret_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_payment_secret_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_payment_secret_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_payment_secret(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_payment_secret(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_set_payment_secret_optional(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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;
+       Bolt11InvoiceFeatures_set_payment_secret_optional(&this_arg_conv);
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_set_payment_secret_required(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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;
+       Bolt11InvoiceFeatures_set_payment_secret_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_supports_payment_secret(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_supports_payment_secret(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_payment_secret(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_payment_secret(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_payment_secret(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_payment_secret(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_requires_payment_secret(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_requires_payment_secret(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_basic_mpp_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_basic_mpp_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_basic_mpp_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_basic_mpp_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_basic_mpp(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_basic_mpp(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_basic_mpp_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_basic_mpp_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_basic_mpp_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_basic_mpp_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_basic_mpp(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_basic_mpp(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_set_basic_mpp_optional(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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;
+       Bolt11InvoiceFeatures_set_basic_mpp_optional(&this_arg_conv);
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_set_basic_mpp_required(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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;
+       Bolt11InvoiceFeatures_set_basic_mpp_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_supports_basic_mpp(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_supports_basic_mpp(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Bolt12InvoiceFeatures_set_basic_mpp_optional(int64_t this_arg) {
+       LDKBolt12InvoiceFeatures 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;
+       Bolt12InvoiceFeatures_set_basic_mpp_optional(&this_arg_conv);
+}
+
+void  CS_LDK_Bolt12InvoiceFeatures_set_basic_mpp_required(int64_t this_arg) {
+       LDKBolt12InvoiceFeatures 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;
+       Bolt12InvoiceFeatures_set_basic_mpp_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_Bolt12InvoiceFeatures_supports_basic_mpp(int64_t this_arg) {
+       LDKBolt12InvoiceFeatures 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 = Bolt12InvoiceFeatures_supports_basic_mpp(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_basic_mpp(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_basic_mpp(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_basic_mpp(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_basic_mpp(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_requires_basic_mpp(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_requires_basic_mpp(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt12InvoiceFeatures_requires_basic_mpp(int64_t this_arg) {
+       LDKBolt12InvoiceFeatures 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 = Bolt12InvoiceFeatures_requires_basic_mpp(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_wumbo_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_wumbo_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_wumbo_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_wumbo_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_wumbo(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_wumbo(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_wumbo_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_wumbo_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_wumbo_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_wumbo_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_wumbo(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_wumbo(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_wumbo(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_wumbo(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_wumbo(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_wumbo(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_anchors_nonzero_fee_htlc_tx_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_anchors_nonzero_fee_htlc_tx_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_anchors_nonzero_fee_htlc_tx_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_anchors_nonzero_fee_htlc_tx_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_anchors_nonzero_fee_htlc_tx(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_anchors_nonzero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_anchors_nonzero_fee_htlc_tx_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_anchors_nonzero_fee_htlc_tx_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_anchors_nonzero_fee_htlc_tx_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_anchors_nonzero_fee_htlc_tx_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_anchors_nonzero_fee_htlc_tx(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_anchors_nonzero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_anchors_nonzero_fee_htlc_tx_optional(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_anchors_nonzero_fee_htlc_tx_optional(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_anchors_nonzero_fee_htlc_tx_required(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_anchors_nonzero_fee_htlc_tx_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_supports_anchors_nonzero_fee_htlc_tx(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_supports_anchors_nonzero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_anchors_nonzero_fee_htlc_tx(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_anchors_nonzero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_anchors_nonzero_fee_htlc_tx(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_anchors_nonzero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_requires_anchors_nonzero_fee_htlc_tx(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_requires_anchors_nonzero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_anchors_zero_fee_htlc_tx_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_anchors_zero_fee_htlc_tx_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_anchors_zero_fee_htlc_tx_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_anchors_zero_fee_htlc_tx_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_anchors_zero_fee_htlc_tx(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_anchors_zero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_anchors_zero_fee_htlc_tx_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_anchors_zero_fee_htlc_tx_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_anchors_zero_fee_htlc_tx_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_anchors_zero_fee_htlc_tx_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_anchors_zero_fee_htlc_tx(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_anchors_zero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_anchors_zero_fee_htlc_tx_optional(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_anchors_zero_fee_htlc_tx_optional(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_anchors_zero_fee_htlc_tx_required(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_anchors_zero_fee_htlc_tx_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_supports_anchors_zero_fee_htlc_tx(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_supports_anchors_zero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_anchors_zero_fee_htlc_tx(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_anchors_zero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_anchors_zero_fee_htlc_tx(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_anchors_zero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_requires_anchors_zero_fee_htlc_tx(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_requires_anchors_zero_fee_htlc_tx(&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);
+       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_shutdown_any_segwit_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_shutdown_any_segwit_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_shutdown_any_segwit_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_shutdown_anysegwit(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_shutdown_anysegwit(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_shutdown_any_segwit_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_shutdown_any_segwit_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_shutdown_any_segwit_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_shutdown_any_segwit_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_shutdown_anysegwit(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_shutdown_anysegwit(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_shutdown_anysegwit(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_shutdown_anysegwit(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_shutdown_anysegwit(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_shutdown_anysegwit(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_taproot_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_taproot_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_taproot_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_taproot_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_taproot(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_taproot(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_taproot_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_taproot_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_taproot_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_taproot_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_taproot(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_taproot(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_taproot_optional(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_taproot_optional(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_taproot_required(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_taproot_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_supports_taproot(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_supports_taproot(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_taproot(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_taproot(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_taproot(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_taproot(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_requires_taproot(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_requires_taproot(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_onion_messages_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_onion_messages_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_onion_messages_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_onion_messages_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_onion_messages(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_onion_messages(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_onion_messages_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_onion_messages_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_onion_messages_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_onion_messages_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_onion_messages(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_onion_messages(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_onion_messages(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_onion_messages(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_onion_messages(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_onion_messages(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_channel_type_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_channel_type_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_channel_type_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_channel_type_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_channel_type(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_channel_type(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_channel_type_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_channel_type_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_channel_type_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_channel_type_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_channel_type(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_channel_type(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_channel_type(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_channel_type(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_channel_type(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_channel_type(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_scid_privacy_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_scid_privacy_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_scid_privacy_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_scid_privacy_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_scid_privacy(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_scid_privacy(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_scid_privacy_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_scid_privacy_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_scid_privacy_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_scid_privacy_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_scid_privacy(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_scid_privacy(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_scid_privacy_optional(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_scid_privacy_optional(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_scid_privacy_required(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_scid_privacy_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_supports_scid_privacy(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_supports_scid_privacy(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_scid_privacy(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_scid_privacy(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_scid_privacy(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_scid_privacy(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_requires_scid_privacy(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_requires_scid_privacy(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_set_payment_metadata_optional(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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;
+       Bolt11InvoiceFeatures_set_payment_metadata_optional(&this_arg_conv);
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_set_payment_metadata_required(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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;
+       Bolt11InvoiceFeatures_set_payment_metadata_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_supports_payment_metadata(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_supports_payment_metadata(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_requires_payment_metadata(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_requires_payment_metadata(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_zero_conf_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_zero_conf_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_zero_conf_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_zero_conf_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_zero_conf(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_zero_conf(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_zero_conf_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_zero_conf_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_zero_conf_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_zero_conf_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_zero_conf(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_zero_conf(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_zero_conf_optional(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_zero_conf_optional(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_zero_conf_required(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_zero_conf_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_supports_zero_conf(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_supports_zero_conf(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_zero_conf(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_zero_conf(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_zero_conf(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_zero_conf(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_requires_zero_conf(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_requires_zero_conf(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_keysend_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_keysend_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_keysend_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_keysend_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_keysend(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_keysend(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_keysend(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_keysend(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ShutdownScript_free(int64_t this_obj) {
+       LDKShutdownScript 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);
+       ShutdownScript_free(this_obj_conv);
+}
+
+static inline uint64_t ShutdownScript_clone_ptr(LDKShutdownScript *NONNULL_PTR arg) {
+       LDKShutdownScript ret_var = ShutdownScript_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_ShutdownScript_clone_ptr(int64_t arg) {
+       LDKShutdownScript 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 = ShutdownScript_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ShutdownScript_clone(int64_t orig) {
+       LDKShutdownScript 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;
+       LDKShutdownScript ret_var = ShutdownScript_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_ShutdownScript_eq(int64_t a, int64_t b) {
+       LDKShutdownScript 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;
+       LDKShutdownScript 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 = ShutdownScript_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InvalidShutdownScript_free(int64_t this_obj) {
+       LDKInvalidShutdownScript 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);
+       InvalidShutdownScript_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_InvalidShutdownScript_get_script(int64_t this_ptr) {
+       LDKInvalidShutdownScript 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;
+       LDKu8slice 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);
+       return ret_arr;
+}
+
+void  CS_LDK_InvalidShutdownScript_set_script(int64_t this_ptr, int8_tArray val) {
+       LDKInvalidShutdownScript 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);
+       InvalidShutdownScript_set_script(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_InvalidShutdownScript_new(int8_tArray script_arg) {
+       LDKCVec_u8Z script_arg_ref;
+       script_arg_ref.datalen = script_arg->arr_len;
+       script_arg_ref.data = MALLOC(script_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(script_arg_ref.data, script_arg->elems, script_arg_ref.datalen); FREE(script_arg);
+       LDKInvalidShutdownScript ret_var = InvalidShutdownScript_new(script_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 InvalidShutdownScript_clone_ptr(LDKInvalidShutdownScript *NONNULL_PTR arg) {
+       LDKInvalidShutdownScript ret_var = InvalidShutdownScript_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_InvalidShutdownScript_clone_ptr(int64_t arg) {
+       LDKInvalidShutdownScript 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 = InvalidShutdownScript_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InvalidShutdownScript_clone(int64_t orig) {
+       LDKInvalidShutdownScript 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;
+       LDKInvalidShutdownScript ret_var = InvalidShutdownScript_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_ShutdownScript_write(int64_t obj) {
+       LDKShutdownScript 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 = ShutdownScript_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_ShutdownScript_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ShutdownScriptDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptDecodeErrorZ), "LDKCResult_ShutdownScriptDecodeErrorZ");
+       *ret_conv = ShutdownScript_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ShutdownScript_new_p2wpkh(int8_tArray pubkey_hash) {
+       uint8_t pubkey_hash_arr[20];
+       CHECK(pubkey_hash->arr_len == 20);
+       memcpy(pubkey_hash_arr, pubkey_hash->elems, 20); FREE(pubkey_hash);
+       uint8_t (*pubkey_hash_ref)[20] = &pubkey_hash_arr;
+       LDKShutdownScript ret_var = ShutdownScript_new_p2wpkh(pubkey_hash_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_ShutdownScript_new_p2wsh(int8_tArray script_hash) {
+       uint8_t script_hash_arr[32];
+       CHECK(script_hash->arr_len == 32);
+       memcpy(script_hash_arr, script_hash->elems, 32); FREE(script_hash);
+       uint8_t (*script_hash_ref)[32] = &script_hash_arr;
+       LDKShutdownScript ret_var = ShutdownScript_new_p2wsh(script_hash_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_ShutdownScript_new_witness_program(int8_t version, int8_tArray program) {
+       
+       LDKu8slice program_ref;
+       program_ref.datalen = program->arr_len;
+       program_ref.data = program->elems;
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptInvalidShutdownScriptZ), "LDKCResult_ShutdownScriptInvalidShutdownScriptZ");
+       *ret_conv = ShutdownScript_new_witness_program((LDKWitnessVersion){ ._0 = version }, program_ref);
+       FREE(program);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ShutdownScript_into_inner(int64_t this_arg) {
+       LDKShutdownScript 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 = ShutdownScript_clone(&this_arg_conv);
+       LDKCVec_u8Z ret_var = ShutdownScript_into_inner(this_arg_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;
+}
+
+int8_tArray  CS_LDK_ShutdownScript_as_legacy_pubkey(int64_t this_arg) {
+       LDKShutdownScript 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, ShutdownScript_as_legacy_pubkey(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+jboolean  CS_LDK_ShutdownScript_is_compatible(int64_t this_arg, int64_t features) {
+       LDKShutdownScript 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;
+       LDKInitFeatures features_conv;
+       features_conv.inner = untag_ptr(features);
+       features_conv.is_owned = ptr_is_owned(features);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_conv);
+       features_conv.is_owned = false;
+       jboolean ret_conv = ShutdownScript_is_compatible(&this_arg_conv, &features_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Retry_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);
+       LDKRetry this_ptr_conv = *(LDKRetry*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Retry_free(this_ptr_conv);
+}
+
+static inline uint64_t Retry_clone_ptr(LDKRetry *NONNULL_PTR arg) {
+       LDKRetry *ret_copy = MALLOC(sizeof(LDKRetry), "LDKRetry");
+       *ret_copy = Retry_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_Retry_clone_ptr(int64_t arg) {
+       LDKRetry* arg_conv = (LDKRetry*)untag_ptr(arg);
+       int64_t ret_conv = Retry_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Retry_clone(int64_t orig) {
+       LDKRetry* orig_conv = (LDKRetry*)untag_ptr(orig);
+       LDKRetry *ret_copy = MALLOC(sizeof(LDKRetry), "LDKRetry");
+       *ret_copy = Retry_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Retry_attempts(int32_t a) {
+       LDKRetry *ret_copy = MALLOC(sizeof(LDKRetry), "LDKRetry");
+       *ret_copy = Retry_attempts(a);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Retry_timeout(int64_t a) {
+       LDKRetry *ret_copy = MALLOC(sizeof(LDKRetry), "LDKRetry");
+       *ret_copy = Retry_timeout(a);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_Retry_eq(int64_t a, int64_t b) {
+       LDKRetry* a_conv = (LDKRetry*)untag_ptr(a);
+       LDKRetry* b_conv = (LDKRetry*)untag_ptr(b);
+       jboolean ret_conv = Retry_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Retry_hash(int64_t o) {
+       LDKRetry* o_conv = (LDKRetry*)untag_ptr(o);
+       int64_t ret_conv = Retry_hash(o_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Retry_write(int64_t obj) {
+       LDKRetry* obj_conv = (LDKRetry*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = Retry_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_Retry_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RetryDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RetryDecodeErrorZ), "LDKCResult_RetryDecodeErrorZ");
+       *ret_conv = Retry_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int32_t  CS_LDK_RetryableSendFailure_clone(int64_t orig) {
+       LDKRetryableSendFailure* orig_conv = (LDKRetryableSendFailure*)untag_ptr(orig);
+       int32_t ret_conv = LDKRetryableSendFailure_to_cs(RetryableSendFailure_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_RetryableSendFailure_payment_expired() {
+       int32_t ret_conv = LDKRetryableSendFailure_to_cs(RetryableSendFailure_payment_expired());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_RetryableSendFailure_route_not_found() {
+       int32_t ret_conv = LDKRetryableSendFailure_to_cs(RetryableSendFailure_route_not_found());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_RetryableSendFailure_duplicate_payment() {
+       int32_t ret_conv = LDKRetryableSendFailure_to_cs(RetryableSendFailure_duplicate_payment());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_RetryableSendFailure_eq(int64_t a, int64_t b) {
+       LDKRetryableSendFailure* a_conv = (LDKRetryableSendFailure*)untag_ptr(a);
+       LDKRetryableSendFailure* b_conv = (LDKRetryableSendFailure*)untag_ptr(b);
+       jboolean ret_conv = RetryableSendFailure_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentSendFailure_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);
+       LDKPaymentSendFailure this_ptr_conv = *(LDKPaymentSendFailure*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       PaymentSendFailure_free(this_ptr_conv);
+}
+
+static inline uint64_t PaymentSendFailure_clone_ptr(LDKPaymentSendFailure *NONNULL_PTR arg) {
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = PaymentSendFailure_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_PaymentSendFailure_clone_ptr(int64_t arg) {
+       LDKPaymentSendFailure* arg_conv = (LDKPaymentSendFailure*)untag_ptr(arg);
+       int64_t ret_conv = PaymentSendFailure_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PaymentSendFailure_clone(int64_t orig) {
+       LDKPaymentSendFailure* orig_conv = (LDKPaymentSendFailure*)untag_ptr(orig);
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = PaymentSendFailure_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PaymentSendFailure_parameter_error(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKAPIError a_conv = *(LDKAPIError*)(a_ptr);
+       a_conv = APIError_clone((LDKAPIError*)untag_ptr(a));
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = PaymentSendFailure_parameter_error(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PaymentSendFailure_path_parameter_error(int64_tArray a) {
+       LDKCVec_CResult_NoneAPIErrorZZ a_constr;
+       a_constr.datalen = a->arr_len;
+       if (a_constr.datalen > 0)
+               a_constr.data = MALLOC(a_constr.datalen * sizeof(LDKCResult_NoneAPIErrorZ), "LDKCVec_CResult_NoneAPIErrorZZ Elements");
+       else
+               a_constr.data = NULL;
+       int64_t* a_vals = a->elems;
+       for (size_t w = 0; w < a_constr.datalen; w++) {
+               int64_t a_conv_22 = a_vals[w];
+               void* a_conv_22_ptr = untag_ptr(a_conv_22);
+               CHECK_ACCESS(a_conv_22_ptr);
+               LDKCResult_NoneAPIErrorZ a_conv_22_conv = *(LDKCResult_NoneAPIErrorZ*)(a_conv_22_ptr);
+               a_conv_22_conv = CResult_NoneAPIErrorZ_clone((LDKCResult_NoneAPIErrorZ*)untag_ptr(a_conv_22));
+               a_constr.data[w] = a_conv_22_conv;
+       }
+       FREE(a);
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = PaymentSendFailure_path_parameter_error(a_constr);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PaymentSendFailure_all_failed_resend_safe(int64_tArray a) {
+       LDKCVec_APIErrorZ a_constr;
+       a_constr.datalen = a->arr_len;
+       if (a_constr.datalen > 0)
+               a_constr.data = MALLOC(a_constr.datalen * sizeof(LDKAPIError), "LDKCVec_APIErrorZ Elements");
+       else
+               a_constr.data = NULL;
+       int64_t* a_vals = a->elems;
+       for (size_t k = 0; k < a_constr.datalen; k++) {
+               int64_t a_conv_10 = a_vals[k];
+               void* a_conv_10_ptr = untag_ptr(a_conv_10);
+               CHECK_ACCESS(a_conv_10_ptr);
+               LDKAPIError a_conv_10_conv = *(LDKAPIError*)(a_conv_10_ptr);
+               a_conv_10_conv = APIError_clone((LDKAPIError*)untag_ptr(a_conv_10));
+               a_constr.data[k] = a_conv_10_conv;
+       }
+       FREE(a);
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = PaymentSendFailure_all_failed_resend_safe(a_constr);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PaymentSendFailure_duplicate_payment() {
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = PaymentSendFailure_duplicate_payment();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PaymentSendFailure_partial_failure(int64_tArray results, int64_t failed_paths_retry, int8_tArray payment_id) {
+       LDKCVec_CResult_NoneAPIErrorZZ results_constr;
+       results_constr.datalen = results->arr_len;
+       if (results_constr.datalen > 0)
+               results_constr.data = MALLOC(results_constr.datalen * sizeof(LDKCResult_NoneAPIErrorZ), "LDKCVec_CResult_NoneAPIErrorZZ Elements");
+       else
+               results_constr.data = NULL;
+       int64_t* results_vals = results->elems;
+       for (size_t w = 0; w < results_constr.datalen; w++) {
+               int64_t results_conv_22 = results_vals[w];
+               void* results_conv_22_ptr = untag_ptr(results_conv_22);
+               CHECK_ACCESS(results_conv_22_ptr);
+               LDKCResult_NoneAPIErrorZ results_conv_22_conv = *(LDKCResult_NoneAPIErrorZ*)(results_conv_22_ptr);
+               results_constr.data[w] = results_conv_22_conv;
+       }
+       FREE(results);
+       LDKRouteParameters failed_paths_retry_conv;
+       failed_paths_retry_conv.inner = untag_ptr(failed_paths_retry);
+       failed_paths_retry_conv.is_owned = ptr_is_owned(failed_paths_retry);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(failed_paths_retry_conv);
+       failed_paths_retry_conv = RouteParameters_clone(&failed_paths_retry_conv);
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = PaymentSendFailure_partial_failure(results_constr, failed_paths_retry_conv, payment_id_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_PaymentSendFailure_eq(int64_t a, int64_t b) {
+       LDKPaymentSendFailure* a_conv = (LDKPaymentSendFailure*)untag_ptr(a);
+       LDKPaymentSendFailure* b_conv = (LDKPaymentSendFailure*)untag_ptr(b);
+       jboolean ret_conv = PaymentSendFailure_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbeSendFailure_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);
+       LDKProbeSendFailure this_ptr_conv = *(LDKProbeSendFailure*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       ProbeSendFailure_free(this_ptr_conv);
+}
+
+static inline uint64_t ProbeSendFailure_clone_ptr(LDKProbeSendFailure *NONNULL_PTR arg) {
+       LDKProbeSendFailure *ret_copy = MALLOC(sizeof(LDKProbeSendFailure), "LDKProbeSendFailure");
+       *ret_copy = ProbeSendFailure_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_ProbeSendFailure_clone_ptr(int64_t arg) {
+       LDKProbeSendFailure* arg_conv = (LDKProbeSendFailure*)untag_ptr(arg);
+       int64_t ret_conv = ProbeSendFailure_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ProbeSendFailure_clone(int64_t orig) {
+       LDKProbeSendFailure* orig_conv = (LDKProbeSendFailure*)untag_ptr(orig);
+       LDKProbeSendFailure *ret_copy = MALLOC(sizeof(LDKProbeSendFailure), "LDKProbeSendFailure");
+       *ret_copy = ProbeSendFailure_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ProbeSendFailure_route_not_found() {
+       LDKProbeSendFailure *ret_copy = MALLOC(sizeof(LDKProbeSendFailure), "LDKProbeSendFailure");
+       *ret_copy = ProbeSendFailure_route_not_found();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ProbeSendFailure_sending_failed(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKPaymentSendFailure a_conv = *(LDKPaymentSendFailure*)(a_ptr);
+       a_conv = PaymentSendFailure_clone((LDKPaymentSendFailure*)untag_ptr(a));
+       LDKProbeSendFailure *ret_copy = MALLOC(sizeof(LDKProbeSendFailure), "LDKProbeSendFailure");
+       *ret_copy = ProbeSendFailure_sending_failed(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_ProbeSendFailure_eq(int64_t a, int64_t b) {
+       LDKProbeSendFailure* a_conv = (LDKProbeSendFailure*)untag_ptr(a);
+       LDKProbeSendFailure* b_conv = (LDKProbeSendFailure*)untag_ptr(b);
+       jboolean ret_conv = ProbeSendFailure_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RecipientOnionFields_free(int64_t this_obj) {
+       LDKRecipientOnionFields 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);
+       RecipientOnionFields_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_RecipientOnionFields_get_payment_secret(int64_t this_ptr) {
+       LDKRecipientOnionFields 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 = RecipientOnionFields_get_payment_secret(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_RecipientOnionFields_set_payment_secret(int64_t this_ptr, int64_t val) {
+       LDKRecipientOnionFields 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));
+       RecipientOnionFields_set_payment_secret(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_RecipientOnionFields_get_payment_metadata(int64_t this_ptr) {
+       LDKRecipientOnionFields 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_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = RecipientOnionFields_get_payment_metadata(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_RecipientOnionFields_set_payment_metadata(int64_t this_ptr, int64_t val) {
+       LDKRecipientOnionFields 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_u8ZZ val_conv = *(LDKCOption_CVec_u8ZZ*)(val_ptr);
+       val_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(val));
+       RecipientOnionFields_set_payment_metadata(&this_ptr_conv, val_conv);
+}
+
+static inline uint64_t RecipientOnionFields_clone_ptr(LDKRecipientOnionFields *NONNULL_PTR arg) {
+       LDKRecipientOnionFields ret_var = RecipientOnionFields_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_RecipientOnionFields_clone_ptr(int64_t arg) {
+       LDKRecipientOnionFields 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 = RecipientOnionFields_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RecipientOnionFields_clone(int64_t orig) {
+       LDKRecipientOnionFields 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;
+       LDKRecipientOnionFields ret_var = RecipientOnionFields_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_RecipientOnionFields_eq(int64_t a, int64_t b) {
+       LDKRecipientOnionFields 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;
+       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.is_owned = false;
+       jboolean ret_conv = RecipientOnionFields_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_RecipientOnionFields_write(int64_t obj) {
+       LDKRecipientOnionFields 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 = RecipientOnionFields_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_RecipientOnionFields_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsDecodeErrorZ), "LDKCResult_RecipientOnionFieldsDecodeErrorZ");
+       *ret_conv = RecipientOnionFields_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RecipientOnionFields_secret_only(int8_tArray payment_secret) {
+       LDKThirtyTwoBytes payment_secret_ref;
+       CHECK(payment_secret->arr_len == 32);
+       memcpy(payment_secret_ref.data, payment_secret->elems, 32); FREE(payment_secret);
+       LDKRecipientOnionFields ret_var = RecipientOnionFields_secret_only(payment_secret_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_RecipientOnionFields_spontaneous_empty() {
+       LDKRecipientOnionFields ret_var = RecipientOnionFields_spontaneous_empty();
+       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_RecipientOnionFields_with_custom_tlvs(int64_t this_arg, int64_tArray custom_tlvs) {
+       LDKRecipientOnionFields 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 = RecipientOnionFields_clone(&this_arg_conv);
+       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);
+       LDKCResult_RecipientOnionFieldsNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsNoneZ), "LDKCResult_RecipientOnionFieldsNoneZ");
+       *ret_conv = RecipientOnionFields_with_custom_tlvs(this_arg_conv, custom_tlvs_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_tArray  CS_LDK_RecipientOnionFields_custom_tlvs(int64_t this_arg) {
+       LDKRecipientOnionFields 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;
+       LDKCVec_C2Tuple_u64CVec_u8ZZZ ret_var = RecipientOnionFields_custom_tlvs(&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_u64CVec_u8ZZ* ret_conv_23_conv = MALLOC(sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKC2Tuple_u64CVec_u8ZZ");
+               *ret_conv_23_conv = ret_var.data[x];
+               ret_arr_ptr[x] = tag_ptr(ret_conv_23_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_CustomMessageReader_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);
+       LDKCustomMessageReader this_ptr_conv = *(LDKCustomMessageReader*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       CustomMessageReader_free(this_ptr_conv);
+}
+
+static inline uint64_t Type_clone_ptr(LDKType *NONNULL_PTR arg) {
+       LDKType* ret_ret = MALLOC(sizeof(LDKType), "LDKType");
+       *ret_ret = Type_clone(arg);
+       return tag_ptr(ret_ret, true);
+}
+int64_t  CS_LDK_Type_clone_ptr(int64_t arg) {
+       void* arg_ptr = untag_ptr(arg);
+       if (ptr_is_owned(arg)) { CHECK_ACCESS(arg_ptr); }
+       LDKType* arg_conv = (LDKType*)arg_ptr;
+       int64_t ret_conv = Type_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Type_clone(int64_t orig) {
+       void* orig_ptr = untag_ptr(orig);
+       if (ptr_is_owned(orig)) { CHECK_ACCESS(orig_ptr); }
+       LDKType* orig_conv = (LDKType*)orig_ptr;
+       LDKType* ret_ret = MALLOC(sizeof(LDKType), "LDKType");
+       *ret_ret = Type_clone(orig_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_Type_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);
+       LDKType this_ptr_conv = *(LDKType*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Type_free(this_ptr_conv);
+}
+
+void  CS_LDK_Offer_free(int64_t this_obj) {
+       LDKOffer 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);
+       Offer_free(this_obj_conv);
+}
+
+static inline uint64_t Offer_clone_ptr(LDKOffer *NONNULL_PTR arg) {
+       LDKOffer ret_var = Offer_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_Offer_clone_ptr(int64_t arg) {
+       LDKOffer 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 = Offer_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Offer_clone(int64_t orig) {
+       LDKOffer 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;
+       LDKOffer ret_var = Offer_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;
+}
+
+ptrArray  CS_LDK_Offer_chains(int64_t this_arg) {
+       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;
+       LDKCVec_ThirtyTwoBytesZ ret_var = Offer_chains(&this_arg_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(32, __LINE__);
+               memcpy(ret_conv_8_arr->elems, ret_var.data[i].data, 32);
+               ret_arr_ptr[i] = ret_conv_8_arr;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Offer_metadata(int64_t this_arg) {
+       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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = Offer_metadata(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Offer_amount(int64_t this_arg) {
+       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;
+       LDKAmount ret_var = Offer_amount(&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_Offer_description(int64_t this_arg) {
+       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;
+       LDKPrintableString ret_var = Offer_description(&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_Offer_offer_features(int64_t this_arg) {
+       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;
+       LDKOfferFeatures ret_var = Offer_offer_features(&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_Offer_absolute_expiry(int64_t this_arg) {
+       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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = Offer_absolute_expiry(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Offer_issuer(int64_t this_arg) {
+       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;
+       LDKPrintableString ret_var = Offer_issuer(&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_tArray  CS_LDK_Offer_paths(int64_t this_arg) {
+       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;
+       LDKCVec_BlindedPathZ ret_var = Offer_paths(&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 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;
+}
+
+int64_t  CS_LDK_Offer_supported_quantity(int64_t this_arg) {
+       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;
+       LDKQuantity ret_var = Offer_supported_quantity(&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;
+}
+
+int8_tArray  CS_LDK_Offer_signing_pubkey(int64_t this_arg) {
+       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;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, Offer_signing_pubkey(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+jboolean  CS_LDK_Offer_supports_chain(int64_t this_arg, int8_tArray chain) {
+       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;
+       LDKThirtyTwoBytes chain_ref;
+       CHECK(chain->arr_len == 32);
+       memcpy(chain_ref.data, chain->elems, 32); FREE(chain);
+       jboolean ret_conv = Offer_supports_chain(&this_arg_conv, chain_ref);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Offer_is_expired(int64_t this_arg) {
+       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(&this_arg_conv);
+       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);
+       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_valid_quantity(&this_arg_conv, quantity);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Offer_expects_quantity(int64_t this_arg) {
+       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_expects_quantity(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Offer_write(int64_t obj) {
+       LDKOffer 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 = Offer_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;
+}
+
+void  CS_LDK_Amount_free(int64_t this_obj) {
+       LDKAmount 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);
+       Amount_free(this_obj_conv);
+}
+
+static inline uint64_t Amount_clone_ptr(LDKAmount *NONNULL_PTR arg) {
+       LDKAmount ret_var = Amount_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_Amount_clone_ptr(int64_t arg) {
+       LDKAmount 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 = Amount_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Amount_clone(int64_t orig) {
+       LDKAmount 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;
+       LDKAmount ret_var = Amount_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_Quantity_free(int64_t this_obj) {
+       LDKQuantity 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);
+       Quantity_free(this_obj_conv);
+}
+
+static inline uint64_t Quantity_clone_ptr(LDKQuantity *NONNULL_PTR arg) {
+       LDKQuantity ret_var = Quantity_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_Quantity_clone_ptr(int64_t arg) {
+       LDKQuantity 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 = Quantity_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Quantity_clone(int64_t orig) {
+       LDKQuantity 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;
+       LDKQuantity ret_var = Quantity_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_Offer_from_str(jstring s) {
+       LDKStr s_conv = str_ref_to_owned_c(s);
+       LDKCResult_OfferBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OfferBolt12ParseErrorZ), "LDKCResult_OfferBolt12ParseErrorZ");
+       *ret_conv = Offer_from_str(s_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_UnsignedBolt12Invoice_free(int64_t this_obj) {
+       LDKUnsignedBolt12Invoice 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);
+       UnsignedBolt12Invoice_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_tagged_hash(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKTaggedHash ret_var = UnsignedBolt12Invoice_tagged_hash(&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;
+}
+
+void  CS_LDK_Bolt12Invoice_free(int64_t this_obj) {
+       LDKBolt12Invoice 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);
+       Bolt12Invoice_free(this_obj_conv);
+}
+
+static inline uint64_t Bolt12Invoice_clone_ptr(LDKBolt12Invoice *NONNULL_PTR arg) {
+       LDKBolt12Invoice ret_var = Bolt12Invoice_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_Bolt12Invoice_clone_ptr(int64_t arg) {
+       LDKBolt12Invoice 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 = Bolt12Invoice_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_clone(int64_t orig) {
+       LDKBolt12Invoice 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;
+       LDKBolt12Invoice ret_var = Bolt12Invoice_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_UnsignedBolt12Invoice_offer_chains(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKCOption_CVec_ThirtyTwoBytesZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_ThirtyTwoBytesZZ), "LDKCOption_CVec_ThirtyTwoBytesZZ");
+       *ret_copy = UnsignedBolt12Invoice_offer_chains(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_UnsignedBolt12Invoice_chain(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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, UnsignedBolt12Invoice_chain(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_metadata(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = UnsignedBolt12Invoice_metadata(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_amount(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKAmount ret_var = UnsignedBolt12Invoice_amount(&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_UnsignedBolt12Invoice_offer_features(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKOfferFeatures ret_var = UnsignedBolt12Invoice_offer_features(&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_UnsignedBolt12Invoice_description(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKPrintableString ret_var = UnsignedBolt12Invoice_description(&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_UnsignedBolt12Invoice_absolute_expiry(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = UnsignedBolt12Invoice_absolute_expiry(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_issuer(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKPrintableString ret_var = UnsignedBolt12Invoice_issuer(&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_tArray  CS_LDK_UnsignedBolt12Invoice_message_paths(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKCVec_BlindedPathZ ret_var = UnsignedBolt12Invoice_message_paths(&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 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;
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_supported_quantity(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKQuantity ret_var = UnsignedBolt12Invoice_supported_quantity(&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;
+}
+
+int8_tArray  CS_LDK_UnsignedBolt12Invoice_payer_metadata(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKu8slice ret_var = UnsignedBolt12Invoice_payer_metadata(&this_arg_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_UnsignedBolt12Invoice_invoice_request_features(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKInvoiceRequestFeatures ret_var = UnsignedBolt12Invoice_invoice_request_features(&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_UnsignedBolt12Invoice_quantity(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = UnsignedBolt12Invoice_quantity(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_UnsignedBolt12Invoice_payer_id(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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, UnsignedBolt12Invoice_payer_id(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_payer_note(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKPrintableString ret_var = UnsignedBolt12Invoice_payer_note(&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_UnsignedBolt12Invoice_created_at(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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 = UnsignedBolt12Invoice_created_at(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_relative_expiry(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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 = UnsignedBolt12Invoice_relative_expiry(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_UnsignedBolt12Invoice_is_expired(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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 = UnsignedBolt12Invoice_is_expired(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_UnsignedBolt12Invoice_payment_hash(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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, UnsignedBolt12Invoice_payment_hash(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_amount_msats(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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 = UnsignedBolt12Invoice_amount_msats(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_invoice_features(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKBolt12InvoiceFeatures ret_var = UnsignedBolt12Invoice_invoice_features(&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;
+}
+
+int8_tArray  CS_LDK_UnsignedBolt12Invoice_signing_pubkey(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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, UnsignedBolt12Invoice_signing_pubkey(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_offer_chains(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKCOption_CVec_ThirtyTwoBytesZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_ThirtyTwoBytesZZ), "LDKCOption_CVec_ThirtyTwoBytesZZ");
+       *ret_copy = Bolt12Invoice_offer_chains(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_Bolt12Invoice_chain(int64_t this_arg) {
+       LDKBolt12Invoice 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, Bolt12Invoice_chain(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_metadata(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = Bolt12Invoice_metadata(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_amount(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKAmount ret_var = Bolt12Invoice_amount(&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_Bolt12Invoice_offer_features(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKOfferFeatures ret_var = Bolt12Invoice_offer_features(&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_Bolt12Invoice_description(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKPrintableString ret_var = Bolt12Invoice_description(&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_Bolt12Invoice_absolute_expiry(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = Bolt12Invoice_absolute_expiry(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_issuer(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKPrintableString ret_var = Bolt12Invoice_issuer(&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_tArray  CS_LDK_Bolt12Invoice_message_paths(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKCVec_BlindedPathZ ret_var = Bolt12Invoice_message_paths(&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 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;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_supported_quantity(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKQuantity ret_var = Bolt12Invoice_supported_quantity(&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;
+}
+
+int8_tArray  CS_LDK_Bolt12Invoice_payer_metadata(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKu8slice ret_var = Bolt12Invoice_payer_metadata(&this_arg_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_Bolt12Invoice_invoice_request_features(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKInvoiceRequestFeatures ret_var = Bolt12Invoice_invoice_request_features(&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_Bolt12Invoice_quantity(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = Bolt12Invoice_quantity(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_Bolt12Invoice_payer_id(int64_t this_arg) {
+       LDKBolt12Invoice 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, Bolt12Invoice_payer_id(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_payer_note(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKPrintableString ret_var = Bolt12Invoice_payer_note(&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_Bolt12Invoice_created_at(int64_t this_arg) {
+       LDKBolt12Invoice 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 = Bolt12Invoice_created_at(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_relative_expiry(int64_t this_arg) {
+       LDKBolt12Invoice 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 = Bolt12Invoice_relative_expiry(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt12Invoice_is_expired(int64_t this_arg) {
+       LDKBolt12Invoice 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 = Bolt12Invoice_is_expired(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Bolt12Invoice_payment_hash(int64_t this_arg) {
+       LDKBolt12Invoice 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, Bolt12Invoice_payment_hash(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_amount_msats(int64_t this_arg) {
+       LDKBolt12Invoice 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 = Bolt12Invoice_amount_msats(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_invoice_features(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKBolt12InvoiceFeatures ret_var = Bolt12Invoice_invoice_features(&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;
+}
+
+int8_tArray  CS_LDK_Bolt12Invoice_signing_pubkey(int64_t this_arg) {
+       LDKBolt12Invoice 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, Bolt12Invoice_signing_pubkey(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_Bolt12Invoice_signature(int64_t this_arg) {
+       LDKBolt12Invoice 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(64, __LINE__);
+       memcpy(ret_arr->elems, Bolt12Invoice_signature(&this_arg_conv).compact_form, 64);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_Bolt12Invoice_signable_hash(int64_t this_arg) {
+       LDKBolt12Invoice 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, Bolt12Invoice_signable_hash(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_verify(int64_t this_arg, int64_t key) {
+       LDKBolt12Invoice 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;
+       LDKExpandedKey key_conv;
+       key_conv.inner = untag_ptr(key);
+       key_conv.is_owned = ptr_is_owned(key);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(key_conv);
+       key_conv.is_owned = false;
+       LDKCResult_ThirtyTwoBytesNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesNoneZ), "LDKCResult_ThirtyTwoBytesNoneZ");
+       *ret_conv = Bolt12Invoice_verify(&this_arg_conv, &key_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_UnsignedBolt12Invoice_write(int64_t obj) {
+       LDKUnsignedBolt12Invoice 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 = UnsignedBolt12Invoice_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;
+}
+
+int8_tArray  CS_LDK_Bolt12Invoice_write(int64_t obj) {
+       LDKBolt12Invoice 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 = Bolt12Invoice_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;
+}
+
+void  CS_LDK_BlindedPayInfo_free(int64_t this_obj) {
+       LDKBlindedPayInfo 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);
+       BlindedPayInfo_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_BlindedPayInfo_get_fee_base_msat(int64_t this_ptr) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_get_fee_base_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedPayInfo_set_fee_base_msat(int64_t this_ptr, int32_t val) {
+       LDKBlindedPayInfo 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;
+       BlindedPayInfo_set_fee_base_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_BlindedPayInfo_get_fee_proportional_millionths(int64_t this_ptr) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_get_fee_proportional_millionths(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedPayInfo_set_fee_proportional_millionths(int64_t this_ptr, int32_t val) {
+       LDKBlindedPayInfo 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;
+       BlindedPayInfo_set_fee_proportional_millionths(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_BlindedPayInfo_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_get_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedPayInfo_set_cltv_expiry_delta(int64_t this_ptr, int16_t val) {
+       LDKBlindedPayInfo 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;
+       BlindedPayInfo_set_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_BlindedPayInfo_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_get_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedPayInfo_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKBlindedPayInfo 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;
+       BlindedPayInfo_set_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_BlindedPayInfo_get_htlc_maximum_msat(int64_t this_ptr) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_get_htlc_maximum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedPayInfo_set_htlc_maximum_msat(int64_t this_ptr, int64_t val) {
+       LDKBlindedPayInfo 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;
+       BlindedPayInfo_set_htlc_maximum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_BlindedPayInfo_get_features(int64_t this_ptr) {
+       LDKBlindedPayInfo 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;
+       LDKBlindedHopFeatures ret_var = BlindedPayInfo_get_features(&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_BlindedPayInfo_set_features(int64_t this_ptr, int64_t val) {
+       LDKBlindedPayInfo 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;
+       LDKBlindedHopFeatures 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 = BlindedHopFeatures_clone(&val_conv);
+       BlindedPayInfo_set_features(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_BlindedPayInfo_new(int32_t fee_base_msat_arg, int32_t fee_proportional_millionths_arg, int16_t cltv_expiry_delta_arg, int64_t htlc_minimum_msat_arg, int64_t htlc_maximum_msat_arg, int64_t features_arg) {
+       LDKBlindedHopFeatures features_arg_conv;
+       features_arg_conv.inner = untag_ptr(features_arg);
+       features_arg_conv.is_owned = ptr_is_owned(features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_arg_conv);
+       features_arg_conv = BlindedHopFeatures_clone(&features_arg_conv);
+       LDKBlindedPayInfo ret_var = BlindedPayInfo_new(fee_base_msat_arg, fee_proportional_millionths_arg, cltv_expiry_delta_arg, htlc_minimum_msat_arg, htlc_maximum_msat_arg, features_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 BlindedPayInfo_clone_ptr(LDKBlindedPayInfo *NONNULL_PTR arg) {
+       LDKBlindedPayInfo ret_var = BlindedPayInfo_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_BlindedPayInfo_clone_ptr(int64_t arg) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedPayInfo_clone(int64_t orig) {
+       LDKBlindedPayInfo 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;
+       LDKBlindedPayInfo ret_var = BlindedPayInfo_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_BlindedPayInfo_hash(int64_t o) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BlindedPayInfo_eq(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.is_owned = false;
+       LDKBlindedPayInfo 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 = BlindedPayInfo_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_BlindedPayInfo_write(int64_t obj) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_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_BlindedPayInfo_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BlindedPayInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPayInfoDecodeErrorZ), "LDKCResult_BlindedPayInfoDecodeErrorZ");
+       *ret_conv = BlindedPayInfo_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_InvoiceError_free(int64_t this_obj) {
+       LDKInvoiceError 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);
+       InvoiceError_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_InvoiceError_get_erroneous_field(int64_t this_ptr) {
+       LDKInvoiceError 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;
+       LDKErroneousField ret_var = InvoiceError_get_erroneous_field(&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_InvoiceError_set_erroneous_field(int64_t this_ptr, int64_t val) {
+       LDKInvoiceError 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;
+       LDKErroneousField 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 = ErroneousField_clone(&val_conv);
+       InvoiceError_set_erroneous_field(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_InvoiceError_get_message(int64_t this_ptr) {
+       LDKInvoiceError 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;
+       LDKUntrustedString ret_var = InvoiceError_get_message(&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_InvoiceError_set_message(int64_t this_ptr, int64_t val) {
+       LDKInvoiceError 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;
+       LDKUntrustedString 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 = UntrustedString_clone(&val_conv);
+       InvoiceError_set_message(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_InvoiceError_new(int64_t erroneous_field_arg, int64_t message_arg) {
+       LDKErroneousField erroneous_field_arg_conv;
+       erroneous_field_arg_conv.inner = untag_ptr(erroneous_field_arg);
+       erroneous_field_arg_conv.is_owned = ptr_is_owned(erroneous_field_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(erroneous_field_arg_conv);
+       erroneous_field_arg_conv = ErroneousField_clone(&erroneous_field_arg_conv);
+       LDKUntrustedString message_arg_conv;
+       message_arg_conv.inner = untag_ptr(message_arg);
+       message_arg_conv.is_owned = ptr_is_owned(message_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(message_arg_conv);
+       message_arg_conv = UntrustedString_clone(&message_arg_conv);
+       LDKInvoiceError ret_var = InvoiceError_new(erroneous_field_arg_conv, message_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 InvoiceError_clone_ptr(LDKInvoiceError *NONNULL_PTR arg) {
+       LDKInvoiceError ret_var = InvoiceError_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_InvoiceError_clone_ptr(int64_t arg) {
+       LDKInvoiceError 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 = InvoiceError_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InvoiceError_clone(int64_t orig) {
+       LDKInvoiceError 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;
+       LDKInvoiceError ret_var = InvoiceError_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_ErroneousField_free(int64_t this_obj) {
+       LDKErroneousField 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);
+       ErroneousField_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ErroneousField_get_tlv_fieldnum(int64_t this_ptr) {
+       LDKErroneousField 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 = ErroneousField_get_tlv_fieldnum(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ErroneousField_set_tlv_fieldnum(int64_t this_ptr, int64_t val) {
+       LDKErroneousField 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;
+       ErroneousField_set_tlv_fieldnum(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ErroneousField_get_suggested_value(int64_t this_ptr) {
+       LDKErroneousField 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_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = ErroneousField_get_suggested_value(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ErroneousField_set_suggested_value(int64_t this_ptr, int64_t val) {
+       LDKErroneousField 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_u8ZZ val_conv = *(LDKCOption_CVec_u8ZZ*)(val_ptr);
+       val_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(val));
+       ErroneousField_set_suggested_value(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ErroneousField_new(int64_t tlv_fieldnum_arg, int64_t suggested_value_arg) {
+       void* suggested_value_arg_ptr = untag_ptr(suggested_value_arg);
+       CHECK_ACCESS(suggested_value_arg_ptr);
+       LDKCOption_CVec_u8ZZ suggested_value_arg_conv = *(LDKCOption_CVec_u8ZZ*)(suggested_value_arg_ptr);
+       suggested_value_arg_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(suggested_value_arg));
+       LDKErroneousField ret_var = ErroneousField_new(tlv_fieldnum_arg, suggested_value_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 ErroneousField_clone_ptr(LDKErroneousField *NONNULL_PTR arg) {
+       LDKErroneousField ret_var = ErroneousField_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_ErroneousField_clone_ptr(int64_t arg) {
+       LDKErroneousField 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 = ErroneousField_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ErroneousField_clone(int64_t orig) {
+       LDKErroneousField 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;
+       LDKErroneousField ret_var = ErroneousField_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_InvoiceError_from_string(jstring s) {
+       LDKStr s_conv = str_ref_to_owned_c(s);
+       LDKInvoiceError ret_var = InvoiceError_from_string(s_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_InvoiceError_write(int64_t obj) {
+       LDKInvoiceError 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 = InvoiceError_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_InvoiceError_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_InvoiceErrorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InvoiceErrorDecodeErrorZ), "LDKCResult_InvoiceErrorDecodeErrorZ");
+       *ret_conv = InvoiceError_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_UnsignedInvoiceRequest_free(int64_t this_obj) {
+       LDKUnsignedInvoiceRequest 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);
+       UnsignedInvoiceRequest_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_UnsignedInvoiceRequest_tagged_hash(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKTaggedHash ret_var = UnsignedInvoiceRequest_tagged_hash(&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;
+}
+
+void  CS_LDK_InvoiceRequest_free(int64_t this_obj) {
+       LDKInvoiceRequest 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);
+       InvoiceRequest_free(this_obj_conv);
+}
+
+static inline uint64_t InvoiceRequest_clone_ptr(LDKInvoiceRequest *NONNULL_PTR arg) {
+       LDKInvoiceRequest ret_var = InvoiceRequest_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_InvoiceRequest_clone_ptr(int64_t arg) {
+       LDKInvoiceRequest 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 = InvoiceRequest_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InvoiceRequest_clone(int64_t orig) {
+       LDKInvoiceRequest 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;
+       LDKInvoiceRequest ret_var = InvoiceRequest_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_VerifiedInvoiceRequest_free(int64_t this_obj) {
+       LDKVerifiedInvoiceRequest 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);
+       VerifiedInvoiceRequest_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_get_keys(int64_t this_ptr) {
+       LDKVerifiedInvoiceRequest 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_SecretKeyZ *ret_copy = MALLOC(sizeof(LDKCOption_SecretKeyZ), "LDKCOption_SecretKeyZ");
+       *ret_copy = VerifiedInvoiceRequest_get_keys(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_VerifiedInvoiceRequest_set_keys(int64_t this_ptr, int64_t val) {
+       LDKVerifiedInvoiceRequest 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_SecretKeyZ val_conv = *(LDKCOption_SecretKeyZ*)(val_ptr);
+       val_conv = COption_SecretKeyZ_clone((LDKCOption_SecretKeyZ*)untag_ptr(val));
+       VerifiedInvoiceRequest_set_keys(&this_ptr_conv, val_conv);
+}
+
+static inline uint64_t VerifiedInvoiceRequest_clone_ptr(LDKVerifiedInvoiceRequest *NONNULL_PTR arg) {
+       LDKVerifiedInvoiceRequest ret_var = VerifiedInvoiceRequest_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_VerifiedInvoiceRequest_clone_ptr(int64_t arg) {
+       LDKVerifiedInvoiceRequest 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 = VerifiedInvoiceRequest_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_clone(int64_t orig) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKVerifiedInvoiceRequest ret_var = VerifiedInvoiceRequest_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;
+}
+
+ptrArray  CS_LDK_UnsignedInvoiceRequest_chains(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKCVec_ThirtyTwoBytesZ ret_var = UnsignedInvoiceRequest_chains(&this_arg_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(32, __LINE__);
+               memcpy(ret_conv_8_arr->elems, ret_var.data[i].data, 32);
+               ret_arr_ptr[i] = ret_conv_8_arr;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_UnsignedInvoiceRequest_metadata(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = UnsignedInvoiceRequest_metadata(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UnsignedInvoiceRequest_amount(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKAmount ret_var = UnsignedInvoiceRequest_amount(&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_UnsignedInvoiceRequest_description(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKPrintableString ret_var = UnsignedInvoiceRequest_description(&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_UnsignedInvoiceRequest_offer_features(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKOfferFeatures ret_var = UnsignedInvoiceRequest_offer_features(&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_UnsignedInvoiceRequest_absolute_expiry(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = UnsignedInvoiceRequest_absolute_expiry(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UnsignedInvoiceRequest_issuer(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKPrintableString ret_var = UnsignedInvoiceRequest_issuer(&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_tArray  CS_LDK_UnsignedInvoiceRequest_paths(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKCVec_BlindedPathZ ret_var = UnsignedInvoiceRequest_paths(&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 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;
+}
+
+int64_t  CS_LDK_UnsignedInvoiceRequest_supported_quantity(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKQuantity ret_var = UnsignedInvoiceRequest_supported_quantity(&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;
+}
+
+int8_tArray  CS_LDK_UnsignedInvoiceRequest_signing_pubkey(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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, UnsignedInvoiceRequest_signing_pubkey(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_UnsignedInvoiceRequest_payer_metadata(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKu8slice ret_var = UnsignedInvoiceRequest_payer_metadata(&this_arg_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;
+}
+
+int8_tArray  CS_LDK_UnsignedInvoiceRequest_chain(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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, UnsignedInvoiceRequest_chain(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_UnsignedInvoiceRequest_amount_msats(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = UnsignedInvoiceRequest_amount_msats(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UnsignedInvoiceRequest_invoice_request_features(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKInvoiceRequestFeatures ret_var = UnsignedInvoiceRequest_invoice_request_features(&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_UnsignedInvoiceRequest_quantity(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = UnsignedInvoiceRequest_quantity(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_UnsignedInvoiceRequest_payer_id(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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, UnsignedInvoiceRequest_payer_id(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_UnsignedInvoiceRequest_payer_note(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKPrintableString ret_var = UnsignedInvoiceRequest_payer_note(&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;
+}
+
+ptrArray  CS_LDK_InvoiceRequest_chains(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKCVec_ThirtyTwoBytesZ ret_var = InvoiceRequest_chains(&this_arg_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(32, __LINE__);
+               memcpy(ret_conv_8_arr->elems, ret_var.data[i].data, 32);
+               ret_arr_ptr[i] = ret_conv_8_arr;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_InvoiceRequest_metadata(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = InvoiceRequest_metadata(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_InvoiceRequest_amount(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKAmount ret_var = InvoiceRequest_amount(&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_InvoiceRequest_description(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKPrintableString ret_var = InvoiceRequest_description(&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_InvoiceRequest_offer_features(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKOfferFeatures ret_var = InvoiceRequest_offer_features(&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_InvoiceRequest_absolute_expiry(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = InvoiceRequest_absolute_expiry(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_InvoiceRequest_issuer(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKPrintableString ret_var = InvoiceRequest_issuer(&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_tArray  CS_LDK_InvoiceRequest_paths(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKCVec_BlindedPathZ ret_var = InvoiceRequest_paths(&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 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;
+}
+
+int64_t  CS_LDK_InvoiceRequest_supported_quantity(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKQuantity ret_var = InvoiceRequest_supported_quantity(&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;
+}
+
+int8_tArray  CS_LDK_InvoiceRequest_signing_pubkey(int64_t this_arg) {
+       LDKInvoiceRequest 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, InvoiceRequest_signing_pubkey(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_InvoiceRequest_payer_metadata(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKu8slice ret_var = InvoiceRequest_payer_metadata(&this_arg_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;
+}
+
+int8_tArray  CS_LDK_InvoiceRequest_chain(int64_t this_arg) {
+       LDKInvoiceRequest 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, InvoiceRequest_chain(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_InvoiceRequest_amount_msats(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = InvoiceRequest_amount_msats(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_InvoiceRequest_invoice_request_features(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKInvoiceRequestFeatures ret_var = InvoiceRequest_invoice_request_features(&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_InvoiceRequest_quantity(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = InvoiceRequest_quantity(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_InvoiceRequest_payer_id(int64_t this_arg) {
+       LDKInvoiceRequest 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, InvoiceRequest_payer_id(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_InvoiceRequest_payer_note(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKPrintableString ret_var = InvoiceRequest_payer_note(&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;
+}
+
+int8_tArray  CS_LDK_InvoiceRequest_signature(int64_t this_arg) {
+       LDKInvoiceRequest 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(64, __LINE__);
+       memcpy(ret_arr->elems, InvoiceRequest_signature(&this_arg_conv).compact_form, 64);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_InvoiceRequest_verify(int64_t this_arg, int64_t key) {
+       LDKInvoiceRequest 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 = InvoiceRequest_clone(&this_arg_conv);
+       LDKExpandedKey key_conv;
+       key_conv.inner = untag_ptr(key);
+       key_conv.is_owned = ptr_is_owned(key);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(key_conv);
+       key_conv.is_owned = false;
+       LDKCResult_VerifiedInvoiceRequestNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_VerifiedInvoiceRequestNoneZ), "LDKCResult_VerifiedInvoiceRequestNoneZ");
+       *ret_conv = InvoiceRequest_verify(this_arg_conv, &key_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+ptrArray  CS_LDK_VerifiedInvoiceRequest_chains(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKCVec_ThirtyTwoBytesZ ret_var = VerifiedInvoiceRequest_chains(&this_arg_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(32, __LINE__);
+               memcpy(ret_conv_8_arr->elems, ret_var.data[i].data, 32);
+               ret_arr_ptr[i] = ret_conv_8_arr;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_metadata(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = VerifiedInvoiceRequest_metadata(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_amount(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKAmount ret_var = VerifiedInvoiceRequest_amount(&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_VerifiedInvoiceRequest_description(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKPrintableString ret_var = VerifiedInvoiceRequest_description(&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_VerifiedInvoiceRequest_offer_features(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKOfferFeatures ret_var = VerifiedInvoiceRequest_offer_features(&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_VerifiedInvoiceRequest_absolute_expiry(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = VerifiedInvoiceRequest_absolute_expiry(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_issuer(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKPrintableString ret_var = VerifiedInvoiceRequest_issuer(&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_tArray  CS_LDK_VerifiedInvoiceRequest_paths(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKCVec_BlindedPathZ ret_var = VerifiedInvoiceRequest_paths(&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 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;
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_supported_quantity(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKQuantity ret_var = VerifiedInvoiceRequest_supported_quantity(&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;
+}
+
+int8_tArray  CS_LDK_VerifiedInvoiceRequest_signing_pubkey(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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, VerifiedInvoiceRequest_signing_pubkey(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_VerifiedInvoiceRequest_payer_metadata(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKu8slice ret_var = VerifiedInvoiceRequest_payer_metadata(&this_arg_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;
+}
+
+int8_tArray  CS_LDK_VerifiedInvoiceRequest_chain(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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, VerifiedInvoiceRequest_chain(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_amount_msats(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = VerifiedInvoiceRequest_amount_msats(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_invoice_request_features(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKInvoiceRequestFeatures ret_var = VerifiedInvoiceRequest_invoice_request_features(&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_VerifiedInvoiceRequest_quantity(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = VerifiedInvoiceRequest_quantity(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_VerifiedInvoiceRequest_payer_id(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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, VerifiedInvoiceRequest_payer_id(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_payer_note(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKPrintableString ret_var = VerifiedInvoiceRequest_payer_note(&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;
+}
+
+int8_tArray  CS_LDK_UnsignedInvoiceRequest_write(int64_t obj) {
+       LDKUnsignedInvoiceRequest 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 = UnsignedInvoiceRequest_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;
+}
+
+int8_tArray  CS_LDK_InvoiceRequest_write(int64_t obj) {
+       LDKInvoiceRequest 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 = InvoiceRequest_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;
+}
+
+void  CS_LDK_TaggedHash_free(int64_t this_obj) {
+       LDKTaggedHash 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);
+       TaggedHash_free(this_obj_conv);
+}
+
+void  CS_LDK_Bolt12ParseError_free(int64_t this_obj) {
+       LDKBolt12ParseError 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);
+       Bolt12ParseError_free(this_obj_conv);
+}
+
+static inline uint64_t Bolt12ParseError_clone_ptr(LDKBolt12ParseError *NONNULL_PTR arg) {
+       LDKBolt12ParseError ret_var = Bolt12ParseError_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_Bolt12ParseError_clone_ptr(int64_t arg) {
+       LDKBolt12ParseError 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 = Bolt12ParseError_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt12ParseError_clone(int64_t orig) {
+       LDKBolt12ParseError 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;
+       LDKBolt12ParseError ret_var = Bolt12ParseError_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_Bolt12SemanticError_clone(int64_t orig) {
+       LDKBolt12SemanticError* orig_conv = (LDKBolt12SemanticError*)untag_ptr(orig);
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_already_expired() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_already_expired());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unsupported_chain() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unsupported_chain());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unexpected_chain() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unexpected_chain());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_amount() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_amount());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_invalid_amount() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_invalid_amount());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_insufficient_amount() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_insufficient_amount());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unexpected_amount() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unexpected_amount());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unsupported_currency() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unsupported_currency());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unknown_required_features() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unknown_required_features());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unexpected_features() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unexpected_features());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_description() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_description());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_signing_pubkey() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_signing_pubkey());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_invalid_signing_pubkey() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_invalid_signing_pubkey());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unexpected_signing_pubkey() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unexpected_signing_pubkey());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_quantity() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_quantity());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_invalid_quantity() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_invalid_quantity());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unexpected_quantity() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unexpected_quantity());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_invalid_metadata() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_invalid_metadata());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unexpected_metadata() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unexpected_metadata());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_payer_metadata() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_payer_metadata());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_payer_id() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_payer_id());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_duplicate_payment_id() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_duplicate_payment_id());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_paths() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_paths());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_invalid_pay_info() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_invalid_pay_info());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_creation_time() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_creation_time());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_payment_hash() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_payment_hash());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_signature() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_signature());
+       return ret_conv;
+}
+
+void  CS_LDK_Refund_free(int64_t this_obj) {
+       LDKRefund 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);
+       Refund_free(this_obj_conv);
+}
+
+static inline uint64_t Refund_clone_ptr(LDKRefund *NONNULL_PTR arg) {
+       LDKRefund ret_var = Refund_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_Refund_clone_ptr(int64_t arg) {
+       LDKRefund 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 = Refund_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Refund_clone(int64_t orig) {
+       LDKRefund 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;
+       LDKRefund ret_var = Refund_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_Refund_description(int64_t this_arg) {
+       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;
+       LDKPrintableString ret_var = Refund_description(&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_Refund_absolute_expiry(int64_t this_arg) {
+       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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = Refund_absolute_expiry(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_Refund_is_expired(int64_t this_arg) {
+       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(&this_arg_conv);
+       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);
+       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;
+       LDKPrintableString ret_var = Refund_issuer(&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_tArray  CS_LDK_Refund_paths(int64_t this_arg) {
+       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;
+       LDKCVec_BlindedPathZ ret_var = Refund_paths(&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 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;
+}
+
+int8_tArray  CS_LDK_Refund_payer_metadata(int64_t this_arg) {
+       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;
+       LDKu8slice ret_var = Refund_payer_metadata(&this_arg_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;
+}
+
+int8_tArray  CS_LDK_Refund_chain(int64_t this_arg) {
+       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;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, Refund_chain(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Refund_amount_msats(int64_t this_arg) {
+       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;
+       int64_t ret_conv = Refund_amount_msats(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Refund_features(int64_t this_arg) {
+       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;
+       LDKInvoiceRequestFeatures ret_var = Refund_features(&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_Refund_quantity(int64_t this_arg) {
+       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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = Refund_quantity(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_Refund_payer_id(int64_t this_arg) {
+       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;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, Refund_payer_id(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Refund_payer_note(int64_t this_arg) {
+       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;
+       LDKPrintableString ret_var = Refund_payer_note(&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;
+}
+
+int8_tArray  CS_LDK_Refund_write(int64_t obj) {
+       LDKRefund 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 = Refund_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_Refund_from_str(jstring s) {
+       LDKStr s_conv = str_ref_to_owned_c(s);
+       LDKCResult_RefundBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RefundBolt12ParseErrorZ), "LDKCResult_RefundBolt12ParseErrorZ");
+       *ret_conv = Refund_from_str(s_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int32_t  CS_LDK_UtxoLookupError_clone(int64_t orig) {
+       LDKUtxoLookupError* orig_conv = (LDKUtxoLookupError*)untag_ptr(orig);
+       int32_t ret_conv = LDKUtxoLookupError_to_cs(UtxoLookupError_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_UtxoLookupError_unknown_chain() {
+       int32_t ret_conv = LDKUtxoLookupError_to_cs(UtxoLookupError_unknown_chain());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_UtxoLookupError_unknown_tx() {
+       int32_t ret_conv = LDKUtxoLookupError_to_cs(UtxoLookupError_unknown_tx());
+       return ret_conv;
+}
+
+void  CS_LDK_UtxoResult_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);
+       LDKUtxoResult this_ptr_conv = *(LDKUtxoResult*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       UtxoResult_free(this_ptr_conv);
+}
+
+static inline uint64_t UtxoResult_clone_ptr(LDKUtxoResult *NONNULL_PTR arg) {
+       LDKUtxoResult *ret_copy = MALLOC(sizeof(LDKUtxoResult), "LDKUtxoResult");
+       *ret_copy = UtxoResult_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_UtxoResult_clone_ptr(int64_t arg) {
+       LDKUtxoResult* arg_conv = (LDKUtxoResult*)untag_ptr(arg);
+       int64_t ret_conv = UtxoResult_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UtxoResult_clone(int64_t orig) {
+       LDKUtxoResult* orig_conv = (LDKUtxoResult*)untag_ptr(orig);
+       LDKUtxoResult *ret_copy = MALLOC(sizeof(LDKUtxoResult), "LDKUtxoResult");
+       *ret_copy = UtxoResult_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UtxoResult_sync(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKCResult_TxOutUtxoLookupErrorZ a_conv = *(LDKCResult_TxOutUtxoLookupErrorZ*)(a_ptr);
+       a_conv = CResult_TxOutUtxoLookupErrorZ_clone((LDKCResult_TxOutUtxoLookupErrorZ*)untag_ptr(a));
+       LDKUtxoResult *ret_copy = MALLOC(sizeof(LDKUtxoResult), "LDKUtxoResult");
+       *ret_copy = UtxoResult_sync(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UtxoResult_async(int64_t a) {
+       LDKUtxoFuture 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 = UtxoFuture_clone(&a_conv);
+       LDKUtxoResult *ret_copy = MALLOC(sizeof(LDKUtxoResult), "LDKUtxoResult");
+       *ret_copy = UtxoResult_async(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_UtxoLookup_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);
+       LDKUtxoLookup this_ptr_conv = *(LDKUtxoLookup*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       UtxoLookup_free(this_ptr_conv);
+}
+
+void  CS_LDK_UtxoFuture_free(int64_t this_obj) {
+       LDKUtxoFuture 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);
+       UtxoFuture_free(this_obj_conv);
+}
+
+static inline uint64_t UtxoFuture_clone_ptr(LDKUtxoFuture *NONNULL_PTR arg) {
+       LDKUtxoFuture ret_var = UtxoFuture_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_UtxoFuture_clone_ptr(int64_t arg) {
+       LDKUtxoFuture 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 = UtxoFuture_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UtxoFuture_clone(int64_t orig) {
+       LDKUtxoFuture 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;
+       LDKUtxoFuture ret_var = UtxoFuture_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_UtxoFuture_new() {
+       LDKUtxoFuture ret_var = UtxoFuture_new();
+       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_UtxoFuture_resolve_without_forwarding(int64_t this_arg, int64_t graph, int64_t result) {
+       LDKUtxoFuture 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;
+       LDKNetworkGraph graph_conv;
+       graph_conv.inner = untag_ptr(graph);
+       graph_conv.is_owned = ptr_is_owned(graph);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(graph_conv);
+       graph_conv.is_owned = false;
+       void* result_ptr = untag_ptr(result);
+       CHECK_ACCESS(result_ptr);
+       LDKCResult_TxOutUtxoLookupErrorZ result_conv = *(LDKCResult_TxOutUtxoLookupErrorZ*)(result_ptr);
+       UtxoFuture_resolve_without_forwarding(&this_arg_conv, &graph_conv, result_conv);
+}
+
+void  CS_LDK_UtxoFuture_resolve(int64_t this_arg, int64_t graph, int64_t gossip, int64_t result) {
+       LDKUtxoFuture 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;
+       LDKNetworkGraph graph_conv;
+       graph_conv.inner = untag_ptr(graph);
+       graph_conv.is_owned = ptr_is_owned(graph);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(graph_conv);
+       graph_conv.is_owned = false;
+       LDKP2PGossipSync gossip_conv;
+       gossip_conv.inner = untag_ptr(gossip);
+       gossip_conv.is_owned = ptr_is_owned(gossip);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(gossip_conv);
+       gossip_conv.is_owned = false;
+       void* result_ptr = untag_ptr(result);
+       CHECK_ACCESS(result_ptr);
+       LDKCResult_TxOutUtxoLookupErrorZ result_conv = *(LDKCResult_TxOutUtxoLookupErrorZ*)(result_ptr);
+       UtxoFuture_resolve(&this_arg_conv, &graph_conv, &gossip_conv, result_conv);
+}
+
+void  CS_LDK_NodeId_free(int64_t this_obj) {
+       LDKNodeId 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);
+       NodeId_free(this_obj_conv);
+}
+
+static inline uint64_t NodeId_clone_ptr(LDKNodeId *NONNULL_PTR arg) {
+       LDKNodeId ret_var = NodeId_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_NodeId_clone_ptr(int64_t arg) {
+       LDKNodeId 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 = NodeId_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NodeId_clone(int64_t orig) {
+       LDKNodeId 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;
+       LDKNodeId ret_var = NodeId_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_NodeId_from_pubkey(int8_tArray pubkey) {
+       LDKPublicKey pubkey_ref;
+       CHECK(pubkey->arr_len == 33);
+       memcpy(pubkey_ref.compressed_form, pubkey->elems, 33); FREE(pubkey);
+       LDKNodeId ret_var = NodeId_from_pubkey(pubkey_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_NodeId_as_slice(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;
+       LDKu8slice ret_var = NodeId_as_slice(&this_arg_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_NodeId_as_pubkey(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;
+       LDKCResult_PublicKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeySecp256k1ErrorZ), "LDKCResult_PublicKeySecp256k1ErrorZ");
+       *ret_conv = NodeId_as_pubkey(&this_arg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeId_hash(int64_t o) {
+       LDKNodeId 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 = NodeId_hash(&o_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_NodeId_write(int64_t obj) {
+       LDKNodeId 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 = NodeId_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_NodeId_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_NodeIdDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeIdDecodeErrorZ), "LDKCResult_NodeIdDecodeErrorZ");
+       *ret_conv = NodeId_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_NetworkGraph_free(int64_t this_obj) {
+       LDKNetworkGraph 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);
+       NetworkGraph_free(this_obj_conv);
+}
+
+void  CS_LDK_ReadOnlyNetworkGraph_free(int64_t this_obj) {
+       LDKReadOnlyNetworkGraph 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);
+       ReadOnlyNetworkGraph_free(this_obj_conv);
+}
+
+void  CS_LDK_NetworkUpdate_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);
+       LDKNetworkUpdate this_ptr_conv = *(LDKNetworkUpdate*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       NetworkUpdate_free(this_ptr_conv);
+}
+
+static inline uint64_t NetworkUpdate_clone_ptr(LDKNetworkUpdate *NONNULL_PTR arg) {
+       LDKNetworkUpdate *ret_copy = MALLOC(sizeof(LDKNetworkUpdate), "LDKNetworkUpdate");
+       *ret_copy = NetworkUpdate_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_NetworkUpdate_clone_ptr(int64_t arg) {
+       LDKNetworkUpdate* arg_conv = (LDKNetworkUpdate*)untag_ptr(arg);
+       int64_t ret_conv = NetworkUpdate_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NetworkUpdate_clone(int64_t orig) {
+       LDKNetworkUpdate* orig_conv = (LDKNetworkUpdate*)untag_ptr(orig);
+       LDKNetworkUpdate *ret_copy = MALLOC(sizeof(LDKNetworkUpdate), "LDKNetworkUpdate");
+       *ret_copy = NetworkUpdate_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_NetworkUpdate_channel_update_message(int64_t msg) {
+       LDKChannelUpdate 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 = ChannelUpdate_clone(&msg_conv);
+       LDKNetworkUpdate *ret_copy = MALLOC(sizeof(LDKNetworkUpdate), "LDKNetworkUpdate");
+       *ret_copy = NetworkUpdate_channel_update_message(msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_NetworkUpdate_channel_failure(int64_t short_channel_id, jboolean is_permanent) {
+       LDKNetworkUpdate *ret_copy = MALLOC(sizeof(LDKNetworkUpdate), "LDKNetworkUpdate");
+       *ret_copy = NetworkUpdate_channel_failure(short_channel_id, is_permanent);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_NetworkUpdate_node_failure(int8_tArray node_id, jboolean is_permanent) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKNetworkUpdate *ret_copy = MALLOC(sizeof(LDKNetworkUpdate), "LDKNetworkUpdate");
+       *ret_copy = NetworkUpdate_node_failure(node_id_ref, is_permanent);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_NetworkUpdate_eq(int64_t a, int64_t b) {
+       LDKNetworkUpdate* a_conv = (LDKNetworkUpdate*)untag_ptr(a);
+       LDKNetworkUpdate* b_conv = (LDKNetworkUpdate*)untag_ptr(b);
+       jboolean ret_conv = NetworkUpdate_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_NetworkUpdate_write(int64_t obj) {
+       LDKNetworkUpdate* obj_conv = (LDKNetworkUpdate*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = NetworkUpdate_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_NetworkUpdate_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_NetworkUpdateZDecodeErrorZ), "LDKCResult_COption_NetworkUpdateZDecodeErrorZ");
+       *ret_conv = NetworkUpdate_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_P2PGossipSync_free(int64_t this_obj) {
+       LDKP2PGossipSync 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);
+       P2PGossipSync_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_P2PGossipSync_new(int64_t network_graph, int64_t utxo_lookup, int64_t logger) {
+       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* utxo_lookup_ptr = untag_ptr(utxo_lookup);
+       CHECK_ACCESS(utxo_lookup_ptr);
+       LDKCOption_UtxoLookupZ utxo_lookup_conv = *(LDKCOption_UtxoLookupZ*)(utxo_lookup_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKCOption_UtxoLookupZ
+       if (utxo_lookup_conv.tag == LDKCOption_UtxoLookupZ_Some) {
+               // Manually implement clone for Java trait instances
+               if (utxo_lookup_conv.some.free == LDKUtxoLookup_JCalls_free) {
+                       // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                       LDKUtxoLookup_JCalls_cloned(&utxo_lookup_conv.some);
+               }
+       }
+       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);
+       }
+       LDKP2PGossipSync ret_var = P2PGossipSync_new(&network_graph_conv, utxo_lookup_conv, logger_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_P2PGossipSync_add_utxo_lookup(int64_t this_arg, int64_t utxo_lookup) {
+       LDKP2PGossipSync 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;
+       void* utxo_lookup_ptr = untag_ptr(utxo_lookup);
+       CHECK_ACCESS(utxo_lookup_ptr);
+       LDKCOption_UtxoLookupZ utxo_lookup_conv = *(LDKCOption_UtxoLookupZ*)(utxo_lookup_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKCOption_UtxoLookupZ
+       if (utxo_lookup_conv.tag == LDKCOption_UtxoLookupZ_Some) {
+               // Manually implement clone for Java trait instances
+               if (utxo_lookup_conv.some.free == LDKUtxoLookup_JCalls_free) {
+                       // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                       LDKUtxoLookup_JCalls_cloned(&utxo_lookup_conv.some);
+               }
+       }
+       P2PGossipSync_add_utxo_lookup(&this_arg_conv, utxo_lookup_conv);
+}
+
+void  CS_LDK_NetworkGraph_handle_network_update(int64_t this_arg, int64_t network_update) {
+       LDKNetworkGraph 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;
+       LDKNetworkUpdate* network_update_conv = (LDKNetworkUpdate*)untag_ptr(network_update);
+       NetworkGraph_handle_network_update(&this_arg_conv, network_update_conv);
+}
+
+int8_tArray  CS_LDK_NetworkGraph_get_chain_hash(int64_t this_arg) {
+       LDKNetworkGraph 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, NetworkGraph_get_chain_hash(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_verify_node_announcement(int64_t msg) {
+       LDKNodeAnnouncement 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;
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = verify_node_announcement(&msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_verify_channel_announcement(int64_t msg) {
+       LDKChannelAnnouncement 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;
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = verify_channel_announcement(&msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_P2PGossipSync_as_RoutingMessageHandler(int64_t this_arg) {
+       LDKP2PGossipSync 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;
+       LDKRoutingMessageHandler* ret_ret = MALLOC(sizeof(LDKRoutingMessageHandler), "LDKRoutingMessageHandler");
+       *ret_ret = P2PGossipSync_as_RoutingMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_P2PGossipSync_as_MessageSendEventsProvider(int64_t this_arg) {
+       LDKP2PGossipSync 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;
+       LDKMessageSendEventsProvider* ret_ret = MALLOC(sizeof(LDKMessageSendEventsProvider), "LDKMessageSendEventsProvider");
+       *ret_ret = P2PGossipSync_as_MessageSendEventsProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_ChannelUpdateInfo_free(int64_t this_obj) {
+       LDKChannelUpdateInfo 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);
+       ChannelUpdateInfo_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_ChannelUpdateInfo_get_last_update(int64_t this_ptr) {
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_get_last_update(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelUpdateInfo_set_last_update(int64_t this_ptr, int32_t val) {
+       LDKChannelUpdateInfo 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;
+       ChannelUpdateInfo_set_last_update(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelUpdateInfo_get_enabled(int64_t this_ptr) {
+       LDKChannelUpdateInfo 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;
+       jboolean ret_conv = ChannelUpdateInfo_get_enabled(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelUpdateInfo_set_enabled(int64_t this_ptr, jboolean val) {
+       LDKChannelUpdateInfo 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;
+       ChannelUpdateInfo_set_enabled(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_ChannelUpdateInfo_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_get_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelUpdateInfo_set_cltv_expiry_delta(int64_t this_ptr, int16_t val) {
+       LDKChannelUpdateInfo 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;
+       ChannelUpdateInfo_set_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelUpdateInfo_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_get_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelUpdateInfo_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelUpdateInfo 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;
+       ChannelUpdateInfo_set_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelUpdateInfo_get_htlc_maximum_msat(int64_t this_ptr) {
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_get_htlc_maximum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelUpdateInfo_set_htlc_maximum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelUpdateInfo 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;
+       ChannelUpdateInfo_set_htlc_maximum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelUpdateInfo_get_fees(int64_t this_ptr) {
+       LDKChannelUpdateInfo 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;
+       LDKRoutingFees ret_var = ChannelUpdateInfo_get_fees(&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_ChannelUpdateInfo_set_fees(int64_t this_ptr, int64_t val) {
+       LDKChannelUpdateInfo 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;
+       LDKRoutingFees 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 = RoutingFees_clone(&val_conv);
+       ChannelUpdateInfo_set_fees(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelUpdateInfo_get_last_update_message(int64_t this_ptr) {
+       LDKChannelUpdateInfo 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;
+       LDKChannelUpdate ret_var = ChannelUpdateInfo_get_last_update_message(&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_ChannelUpdateInfo_set_last_update_message(int64_t this_ptr, int64_t val) {
+       LDKChannelUpdateInfo 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;
+       LDKChannelUpdate 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 = ChannelUpdate_clone(&val_conv);
+       ChannelUpdateInfo_set_last_update_message(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelUpdateInfo_new(int32_t last_update_arg, jboolean enabled_arg, int16_t cltv_expiry_delta_arg, int64_t htlc_minimum_msat_arg, int64_t htlc_maximum_msat_arg, int64_t fees_arg, int64_t last_update_message_arg) {
+       LDKRoutingFees fees_arg_conv;
+       fees_arg_conv.inner = untag_ptr(fees_arg);
+       fees_arg_conv.is_owned = ptr_is_owned(fees_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(fees_arg_conv);
+       fees_arg_conv = RoutingFees_clone(&fees_arg_conv);
+       LDKChannelUpdate last_update_message_arg_conv;
+       last_update_message_arg_conv.inner = untag_ptr(last_update_message_arg);
+       last_update_message_arg_conv.is_owned = ptr_is_owned(last_update_message_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(last_update_message_arg_conv);
+       last_update_message_arg_conv = ChannelUpdate_clone(&last_update_message_arg_conv);
+       LDKChannelUpdateInfo ret_var = ChannelUpdateInfo_new(last_update_arg, enabled_arg, cltv_expiry_delta_arg, htlc_minimum_msat_arg, htlc_maximum_msat_arg, fees_arg_conv, last_update_message_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 ChannelUpdateInfo_clone_ptr(LDKChannelUpdateInfo *NONNULL_PTR arg) {
+       LDKChannelUpdateInfo ret_var = ChannelUpdateInfo_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_ChannelUpdateInfo_clone_ptr(int64_t arg) {
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelUpdateInfo_clone(int64_t orig) {
+       LDKChannelUpdateInfo 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;
+       LDKChannelUpdateInfo ret_var = ChannelUpdateInfo_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_ChannelUpdateInfo_eq(int64_t a, int64_t b) {
+       LDKChannelUpdateInfo 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;
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_ChannelUpdateInfo_write(int64_t obj) {
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_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_ChannelUpdateInfo_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateInfoDecodeErrorZ), "LDKCResult_ChannelUpdateInfoDecodeErrorZ");
+       *ret_conv = ChannelUpdateInfo_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelInfo_free(int64_t this_obj) {
+       LDKChannelInfo 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);
+       ChannelInfo_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChannelInfo_get_features(int64_t this_ptr) {
+       LDKChannelInfo 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;
+       LDKChannelFeatures ret_var = ChannelInfo_get_features(&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_ChannelInfo_set_features(int64_t this_ptr, int64_t val) {
+       LDKChannelInfo 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;
+       LDKChannelFeatures 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 = ChannelFeatures_clone(&val_conv);
+       ChannelInfo_set_features(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelInfo_get_node_one(int64_t this_ptr) {
+       LDKChannelInfo 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;
+       LDKNodeId ret_var = ChannelInfo_get_node_one(&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_ChannelInfo_set_node_one(int64_t this_ptr, int64_t val) {
+       LDKChannelInfo 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;
+       LDKNodeId 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 = NodeId_clone(&val_conv);
+       ChannelInfo_set_node_one(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelInfo_get_one_to_two(int64_t this_ptr) {
+       LDKChannelInfo 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;
+       LDKChannelUpdateInfo ret_var = ChannelInfo_get_one_to_two(&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_ChannelInfo_set_one_to_two(int64_t this_ptr, int64_t val) {
+       LDKChannelInfo 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;
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_clone(&val_conv);
+       ChannelInfo_set_one_to_two(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelInfo_get_node_two(int64_t this_ptr) {
+       LDKChannelInfo 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;
+       LDKNodeId ret_var = ChannelInfo_get_node_two(&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_ChannelInfo_set_node_two(int64_t this_ptr, int64_t val) {
+       LDKChannelInfo 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;
+       LDKNodeId 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 = NodeId_clone(&val_conv);
+       ChannelInfo_set_node_two(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelInfo_get_two_to_one(int64_t this_ptr) {
+       LDKChannelInfo 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;
+       LDKChannelUpdateInfo ret_var = ChannelInfo_get_two_to_one(&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_ChannelInfo_set_two_to_one(int64_t this_ptr, int64_t val) {
+       LDKChannelInfo 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;
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_clone(&val_conv);
+       ChannelInfo_set_two_to_one(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelInfo_get_capacity_sats(int64_t this_ptr) {
+       LDKChannelInfo 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 = ChannelInfo_get_capacity_sats(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelInfo_set_capacity_sats(int64_t this_ptr, int64_t val) {
+       LDKChannelInfo 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));
+       ChannelInfo_set_capacity_sats(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelInfo_get_announcement_message(int64_t this_ptr) {
+       LDKChannelInfo 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;
+       LDKChannelAnnouncement ret_var = ChannelInfo_get_announcement_message(&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_ChannelInfo_set_announcement_message(int64_t this_ptr, int64_t val) {
+       LDKChannelInfo 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;
+       LDKChannelAnnouncement 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 = ChannelAnnouncement_clone(&val_conv);
+       ChannelInfo_set_announcement_message(&this_ptr_conv, val_conv);
+}
+
+static inline uint64_t ChannelInfo_clone_ptr(LDKChannelInfo *NONNULL_PTR arg) {
+       LDKChannelInfo ret_var = ChannelInfo_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_ChannelInfo_clone_ptr(int64_t arg) {
+       LDKChannelInfo 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 = ChannelInfo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelInfo_clone(int64_t orig) {
+       LDKChannelInfo 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;
+       LDKChannelInfo ret_var = ChannelInfo_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_ChannelInfo_eq(int64_t a, int64_t b) {
+       LDKChannelInfo 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;
+       LDKChannelInfo 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 = ChannelInfo_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelInfo_get_directional_info(int64_t this_arg, int8_t channel_flags) {
+       LDKChannelInfo 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;
+       LDKChannelUpdateInfo ret_var = ChannelInfo_get_directional_info(&this_arg_conv, channel_flags);
+       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_ChannelInfo_write(int64_t obj) {
+       LDKChannelInfo 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 = ChannelInfo_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_ChannelInfo_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelInfoDecodeErrorZ), "LDKCResult_ChannelInfoDecodeErrorZ");
+       *ret_conv = ChannelInfo_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_DirectedChannelInfo_free(int64_t this_obj) {
+       LDKDirectedChannelInfo 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);
+       DirectedChannelInfo_free(this_obj_conv);
+}
+
+static inline uint64_t DirectedChannelInfo_clone_ptr(LDKDirectedChannelInfo *NONNULL_PTR arg) {
+       LDKDirectedChannelInfo ret_var = DirectedChannelInfo_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_DirectedChannelInfo_clone_ptr(int64_t arg) {
+       LDKDirectedChannelInfo 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 = DirectedChannelInfo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_DirectedChannelInfo_clone(int64_t orig) {
+       LDKDirectedChannelInfo 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;
+       LDKDirectedChannelInfo ret_var = DirectedChannelInfo_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_DirectedChannelInfo_channel(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;
+       LDKChannelInfo ret_var = DirectedChannelInfo_channel(&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_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);
+       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;
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = DirectedChannelInfo_effective_capacity(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_EffectiveCapacity_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);
+       LDKEffectiveCapacity this_ptr_conv = *(LDKEffectiveCapacity*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       EffectiveCapacity_free(this_ptr_conv);
+}
+
+static inline uint64_t EffectiveCapacity_clone_ptr(LDKEffectiveCapacity *NONNULL_PTR arg) {
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = EffectiveCapacity_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_EffectiveCapacity_clone_ptr(int64_t arg) {
+       LDKEffectiveCapacity* arg_conv = (LDKEffectiveCapacity*)untag_ptr(arg);
+       int64_t ret_conv = EffectiveCapacity_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_EffectiveCapacity_clone(int64_t orig) {
+       LDKEffectiveCapacity* orig_conv = (LDKEffectiveCapacity*)untag_ptr(orig);
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = EffectiveCapacity_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_EffectiveCapacity_exact_liquidity(int64_t liquidity_msat) {
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = EffectiveCapacity_exact_liquidity(liquidity_msat);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_EffectiveCapacity_advertised_max_htlc(int64_t amount_msat) {
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = EffectiveCapacity_advertised_max_htlc(amount_msat);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_EffectiveCapacity_total(int64_t capacity_msat, int64_t htlc_maximum_msat) {
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = EffectiveCapacity_total(capacity_msat, htlc_maximum_msat);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_EffectiveCapacity_infinite() {
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = EffectiveCapacity_infinite();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_EffectiveCapacity_hint_max_htlc(int64_t amount_msat) {
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = EffectiveCapacity_hint_max_htlc(amount_msat);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_EffectiveCapacity_unknown() {
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = EffectiveCapacity_unknown();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_EffectiveCapacity_as_msat(int64_t this_arg) {
+       LDKEffectiveCapacity* this_arg_conv = (LDKEffectiveCapacity*)untag_ptr(this_arg);
+       int64_t ret_conv = EffectiveCapacity_as_msat(this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RoutingFees_free(int64_t this_obj) {
+       LDKRoutingFees 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);
+       RoutingFees_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_RoutingFees_get_base_msat(int64_t this_ptr) {
+       LDKRoutingFees 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 = RoutingFees_get_base_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RoutingFees_set_base_msat(int64_t this_ptr, int32_t val) {
+       LDKRoutingFees 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;
+       RoutingFees_set_base_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_RoutingFees_get_proportional_millionths(int64_t this_ptr) {
+       LDKRoutingFees 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 = RoutingFees_get_proportional_millionths(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RoutingFees_set_proportional_millionths(int64_t this_ptr, int32_t val) {
+       LDKRoutingFees 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;
+       RoutingFees_set_proportional_millionths(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_RoutingFees_new(int32_t base_msat_arg, int32_t proportional_millionths_arg) {
+       LDKRoutingFees ret_var = RoutingFees_new(base_msat_arg, proportional_millionths_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;
+}
+
+jboolean  CS_LDK_RoutingFees_eq(int64_t a, int64_t b) {
+       LDKRoutingFees 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;
+       LDKRoutingFees 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 = RoutingFees_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t RoutingFees_clone_ptr(LDKRoutingFees *NONNULL_PTR arg) {
+       LDKRoutingFees ret_var = RoutingFees_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_RoutingFees_clone_ptr(int64_t arg) {
+       LDKRoutingFees 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 = RoutingFees_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RoutingFees_clone(int64_t orig) {
+       LDKRoutingFees 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;
+       LDKRoutingFees ret_var = RoutingFees_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_RoutingFees_hash(int64_t o) {
+       LDKRoutingFees 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 = RoutingFees_hash(&o_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_RoutingFees_write(int64_t obj) {
+       LDKRoutingFees 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 = RoutingFees_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_RoutingFees_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RoutingFeesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RoutingFeesDecodeErrorZ), "LDKCResult_RoutingFeesDecodeErrorZ");
+       *ret_conv = RoutingFees_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_NodeAnnouncementInfo_free(int64_t this_obj) {
+       LDKNodeAnnouncementInfo 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);
+       NodeAnnouncementInfo_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_NodeAnnouncementInfo_get_features(int64_t this_ptr) {
+       LDKNodeAnnouncementInfo 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;
+       LDKNodeFeatures ret_var = NodeAnnouncementInfo_get_features(&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_NodeAnnouncementInfo_set_features(int64_t this_ptr, int64_t val) {
+       LDKNodeAnnouncementInfo 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;
+       LDKNodeFeatures 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 = NodeFeatures_clone(&val_conv);
+       NodeAnnouncementInfo_set_features(&this_ptr_conv, val_conv);
+}
+
+int32_t  CS_LDK_NodeAnnouncementInfo_get_last_update(int64_t this_ptr) {
+       LDKNodeAnnouncementInfo 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 = NodeAnnouncementInfo_get_last_update(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeAnnouncementInfo_set_last_update(int64_t this_ptr, int32_t val) {
+       LDKNodeAnnouncementInfo 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;
+       NodeAnnouncementInfo_set_last_update(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_NodeAnnouncementInfo_get_rgb(int64_t this_ptr) {
+       LDKNodeAnnouncementInfo 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(3, __LINE__);
+       memcpy(ret_arr->elems, *NodeAnnouncementInfo_get_rgb(&this_ptr_conv), 3);
+       return ret_arr;
+}
+
+void  CS_LDK_NodeAnnouncementInfo_set_rgb(int64_t this_ptr, int8_tArray val) {
+       LDKNodeAnnouncementInfo 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;
+       LDKThreeBytes val_ref;
+       CHECK(val->arr_len == 3);
+       memcpy(val_ref.data, val->elems, 3); FREE(val);
+       NodeAnnouncementInfo_set_rgb(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_NodeAnnouncementInfo_get_alias(int64_t this_ptr) {
+       LDKNodeAnnouncementInfo 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;
+       LDKNodeAlias ret_var = NodeAnnouncementInfo_get_alias(&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_NodeAnnouncementInfo_set_alias(int64_t this_ptr, int64_t val) {
+       LDKNodeAnnouncementInfo 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;
+       LDKNodeAlias 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 = NodeAlias_clone(&val_conv);
+       NodeAnnouncementInfo_set_alias(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_NodeAnnouncementInfo_get_announcement_message(int64_t this_ptr) {
+       LDKNodeAnnouncementInfo 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;
+       LDKNodeAnnouncement ret_var = NodeAnnouncementInfo_get_announcement_message(&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_NodeAnnouncementInfo_set_announcement_message(int64_t this_ptr, int64_t val) {
+       LDKNodeAnnouncementInfo 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;
+       LDKNodeAnnouncement 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 = NodeAnnouncement_clone(&val_conv);
+       NodeAnnouncementInfo_set_announcement_message(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_NodeAnnouncementInfo_new(int64_t features_arg, int32_t last_update_arg, int8_tArray rgb_arg, int64_t alias_arg, int64_t announcement_message_arg) {
+       LDKNodeFeatures features_arg_conv;
+       features_arg_conv.inner = untag_ptr(features_arg);
+       features_arg_conv.is_owned = ptr_is_owned(features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_arg_conv);
+       features_arg_conv = NodeFeatures_clone(&features_arg_conv);
+       LDKThreeBytes rgb_arg_ref;
+       CHECK(rgb_arg->arr_len == 3);
+       memcpy(rgb_arg_ref.data, rgb_arg->elems, 3); FREE(rgb_arg);
+       LDKNodeAlias alias_arg_conv;
+       alias_arg_conv.inner = untag_ptr(alias_arg);
+       alias_arg_conv.is_owned = ptr_is_owned(alias_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(alias_arg_conv);
+       alias_arg_conv = NodeAlias_clone(&alias_arg_conv);
+       LDKNodeAnnouncement announcement_message_arg_conv;
+       announcement_message_arg_conv.inner = untag_ptr(announcement_message_arg);
+       announcement_message_arg_conv.is_owned = ptr_is_owned(announcement_message_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(announcement_message_arg_conv);
+       announcement_message_arg_conv = NodeAnnouncement_clone(&announcement_message_arg_conv);
+       LDKNodeAnnouncementInfo ret_var = NodeAnnouncementInfo_new(features_arg_conv, last_update_arg, rgb_arg_ref, alias_arg_conv, announcement_message_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 NodeAnnouncementInfo_clone_ptr(LDKNodeAnnouncementInfo *NONNULL_PTR arg) {
+       LDKNodeAnnouncementInfo ret_var = NodeAnnouncementInfo_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_NodeAnnouncementInfo_clone_ptr(int64_t arg) {
+       LDKNodeAnnouncementInfo 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 = NodeAnnouncementInfo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NodeAnnouncementInfo_clone(int64_t orig) {
+       LDKNodeAnnouncementInfo 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;
+       LDKNodeAnnouncementInfo ret_var = NodeAnnouncementInfo_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_NodeAnnouncementInfo_eq(int64_t a, int64_t b) {
+       LDKNodeAnnouncementInfo 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;
+       LDKNodeAnnouncementInfo 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 = NodeAnnouncementInfo_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_tArray  CS_LDK_NodeAnnouncementInfo_addresses(int64_t this_arg) {
+       LDKNodeAnnouncementInfo 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;
+       LDKCVec_SocketAddressZ ret_var = NodeAnnouncementInfo_addresses(&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 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;
+}
+
+int8_tArray  CS_LDK_NodeAnnouncementInfo_write(int64_t obj) {
+       LDKNodeAnnouncementInfo 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 = NodeAnnouncementInfo_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_NodeAnnouncementInfo_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementInfoDecodeErrorZ), "LDKCResult_NodeAnnouncementInfoDecodeErrorZ");
+       *ret_conv = NodeAnnouncementInfo_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_NodeAlias_free(int64_t this_obj) {
+       LDKNodeAlias 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);
+       NodeAlias_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_NodeAlias_get_a(int64_t this_ptr) {
+       LDKNodeAlias 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, *NodeAlias_get_a(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_NodeAlias_set_a(int64_t this_ptr, int8_tArray val) {
+       LDKNodeAlias 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);
+       NodeAlias_set_a(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_NodeAlias_new(int8_tArray a_arg) {
+       LDKThirtyTwoBytes a_arg_ref;
+       CHECK(a_arg->arr_len == 32);
+       memcpy(a_arg_ref.data, a_arg->elems, 32); FREE(a_arg);
+       LDKNodeAlias ret_var = NodeAlias_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;
+}
+
+static inline uint64_t NodeAlias_clone_ptr(LDKNodeAlias *NONNULL_PTR arg) {
+       LDKNodeAlias ret_var = NodeAlias_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_NodeAlias_clone_ptr(int64_t arg) {
+       LDKNodeAlias 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 = NodeAlias_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NodeAlias_clone(int64_t orig) {
+       LDKNodeAlias 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;
+       LDKNodeAlias ret_var = NodeAlias_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_NodeAlias_eq(int64_t a, int64_t b) {
+       LDKNodeAlias 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;
+       LDKNodeAlias 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 = NodeAlias_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_NodeAlias_write(int64_t obj) {
+       LDKNodeAlias 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 = NodeAlias_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_NodeAlias_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_NodeAliasDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAliasDecodeErrorZ), "LDKCResult_NodeAliasDecodeErrorZ");
+       *ret_conv = NodeAlias_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_NodeInfo_free(int64_t this_obj) {
+       LDKNodeInfo 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);
+       NodeInfo_free(this_obj_conv);
+}
+
+int64_tArray  CS_LDK_NodeInfo_get_channels(int64_t this_ptr) {
+       LDKNodeInfo 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 = NodeInfo_get_channels(&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_NodeInfo_set_channels(int64_t this_ptr, int64_tArray val) {
+       LDKNodeInfo 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);
+       NodeInfo_set_channels(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_NodeInfo_get_announcement_info(int64_t this_ptr) {
+       LDKNodeInfo 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;
+       LDKNodeAnnouncementInfo ret_var = NodeInfo_get_announcement_info(&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_NodeInfo_set_announcement_info(int64_t this_ptr, int64_t val) {
+       LDKNodeInfo 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;
+       LDKNodeAnnouncementInfo 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 = NodeAnnouncementInfo_clone(&val_conv);
+       NodeInfo_set_announcement_info(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_NodeInfo_new(int64_tArray channels_arg, int64_t announcement_info_arg) {
+       LDKCVec_u64Z channels_arg_constr;
+       channels_arg_constr.datalen = channels_arg->arr_len;
+       if (channels_arg_constr.datalen > 0)
+               channels_arg_constr.data = MALLOC(channels_arg_constr.datalen * sizeof(int64_t), "LDKCVec_u64Z Elements");
+       else
+               channels_arg_constr.data = NULL;
+       int64_t* channels_arg_vals = channels_arg->elems;
+       for (size_t g = 0; g < channels_arg_constr.datalen; g++) {
+               int64_t channels_arg_conv_6 = channels_arg_vals[g];
+               channels_arg_constr.data[g] = channels_arg_conv_6;
+       }
+       FREE(channels_arg);
+       LDKNodeAnnouncementInfo announcement_info_arg_conv;
+       announcement_info_arg_conv.inner = untag_ptr(announcement_info_arg);
+       announcement_info_arg_conv.is_owned = ptr_is_owned(announcement_info_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(announcement_info_arg_conv);
+       announcement_info_arg_conv = NodeAnnouncementInfo_clone(&announcement_info_arg_conv);
+       LDKNodeInfo ret_var = NodeInfo_new(channels_arg_constr, announcement_info_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 NodeInfo_clone_ptr(LDKNodeInfo *NONNULL_PTR arg) {
+       LDKNodeInfo ret_var = NodeInfo_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_NodeInfo_clone_ptr(int64_t arg) {
+       LDKNodeInfo 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 = NodeInfo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NodeInfo_clone(int64_t orig) {
+       LDKNodeInfo 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;
+       LDKNodeInfo ret_var = NodeInfo_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_NodeInfo_eq(int64_t a, int64_t b) {
+       LDKNodeInfo 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;
+       LDKNodeInfo 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 = NodeInfo_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_NodeInfo_write(int64_t obj) {
+       LDKNodeInfo 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 = NodeInfo_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_NodeInfo_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_NodeInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeInfoDecodeErrorZ), "LDKCResult_NodeInfoDecodeErrorZ");
+       *ret_conv = NodeInfo_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_NetworkGraph_write(int64_t obj) {
+       LDKNetworkGraph 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 = NetworkGraph_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_NetworkGraph_read(int8_tArray ser, int64_t arg) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       void* arg_ptr = untag_ptr(arg);
+       CHECK_ACCESS(arg_ptr);
+       LDKLogger arg_conv = *(LDKLogger*)(arg_ptr);
+       if (arg_conv.free == LDKLogger_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKLogger_JCalls_cloned(&arg_conv);
+       }
+       LDKCResult_NetworkGraphDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NetworkGraphDecodeErrorZ), "LDKCResult_NetworkGraphDecodeErrorZ");
+       *ret_conv = NetworkGraph_read(ser_ref, arg_conv);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NetworkGraph_new(int32_t network, int64_t logger) {
+       LDKNetwork network_conv = LDKNetwork_from_cs(network);
+       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);
+       }
+       LDKNetworkGraph ret_var = NetworkGraph_new(network_conv, logger_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_NetworkGraph_read_only(int64_t this_arg) {
+       LDKNetworkGraph 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;
+       LDKReadOnlyNetworkGraph ret_var = NetworkGraph_read_only(&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_NetworkGraph_get_last_rapid_gossip_sync_timestamp(int64_t this_arg) {
+       LDKNetworkGraph 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;
+       LDKCOption_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = NetworkGraph_get_last_rapid_gossip_sync_timestamp(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_NetworkGraph_set_last_rapid_gossip_sync_timestamp(int64_t this_arg, int32_t last_rapid_gossip_sync_timestamp) {
+       LDKNetworkGraph 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;
+       NetworkGraph_set_last_rapid_gossip_sync_timestamp(&this_arg_conv, last_rapid_gossip_sync_timestamp);
+}
+
+int64_t  CS_LDK_NetworkGraph_update_node_from_announcement(int64_t this_arg, int64_t msg) {
+       LDKNetworkGraph 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;
+       LDKNodeAnnouncement 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;
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_update_node_from_announcement(&this_arg_conv, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NetworkGraph_update_node_from_unsigned_announcement(int64_t this_arg, int64_t msg) {
+       LDKNetworkGraph 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;
+       LDKUnsignedNodeAnnouncement 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;
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_update_node_from_unsigned_announcement(&this_arg_conv, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NetworkGraph_update_channel_from_announcement(int64_t this_arg, int64_t msg, int64_t utxo_lookup) {
+       LDKNetworkGraph 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;
+       LDKChannelAnnouncement 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* utxo_lookup_ptr = untag_ptr(utxo_lookup);
+       CHECK_ACCESS(utxo_lookup_ptr);
+       LDKCOption_UtxoLookupZ utxo_lookup_conv = *(LDKCOption_UtxoLookupZ*)(utxo_lookup_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKCOption_UtxoLookupZ
+       if (utxo_lookup_conv.tag == LDKCOption_UtxoLookupZ_Some) {
+               // Manually implement clone for Java trait instances
+               if (utxo_lookup_conv.some.free == LDKUtxoLookup_JCalls_free) {
+                       // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                       LDKUtxoLookup_JCalls_cloned(&utxo_lookup_conv.some);
+               }
+       }
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_update_channel_from_announcement(&this_arg_conv, &msg_conv, utxo_lookup_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NetworkGraph_update_channel_from_announcement_no_lookup(int64_t this_arg, int64_t msg) {
+       LDKNetworkGraph 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;
+       LDKChannelAnnouncement 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;
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_update_channel_from_announcement_no_lookup(&this_arg_conv, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NetworkGraph_update_channel_from_unsigned_announcement(int64_t this_arg, int64_t msg, int64_t utxo_lookup) {
+       LDKNetworkGraph 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;
+       LDKUnsignedChannelAnnouncement 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* utxo_lookup_ptr = untag_ptr(utxo_lookup);
+       CHECK_ACCESS(utxo_lookup_ptr);
+       LDKCOption_UtxoLookupZ utxo_lookup_conv = *(LDKCOption_UtxoLookupZ*)(utxo_lookup_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKCOption_UtxoLookupZ
+       if (utxo_lookup_conv.tag == LDKCOption_UtxoLookupZ_Some) {
+               // Manually implement clone for Java trait instances
+               if (utxo_lookup_conv.some.free == LDKUtxoLookup_JCalls_free) {
+                       // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                       LDKUtxoLookup_JCalls_cloned(&utxo_lookup_conv.some);
+               }
+       }
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_update_channel_from_unsigned_announcement(&this_arg_conv, &msg_conv, utxo_lookup_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NetworkGraph_add_channel_from_partial_announcement(int64_t this_arg, int64_t short_channel_id, int64_t timestamp, int64_t features, int8_tArray node_id_1, int8_tArray node_id_2) {
+       LDKNetworkGraph 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;
+       LDKChannelFeatures features_conv;
+       features_conv.inner = untag_ptr(features);
+       features_conv.is_owned = ptr_is_owned(features);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_conv);
+       features_conv = ChannelFeatures_clone(&features_conv);
+       LDKPublicKey node_id_1_ref;
+       CHECK(node_id_1->arr_len == 33);
+       memcpy(node_id_1_ref.compressed_form, node_id_1->elems, 33); FREE(node_id_1);
+       LDKPublicKey node_id_2_ref;
+       CHECK(node_id_2->arr_len == 33);
+       memcpy(node_id_2_ref.compressed_form, node_id_2->elems, 33); FREE(node_id_2);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_add_channel_from_partial_announcement(&this_arg_conv, short_channel_id, timestamp, features_conv, node_id_1_ref, node_id_2_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_NetworkGraph_channel_failed_permanent(int64_t this_arg, int64_t short_channel_id) {
+       LDKNetworkGraph 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;
+       NetworkGraph_channel_failed_permanent(&this_arg_conv, short_channel_id);
+}
+
+void  CS_LDK_NetworkGraph_node_failed_permanent(int64_t this_arg, int8_tArray node_id) {
+       LDKNetworkGraph 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;
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       NetworkGraph_node_failed_permanent(&this_arg_conv, node_id_ref);
+}
+
+void  CS_LDK_NetworkGraph_remove_stale_channels_and_tracking(int64_t this_arg) {
+       LDKNetworkGraph 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;
+       NetworkGraph_remove_stale_channels_and_tracking(&this_arg_conv);
+}
+
+void  CS_LDK_NetworkGraph_remove_stale_channels_and_tracking_with_time(int64_t this_arg, int64_t current_time_unix) {
+       LDKNetworkGraph 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;
+       NetworkGraph_remove_stale_channels_and_tracking_with_time(&this_arg_conv, current_time_unix);
+}
+
+int64_t  CS_LDK_NetworkGraph_update_channel(int64_t this_arg, int64_t msg) {
+       LDKNetworkGraph 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;
+       LDKChannelUpdate 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;
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_update_channel(&this_arg_conv, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NetworkGraph_update_channel_unsigned(int64_t this_arg, int64_t msg) {
+       LDKNetworkGraph 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;
+       LDKUnsignedChannelUpdate 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;
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_update_channel_unsigned(&this_arg_conv, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NetworkGraph_verify_channel_update(int64_t this_arg, int64_t msg) {
+       LDKNetworkGraph 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;
+       LDKChannelUpdate 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;
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_verify_channel_update(&this_arg_conv, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ReadOnlyNetworkGraph_channel(int64_t this_arg, int64_t short_channel_id) {
+       LDKReadOnlyNetworkGraph 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;
+       LDKChannelInfo ret_var = ReadOnlyNetworkGraph_channel(&this_arg_conv, short_channel_id);
+       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_tArray  CS_LDK_ReadOnlyNetworkGraph_list_channels(int64_t this_arg) {
+       LDKReadOnlyNetworkGraph 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;
+       LDKCVec_u64Z ret_var = ReadOnlyNetworkGraph_list_channels(&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 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;
+}
+
+int64_t  CS_LDK_ReadOnlyNetworkGraph_node(int64_t this_arg, int64_t node_id) {
+       LDKReadOnlyNetworkGraph 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;
+       LDKNodeId node_id_conv;
+       node_id_conv.inner = untag_ptr(node_id);
+       node_id_conv.is_owned = ptr_is_owned(node_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_id_conv);
+       node_id_conv.is_owned = false;
+       LDKNodeInfo ret_var = ReadOnlyNetworkGraph_node(&this_arg_conv, &node_id_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_tArray  CS_LDK_ReadOnlyNetworkGraph_list_nodes(int64_t this_arg) {
+       LDKReadOnlyNetworkGraph 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;
+       LDKCVec_NodeIdZ ret_var = ReadOnlyNetworkGraph_list_nodes(&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 i = 0; i < ret_var.datalen; i++) {
+               LDKNodeId ret_conv_8_var = ret_var.data[i];
+               int64_t ret_conv_8_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_8_var);
+               ret_conv_8_ref = tag_ptr(ret_conv_8_var.inner, ret_conv_8_var.is_owned);
+               ret_arr_ptr[i] = ret_conv_8_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_ReadOnlyNetworkGraph_get_addresses(int64_t this_arg, int8_tArray pubkey) {
+       LDKReadOnlyNetworkGraph 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;
+       LDKPublicKey pubkey_ref;
+       CHECK(pubkey->arr_len == 33);
+       memcpy(pubkey_ref.compressed_form, pubkey->elems, 33); FREE(pubkey);
+       LDKCOption_CVec_SocketAddressZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_SocketAddressZZ), "LDKCOption_CVec_SocketAddressZZ");
+       *ret_copy = ReadOnlyNetworkGraph_get_addresses(&this_arg_conv, pubkey_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_DefaultRouter_free(int64_t this_obj) {
+       LDKDefaultRouter 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);
+       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) {
+       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* 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);
+       }
+       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* scorer_ptr = untag_ptr(scorer);
+       CHECK_ACCESS(scorer_ptr);
+       LDKLockableScore scorer_conv = *(LDKLockableScore*)(scorer_ptr);
+       if (scorer_conv.free == LDKLockableScore_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKLockableScore_JCalls_cloned(&scorer_conv);
+       }
+       LDKProbabilisticScoringFeeParameters score_params_conv;
+       score_params_conv.inner = untag_ptr(score_params);
+       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);
+       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_DefaultRouter_as_Router(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;
+       LDKRouter* ret_ret = MALLOC(sizeof(LDKRouter), "LDKRouter");
+       *ret_ret = DefaultRouter_as_Router(&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);
+       CHECK_ACCESS(this_ptr_ptr);
+       LDKRouter this_ptr_conv = *(LDKRouter*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Router_free(this_ptr_conv);
+}
+
+void  CS_LDK_ScorerAccountingForInFlightHtlcs_free(int64_t this_obj) {
+       LDKScorerAccountingForInFlightHtlcs 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);
+       ScorerAccountingForInFlightHtlcs_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ScorerAccountingForInFlightHtlcs_new(int64_t scorer, int64_t inflight_htlcs) {
+       void* scorer_ptr = untag_ptr(scorer);
+       CHECK_ACCESS(scorer_ptr);
+       LDKScoreLookUp scorer_conv = *(LDKScoreLookUp*)(scorer_ptr);
+       if (scorer_conv.free == LDKScoreLookUp_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKScoreLookUp_JCalls_cloned(&scorer_conv);
+       }
+       LDKInFlightHtlcs inflight_htlcs_conv;
+       inflight_htlcs_conv.inner = untag_ptr(inflight_htlcs);
+       inflight_htlcs_conv.is_owned = ptr_is_owned(inflight_htlcs);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(inflight_htlcs_conv);
+       inflight_htlcs_conv.is_owned = false;
+       LDKScorerAccountingForInFlightHtlcs ret_var = ScorerAccountingForInFlightHtlcs_new(scorer_conv, &inflight_htlcs_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_ScorerAccountingForInFlightHtlcs_as_ScoreLookUp(int64_t this_arg) {
+       LDKScorerAccountingForInFlightHtlcs 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;
+       LDKScoreLookUp* ret_ret = MALLOC(sizeof(LDKScoreLookUp), "LDKScoreLookUp");
+       *ret_ret = ScorerAccountingForInFlightHtlcs_as_ScoreLookUp(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_InFlightHtlcs_free(int64_t this_obj) {
+       LDKInFlightHtlcs 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);
+       InFlightHtlcs_free(this_obj_conv);
+}
+
+static inline uint64_t InFlightHtlcs_clone_ptr(LDKInFlightHtlcs *NONNULL_PTR arg) {
+       LDKInFlightHtlcs ret_var = InFlightHtlcs_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_InFlightHtlcs_clone_ptr(int64_t arg) {
+       LDKInFlightHtlcs 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 = InFlightHtlcs_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InFlightHtlcs_clone(int64_t orig) {
+       LDKInFlightHtlcs 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;
+       LDKInFlightHtlcs ret_var = InFlightHtlcs_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_InFlightHtlcs_new() {
+       LDKInFlightHtlcs ret_var = InFlightHtlcs_new();
+       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_InFlightHtlcs_process_path(int64_t this_arg, int64_t path, int8_tArray payer_node_id) {
+       LDKInFlightHtlcs 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;
+       LDKPath 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.is_owned = false;
+       LDKPublicKey payer_node_id_ref;
+       CHECK(payer_node_id->arr_len == 33);
+       memcpy(payer_node_id_ref.compressed_form, payer_node_id->elems, 33); FREE(payer_node_id);
+       InFlightHtlcs_process_path(&this_arg_conv, &path_conv, payer_node_id_ref);
+}
+
+void  CS_LDK_InFlightHtlcs_add_inflight_htlc(int64_t this_arg, int64_t source, int64_t target, int64_t channel_scid, int64_t used_msat) {
+       LDKInFlightHtlcs 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;
+       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;
+       InFlightHtlcs_add_inflight_htlc(&this_arg_conv, &source_conv, &target_conv, channel_scid, used_msat);
+}
+
+int64_t  CS_LDK_InFlightHtlcs_used_liquidity_msat(int64_t this_arg, int64_t source, int64_t target, int64_t channel_scid) {
+       LDKInFlightHtlcs 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;
+       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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = InFlightHtlcs_used_liquidity_msat(&this_arg_conv, &source_conv, &target_conv, channel_scid);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_InFlightHtlcs_write(int64_t obj) {
+       LDKInFlightHtlcs 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 = InFlightHtlcs_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_InFlightHtlcs_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_InFlightHtlcsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InFlightHtlcsDecodeErrorZ), "LDKCResult_InFlightHtlcsDecodeErrorZ");
+       *ret_conv = InFlightHtlcs_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_RouteHop_free(int64_t this_obj) {
+       LDKRouteHop 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);
+       RouteHop_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_RouteHop_get_pubkey(int64_t this_ptr) {
+       LDKRouteHop 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, RouteHop_get_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_RouteHop_set_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKRouteHop 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);
+       RouteHop_set_pubkey(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_RouteHop_get_node_features(int64_t this_ptr) {
+       LDKRouteHop 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;
+       LDKNodeFeatures ret_var = RouteHop_get_node_features(&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_RouteHop_set_node_features(int64_t this_ptr, int64_t val) {
+       LDKRouteHop 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;
+       LDKNodeFeatures 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 = NodeFeatures_clone(&val_conv);
+       RouteHop_set_node_features(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_RouteHop_get_short_channel_id(int64_t this_ptr) {
+       LDKRouteHop 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 = RouteHop_get_short_channel_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RouteHop_set_short_channel_id(int64_t this_ptr, int64_t val) {
+       LDKRouteHop 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;
+       RouteHop_set_short_channel_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_RouteHop_get_channel_features(int64_t this_ptr) {
+       LDKRouteHop 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;
+       LDKChannelFeatures ret_var = RouteHop_get_channel_features(&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_RouteHop_set_channel_features(int64_t this_ptr, int64_t val) {
+       LDKRouteHop 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;
+       LDKChannelFeatures 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 = ChannelFeatures_clone(&val_conv);
+       RouteHop_set_channel_features(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_RouteHop_get_fee_msat(int64_t this_ptr) {
+       LDKRouteHop 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 = RouteHop_get_fee_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RouteHop_set_fee_msat(int64_t this_ptr, int64_t val) {
+       LDKRouteHop 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;
+       RouteHop_set_fee_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_RouteHop_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKRouteHop 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 = RouteHop_get_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RouteHop_set_cltv_expiry_delta(int64_t this_ptr, int32_t val) {
+       LDKRouteHop 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;
+       RouteHop_set_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_RouteHop_get_maybe_announced_channel(int64_t this_ptr) {
+       LDKRouteHop 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;
+       jboolean ret_conv = RouteHop_get_maybe_announced_channel(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RouteHop_set_maybe_announced_channel(int64_t this_ptr, jboolean val) {
+       LDKRouteHop 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;
+       RouteHop_set_maybe_announced_channel(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_RouteHop_new(int8_tArray pubkey_arg, int64_t node_features_arg, int64_t short_channel_id_arg, int64_t channel_features_arg, int64_t fee_msat_arg, int32_t cltv_expiry_delta_arg, jboolean maybe_announced_channel_arg) {
+       LDKPublicKey pubkey_arg_ref;
+       CHECK(pubkey_arg->arr_len == 33);
+       memcpy(pubkey_arg_ref.compressed_form, pubkey_arg->elems, 33); FREE(pubkey_arg);
+       LDKNodeFeatures node_features_arg_conv;
+       node_features_arg_conv.inner = untag_ptr(node_features_arg);
+       node_features_arg_conv.is_owned = ptr_is_owned(node_features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_features_arg_conv);
+       node_features_arg_conv = NodeFeatures_clone(&node_features_arg_conv);
+       LDKChannelFeatures channel_features_arg_conv;
+       channel_features_arg_conv.inner = untag_ptr(channel_features_arg);
+       channel_features_arg_conv.is_owned = ptr_is_owned(channel_features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_features_arg_conv);
+       channel_features_arg_conv = ChannelFeatures_clone(&channel_features_arg_conv);
+       LDKRouteHop ret_var = RouteHop_new(pubkey_arg_ref, node_features_arg_conv, short_channel_id_arg, channel_features_arg_conv, fee_msat_arg, cltv_expiry_delta_arg, maybe_announced_channel_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 RouteHop_clone_ptr(LDKRouteHop *NONNULL_PTR arg) {
+       LDKRouteHop ret_var = RouteHop_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_RouteHop_clone_ptr(int64_t arg) {
+       LDKRouteHop 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 = RouteHop_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RouteHop_clone(int64_t orig) {
+       LDKRouteHop 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;
+       LDKRouteHop ret_var = RouteHop_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_RouteHop_hash(int64_t o) {
+       LDKRouteHop 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 = RouteHop_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_RouteHop_eq(int64_t a, int64_t b) {
+       LDKRouteHop 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;
+       LDKRouteHop 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 = RouteHop_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_RouteHop_write(int64_t obj) {
+       LDKRouteHop 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 = RouteHop_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_RouteHop_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RouteHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHopDecodeErrorZ), "LDKCResult_RouteHopDecodeErrorZ");
+       *ret_conv = RouteHop_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_BlindedTail_free(int64_t this_obj) {
+       LDKBlindedTail 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);
+       BlindedTail_free(this_obj_conv);
+}
+
+int64_tArray  CS_LDK_BlindedTail_get_hops(int64_t this_ptr) {
+       LDKBlindedTail 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_BlindedHopZ ret_var = BlindedTail_get_hops(&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 m = 0; m < ret_var.datalen; m++) {
+               LDKBlindedHop ret_conv_12_var = ret_var.data[m];
+               int64_t ret_conv_12_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_12_var);
+               ret_conv_12_ref = tag_ptr(ret_conv_12_var.inner, ret_conv_12_var.is_owned);
+               ret_arr_ptr[m] = ret_conv_12_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_BlindedTail_set_hops(int64_t this_ptr, int64_tArray val) {
+       LDKBlindedTail 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_BlindedHopZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKBlindedHop), "LDKCVec_BlindedHopZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t m = 0; m < val_constr.datalen; m++) {
+               int64_t val_conv_12 = val_vals[m];
+               LDKBlindedHop val_conv_12_conv;
+               val_conv_12_conv.inner = untag_ptr(val_conv_12);
+               val_conv_12_conv.is_owned = ptr_is_owned(val_conv_12);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_12_conv);
+               val_conv_12_conv = BlindedHop_clone(&val_conv_12_conv);
+               val_constr.data[m] = val_conv_12_conv;
+       }
+       FREE(val);
+       BlindedTail_set_hops(&this_ptr_conv, val_constr);
+}
+
+int8_tArray  CS_LDK_BlindedTail_get_blinding_point(int64_t this_ptr) {
+       LDKBlindedTail 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, BlindedTail_get_blinding_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_BlindedTail_set_blinding_point(int64_t this_ptr, int8_tArray val) {
+       LDKBlindedTail 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);
+       BlindedTail_set_blinding_point(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_BlindedTail_get_excess_final_cltv_expiry_delta(int64_t this_ptr) {
+       LDKBlindedTail 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 = BlindedTail_get_excess_final_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedTail_set_excess_final_cltv_expiry_delta(int64_t this_ptr, int32_t val) {
+       LDKBlindedTail 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;
+       BlindedTail_set_excess_final_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_BlindedTail_get_final_value_msat(int64_t this_ptr) {
+       LDKBlindedTail 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 = BlindedTail_get_final_value_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedTail_set_final_value_msat(int64_t this_ptr, int64_t val) {
+       LDKBlindedTail 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;
+       BlindedTail_set_final_value_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_BlindedTail_new(int64_tArray hops_arg, int8_tArray blinding_point_arg, int32_t excess_final_cltv_expiry_delta_arg, int64_t final_value_msat_arg) {
+       LDKCVec_BlindedHopZ hops_arg_constr;
+       hops_arg_constr.datalen = hops_arg->arr_len;
+       if (hops_arg_constr.datalen > 0)
+               hops_arg_constr.data = MALLOC(hops_arg_constr.datalen * sizeof(LDKBlindedHop), "LDKCVec_BlindedHopZ Elements");
+       else
+               hops_arg_constr.data = NULL;
+       int64_t* hops_arg_vals = hops_arg->elems;
+       for (size_t m = 0; m < hops_arg_constr.datalen; m++) {
+               int64_t hops_arg_conv_12 = hops_arg_vals[m];
+               LDKBlindedHop hops_arg_conv_12_conv;
+               hops_arg_conv_12_conv.inner = untag_ptr(hops_arg_conv_12);
+               hops_arg_conv_12_conv.is_owned = ptr_is_owned(hops_arg_conv_12);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(hops_arg_conv_12_conv);
+               hops_arg_conv_12_conv = BlindedHop_clone(&hops_arg_conv_12_conv);
+               hops_arg_constr.data[m] = hops_arg_conv_12_conv;
+       }
+       FREE(hops_arg);
+       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);
+       LDKBlindedTail ret_var = BlindedTail_new(hops_arg_constr, blinding_point_arg_ref, excess_final_cltv_expiry_delta_arg, final_value_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 BlindedTail_clone_ptr(LDKBlindedTail *NONNULL_PTR arg) {
+       LDKBlindedTail ret_var = BlindedTail_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_BlindedTail_clone_ptr(int64_t arg) {
+       LDKBlindedTail 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 = BlindedTail_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedTail_clone(int64_t orig) {
+       LDKBlindedTail 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;
+       LDKBlindedTail ret_var = BlindedTail_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_BlindedTail_hash(int64_t o) {
+       LDKBlindedTail 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 = BlindedTail_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BlindedTail_eq(int64_t a, int64_t b) {
+       LDKBlindedTail 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;
+       LDKBlindedTail 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 = BlindedTail_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_BlindedTail_write(int64_t obj) {
+       LDKBlindedTail 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 = BlindedTail_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_BlindedTail_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BlindedTailDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedTailDecodeErrorZ), "LDKCResult_BlindedTailDecodeErrorZ");
+       *ret_conv = BlindedTail_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_Path_free(int64_t this_obj) {
+       LDKPath 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);
+       Path_free(this_obj_conv);
+}
+
+int64_tArray  CS_LDK_Path_get_hops(int64_t this_ptr) {
+       LDKPath 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_RouteHopZ ret_var = Path_get_hops(&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 k = 0; k < ret_var.datalen; k++) {
+               LDKRouteHop ret_conv_10_var = ret_var.data[k];
+               int64_t ret_conv_10_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_10_var);
+               ret_conv_10_ref = tag_ptr(ret_conv_10_var.inner, ret_conv_10_var.is_owned);
+               ret_arr_ptr[k] = ret_conv_10_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_Path_set_hops(int64_t this_ptr, int64_tArray val) {
+       LDKPath 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_RouteHopZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKRouteHop), "LDKCVec_RouteHopZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t k = 0; k < val_constr.datalen; k++) {
+               int64_t val_conv_10 = val_vals[k];
+               LDKRouteHop val_conv_10_conv;
+               val_conv_10_conv.inner = untag_ptr(val_conv_10);
+               val_conv_10_conv.is_owned = ptr_is_owned(val_conv_10);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_10_conv);
+               val_conv_10_conv = RouteHop_clone(&val_conv_10_conv);
+               val_constr.data[k] = val_conv_10_conv;
+       }
+       FREE(val);
+       Path_set_hops(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_Path_get_blinded_tail(int64_t this_ptr) {
+       LDKPath 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;
+       LDKBlindedTail ret_var = Path_get_blinded_tail(&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_Path_set_blinded_tail(int64_t this_ptr, int64_t val) {
+       LDKPath 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;
+       LDKBlindedTail 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 = BlindedTail_clone(&val_conv);
+       Path_set_blinded_tail(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Path_new(int64_tArray hops_arg, int64_t blinded_tail_arg) {
+       LDKCVec_RouteHopZ hops_arg_constr;
+       hops_arg_constr.datalen = hops_arg->arr_len;
+       if (hops_arg_constr.datalen > 0)
+               hops_arg_constr.data = MALLOC(hops_arg_constr.datalen * sizeof(LDKRouteHop), "LDKCVec_RouteHopZ Elements");
+       else
+               hops_arg_constr.data = NULL;
+       int64_t* hops_arg_vals = hops_arg->elems;
+       for (size_t k = 0; k < hops_arg_constr.datalen; k++) {
+               int64_t hops_arg_conv_10 = hops_arg_vals[k];
+               LDKRouteHop hops_arg_conv_10_conv;
+               hops_arg_conv_10_conv.inner = untag_ptr(hops_arg_conv_10);
+               hops_arg_conv_10_conv.is_owned = ptr_is_owned(hops_arg_conv_10);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(hops_arg_conv_10_conv);
+               hops_arg_conv_10_conv = RouteHop_clone(&hops_arg_conv_10_conv);
+               hops_arg_constr.data[k] = hops_arg_conv_10_conv;
+       }
+       FREE(hops_arg);
+       LDKBlindedTail blinded_tail_arg_conv;
+       blinded_tail_arg_conv.inner = untag_ptr(blinded_tail_arg);
+       blinded_tail_arg_conv.is_owned = ptr_is_owned(blinded_tail_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(blinded_tail_arg_conv);
+       blinded_tail_arg_conv = BlindedTail_clone(&blinded_tail_arg_conv);
+       LDKPath ret_var = Path_new(hops_arg_constr, blinded_tail_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 Path_clone_ptr(LDKPath *NONNULL_PTR arg) {
+       LDKPath ret_var = Path_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_Path_clone_ptr(int64_t arg) {
+       LDKPath 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 = Path_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Path_clone(int64_t orig) {
+       LDKPath 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;
+       LDKPath ret_var = Path_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_Path_hash(int64_t o) {
+       LDKPath 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 = Path_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Path_eq(int64_t a, int64_t b) {
+       LDKPath 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;
+       LDKPath 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 = Path_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Path_fee_msat(int64_t this_arg) {
+       LDKPath 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 = Path_fee_msat(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Path_final_value_msat(int64_t this_arg) {
+       LDKPath 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 = Path_final_value_msat(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Path_final_cltv_expiry_delta(int64_t this_arg) {
+       LDKPath 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;
+       LDKCOption_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = Path_final_cltv_expiry_delta(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_Route_free(int64_t this_obj) {
+       LDKRoute 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);
+       Route_free(this_obj_conv);
+}
+
+int64_tArray  CS_LDK_Route_get_paths(int64_t this_ptr) {
+       LDKRoute 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_PathZ ret_var = Route_get_paths(&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++) {
+               LDKPath ret_conv_6_var = ret_var.data[g];
+               int64_t ret_conv_6_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_6_var);
+               ret_conv_6_ref = tag_ptr(ret_conv_6_var.inner, ret_conv_6_var.is_owned);
+               ret_arr_ptr[g] = ret_conv_6_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_Route_set_paths(int64_t this_ptr, int64_tArray val) {
+       LDKRoute 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_PathZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKPath), "LDKCVec_PathZ 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];
+               LDKPath val_conv_6_conv;
+               val_conv_6_conv.inner = untag_ptr(val_conv_6);
+               val_conv_6_conv.is_owned = ptr_is_owned(val_conv_6);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_6_conv);
+               val_conv_6_conv = Path_clone(&val_conv_6_conv);
+               val_constr.data[g] = val_conv_6_conv;
+       }
+       FREE(val);
+       Route_set_paths(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_Route_get_route_params(int64_t this_ptr) {
+       LDKRoute 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;
+       LDKRouteParameters ret_var = Route_get_route_params(&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_Route_set_route_params(int64_t this_ptr, int64_t val) {
+       LDKRoute 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;
+       LDKRouteParameters 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 = RouteParameters_clone(&val_conv);
+       Route_set_route_params(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Route_new(int64_tArray paths_arg, int64_t route_params_arg) {
+       LDKCVec_PathZ paths_arg_constr;
+       paths_arg_constr.datalen = paths_arg->arr_len;
+       if (paths_arg_constr.datalen > 0)
+               paths_arg_constr.data = MALLOC(paths_arg_constr.datalen * sizeof(LDKPath), "LDKCVec_PathZ Elements");
+       else
+               paths_arg_constr.data = NULL;
+       int64_t* paths_arg_vals = paths_arg->elems;
+       for (size_t g = 0; g < paths_arg_constr.datalen; g++) {
+               int64_t paths_arg_conv_6 = paths_arg_vals[g];
+               LDKPath paths_arg_conv_6_conv;
+               paths_arg_conv_6_conv.inner = untag_ptr(paths_arg_conv_6);
+               paths_arg_conv_6_conv.is_owned = ptr_is_owned(paths_arg_conv_6);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(paths_arg_conv_6_conv);
+               paths_arg_conv_6_conv = Path_clone(&paths_arg_conv_6_conv);
+               paths_arg_constr.data[g] = paths_arg_conv_6_conv;
+       }
+       FREE(paths_arg);
+       LDKRouteParameters route_params_arg_conv;
+       route_params_arg_conv.inner = untag_ptr(route_params_arg);
+       route_params_arg_conv.is_owned = ptr_is_owned(route_params_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_arg_conv);
+       route_params_arg_conv = RouteParameters_clone(&route_params_arg_conv);
+       LDKRoute ret_var = Route_new(paths_arg_constr, route_params_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 Route_clone_ptr(LDKRoute *NONNULL_PTR arg) {
+       LDKRoute ret_var = Route_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_Route_clone_ptr(int64_t arg) {
+       LDKRoute 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 = Route_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Route_clone(int64_t orig) {
+       LDKRoute 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;
+       LDKRoute ret_var = Route_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_Route_hash(int64_t o) {
+       LDKRoute 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 = Route_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Route_eq(int64_t a, int64_t b) {
+       LDKRoute 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;
+       LDKRoute 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 = Route_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Route_get_total_fees(int64_t this_arg) {
+       LDKRoute 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 = Route_get_total_fees(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Route_get_total_amount(int64_t this_arg) {
+       LDKRoute 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 = Route_get_total_amount(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Route_write(int64_t obj) {
+       LDKRoute 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 = Route_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_Route_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RouteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteDecodeErrorZ), "LDKCResult_RouteDecodeErrorZ");
+       *ret_conv = Route_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_RouteParameters_free(int64_t this_obj) {
+       LDKRouteParameters 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);
+       RouteParameters_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_RouteParameters_get_payment_params(int64_t this_ptr) {
+       LDKRouteParameters 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;
+       LDKPaymentParameters ret_var = RouteParameters_get_payment_params(&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_RouteParameters_set_payment_params(int64_t this_ptr, int64_t val) {
+       LDKRouteParameters 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;
+       LDKPaymentParameters 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 = PaymentParameters_clone(&val_conv);
+       RouteParameters_set_payment_params(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_RouteParameters_get_final_value_msat(int64_t this_ptr) {
+       LDKRouteParameters 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 = RouteParameters_get_final_value_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RouteParameters_set_final_value_msat(int64_t this_ptr, int64_t val) {
+       LDKRouteParameters 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;
+       RouteParameters_set_final_value_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_RouteParameters_get_max_total_routing_fee_msat(int64_t this_ptr) {
+       LDKRouteParameters 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 = RouteParameters_get_max_total_routing_fee_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_RouteParameters_set_max_total_routing_fee_msat(int64_t this_ptr, int64_t val) {
+       LDKRouteParameters 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));
+       RouteParameters_set_max_total_routing_fee_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_RouteParameters_new(int64_t payment_params_arg, int64_t final_value_msat_arg, int64_t max_total_routing_fee_msat_arg) {
+       LDKPaymentParameters payment_params_arg_conv;
+       payment_params_arg_conv.inner = untag_ptr(payment_params_arg);
+       payment_params_arg_conv.is_owned = ptr_is_owned(payment_params_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_params_arg_conv);
+       payment_params_arg_conv = PaymentParameters_clone(&payment_params_arg_conv);
+       void* max_total_routing_fee_msat_arg_ptr = untag_ptr(max_total_routing_fee_msat_arg);
+       CHECK_ACCESS(max_total_routing_fee_msat_arg_ptr);
+       LDKCOption_u64Z max_total_routing_fee_msat_arg_conv = *(LDKCOption_u64Z*)(max_total_routing_fee_msat_arg_ptr);
+       max_total_routing_fee_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(max_total_routing_fee_msat_arg));
+       LDKRouteParameters ret_var = RouteParameters_new(payment_params_arg_conv, final_value_msat_arg, max_total_routing_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 RouteParameters_clone_ptr(LDKRouteParameters *NONNULL_PTR arg) {
+       LDKRouteParameters ret_var = RouteParameters_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_RouteParameters_clone_ptr(int64_t arg) {
+       LDKRouteParameters 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 = RouteParameters_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RouteParameters_clone(int64_t orig) {
+       LDKRouteParameters 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;
+       LDKRouteParameters ret_var = RouteParameters_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_RouteParameters_hash(int64_t o) {
+       LDKRouteParameters 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 = RouteParameters_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_RouteParameters_eq(int64_t a, int64_t b) {
+       LDKRouteParameters 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;
+       LDKRouteParameters 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 = RouteParameters_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RouteParameters_from_payment_params_and_value(int64_t payment_params, int64_t final_value_msat) {
+       LDKPaymentParameters payment_params_conv;
+       payment_params_conv.inner = untag_ptr(payment_params);
+       payment_params_conv.is_owned = ptr_is_owned(payment_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_params_conv);
+       payment_params_conv = PaymentParameters_clone(&payment_params_conv);
+       LDKRouteParameters ret_var = RouteParameters_from_payment_params_and_value(payment_params_conv, final_value_msat);
+       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_RouteParameters_write(int64_t obj) {
+       LDKRouteParameters 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 = RouteParameters_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_RouteParameters_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RouteParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteParametersDecodeErrorZ), "LDKCResult_RouteParametersDecodeErrorZ");
+       *ret_conv = RouteParameters_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_PaymentParameters_free(int64_t this_obj) {
+       LDKPaymentParameters 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);
+       PaymentParameters_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_PaymentParameters_get_payee(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;
+       LDKPayee *ret_copy = MALLOC(sizeof(LDKPayee), "LDKPayee");
+       *ret_copy = PaymentParameters_get_payee(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_PaymentParameters_set_payee(int64_t this_ptr, int64_t 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;
+       void* val_ptr = untag_ptr(val);
+       CHECK_ACCESS(val_ptr);
+       LDKPayee val_conv = *(LDKPayee*)(val_ptr);
+       val_conv = Payee_clone((LDKPayee*)untag_ptr(val));
+       PaymentParameters_set_payee(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_PaymentParameters_get_expiry_time(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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = PaymentParameters_get_expiry_time(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_PaymentParameters_set_expiry_time(int64_t this_ptr, int64_t 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;
+       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));
+       PaymentParameters_set_expiry_time(&this_ptr_conv, val_conv);
+}
+
+int32_t  CS_LDK_PaymentParameters_get_max_total_cltv_expiry_delta(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;
+       int32_t ret_conv = PaymentParameters_get_max_total_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentParameters_set_max_total_cltv_expiry_delta(int64_t this_ptr, int32_t 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;
+       PaymentParameters_set_max_total_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int8_t  CS_LDK_PaymentParameters_get_max_path_count(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;
+       int8_t ret_conv = PaymentParameters_get_max_path_count(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentParameters_set_max_path_count(int64_t this_ptr, int8_t 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;
+       PaymentParameters_set_max_path_count(&this_ptr_conv, val);
+}
+
+int8_t  CS_LDK_PaymentParameters_get_max_channel_saturation_power_of_half(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;
+       int8_t ret_conv = PaymentParameters_get_max_channel_saturation_power_of_half(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentParameters_set_max_channel_saturation_power_of_half(int64_t this_ptr, int8_t 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;
+       PaymentParameters_set_max_channel_saturation_power_of_half(&this_ptr_conv, val);
+}
+
+int64_tArray  CS_LDK_PaymentParameters_get_previously_failed_channels(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_channels(&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_channels(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_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) {
+       void* payee_arg_ptr = untag_ptr(payee_arg);
+       CHECK_ACCESS(payee_arg_ptr);
+       LDKPayee payee_arg_conv = *(LDKPayee*)(payee_arg_ptr);
+       payee_arg_conv = Payee_clone((LDKPayee*)untag_ptr(payee_arg));
+       void* expiry_time_arg_ptr = untag_ptr(expiry_time_arg);
+       CHECK_ACCESS(expiry_time_arg_ptr);
+       LDKCOption_u64Z expiry_time_arg_conv = *(LDKCOption_u64Z*)(expiry_time_arg_ptr);
+       expiry_time_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(expiry_time_arg));
+       LDKCVec_u64Z previously_failed_channels_arg_constr;
+       previously_failed_channels_arg_constr.datalen = previously_failed_channels_arg->arr_len;
+       if (previously_failed_channels_arg_constr.datalen > 0)
+               previously_failed_channels_arg_constr.data = MALLOC(previously_failed_channels_arg_constr.datalen * sizeof(int64_t), "LDKCVec_u64Z Elements");
+       else
+               previously_failed_channels_arg_constr.data = NULL;
+       int64_t* previously_failed_channels_arg_vals = previously_failed_channels_arg->elems;
+       for (size_t g = 0; g < previously_failed_channels_arg_constr.datalen; g++) {
+               int64_t previously_failed_channels_arg_conv_6 = previously_failed_channels_arg_vals[g];
+               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);
+       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 PaymentParameters_clone_ptr(LDKPaymentParameters *NONNULL_PTR arg) {
+       LDKPaymentParameters ret_var = PaymentParameters_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_PaymentParameters_clone_ptr(int64_t arg) {
+       LDKPaymentParameters 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 = PaymentParameters_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PaymentParameters_clone(int64_t orig) {
+       LDKPaymentParameters 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;
+       LDKPaymentParameters ret_var = PaymentParameters_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_PaymentParameters_hash(int64_t o) {
+       LDKPaymentParameters 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 = PaymentParameters_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_PaymentParameters_eq(int64_t a, int64_t b) {
+       LDKPaymentParameters 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;
+       LDKPaymentParameters 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 = PaymentParameters_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_PaymentParameters_write(int64_t obj) {
+       LDKPaymentParameters 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 = PaymentParameters_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_PaymentParameters_read(int8_tArray ser, int32_t arg) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PaymentParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentParametersDecodeErrorZ), "LDKCResult_PaymentParametersDecodeErrorZ");
+       *ret_conv = PaymentParameters_read(ser_ref, arg);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PaymentParameters_from_node_id(int8_tArray payee_pubkey, int32_t final_cltv_expiry_delta) {
+       LDKPublicKey payee_pubkey_ref;
+       CHECK(payee_pubkey->arr_len == 33);
+       memcpy(payee_pubkey_ref.compressed_form, payee_pubkey->elems, 33); FREE(payee_pubkey);
+       LDKPaymentParameters ret_var = PaymentParameters_from_node_id(payee_pubkey_ref, final_cltv_expiry_delta);
+       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_PaymentParameters_for_keysend(int8_tArray payee_pubkey, int32_t final_cltv_expiry_delta, jboolean allow_mpp) {
+       LDKPublicKey payee_pubkey_ref;
+       CHECK(payee_pubkey->arr_len == 33);
+       memcpy(payee_pubkey_ref.compressed_form, payee_pubkey->elems, 33); FREE(payee_pubkey);
+       LDKPaymentParameters ret_var = PaymentParameters_for_keysend(payee_pubkey_ref, final_cltv_expiry_delta, allow_mpp);
+       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_PaymentParameters_from_bolt12_invoice(int64_t invoice) {
+       LDKBolt12Invoice 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;
+       LDKPaymentParameters ret_var = PaymentParameters_from_bolt12_invoice(&invoice_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_PaymentParameters_blinded(int64_tArray blinded_route_hints) {
+       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ blinded_route_hints_constr;
+       blinded_route_hints_constr.datalen = blinded_route_hints->arr_len;
+       if (blinded_route_hints_constr.datalen > 0)
+               blinded_route_hints_constr.data = MALLOC(blinded_route_hints_constr.datalen * sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ Elements");
+       else
+               blinded_route_hints_constr.data = NULL;
+       int64_t* blinded_route_hints_vals = blinded_route_hints->elems;
+       for (size_t l = 0; l < blinded_route_hints_constr.datalen; l++) {
+               int64_t blinded_route_hints_conv_37 = blinded_route_hints_vals[l];
+               void* blinded_route_hints_conv_37_ptr = untag_ptr(blinded_route_hints_conv_37);
+               CHECK_ACCESS(blinded_route_hints_conv_37_ptr);
+               LDKC2Tuple_BlindedPayInfoBlindedPathZ blinded_route_hints_conv_37_conv = *(LDKC2Tuple_BlindedPayInfoBlindedPathZ*)(blinded_route_hints_conv_37_ptr);
+               blinded_route_hints_conv_37_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone((LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(blinded_route_hints_conv_37));
+               blinded_route_hints_constr.data[l] = blinded_route_hints_conv_37_conv;
+       }
+       FREE(blinded_route_hints);
+       LDKPaymentParameters ret_var = PaymentParameters_blinded(blinded_route_hints_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);
+       return ret_ref;
+}
+
+void  CS_LDK_Payee_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);
+       LDKPayee this_ptr_conv = *(LDKPayee*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Payee_free(this_ptr_conv);
+}
+
+static inline uint64_t Payee_clone_ptr(LDKPayee *NONNULL_PTR arg) {
+       LDKPayee *ret_copy = MALLOC(sizeof(LDKPayee), "LDKPayee");
+       *ret_copy = Payee_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_Payee_clone_ptr(int64_t arg) {
+       LDKPayee* arg_conv = (LDKPayee*)untag_ptr(arg);
+       int64_t ret_conv = Payee_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Payee_clone(int64_t orig) {
+       LDKPayee* orig_conv = (LDKPayee*)untag_ptr(orig);
+       LDKPayee *ret_copy = MALLOC(sizeof(LDKPayee), "LDKPayee");
+       *ret_copy = Payee_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Payee_blinded(int64_tArray route_hints, int64_t features) {
+       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ route_hints_constr;
+       route_hints_constr.datalen = route_hints->arr_len;
+       if (route_hints_constr.datalen > 0)
+               route_hints_constr.data = MALLOC(route_hints_constr.datalen * sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ Elements");
+       else
+               route_hints_constr.data = NULL;
+       int64_t* route_hints_vals = route_hints->elems;
+       for (size_t l = 0; l < route_hints_constr.datalen; l++) {
+               int64_t route_hints_conv_37 = route_hints_vals[l];
+               void* route_hints_conv_37_ptr = untag_ptr(route_hints_conv_37);
+               CHECK_ACCESS(route_hints_conv_37_ptr);
+               LDKC2Tuple_BlindedPayInfoBlindedPathZ route_hints_conv_37_conv = *(LDKC2Tuple_BlindedPayInfoBlindedPathZ*)(route_hints_conv_37_ptr);
+               route_hints_conv_37_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone((LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(route_hints_conv_37));
+               route_hints_constr.data[l] = route_hints_conv_37_conv;
+       }
+       FREE(route_hints);
+       LDKBolt12InvoiceFeatures features_conv;
+       features_conv.inner = untag_ptr(features);
+       features_conv.is_owned = ptr_is_owned(features);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_conv);
+       features_conv = Bolt12InvoiceFeatures_clone(&features_conv);
+       LDKPayee *ret_copy = MALLOC(sizeof(LDKPayee), "LDKPayee");
+       *ret_copy = Payee_blinded(route_hints_constr, features_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Payee_clear(int8_tArray node_id, int64_tArray route_hints, int64_t features, int32_t final_cltv_expiry_delta) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKCVec_RouteHintZ route_hints_constr;
+       route_hints_constr.datalen = route_hints->arr_len;
+       if (route_hints_constr.datalen > 0)
+               route_hints_constr.data = MALLOC(route_hints_constr.datalen * sizeof(LDKRouteHint), "LDKCVec_RouteHintZ Elements");
+       else
+               route_hints_constr.data = NULL;
+       int64_t* route_hints_vals = route_hints->elems;
+       for (size_t l = 0; l < route_hints_constr.datalen; l++) {
+               int64_t route_hints_conv_11 = route_hints_vals[l];
+               LDKRouteHint route_hints_conv_11_conv;
+               route_hints_conv_11_conv.inner = untag_ptr(route_hints_conv_11);
+               route_hints_conv_11_conv.is_owned = ptr_is_owned(route_hints_conv_11);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(route_hints_conv_11_conv);
+               route_hints_conv_11_conv = RouteHint_clone(&route_hints_conv_11_conv);
+               route_hints_constr.data[l] = route_hints_conv_11_conv;
+       }
+       FREE(route_hints);
+       LDKBolt11InvoiceFeatures features_conv;
+       features_conv.inner = untag_ptr(features);
+       features_conv.is_owned = ptr_is_owned(features);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_conv);
+       features_conv = Bolt11InvoiceFeatures_clone(&features_conv);
+       LDKPayee *ret_copy = MALLOC(sizeof(LDKPayee), "LDKPayee");
+       *ret_copy = Payee_clear(node_id_ref, route_hints_constr, features_conv, final_cltv_expiry_delta);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Payee_hash(int64_t o) {
+       LDKPayee* o_conv = (LDKPayee*)untag_ptr(o);
+       int64_t ret_conv = Payee_hash(o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Payee_eq(int64_t a, int64_t b) {
+       LDKPayee* a_conv = (LDKPayee*)untag_ptr(a);
+       LDKPayee* b_conv = (LDKPayee*)untag_ptr(b);
+       jboolean ret_conv = Payee_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RouteHint_free(int64_t this_obj) {
+       LDKRouteHint 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);
+       RouteHint_free(this_obj_conv);
+}
+
+int64_tArray  CS_LDK_RouteHint_get_a(int64_t this_ptr) {
+       LDKRouteHint 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_RouteHintHopZ ret_var = RouteHint_get_a(&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 o = 0; o < ret_var.datalen; o++) {
+               LDKRouteHintHop ret_conv_14_var = ret_var.data[o];
+               int64_t ret_conv_14_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_14_var);
+               ret_conv_14_ref = tag_ptr(ret_conv_14_var.inner, ret_conv_14_var.is_owned);
+               ret_arr_ptr[o] = ret_conv_14_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_RouteHint_set_a(int64_t this_ptr, int64_tArray val) {
+       LDKRouteHint 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_RouteHintHopZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKRouteHintHop), "LDKCVec_RouteHintHopZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t o = 0; o < val_constr.datalen; o++) {
+               int64_t val_conv_14 = val_vals[o];
+               LDKRouteHintHop val_conv_14_conv;
+               val_conv_14_conv.inner = untag_ptr(val_conv_14);
+               val_conv_14_conv.is_owned = ptr_is_owned(val_conv_14);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_14_conv);
+               val_conv_14_conv = RouteHintHop_clone(&val_conv_14_conv);
+               val_constr.data[o] = val_conv_14_conv;
+       }
+       FREE(val);
+       RouteHint_set_a(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_RouteHint_new(int64_tArray a_arg) {
+       LDKCVec_RouteHintHopZ a_arg_constr;
+       a_arg_constr.datalen = a_arg->arr_len;
+       if (a_arg_constr.datalen > 0)
+               a_arg_constr.data = MALLOC(a_arg_constr.datalen * sizeof(LDKRouteHintHop), "LDKCVec_RouteHintHopZ Elements");
+       else
+               a_arg_constr.data = NULL;
+       int64_t* a_arg_vals = a_arg->elems;
+       for (size_t o = 0; o < a_arg_constr.datalen; o++) {
+               int64_t a_arg_conv_14 = a_arg_vals[o];
+               LDKRouteHintHop a_arg_conv_14_conv;
+               a_arg_conv_14_conv.inner = untag_ptr(a_arg_conv_14);
+               a_arg_conv_14_conv.is_owned = ptr_is_owned(a_arg_conv_14);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(a_arg_conv_14_conv);
+               a_arg_conv_14_conv = RouteHintHop_clone(&a_arg_conv_14_conv);
+               a_arg_constr.data[o] = a_arg_conv_14_conv;
+       }
+       FREE(a_arg);
+       LDKRouteHint ret_var = RouteHint_new(a_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);
+       return ret_ref;
+}
+
+static inline uint64_t RouteHint_clone_ptr(LDKRouteHint *NONNULL_PTR arg) {
+       LDKRouteHint ret_var = RouteHint_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_RouteHint_clone_ptr(int64_t arg) {
+       LDKRouteHint 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 = RouteHint_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RouteHint_clone(int64_t orig) {
+       LDKRouteHint 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;
+       LDKRouteHint ret_var = RouteHint_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_RouteHint_hash(int64_t o) {
+       LDKRouteHint 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 = RouteHint_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_RouteHint_eq(int64_t a, int64_t b) {
+       LDKRouteHint 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;
+       LDKRouteHint 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 = RouteHint_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_RouteHint_write(int64_t obj) {
+       LDKRouteHint 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 = RouteHint_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_RouteHint_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RouteHintDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintDecodeErrorZ), "LDKCResult_RouteHintDecodeErrorZ");
+       *ret_conv = RouteHint_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_RouteHintHop_free(int64_t this_obj) {
+       LDKRouteHintHop 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);
+       RouteHintHop_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_RouteHintHop_get_src_node_id(int64_t this_ptr) {
+       LDKRouteHintHop 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, RouteHintHop_get_src_node_id(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_RouteHintHop_set_src_node_id(int64_t this_ptr, int8_tArray val) {
+       LDKRouteHintHop 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);
+       RouteHintHop_set_src_node_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_RouteHintHop_get_short_channel_id(int64_t this_ptr) {
+       LDKRouteHintHop 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 = RouteHintHop_get_short_channel_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RouteHintHop_set_short_channel_id(int64_t this_ptr, int64_t val) {
+       LDKRouteHintHop 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;
+       RouteHintHop_set_short_channel_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_RouteHintHop_get_fees(int64_t this_ptr) {
+       LDKRouteHintHop 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;
+       LDKRoutingFees ret_var = RouteHintHop_get_fees(&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_RouteHintHop_set_fees(int64_t this_ptr, int64_t val) {
+       LDKRouteHintHop 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;
+       LDKRoutingFees 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 = RoutingFees_clone(&val_conv);
+       RouteHintHop_set_fees(&this_ptr_conv, val_conv);
+}
+
+int16_t  CS_LDK_RouteHintHop_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKRouteHintHop 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 = RouteHintHop_get_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RouteHintHop_set_cltv_expiry_delta(int64_t this_ptr, int16_t val) {
+       LDKRouteHintHop 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;
+       RouteHintHop_set_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_RouteHintHop_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKRouteHintHop 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 = RouteHintHop_get_htlc_minimum_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_RouteHintHop_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKRouteHintHop 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));
+       RouteHintHop_set_htlc_minimum_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_RouteHintHop_get_htlc_maximum_msat(int64_t this_ptr) {
+       LDKRouteHintHop 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 = RouteHintHop_get_htlc_maximum_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_RouteHintHop_set_htlc_maximum_msat(int64_t this_ptr, int64_t val) {
+       LDKRouteHintHop 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));
+       RouteHintHop_set_htlc_maximum_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_RouteHintHop_new(int8_tArray src_node_id_arg, int64_t short_channel_id_arg, int64_t fees_arg, int16_t cltv_expiry_delta_arg, int64_t htlc_minimum_msat_arg, int64_t htlc_maximum_msat_arg) {
+       LDKPublicKey src_node_id_arg_ref;
+       CHECK(src_node_id_arg->arr_len == 33);
+       memcpy(src_node_id_arg_ref.compressed_form, src_node_id_arg->elems, 33); FREE(src_node_id_arg);
+       LDKRoutingFees fees_arg_conv;
+       fees_arg_conv.inner = untag_ptr(fees_arg);
+       fees_arg_conv.is_owned = ptr_is_owned(fees_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(fees_arg_conv);
+       fees_arg_conv = RoutingFees_clone(&fees_arg_conv);
+       void* htlc_minimum_msat_arg_ptr = untag_ptr(htlc_minimum_msat_arg);
+       CHECK_ACCESS(htlc_minimum_msat_arg_ptr);
+       LDKCOption_u64Z htlc_minimum_msat_arg_conv = *(LDKCOption_u64Z*)(htlc_minimum_msat_arg_ptr);
+       htlc_minimum_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(htlc_minimum_msat_arg));
+       void* htlc_maximum_msat_arg_ptr = untag_ptr(htlc_maximum_msat_arg);
+       CHECK_ACCESS(htlc_maximum_msat_arg_ptr);
+       LDKCOption_u64Z htlc_maximum_msat_arg_conv = *(LDKCOption_u64Z*)(htlc_maximum_msat_arg_ptr);
+       htlc_maximum_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(htlc_maximum_msat_arg));
+       LDKRouteHintHop ret_var = RouteHintHop_new(src_node_id_arg_ref, short_channel_id_arg, fees_arg_conv, cltv_expiry_delta_arg, htlc_minimum_msat_arg_conv, htlc_maximum_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 RouteHintHop_clone_ptr(LDKRouteHintHop *NONNULL_PTR arg) {
+       LDKRouteHintHop ret_var = RouteHintHop_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_RouteHintHop_clone_ptr(int64_t arg) {
+       LDKRouteHintHop 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 = RouteHintHop_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RouteHintHop_clone(int64_t orig) {
+       LDKRouteHintHop 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;
+       LDKRouteHintHop ret_var = RouteHintHop_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_RouteHintHop_hash(int64_t o) {
+       LDKRouteHintHop 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 = RouteHintHop_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_RouteHintHop_eq(int64_t a, int64_t b) {
+       LDKRouteHintHop 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;
+       LDKRouteHintHop 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 = RouteHintHop_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_RouteHintHop_write(int64_t obj) {
+       LDKRouteHintHop 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 = RouteHintHop_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_RouteHintHop_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RouteHintHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintHopDecodeErrorZ), "LDKCResult_RouteHintHopDecodeErrorZ");
+       *ret_conv = RouteHintHop_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+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);
+       memcpy(our_node_pubkey_ref.compressed_form, our_node_pubkey->elems, 33); FREE(our_node_pubkey);
+       LDKRouteParameters route_params_conv;
+       route_params_conv.inner = untag_ptr(route_params);
+       route_params_conv.is_owned = ptr_is_owned(route_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_conv);
+       route_params_conv.is_owned = false;
+       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;
+       LDKCVec_ChannelDetailsZ first_hops_constr;
+       LDKCVec_ChannelDetailsZ *first_hops_ptr = NULL;
+       if (first_hops != NULL) {
+               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.is_owned = false;
+                       first_hops_constr.data[q] = first_hops_conv_16_conv;
+               }
+               FREE(first_hops);
+               first_hops_ptr = &first_hops_constr;
+       }
+       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);
+       }
+       void* scorer_ptr = untag_ptr(scorer);
+       if (ptr_is_owned(scorer)) { CHECK_ACCESS(scorer_ptr); }
+       LDKScoreLookUp* scorer_conv = (LDKScoreLookUp*)scorer_ptr;
+       LDKProbabilisticScoringFeeParameters score_params_conv;
+       score_params_conv.inner = untag_ptr(score_params);
+       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;
+       uint8_t random_seed_bytes_arr[32];
+       CHECK(random_seed_bytes->arr_len == 32);
+       memcpy(random_seed_bytes_arr, random_seed_bytes->elems, 32); FREE(random_seed_bytes);
+       uint8_t (*random_seed_bytes_ref)[32] = &random_seed_bytes_arr;
+       LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
+       *ret_conv = find_route(our_node_pubkey_ref, &route_params_conv, &network_graph_conv, first_hops_ptr, logger_conv, scorer_conv, &score_params_conv, random_seed_bytes_ref);
+       if (first_hops_ptr != NULL) { FREE(first_hops_constr.data); }
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_build_route_from_hops(int8_tArray our_node_pubkey, ptrArray hops, int64_t route_params, int64_t network_graph, int64_t logger, int8_tArray random_seed_bytes) {
+       LDKPublicKey our_node_pubkey_ref;
+       CHECK(our_node_pubkey->arr_len == 33);
+       memcpy(our_node_pubkey_ref.compressed_form, our_node_pubkey->elems, 33); FREE(our_node_pubkey);
+       LDKCVec_PublicKeyZ hops_constr;
+       hops_constr.datalen = hops->arr_len;
+       if (hops_constr.datalen > 0)
+               hops_constr.data = MALLOC(hops_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
+       else
+               hops_constr.data = NULL;
+       int8_tArray* hops_vals = (void*) hops->elems;
+       for (size_t i = 0; i < hops_constr.datalen; i++) {
+               int8_tArray hops_conv_8 = hops_vals[i];
+               LDKPublicKey hops_conv_8_ref;
+               CHECK(hops_conv_8->arr_len == 33);
+               memcpy(hops_conv_8_ref.compressed_form, hops_conv_8->elems, 33); FREE(hops_conv_8);
+               hops_constr.data[i] = hops_conv_8_ref;
+       }
+       FREE(hops);
+       LDKRouteParameters route_params_conv;
+       route_params_conv.inner = untag_ptr(route_params);
+       route_params_conv.is_owned = ptr_is_owned(route_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_conv);
+       route_params_conv.is_owned = false;
+       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* 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);
+       }
+       uint8_t random_seed_bytes_arr[32];
+       CHECK(random_seed_bytes->arr_len == 32);
+       memcpy(random_seed_bytes_arr, random_seed_bytes->elems, 32); FREE(random_seed_bytes);
+       uint8_t (*random_seed_bytes_ref)[32] = &random_seed_bytes_arr;
+       LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
+       *ret_conv = build_route_from_hops(our_node_pubkey_ref, hops_constr, &route_params_conv, &network_graph_conv, logger_conv, random_seed_bytes_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ScoreLookUp_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);
+       LDKScoreLookUp this_ptr_conv = *(LDKScoreLookUp*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       ScoreLookUp_free(this_ptr_conv);
+}
+
+void  CS_LDK_ScoreUpdate_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);
+       LDKScoreUpdate this_ptr_conv = *(LDKScoreUpdate*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       ScoreUpdate_free(this_ptr_conv);
+}
+
+void  CS_LDK_Score_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);
+       LDKScore this_ptr_conv = *(LDKScore*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Score_free(this_ptr_conv);
+}
+
+void  CS_LDK_LockableScore_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);
+       LDKLockableScore this_ptr_conv = *(LDKLockableScore*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       LockableScore_free(this_ptr_conv);
+}
+
+void  CS_LDK_WriteableScore_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);
+       LDKWriteableScore this_ptr_conv = *(LDKWriteableScore*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       WriteableScore_free(this_ptr_conv);
+}
+
+void  CS_LDK_MultiThreadedLockableScore_free(int64_t this_obj) {
+       LDKMultiThreadedLockableScore 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);
+       MultiThreadedLockableScore_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_MultiThreadedLockableScore_as_LockableScore(int64_t this_arg) {
+       LDKMultiThreadedLockableScore 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;
+       LDKLockableScore* ret_ret = MALLOC(sizeof(LDKLockableScore), "LDKLockableScore");
+       *ret_ret = MultiThreadedLockableScore_as_LockableScore(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int8_tArray  CS_LDK_MultiThreadedLockableScore_write(int64_t obj) {
+       LDKMultiThreadedLockableScore 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 = MultiThreadedLockableScore_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_MultiThreadedLockableScore_as_WriteableScore(int64_t this_arg) {
+       LDKMultiThreadedLockableScore 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;
+       LDKWriteableScore* ret_ret = MALLOC(sizeof(LDKWriteableScore), "LDKWriteableScore");
+       *ret_ret = MultiThreadedLockableScore_as_WriteableScore(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_MultiThreadedLockableScore_new(int64_t score) {
+       void* score_ptr = untag_ptr(score);
+       CHECK_ACCESS(score_ptr);
+       LDKScore score_conv = *(LDKScore*)(score_ptr);
+       if (score_conv.free == LDKScore_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKScore_JCalls_cloned(&score_conv);
+       }
+       LDKMultiThreadedLockableScore ret_var = MultiThreadedLockableScore_new(score_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_MultiThreadedScoreLockRead_free(int64_t this_obj) {
+       LDKMultiThreadedScoreLockRead 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);
+       MultiThreadedScoreLockRead_free(this_obj_conv);
+}
+
+void  CS_LDK_MultiThreadedScoreLockWrite_free(int64_t this_obj) {
+       LDKMultiThreadedScoreLockWrite 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);
+       MultiThreadedScoreLockWrite_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_MultiThreadedScoreLockRead_as_ScoreLookUp(int64_t this_arg) {
+       LDKMultiThreadedScoreLockRead 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;
+       LDKScoreLookUp* ret_ret = MALLOC(sizeof(LDKScoreLookUp), "LDKScoreLookUp");
+       *ret_ret = MultiThreadedScoreLockRead_as_ScoreLookUp(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int8_tArray  CS_LDK_MultiThreadedScoreLockWrite_write(int64_t obj) {
+       LDKMultiThreadedScoreLockWrite 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 = MultiThreadedScoreLockWrite_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_MultiThreadedScoreLockWrite_as_ScoreUpdate(int64_t this_arg) {
+       LDKMultiThreadedScoreLockWrite 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;
+       LDKScoreUpdate* ret_ret = MALLOC(sizeof(LDKScoreUpdate), "LDKScoreUpdate");
+       *ret_ret = MultiThreadedScoreLockWrite_as_ScoreUpdate(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_ChannelUsage_free(int64_t this_obj) {
+       LDKChannelUsage 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);
+       ChannelUsage_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChannelUsage_get_amount_msat(int64_t this_ptr) {
+       LDKChannelUsage 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 = ChannelUsage_get_amount_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelUsage_set_amount_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelUsage 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;
+       ChannelUsage_set_amount_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelUsage_get_inflight_htlc_msat(int64_t this_ptr) {
+       LDKChannelUsage 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 = ChannelUsage_get_inflight_htlc_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelUsage_set_inflight_htlc_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelUsage 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;
+       ChannelUsage_set_inflight_htlc_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelUsage_get_effective_capacity(int64_t this_ptr) {
+       LDKChannelUsage 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;
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = ChannelUsage_get_effective_capacity(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelUsage_set_effective_capacity(int64_t this_ptr, int64_t val) {
+       LDKChannelUsage 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);
+       LDKEffectiveCapacity val_conv = *(LDKEffectiveCapacity*)(val_ptr);
+       val_conv = EffectiveCapacity_clone((LDKEffectiveCapacity*)untag_ptr(val));
+       ChannelUsage_set_effective_capacity(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelUsage_new(int64_t amount_msat_arg, int64_t inflight_htlc_msat_arg, int64_t effective_capacity_arg) {
+       void* effective_capacity_arg_ptr = untag_ptr(effective_capacity_arg);
+       CHECK_ACCESS(effective_capacity_arg_ptr);
+       LDKEffectiveCapacity effective_capacity_arg_conv = *(LDKEffectiveCapacity*)(effective_capacity_arg_ptr);
+       effective_capacity_arg_conv = EffectiveCapacity_clone((LDKEffectiveCapacity*)untag_ptr(effective_capacity_arg));
+       LDKChannelUsage ret_var = ChannelUsage_new(amount_msat_arg, inflight_htlc_msat_arg, effective_capacity_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 ChannelUsage_clone_ptr(LDKChannelUsage *NONNULL_PTR arg) {
+       LDKChannelUsage ret_var = ChannelUsage_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_ChannelUsage_clone_ptr(int64_t arg) {
+       LDKChannelUsage 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 = ChannelUsage_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelUsage_clone(int64_t orig) {
+       LDKChannelUsage 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;
+       LDKChannelUsage ret_var = ChannelUsage_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_FixedPenaltyScorer_free(int64_t this_obj) {
+       LDKFixedPenaltyScorer 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);
+       FixedPenaltyScorer_free(this_obj_conv);
+}
+
+static inline uint64_t FixedPenaltyScorer_clone_ptr(LDKFixedPenaltyScorer *NONNULL_PTR arg) {
+       LDKFixedPenaltyScorer ret_var = FixedPenaltyScorer_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_FixedPenaltyScorer_clone_ptr(int64_t arg) {
+       LDKFixedPenaltyScorer 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 = FixedPenaltyScorer_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_FixedPenaltyScorer_clone(int64_t orig) {
+       LDKFixedPenaltyScorer 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;
+       LDKFixedPenaltyScorer ret_var = FixedPenaltyScorer_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_FixedPenaltyScorer_with_penalty(int64_t penalty_msat) {
+       LDKFixedPenaltyScorer ret_var = FixedPenaltyScorer_with_penalty(penalty_msat);
+       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_FixedPenaltyScorer_as_ScoreLookUp(int64_t this_arg) {
+       LDKFixedPenaltyScorer 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;
+       LDKScoreLookUp* ret_ret = MALLOC(sizeof(LDKScoreLookUp), "LDKScoreLookUp");
+       *ret_ret = FixedPenaltyScorer_as_ScoreLookUp(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_FixedPenaltyScorer_as_ScoreUpdate(int64_t this_arg) {
+       LDKFixedPenaltyScorer 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;
+       LDKScoreUpdate* ret_ret = MALLOC(sizeof(LDKScoreUpdate), "LDKScoreUpdate");
+       *ret_ret = FixedPenaltyScorer_as_ScoreUpdate(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int8_tArray  CS_LDK_FixedPenaltyScorer_write(int64_t obj) {
+       LDKFixedPenaltyScorer 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 = FixedPenaltyScorer_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_FixedPenaltyScorer_read(int8_tArray ser, int64_t arg) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FixedPenaltyScorerDecodeErrorZ), "LDKCResult_FixedPenaltyScorerDecodeErrorZ");
+       *ret_conv = FixedPenaltyScorer_read(ser_ref, arg);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ProbabilisticScorer_free(int64_t this_obj) {
+       LDKProbabilisticScorer 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);
+       ProbabilisticScorer_free(this_obj_conv);
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_free(int64_t this_obj) {
+       LDKProbabilisticScoringFeeParameters 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);
+       ProbabilisticScoringFeeParameters_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_get_base_penalty_msat(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_get_base_penalty_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_base_penalty_msat(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_base_penalty_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_get_base_penalty_amount_multiplier_msat(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_get_base_penalty_amount_multiplier_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_base_penalty_amount_multiplier_msat(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_base_penalty_amount_multiplier_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_get_liquidity_penalty_multiplier_msat(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_get_liquidity_penalty_multiplier_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_liquidity_penalty_multiplier_msat(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_liquidity_penalty_multiplier_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_get_liquidity_penalty_amount_multiplier_msat(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_get_liquidity_penalty_amount_multiplier_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_liquidity_penalty_amount_multiplier_msat(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_liquidity_penalty_amount_multiplier_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_get_historical_liquidity_penalty_multiplier_msat(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_get_historical_liquidity_penalty_multiplier_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_historical_liquidity_penalty_multiplier_msat(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_historical_liquidity_penalty_multiplier_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_get_historical_liquidity_penalty_amount_multiplier_msat(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_get_historical_liquidity_penalty_amount_multiplier_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_historical_liquidity_penalty_amount_multiplier_msat(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_historical_liquidity_penalty_amount_multiplier_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_get_anti_probing_penalty_msat(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_get_anti_probing_penalty_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_anti_probing_penalty_msat(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_anti_probing_penalty_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_get_considered_impossible_penalty_msat(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_get_considered_impossible_penalty_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_considered_impossible_penalty_msat(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_considered_impossible_penalty_msat(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ProbabilisticScoringFeeParameters_get_linear_success_probability(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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;
+       jboolean ret_conv = ProbabilisticScoringFeeParameters_get_linear_success_probability(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_linear_success_probability(int64_t this_ptr, jboolean val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_linear_success_probability(&this_ptr_conv, val);
+}
+
+static inline uint64_t ProbabilisticScoringFeeParameters_clone_ptr(LDKProbabilisticScoringFeeParameters *NONNULL_PTR arg) {
+       LDKProbabilisticScoringFeeParameters ret_var = ProbabilisticScoringFeeParameters_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_ProbabilisticScoringFeeParameters_clone_ptr(int64_t arg) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_clone(int64_t orig) {
+       LDKProbabilisticScoringFeeParameters 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;
+       LDKProbabilisticScoringFeeParameters ret_var = ProbabilisticScoringFeeParameters_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_ProbabilisticScoringFeeParameters_default() {
+       LDKProbabilisticScoringFeeParameters ret_var = ProbabilisticScoringFeeParameters_default();
+       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_ProbabilisticScoringFeeParameters_add_banned(int64_t this_arg, int64_t node_id) {
+       LDKProbabilisticScoringFeeParameters 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;
+       LDKNodeId node_id_conv;
+       node_id_conv.inner = untag_ptr(node_id);
+       node_id_conv.is_owned = ptr_is_owned(node_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_id_conv);
+       node_id_conv.is_owned = false;
+       ProbabilisticScoringFeeParameters_add_banned(&this_arg_conv, &node_id_conv);
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_add_banned_from_list(int64_t this_arg, int64_tArray node_ids) {
+       LDKProbabilisticScoringFeeParameters 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;
+       LDKCVec_NodeIdZ node_ids_constr;
+       node_ids_constr.datalen = node_ids->arr_len;
+       if (node_ids_constr.datalen > 0)
+               node_ids_constr.data = MALLOC(node_ids_constr.datalen * sizeof(LDKNodeId), "LDKCVec_NodeIdZ Elements");
+       else
+               node_ids_constr.data = NULL;
+       int64_t* node_ids_vals = node_ids->elems;
+       for (size_t i = 0; i < node_ids_constr.datalen; i++) {
+               int64_t node_ids_conv_8 = node_ids_vals[i];
+               LDKNodeId node_ids_conv_8_conv;
+               node_ids_conv_8_conv.inner = untag_ptr(node_ids_conv_8);
+               node_ids_conv_8_conv.is_owned = ptr_is_owned(node_ids_conv_8);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(node_ids_conv_8_conv);
+               node_ids_conv_8_conv = NodeId_clone(&node_ids_conv_8_conv);
+               node_ids_constr.data[i] = node_ids_conv_8_conv;
+       }
+       FREE(node_ids);
+       ProbabilisticScoringFeeParameters_add_banned_from_list(&this_arg_conv, node_ids_constr);
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_remove_banned(int64_t this_arg, int64_t node_id) {
+       LDKProbabilisticScoringFeeParameters 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;
+       LDKNodeId node_id_conv;
+       node_id_conv.inner = untag_ptr(node_id);
+       node_id_conv.is_owned = ptr_is_owned(node_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_id_conv);
+       node_id_conv.is_owned = false;
+       ProbabilisticScoringFeeParameters_remove_banned(&this_arg_conv, &node_id_conv);
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_manual_penalty(int64_t this_arg, int64_t node_id, int64_t penalty) {
+       LDKProbabilisticScoringFeeParameters 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;
+       LDKNodeId node_id_conv;
+       node_id_conv.inner = untag_ptr(node_id);
+       node_id_conv.is_owned = ptr_is_owned(node_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_id_conv);
+       node_id_conv.is_owned = false;
+       ProbabilisticScoringFeeParameters_set_manual_penalty(&this_arg_conv, &node_id_conv, penalty);
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_remove_manual_penalty(int64_t this_arg, int64_t node_id) {
+       LDKProbabilisticScoringFeeParameters 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;
+       LDKNodeId node_id_conv;
+       node_id_conv.inner = untag_ptr(node_id);
+       node_id_conv.is_owned = ptr_is_owned(node_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_id_conv);
+       node_id_conv.is_owned = false;
+       ProbabilisticScoringFeeParameters_remove_manual_penalty(&this_arg_conv, &node_id_conv);
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_clear_manual_penalties(int64_t this_arg) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_clear_manual_penalties(&this_arg_conv);
+}
+
+void  CS_LDK_ProbabilisticScoringDecayParameters_free(int64_t this_obj) {
+       LDKProbabilisticScoringDecayParameters 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);
+       ProbabilisticScoringDecayParameters_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringDecayParameters_get_historical_no_updates_half_life(int64_t this_ptr) {
+       LDKProbabilisticScoringDecayParameters 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 = ProbabilisticScoringDecayParameters_get_historical_no_updates_half_life(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringDecayParameters_set_historical_no_updates_half_life(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringDecayParameters 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;
+       ProbabilisticScoringDecayParameters_set_historical_no_updates_half_life(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringDecayParameters_get_liquidity_offset_half_life(int64_t this_ptr) {
+       LDKProbabilisticScoringDecayParameters 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 = ProbabilisticScoringDecayParameters_get_liquidity_offset_half_life(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringDecayParameters_set_liquidity_offset_half_life(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringDecayParameters 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;
+       ProbabilisticScoringDecayParameters_set_liquidity_offset_half_life(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringDecayParameters_new(int64_t historical_no_updates_half_life_arg, int64_t liquidity_offset_half_life_arg) {
+       LDKProbabilisticScoringDecayParameters ret_var = ProbabilisticScoringDecayParameters_new(historical_no_updates_half_life_arg, liquidity_offset_half_life_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 ProbabilisticScoringDecayParameters_clone_ptr(LDKProbabilisticScoringDecayParameters *NONNULL_PTR arg) {
+       LDKProbabilisticScoringDecayParameters ret_var = ProbabilisticScoringDecayParameters_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_ProbabilisticScoringDecayParameters_clone_ptr(int64_t arg) {
+       LDKProbabilisticScoringDecayParameters 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 = ProbabilisticScoringDecayParameters_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ProbabilisticScoringDecayParameters_clone(int64_t orig) {
+       LDKProbabilisticScoringDecayParameters 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;
+       LDKProbabilisticScoringDecayParameters ret_var = ProbabilisticScoringDecayParameters_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_ProbabilisticScoringDecayParameters_default() {
+       LDKProbabilisticScoringDecayParameters ret_var = ProbabilisticScoringDecayParameters_default();
+       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_ProbabilisticScorer_new(int64_t decay_params, int64_t network_graph, int64_t logger) {
+       LDKProbabilisticScoringDecayParameters decay_params_conv;
+       decay_params_conv.inner = untag_ptr(decay_params);
+       decay_params_conv.is_owned = ptr_is_owned(decay_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(decay_params_conv);
+       decay_params_conv = ProbabilisticScoringDecayParameters_clone(&decay_params_conv);
+       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* 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);
+       }
+       LDKProbabilisticScorer ret_var = ProbabilisticScorer_new(decay_params_conv, &network_graph_conv, logger_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_ProbabilisticScorer_debug_log_liquidity_stats(int64_t this_arg) {
+       LDKProbabilisticScorer 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;
+       ProbabilisticScorer_debug_log_liquidity_stats(&this_arg_conv);
+}
+
+int64_t  CS_LDK_ProbabilisticScorer_estimated_channel_liquidity_range(int64_t this_arg, int64_t scid, int64_t target) {
+       LDKProbabilisticScorer 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;
+       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;
+       LDKCOption_C2Tuple_u64u64ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u64ZZ), "LDKCOption_C2Tuple_u64u64ZZ");
+       *ret_copy = ProbabilisticScorer_estimated_channel_liquidity_range(&this_arg_conv, scid, &target_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ProbabilisticScorer_historical_estimated_channel_liquidity_probabilities(int64_t this_arg, int64_t scid, int64_t target) {
+       LDKProbabilisticScorer 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;
+       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;
+       LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ), "LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ");
+       *ret_copy = ProbabilisticScorer_historical_estimated_channel_liquidity_probabilities(&this_arg_conv, scid, &target_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ProbabilisticScorer_historical_estimated_payment_success_probability(int64_t this_arg, int64_t scid, int64_t target, int64_t amount_msat, int64_t params) {
+       LDKProbabilisticScorer 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;
+       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;
+       LDKProbabilisticScoringFeeParameters params_conv;
+       params_conv.inner = untag_ptr(params);
+       params_conv.is_owned = ptr_is_owned(params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(params_conv);
+       params_conv.is_owned = false;
+       LDKCOption_f64Z *ret_copy = MALLOC(sizeof(LDKCOption_f64Z), "LDKCOption_f64Z");
+       *ret_copy = ProbabilisticScorer_historical_estimated_payment_success_probability(&this_arg_conv, scid, &target_conv, amount_msat, &params_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ProbabilisticScorer_as_ScoreLookUp(int64_t this_arg) {
+       LDKProbabilisticScorer 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;
+       LDKScoreLookUp* ret_ret = MALLOC(sizeof(LDKScoreLookUp), "LDKScoreLookUp");
+       *ret_ret = ProbabilisticScorer_as_ScoreLookUp(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ProbabilisticScorer_as_ScoreUpdate(int64_t this_arg) {
+       LDKProbabilisticScorer 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;
+       LDKScoreUpdate* ret_ret = MALLOC(sizeof(LDKScoreUpdate), "LDKScoreUpdate");
+       *ret_ret = ProbabilisticScorer_as_ScoreUpdate(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ProbabilisticScorer_as_Score(int64_t this_arg) {
+       LDKProbabilisticScorer 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;
+       LDKScore* ret_ret = MALLOC(sizeof(LDKScore), "LDKScore");
+       *ret_ret = ProbabilisticScorer_as_Score(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int8_tArray  CS_LDK_ProbabilisticScorer_write(int64_t obj) {
+       LDKProbabilisticScorer 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 = ProbabilisticScorer_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_ProbabilisticScorer_read(int8_tArray ser, int64_t arg_a, int64_t arg_b, int64_t arg_c) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKProbabilisticScoringDecayParameters arg_a_conv;
+       arg_a_conv.inner = untag_ptr(arg_a);
+       arg_a_conv.is_owned = ptr_is_owned(arg_a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_a_conv);
+       arg_a_conv = ProbabilisticScoringDecayParameters_clone(&arg_a_conv);
+       LDKNetworkGraph arg_b_conv;
+       arg_b_conv.inner = untag_ptr(arg_b);
+       arg_b_conv.is_owned = ptr_is_owned(arg_b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_b_conv);
+       arg_b_conv.is_owned = false;
+       void* arg_c_ptr = untag_ptr(arg_c);
+       CHECK_ACCESS(arg_c_ptr);
+       LDKLogger arg_c_conv = *(LDKLogger*)(arg_c_ptr);
+       if (arg_c_conv.free == LDKLogger_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKLogger_JCalls_cloned(&arg_c_conv);
+       }
+       LDKCResult_ProbabilisticScorerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ProbabilisticScorerDecodeErrorZ), "LDKCResult_ProbabilisticScorerDecodeErrorZ");
+       *ret_conv = ProbabilisticScorer_read(ser_ref, arg_a_conv, &arg_b_conv, arg_c_conv);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_DelayedPaymentOutputDescriptor_free(int64_t this_obj) {
+       LDKDelayedPaymentOutputDescriptor 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);
+       DelayedPaymentOutputDescriptor_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_DelayedPaymentOutputDescriptor_get_outpoint(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;
+       LDKOutPoint ret_var = DelayedPaymentOutputDescriptor_get_outpoint(&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_outpoint(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;
+       LDKOutPoint 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 = OutPoint_clone(&val_conv);
+       DelayedPaymentOutputDescriptor_set_outpoint(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_DelayedPaymentOutputDescriptor_get_per_commitment_point(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_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_DelayedPaymentOutputDescriptor_set_per_commitment_point(int64_t this_ptr, int8_tArray 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_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int16_t  CS_LDK_DelayedPaymentOutputDescriptor_get_to_self_delay(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;
+       int16_t ret_conv = DelayedPaymentOutputDescriptor_get_to_self_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_DelayedPaymentOutputDescriptor_set_to_self_delay(int64_t this_ptr, int16_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;
+       DelayedPaymentOutputDescriptor_set_to_self_delay(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_DelayedPaymentOutputDescriptor_get_output(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;
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = DelayedPaymentOutputDescriptor_get_output(&this_ptr_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+void  CS_LDK_DelayedPaymentOutputDescriptor_set_output(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;
+       void* val_ptr = untag_ptr(val);
+       CHECK_ACCESS(val_ptr);
+       LDKTxOut val_conv = *(LDKTxOut*)(val_ptr);
+       val_conv = TxOut_clone((LDKTxOut*)untag_ptr(val));
+       DelayedPaymentOutputDescriptor_set_output(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  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;
+}
+
+void  CS_LDK_DelayedPaymentOutputDescriptor_set_revocation_pubkey(int64_t this_ptr, int8_tArray 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);
+}
+
+int8_tArray  CS_LDK_DelayedPaymentOutputDescriptor_get_channel_keys_id(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(32, __LINE__);
+       memcpy(ret_arr->elems, *DelayedPaymentOutputDescriptor_get_channel_keys_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_DelayedPaymentOutputDescriptor_set_channel_keys_id(int64_t this_ptr, int8_tArray 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;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       DelayedPaymentOutputDescriptor_set_channel_keys_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_DelayedPaymentOutputDescriptor_get_channel_value_satoshis(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;
+       int64_t ret_conv = DelayedPaymentOutputDescriptor_get_channel_value_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_DelayedPaymentOutputDescriptor_set_channel_value_satoshis(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;
+       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) {
+       LDKOutPoint outpoint_arg_conv;
+       outpoint_arg_conv.inner = untag_ptr(outpoint_arg);
+       outpoint_arg_conv.is_owned = ptr_is_owned(outpoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_arg_conv);
+       outpoint_arg_conv = OutPoint_clone(&outpoint_arg_conv);
+       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);
+       void* output_arg_ptr = untag_ptr(output_arg);
+       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);
+       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);
+       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 DelayedPaymentOutputDescriptor_clone_ptr(LDKDelayedPaymentOutputDescriptor *NONNULL_PTR arg) {
+       LDKDelayedPaymentOutputDescriptor ret_var = DelayedPaymentOutputDescriptor_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_DelayedPaymentOutputDescriptor_clone_ptr(int64_t arg) {
+       LDKDelayedPaymentOutputDescriptor 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 = DelayedPaymentOutputDescriptor_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_DelayedPaymentOutputDescriptor_clone(int64_t orig) {
+       LDKDelayedPaymentOutputDescriptor 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;
+       LDKDelayedPaymentOutputDescriptor ret_var = DelayedPaymentOutputDescriptor_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_DelayedPaymentOutputDescriptor_hash(int64_t o) {
+       LDKDelayedPaymentOutputDescriptor 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 = DelayedPaymentOutputDescriptor_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_DelayedPaymentOutputDescriptor_eq(int64_t a, int64_t b) {
+       LDKDelayedPaymentOutputDescriptor 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;
+       LDKDelayedPaymentOutputDescriptor 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 = DelayedPaymentOutputDescriptor_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_DelayedPaymentOutputDescriptor_write(int64_t obj) {
+       LDKDelayedPaymentOutputDescriptor 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 = DelayedPaymentOutputDescriptor_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_DelayedPaymentOutputDescriptor_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = DelayedPaymentOutputDescriptor_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_StaticPaymentOutputDescriptor_free(int64_t this_obj) {
+       LDKStaticPaymentOutputDescriptor 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);
+       StaticPaymentOutputDescriptor_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_StaticPaymentOutputDescriptor_get_outpoint(int64_t this_ptr) {
+       LDKStaticPaymentOutputDescriptor 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;
+       LDKOutPoint ret_var = StaticPaymentOutputDescriptor_get_outpoint(&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_StaticPaymentOutputDescriptor_set_outpoint(int64_t this_ptr, int64_t val) {
+       LDKStaticPaymentOutputDescriptor 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;
+       LDKOutPoint 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 = OutPoint_clone(&val_conv);
+       StaticPaymentOutputDescriptor_set_outpoint(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_StaticPaymentOutputDescriptor_get_output(int64_t this_ptr) {
+       LDKStaticPaymentOutputDescriptor 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;
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = StaticPaymentOutputDescriptor_get_output(&this_ptr_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+void  CS_LDK_StaticPaymentOutputDescriptor_set_output(int64_t this_ptr, int64_t val) {
+       LDKStaticPaymentOutputDescriptor 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);
+       LDKTxOut val_conv = *(LDKTxOut*)(val_ptr);
+       val_conv = TxOut_clone((LDKTxOut*)untag_ptr(val));
+       StaticPaymentOutputDescriptor_set_output(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_StaticPaymentOutputDescriptor_get_channel_keys_id(int64_t this_ptr) {
+       LDKStaticPaymentOutputDescriptor 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, *StaticPaymentOutputDescriptor_get_channel_keys_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_StaticPaymentOutputDescriptor_set_channel_keys_id(int64_t this_ptr, int8_tArray val) {
+       LDKStaticPaymentOutputDescriptor 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);
+       StaticPaymentOutputDescriptor_set_channel_keys_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_StaticPaymentOutputDescriptor_get_channel_value_satoshis(int64_t this_ptr) {
+       LDKStaticPaymentOutputDescriptor 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 = StaticPaymentOutputDescriptor_get_channel_value_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_StaticPaymentOutputDescriptor_set_channel_value_satoshis(int64_t this_ptr, int64_t val) {
+       LDKStaticPaymentOutputDescriptor 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;
+       StaticPaymentOutputDescriptor_set_channel_value_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_StaticPaymentOutputDescriptor_get_channel_transaction_parameters(int64_t this_ptr) {
+       LDKStaticPaymentOutputDescriptor 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;
+       LDKChannelTransactionParameters ret_var = StaticPaymentOutputDescriptor_get_channel_transaction_parameters(&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_StaticPaymentOutputDescriptor_set_channel_transaction_parameters(int64_t this_ptr, int64_t val) {
+       LDKStaticPaymentOutputDescriptor 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;
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_clone(&val_conv);
+       StaticPaymentOutputDescriptor_set_channel_transaction_parameters(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_StaticPaymentOutputDescriptor_new(int64_t outpoint_arg, int64_t output_arg, int8_tArray channel_keys_id_arg, int64_t channel_value_satoshis_arg, int64_t channel_transaction_parameters_arg) {
+       LDKOutPoint outpoint_arg_conv;
+       outpoint_arg_conv.inner = untag_ptr(outpoint_arg);
+       outpoint_arg_conv.is_owned = ptr_is_owned(outpoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_arg_conv);
+       outpoint_arg_conv = OutPoint_clone(&outpoint_arg_conv);
+       void* output_arg_ptr = untag_ptr(output_arg);
+       CHECK_ACCESS(output_arg_ptr);
+       LDKTxOut output_arg_conv = *(LDKTxOut*)(output_arg_ptr);
+       output_arg_conv = TxOut_clone((LDKTxOut*)untag_ptr(output_arg));
+       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);
+       LDKChannelTransactionParameters channel_transaction_parameters_arg_conv;
+       channel_transaction_parameters_arg_conv.inner = untag_ptr(channel_transaction_parameters_arg);
+       channel_transaction_parameters_arg_conv.is_owned = ptr_is_owned(channel_transaction_parameters_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_transaction_parameters_arg_conv);
+       channel_transaction_parameters_arg_conv = ChannelTransactionParameters_clone(&channel_transaction_parameters_arg_conv);
+       LDKStaticPaymentOutputDescriptor ret_var = StaticPaymentOutputDescriptor_new(outpoint_arg_conv, output_arg_conv, channel_keys_id_arg_ref, channel_value_satoshis_arg, channel_transaction_parameters_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 StaticPaymentOutputDescriptor_clone_ptr(LDKStaticPaymentOutputDescriptor *NONNULL_PTR arg) {
+       LDKStaticPaymentOutputDescriptor ret_var = StaticPaymentOutputDescriptor_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_StaticPaymentOutputDescriptor_clone_ptr(int64_t arg) {
+       LDKStaticPaymentOutputDescriptor 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 = StaticPaymentOutputDescriptor_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_StaticPaymentOutputDescriptor_clone(int64_t orig) {
+       LDKStaticPaymentOutputDescriptor 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;
+       LDKStaticPaymentOutputDescriptor ret_var = StaticPaymentOutputDescriptor_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_StaticPaymentOutputDescriptor_hash(int64_t o) {
+       LDKStaticPaymentOutputDescriptor 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 = StaticPaymentOutputDescriptor_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_StaticPaymentOutputDescriptor_eq(int64_t a, int64_t b) {
+       LDKStaticPaymentOutputDescriptor 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;
+       LDKStaticPaymentOutputDescriptor 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 = StaticPaymentOutputDescriptor_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_StaticPaymentOutputDescriptor_witness_script(int64_t this_arg) {
+       LDKStaticPaymentOutputDescriptor 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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = StaticPaymentOutputDescriptor_witness_script(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_StaticPaymentOutputDescriptor_max_witness_length(int64_t this_arg) {
+       LDKStaticPaymentOutputDescriptor 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 = StaticPaymentOutputDescriptor_max_witness_length(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_StaticPaymentOutputDescriptor_write(int64_t obj) {
+       LDKStaticPaymentOutputDescriptor 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 = StaticPaymentOutputDescriptor_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_StaticPaymentOutputDescriptor_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = StaticPaymentOutputDescriptor_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_SpendableOutputDescriptor_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);
+       LDKSpendableOutputDescriptor this_ptr_conv = *(LDKSpendableOutputDescriptor*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       SpendableOutputDescriptor_free(this_ptr_conv);
+}
+
+static inline uint64_t SpendableOutputDescriptor_clone_ptr(LDKSpendableOutputDescriptor *NONNULL_PTR arg) {
+       LDKSpendableOutputDescriptor *ret_copy = MALLOC(sizeof(LDKSpendableOutputDescriptor), "LDKSpendableOutputDescriptor");
+       *ret_copy = SpendableOutputDescriptor_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_SpendableOutputDescriptor_clone_ptr(int64_t arg) {
+       LDKSpendableOutputDescriptor* arg_conv = (LDKSpendableOutputDescriptor*)untag_ptr(arg);
+       int64_t ret_conv = SpendableOutputDescriptor_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SpendableOutputDescriptor_clone(int64_t orig) {
+       LDKSpendableOutputDescriptor* orig_conv = (LDKSpendableOutputDescriptor*)untag_ptr(orig);
+       LDKSpendableOutputDescriptor *ret_copy = MALLOC(sizeof(LDKSpendableOutputDescriptor), "LDKSpendableOutputDescriptor");
+       *ret_copy = SpendableOutputDescriptor_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SpendableOutputDescriptor_static_output(int64_t outpoint, int64_t output) {
+       LDKOutPoint outpoint_conv;
+       outpoint_conv.inner = untag_ptr(outpoint);
+       outpoint_conv.is_owned = ptr_is_owned(outpoint);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_conv);
+       outpoint_conv = OutPoint_clone(&outpoint_conv);
+       void* output_ptr = untag_ptr(output);
+       CHECK_ACCESS(output_ptr);
+       LDKTxOut output_conv = *(LDKTxOut*)(output_ptr);
+       output_conv = TxOut_clone((LDKTxOut*)untag_ptr(output));
+       LDKSpendableOutputDescriptor *ret_copy = MALLOC(sizeof(LDKSpendableOutputDescriptor), "LDKSpendableOutputDescriptor");
+       *ret_copy = SpendableOutputDescriptor_static_output(outpoint_conv, output_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SpendableOutputDescriptor_delayed_payment_output(int64_t a) {
+       LDKDelayedPaymentOutputDescriptor 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 = DelayedPaymentOutputDescriptor_clone(&a_conv);
+       LDKSpendableOutputDescriptor *ret_copy = MALLOC(sizeof(LDKSpendableOutputDescriptor), "LDKSpendableOutputDescriptor");
+       *ret_copy = SpendableOutputDescriptor_delayed_payment_output(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SpendableOutputDescriptor_static_payment_output(int64_t a) {
+       LDKStaticPaymentOutputDescriptor 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 = StaticPaymentOutputDescriptor_clone(&a_conv);
+       LDKSpendableOutputDescriptor *ret_copy = MALLOC(sizeof(LDKSpendableOutputDescriptor), "LDKSpendableOutputDescriptor");
+       *ret_copy = SpendableOutputDescriptor_static_payment_output(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SpendableOutputDescriptor_hash(int64_t o) {
+       LDKSpendableOutputDescriptor* o_conv = (LDKSpendableOutputDescriptor*)untag_ptr(o);
+       int64_t ret_conv = SpendableOutputDescriptor_hash(o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_SpendableOutputDescriptor_eq(int64_t a, int64_t b) {
+       LDKSpendableOutputDescriptor* a_conv = (LDKSpendableOutputDescriptor*)untag_ptr(a);
+       LDKSpendableOutputDescriptor* b_conv = (LDKSpendableOutputDescriptor*)untag_ptr(b);
+       jboolean ret_conv = SpendableOutputDescriptor_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_SpendableOutputDescriptor_write(int64_t obj) {
+       LDKSpendableOutputDescriptor* obj_conv = (LDKSpendableOutputDescriptor*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = SpendableOutputDescriptor_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_SpendableOutputDescriptor_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpendableOutputDescriptorDecodeErrorZ), "LDKCResult_SpendableOutputDescriptorDecodeErrorZ");
+       *ret_conv = SpendableOutputDescriptor_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_SpendableOutputDescriptor_create_spendable_outputs_psbt(int64_tArray descriptors, int64_tArray outputs, int8_tArray change_destination_script, int32_t feerate_sat_per_1000_weight, int64_t locktime) {
+       LDKCVec_SpendableOutputDescriptorZ descriptors_constr;
+       descriptors_constr.datalen = descriptors->arr_len;
+       if (descriptors_constr.datalen > 0)
+               descriptors_constr.data = MALLOC(descriptors_constr.datalen * sizeof(LDKSpendableOutputDescriptor), "LDKCVec_SpendableOutputDescriptorZ Elements");
+       else
+               descriptors_constr.data = NULL;
+       int64_t* descriptors_vals = descriptors->elems;
+       for (size_t b = 0; b < descriptors_constr.datalen; b++) {
+               int64_t descriptors_conv_27 = descriptors_vals[b];
+               void* descriptors_conv_27_ptr = untag_ptr(descriptors_conv_27);
+               CHECK_ACCESS(descriptors_conv_27_ptr);
+               LDKSpendableOutputDescriptor descriptors_conv_27_conv = *(LDKSpendableOutputDescriptor*)(descriptors_conv_27_ptr);
+               descriptors_conv_27_conv = SpendableOutputDescriptor_clone((LDKSpendableOutputDescriptor*)untag_ptr(descriptors_conv_27));
+               descriptors_constr.data[b] = descriptors_conv_27_conv;
+       }
+       FREE(descriptors);
+       LDKCVec_TxOutZ outputs_constr;
+       outputs_constr.datalen = outputs->arr_len;
+       if (outputs_constr.datalen > 0)
+               outputs_constr.data = MALLOC(outputs_constr.datalen * sizeof(LDKTxOut), "LDKCVec_TxOutZ Elements");
+       else
+               outputs_constr.data = NULL;
+       int64_t* outputs_vals = outputs->elems;
+       for (size_t h = 0; h < outputs_constr.datalen; h++) {
+               int64_t outputs_conv_7 = outputs_vals[h];
+               void* outputs_conv_7_ptr = untag_ptr(outputs_conv_7);
+               CHECK_ACCESS(outputs_conv_7_ptr);
+               LDKTxOut outputs_conv_7_conv = *(LDKTxOut*)(outputs_conv_7_ptr);
+               outputs_conv_7_conv = TxOut_clone((LDKTxOut*)untag_ptr(outputs_conv_7));
+               outputs_constr.data[h] = outputs_conv_7_conv;
+       }
+       FREE(outputs);
+       LDKCVec_u8Z change_destination_script_ref;
+       change_destination_script_ref.datalen = change_destination_script->arr_len;
+       change_destination_script_ref.data = MALLOC(change_destination_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(change_destination_script_ref.data, change_destination_script->elems, change_destination_script_ref.datalen); FREE(change_destination_script);
+       void* locktime_ptr = untag_ptr(locktime);
+       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");
+       *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);
+}
+
+void  CS_LDK_ChannelDerivationParameters_free(int64_t this_obj) {
+       LDKChannelDerivationParameters 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);
+       ChannelDerivationParameters_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChannelDerivationParameters_get_value_satoshis(int64_t this_ptr) {
+       LDKChannelDerivationParameters 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 = ChannelDerivationParameters_get_value_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDerivationParameters_set_value_satoshis(int64_t this_ptr, int64_t val) {
+       LDKChannelDerivationParameters 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;
+       ChannelDerivationParameters_set_value_satoshis(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_ChannelDerivationParameters_get_keys_id(int64_t this_ptr) {
+       LDKChannelDerivationParameters 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, *ChannelDerivationParameters_get_keys_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelDerivationParameters_set_keys_id(int64_t this_ptr, int8_tArray val) {
+       LDKChannelDerivationParameters 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);
+       ChannelDerivationParameters_set_keys_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelDerivationParameters_get_transaction_parameters(int64_t this_ptr) {
+       LDKChannelDerivationParameters 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;
+       LDKChannelTransactionParameters ret_var = ChannelDerivationParameters_get_transaction_parameters(&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_ChannelDerivationParameters_set_transaction_parameters(int64_t this_ptr, int64_t val) {
+       LDKChannelDerivationParameters 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;
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_clone(&val_conv);
+       ChannelDerivationParameters_set_transaction_parameters(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDerivationParameters_new(int64_t value_satoshis_arg, int8_tArray keys_id_arg, int64_t transaction_parameters_arg) {
+       LDKThirtyTwoBytes keys_id_arg_ref;
+       CHECK(keys_id_arg->arr_len == 32);
+       memcpy(keys_id_arg_ref.data, keys_id_arg->elems, 32); FREE(keys_id_arg);
+       LDKChannelTransactionParameters transaction_parameters_arg_conv;
+       transaction_parameters_arg_conv.inner = untag_ptr(transaction_parameters_arg);
+       transaction_parameters_arg_conv.is_owned = ptr_is_owned(transaction_parameters_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(transaction_parameters_arg_conv);
+       transaction_parameters_arg_conv = ChannelTransactionParameters_clone(&transaction_parameters_arg_conv);
+       LDKChannelDerivationParameters ret_var = ChannelDerivationParameters_new(value_satoshis_arg, keys_id_arg_ref, transaction_parameters_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 ChannelDerivationParameters_clone_ptr(LDKChannelDerivationParameters *NONNULL_PTR arg) {
+       LDKChannelDerivationParameters ret_var = ChannelDerivationParameters_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_ChannelDerivationParameters_clone_ptr(int64_t arg) {
+       LDKChannelDerivationParameters 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 = ChannelDerivationParameters_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelDerivationParameters_clone(int64_t orig) {
+       LDKChannelDerivationParameters 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;
+       LDKChannelDerivationParameters ret_var = ChannelDerivationParameters_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_ChannelDerivationParameters_eq(int64_t a, int64_t b) {
+       LDKChannelDerivationParameters 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;
+       LDKChannelDerivationParameters 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 = ChannelDerivationParameters_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_ChannelDerivationParameters_write(int64_t obj) {
+       LDKChannelDerivationParameters 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 = ChannelDerivationParameters_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_ChannelDerivationParameters_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDerivationParametersDecodeErrorZ), "LDKCResult_ChannelDerivationParametersDecodeErrorZ");
+       *ret_conv = ChannelDerivationParameters_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_HTLCDescriptor_free(int64_t this_obj) {
+       LDKHTLCDescriptor 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);
+       HTLCDescriptor_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_HTLCDescriptor_get_channel_derivation_parameters(int64_t this_ptr) {
+       LDKHTLCDescriptor 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;
+       LDKChannelDerivationParameters ret_var = HTLCDescriptor_get_channel_derivation_parameters(&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_HTLCDescriptor_set_channel_derivation_parameters(int64_t this_ptr, int64_t val) {
+       LDKHTLCDescriptor 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;
+       LDKChannelDerivationParameters 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 = ChannelDerivationParameters_clone(&val_conv);
+       HTLCDescriptor_set_channel_derivation_parameters(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_HTLCDescriptor_get_per_commitment_number(int64_t this_ptr) {
+       LDKHTLCDescriptor 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 = HTLCDescriptor_get_per_commitment_number(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_HTLCDescriptor_set_per_commitment_number(int64_t this_ptr, int64_t val) {
+       LDKHTLCDescriptor 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;
+       HTLCDescriptor_set_per_commitment_number(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_HTLCDescriptor_get_per_commitment_point(int64_t this_ptr) {
+       LDKHTLCDescriptor 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, HTLCDescriptor_get_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_HTLCDescriptor_set_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKHTLCDescriptor 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);
+       HTLCDescriptor_set_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_HTLCDescriptor_get_feerate_per_kw(int64_t this_ptr) {
+       LDKHTLCDescriptor 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 = HTLCDescriptor_get_feerate_per_kw(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_HTLCDescriptor_set_feerate_per_kw(int64_t this_ptr, int32_t val) {
+       LDKHTLCDescriptor 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;
+       HTLCDescriptor_set_feerate_per_kw(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_HTLCDescriptor_get_htlc(int64_t this_ptr) {
+       LDKHTLCDescriptor 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;
+       LDKHTLCOutputInCommitment ret_var = HTLCDescriptor_get_htlc(&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_HTLCDescriptor_set_htlc(int64_t this_ptr, int64_t val) {
+       LDKHTLCDescriptor 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;
+       LDKHTLCOutputInCommitment 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 = HTLCOutputInCommitment_clone(&val_conv);
+       HTLCDescriptor_set_htlc(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_HTLCDescriptor_get_preimage(int64_t this_ptr) {
+       LDKHTLCDescriptor 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 = HTLCDescriptor_get_preimage(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_HTLCDescriptor_set_preimage(int64_t this_ptr, int64_t val) {
+       LDKHTLCDescriptor 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));
+       HTLCDescriptor_set_preimage(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_HTLCDescriptor_get_counterparty_sig(int64_t this_ptr) {
+       LDKHTLCDescriptor 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(64, __LINE__);
+       memcpy(ret_arr->elems, HTLCDescriptor_get_counterparty_sig(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_HTLCDescriptor_set_counterparty_sig(int64_t this_ptr, int8_tArray val) {
+       LDKHTLCDescriptor 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       HTLCDescriptor_set_counterparty_sig(&this_ptr_conv, val_ref);
+}
+
+static inline uint64_t HTLCDescriptor_clone_ptr(LDKHTLCDescriptor *NONNULL_PTR arg) {
+       LDKHTLCDescriptor ret_var = HTLCDescriptor_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_HTLCDescriptor_clone_ptr(int64_t arg) {
+       LDKHTLCDescriptor 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 = HTLCDescriptor_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_HTLCDescriptor_clone(int64_t orig) {
+       LDKHTLCDescriptor 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;
+       LDKHTLCDescriptor ret_var = HTLCDescriptor_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_HTLCDescriptor_eq(int64_t a, int64_t b) {
+       LDKHTLCDescriptor 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;
+       LDKHTLCDescriptor 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 = HTLCDescriptor_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_HTLCDescriptor_write(int64_t obj) {
+       LDKHTLCDescriptor 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 = HTLCDescriptor_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_HTLCDescriptor_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_HTLCDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCDescriptorDecodeErrorZ), "LDKCResult_HTLCDescriptorDecodeErrorZ");
+       *ret_conv = HTLCDescriptor_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_HTLCDescriptor_outpoint(int64_t this_arg) {
+       LDKHTLCDescriptor 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;
+       LDKOutPoint ret_var = HTLCDescriptor_outpoint(&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_HTLCDescriptor_previous_utxo(int64_t this_arg) {
+       LDKHTLCDescriptor 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;
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = HTLCDescriptor_previous_utxo(&this_arg_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+int64_t  CS_LDK_HTLCDescriptor_unsigned_tx_input(int64_t this_arg) {
+       LDKHTLCDescriptor 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;
+       LDKTxIn* ret_ref = MALLOC(sizeof(LDKTxIn), "LDKTxIn");
+       *ret_ref = HTLCDescriptor_unsigned_tx_input(&this_arg_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+int64_t  CS_LDK_HTLCDescriptor_tx_output(int64_t this_arg) {
+       LDKHTLCDescriptor 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;
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = HTLCDescriptor_tx_output(&this_arg_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+int8_tArray  CS_LDK_HTLCDescriptor_witness_script(int64_t this_arg) {
+       LDKHTLCDescriptor 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;
+       LDKCVec_u8Z ret_var = HTLCDescriptor_witness_script(&this_arg_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;
+}
+
+int8_tArray  CS_LDK_HTLCDescriptor_tx_input_witness(int64_t this_arg, int8_tArray signature, int8_tArray witness_script) {
+       LDKHTLCDescriptor 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;
+       LDKECDSASignature signature_ref;
+       CHECK(signature->arr_len == 64);
+       memcpy(signature_ref.compact_form, signature->elems, 64); FREE(signature);
+       LDKu8slice witness_script_ref;
+       witness_script_ref.datalen = witness_script->arr_len;
+       witness_script_ref.data = witness_script->elems;
+       LDKWitness ret_var = HTLCDescriptor_tx_input_witness(&this_arg_conv, signature_ref, witness_script_ref);
+       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);
+       FREE(witness_script);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_HTLCDescriptor_derive_channel_signer(int64_t this_arg, int64_t signer_provider) {
+       LDKHTLCDescriptor 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;
+       void* signer_provider_ptr = untag_ptr(signer_provider);
+       if (ptr_is_owned(signer_provider)) { CHECK_ACCESS(signer_provider_ptr); }
+       LDKSignerProvider* signer_provider_conv = (LDKSignerProvider*)signer_provider_ptr;
+       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
+       *ret_ret = HTLCDescriptor_derive_channel_signer(&this_arg_conv, signer_provider_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_ChannelSigner_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);
+       LDKChannelSigner this_ptr_conv = *(LDKChannelSigner*)(this_ptr_ptr);
+       FREE(untag_ptr(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));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Recipient_node() {
+       int32_t ret_conv = LDKRecipient_to_cs(Recipient_node());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Recipient_phantom_node() {
+       int32_t ret_conv = LDKRecipient_to_cs(Recipient_phantom_node());
+       return ret_conv;
+}
+
+void  CS_LDK_EntropySource_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);
+       LDKEntropySource this_ptr_conv = *(LDKEntropySource*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       EntropySource_free(this_ptr_conv);
+}
+
+void  CS_LDK_NodeSigner_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);
+       LDKNodeSigner this_ptr_conv = *(LDKNodeSigner*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       NodeSigner_free(this_ptr_conv);
+}
+
+void  CS_LDK_SignerProvider_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);
+       LDKSignerProvider this_ptr_conv = *(LDKSignerProvider*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       SignerProvider_free(this_ptr_conv);
+}
+
+void  CS_LDK_InMemorySigner_free(int64_t this_obj) {
+       LDKInMemorySigner 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);
+       InMemorySigner_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_InMemorySigner_get_funding_key(int64_t this_ptr) {
+       LDKInMemorySigner 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, *InMemorySigner_get_funding_key(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_InMemorySigner_set_funding_key(int64_t this_ptr, int8_tArray val) {
+       LDKInMemorySigner 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;
+       LDKSecretKey val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.bytes, val->elems, 32); FREE(val);
+       InMemorySigner_set_funding_key(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_InMemorySigner_get_revocation_base_key(int64_t this_ptr) {
+       LDKInMemorySigner 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, *InMemorySigner_get_revocation_base_key(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_InMemorySigner_set_revocation_base_key(int64_t this_ptr, int8_tArray val) {
+       LDKInMemorySigner 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;
+       LDKSecretKey val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.bytes, val->elems, 32); FREE(val);
+       InMemorySigner_set_revocation_base_key(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_InMemorySigner_get_payment_key(int64_t this_ptr) {
+       LDKInMemorySigner 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, *InMemorySigner_get_payment_key(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_InMemorySigner_set_payment_key(int64_t this_ptr, int8_tArray val) {
+       LDKInMemorySigner 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;
+       LDKSecretKey val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.bytes, val->elems, 32); FREE(val);
+       InMemorySigner_set_payment_key(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_InMemorySigner_get_delayed_payment_base_key(int64_t this_ptr) {
+       LDKInMemorySigner 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, *InMemorySigner_get_delayed_payment_base_key(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_InMemorySigner_set_delayed_payment_base_key(int64_t this_ptr, int8_tArray val) {
+       LDKInMemorySigner 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;
+       LDKSecretKey val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.bytes, val->elems, 32); FREE(val);
+       InMemorySigner_set_delayed_payment_base_key(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_InMemorySigner_get_htlc_base_key(int64_t this_ptr) {
+       LDKInMemorySigner 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, *InMemorySigner_get_htlc_base_key(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_InMemorySigner_set_htlc_base_key(int64_t this_ptr, int8_tArray val) {
+       LDKInMemorySigner 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;
+       LDKSecretKey val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.bytes, val->elems, 32); FREE(val);
+       InMemorySigner_set_htlc_base_key(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_InMemorySigner_get_commitment_seed(int64_t this_ptr) {
+       LDKInMemorySigner 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, *InMemorySigner_get_commitment_seed(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_InMemorySigner_set_commitment_seed(int64_t this_ptr, int8_tArray val) {
+       LDKInMemorySigner 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);
+       InMemorySigner_set_commitment_seed(&this_ptr_conv, val_ref);
+}
+
+static inline uint64_t InMemorySigner_clone_ptr(LDKInMemorySigner *NONNULL_PTR arg) {
+       LDKInMemorySigner ret_var = InMemorySigner_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_InMemorySigner_clone_ptr(int64_t arg) {
+       LDKInMemorySigner 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 = InMemorySigner_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InMemorySigner_clone(int64_t orig) {
+       LDKInMemorySigner 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;
+       LDKInMemorySigner ret_var = InMemorySigner_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_InMemorySigner_new(int8_tArray funding_key, int8_tArray revocation_base_key, int8_tArray payment_key, int8_tArray delayed_payment_base_key, int8_tArray htlc_base_key, int8_tArray commitment_seed, int64_t channel_value_satoshis, int8_tArray channel_keys_id, int8_tArray rand_bytes_unique_start) {
+       LDKSecretKey funding_key_ref;
+       CHECK(funding_key->arr_len == 32);
+       memcpy(funding_key_ref.bytes, funding_key->elems, 32); FREE(funding_key);
+       LDKSecretKey revocation_base_key_ref;
+       CHECK(revocation_base_key->arr_len == 32);
+       memcpy(revocation_base_key_ref.bytes, revocation_base_key->elems, 32); FREE(revocation_base_key);
+       LDKSecretKey payment_key_ref;
+       CHECK(payment_key->arr_len == 32);
+       memcpy(payment_key_ref.bytes, payment_key->elems, 32); FREE(payment_key);
+       LDKSecretKey delayed_payment_base_key_ref;
+       CHECK(delayed_payment_base_key->arr_len == 32);
+       memcpy(delayed_payment_base_key_ref.bytes, delayed_payment_base_key->elems, 32); FREE(delayed_payment_base_key);
+       LDKSecretKey htlc_base_key_ref;
+       CHECK(htlc_base_key->arr_len == 32);
+       memcpy(htlc_base_key_ref.bytes, htlc_base_key->elems, 32); FREE(htlc_base_key);
+       LDKThirtyTwoBytes commitment_seed_ref;
+       CHECK(commitment_seed->arr_len == 32);
+       memcpy(commitment_seed_ref.data, commitment_seed->elems, 32); FREE(commitment_seed);
+       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);
+       LDKThirtyTwoBytes rand_bytes_unique_start_ref;
+       CHECK(rand_bytes_unique_start->arr_len == 32);
+       memcpy(rand_bytes_unique_start_ref.data, rand_bytes_unique_start->elems, 32); FREE(rand_bytes_unique_start);
+       LDKInMemorySigner ret_var = InMemorySigner_new(funding_key_ref, revocation_base_key_ref, payment_key_ref, delayed_payment_base_key_ref, htlc_base_key_ref, commitment_seed_ref, channel_value_satoshis, channel_keys_id_ref, rand_bytes_unique_start_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_InMemorySigner_counterparty_pubkeys(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKChannelPublicKeys ret_var = InMemorySigner_counterparty_pubkeys(&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_InMemorySigner_counterparty_selected_contest_delay(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKCOption_u16Z *ret_copy = MALLOC(sizeof(LDKCOption_u16Z), "LDKCOption_u16Z");
+       *ret_copy = InMemorySigner_counterparty_selected_contest_delay(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_InMemorySigner_holder_selected_contest_delay(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKCOption_u16Z *ret_copy = MALLOC(sizeof(LDKCOption_u16Z), "LDKCOption_u16Z");
+       *ret_copy = InMemorySigner_holder_selected_contest_delay(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_InMemorySigner_is_outbound(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKCOption_boolZ *ret_copy = MALLOC(sizeof(LDKCOption_boolZ), "LDKCOption_boolZ");
+       *ret_copy = InMemorySigner_is_outbound(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_InMemorySigner_funding_outpoint(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKOutPoint ret_var = InMemorySigner_funding_outpoint(&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_InMemorySigner_get_channel_parameters(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKChannelTransactionParameters ret_var = InMemorySigner_get_channel_parameters(&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_InMemorySigner_channel_type_features(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKChannelTypeFeatures ret_var = InMemorySigner_channel_type_features(&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_InMemorySigner_sign_counterparty_payment_input(int64_t this_arg, int8_tArray spend_tx, int64_t input_idx, int64_t descriptor) {
+       LDKInMemorySigner 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;
+       LDKTransaction spend_tx_ref;
+       spend_tx_ref.datalen = spend_tx->arr_len;
+       spend_tx_ref.data = MALLOC(spend_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(spend_tx_ref.data, spend_tx->elems, spend_tx_ref.datalen); FREE(spend_tx);
+       spend_tx_ref.data_is_owned = true;
+       LDKStaticPaymentOutputDescriptor descriptor_conv;
+       descriptor_conv.inner = untag_ptr(descriptor);
+       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");
+       *ret_conv = InMemorySigner_sign_counterparty_payment_input(&this_arg_conv, spend_tx_ref, input_idx, &descriptor_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InMemorySigner_sign_dynamic_p2wsh_input(int64_t this_arg, int8_tArray spend_tx, int64_t input_idx, int64_t descriptor) {
+       LDKInMemorySigner 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;
+       LDKTransaction spend_tx_ref;
+       spend_tx_ref.datalen = spend_tx->arr_len;
+       spend_tx_ref.data = MALLOC(spend_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(spend_tx_ref.data, spend_tx->elems, spend_tx_ref.datalen); FREE(spend_tx);
+       spend_tx_ref.data_is_owned = true;
+       LDKDelayedPaymentOutputDescriptor descriptor_conv;
+       descriptor_conv.inner = untag_ptr(descriptor);
+       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");
+       *ret_conv = InMemorySigner_sign_dynamic_p2wsh_input(&this_arg_conv, spend_tx_ref, input_idx, &descriptor_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InMemorySigner_as_EntropySource(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKEntropySource* ret_ret = MALLOC(sizeof(LDKEntropySource), "LDKEntropySource");
+       *ret_ret = InMemorySigner_as_EntropySource(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_InMemorySigner_as_ChannelSigner(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKChannelSigner* ret_ret = MALLOC(sizeof(LDKChannelSigner), "LDKChannelSigner");
+       *ret_ret = InMemorySigner_as_ChannelSigner(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_InMemorySigner_as_EcdsaChannelSigner(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKEcdsaChannelSigner), "LDKEcdsaChannelSigner");
+       *ret_ret = InMemorySigner_as_EcdsaChannelSigner(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_InMemorySigner_as_WriteableEcdsaChannelSigner(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
+       *ret_ret = InMemorySigner_as_WriteableEcdsaChannelSigner(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int8_tArray  CS_LDK_InMemorySigner_write(int64_t obj) {
+       LDKInMemorySigner 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 = InMemorySigner_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_InMemorySigner_read(int8_tArray ser, int64_t arg) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       void* arg_ptr = untag_ptr(arg);
+       CHECK_ACCESS(arg_ptr);
+       LDKEntropySource arg_conv = *(LDKEntropySource*)(arg_ptr);
+       if (arg_conv.free == LDKEntropySource_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKEntropySource_JCalls_cloned(&arg_conv);
+       }
+       LDKCResult_InMemorySignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InMemorySignerDecodeErrorZ), "LDKCResult_InMemorySignerDecodeErrorZ");
+       *ret_conv = InMemorySigner_read(ser_ref, arg_conv);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_KeysManager_free(int64_t this_obj) {
+       LDKKeysManager 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);
+       KeysManager_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_KeysManager_new(int8_tArray seed, int64_t starting_time_secs, int32_t starting_time_nanos) {
+       uint8_t seed_arr[32];
+       CHECK(seed->arr_len == 32);
+       memcpy(seed_arr, seed->elems, 32); FREE(seed);
+       uint8_t (*seed_ref)[32] = &seed_arr;
+       LDKKeysManager ret_var = KeysManager_new(seed_ref, starting_time_secs, starting_time_nanos);
+       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_KeysManager_get_node_secret_key(int64_t this_arg) {
+       LDKKeysManager 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, KeysManager_get_node_secret_key(&this_arg_conv).bytes, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_KeysManager_derive_channel_keys(int64_t this_arg, int64_t channel_value_satoshis, int8_tArray params) {
+       LDKKeysManager 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;
+       uint8_t params_arr[32];
+       CHECK(params->arr_len == 32);
+       memcpy(params_arr, params->elems, 32); FREE(params);
+       uint8_t (*params_ref)[32] = &params_arr;
+       LDKInMemorySigner ret_var = KeysManager_derive_channel_keys(&this_arg_conv, channel_value_satoshis, params_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_KeysManager_sign_spendable_outputs_psbt(int64_t this_arg, int64_tArray descriptors, int8_tArray psbt) {
+       LDKKeysManager 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;
+       LDKCVec_SpendableOutputDescriptorZ descriptors_constr;
+       descriptors_constr.datalen = descriptors->arr_len;
+       if (descriptors_constr.datalen > 0)
+               descriptors_constr.data = MALLOC(descriptors_constr.datalen * sizeof(LDKSpendableOutputDescriptor), "LDKCVec_SpendableOutputDescriptorZ Elements");
+       else
+               descriptors_constr.data = NULL;
+       int64_t* descriptors_vals = descriptors->elems;
+       for (size_t b = 0; b < descriptors_constr.datalen; b++) {
+               int64_t descriptors_conv_27 = descriptors_vals[b];
+               void* descriptors_conv_27_ptr = untag_ptr(descriptors_conv_27);
+               CHECK_ACCESS(descriptors_conv_27_ptr);
+               LDKSpendableOutputDescriptor descriptors_conv_27_conv = *(LDKSpendableOutputDescriptor*)(descriptors_conv_27_ptr);
+               descriptors_conv_27_conv = SpendableOutputDescriptor_clone((LDKSpendableOutputDescriptor*)untag_ptr(descriptors_conv_27));
+               descriptors_constr.data[b] = descriptors_conv_27_conv;
+       }
+       FREE(descriptors);
+       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_CVec_u8ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZNoneZ), "LDKCResult_CVec_u8ZNoneZ");
+       *ret_conv = KeysManager_sign_spendable_outputs_psbt(&this_arg_conv, descriptors_constr, psbt_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_KeysManager_spend_spendable_outputs(int64_t this_arg, int64_tArray descriptors, int64_tArray outputs, int8_tArray change_destination_script, int32_t feerate_sat_per_1000_weight, int64_t locktime) {
+       LDKKeysManager 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;
+       LDKCVec_SpendableOutputDescriptorZ descriptors_constr;
+       descriptors_constr.datalen = descriptors->arr_len;
+       if (descriptors_constr.datalen > 0)
+               descriptors_constr.data = MALLOC(descriptors_constr.datalen * sizeof(LDKSpendableOutputDescriptor), "LDKCVec_SpendableOutputDescriptorZ Elements");
+       else
+               descriptors_constr.data = NULL;
+       int64_t* descriptors_vals = descriptors->elems;
+       for (size_t b = 0; b < descriptors_constr.datalen; b++) {
+               int64_t descriptors_conv_27 = descriptors_vals[b];
+               void* descriptors_conv_27_ptr = untag_ptr(descriptors_conv_27);
+               CHECK_ACCESS(descriptors_conv_27_ptr);
+               LDKSpendableOutputDescriptor descriptors_conv_27_conv = *(LDKSpendableOutputDescriptor*)(descriptors_conv_27_ptr);
+               descriptors_conv_27_conv = SpendableOutputDescriptor_clone((LDKSpendableOutputDescriptor*)untag_ptr(descriptors_conv_27));
+               descriptors_constr.data[b] = descriptors_conv_27_conv;
+       }
+       FREE(descriptors);
+       LDKCVec_TxOutZ outputs_constr;
+       outputs_constr.datalen = outputs->arr_len;
+       if (outputs_constr.datalen > 0)
+               outputs_constr.data = MALLOC(outputs_constr.datalen * sizeof(LDKTxOut), "LDKCVec_TxOutZ Elements");
+       else
+               outputs_constr.data = NULL;
+       int64_t* outputs_vals = outputs->elems;
+       for (size_t h = 0; h < outputs_constr.datalen; h++) {
+               int64_t outputs_conv_7 = outputs_vals[h];
+               void* outputs_conv_7_ptr = untag_ptr(outputs_conv_7);
+               CHECK_ACCESS(outputs_conv_7_ptr);
+               LDKTxOut outputs_conv_7_conv = *(LDKTxOut*)(outputs_conv_7_ptr);
+               outputs_conv_7_conv = TxOut_clone((LDKTxOut*)untag_ptr(outputs_conv_7));
+               outputs_constr.data[h] = outputs_conv_7_conv;
+       }
+       FREE(outputs);
+       LDKCVec_u8Z change_destination_script_ref;
+       change_destination_script_ref.datalen = change_destination_script->arr_len;
+       change_destination_script_ref.data = MALLOC(change_destination_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(change_destination_script_ref.data, change_destination_script->elems, change_destination_script_ref.datalen); FREE(change_destination_script);
+       void* locktime_ptr = untag_ptr(locktime);
+       CHECK_ACCESS(locktime_ptr);
+       LDKCOption_u32Z locktime_conv = *(LDKCOption_u32Z*)(locktime_ptr);
+       locktime_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(locktime));
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = KeysManager_spend_spendable_outputs(&this_arg_conv, descriptors_constr, outputs_constr, change_destination_script_ref, feerate_sat_per_1000_weight, locktime_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_KeysManager_as_EntropySource(int64_t this_arg) {
+       LDKKeysManager 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;
+       LDKEntropySource* ret_ret = MALLOC(sizeof(LDKEntropySource), "LDKEntropySource");
+       *ret_ret = KeysManager_as_EntropySource(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_KeysManager_as_NodeSigner(int64_t this_arg) {
+       LDKKeysManager 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;
+       LDKNodeSigner* ret_ret = MALLOC(sizeof(LDKNodeSigner), "LDKNodeSigner");
+       *ret_ret = KeysManager_as_NodeSigner(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_KeysManager_as_SignerProvider(int64_t this_arg) {
+       LDKKeysManager 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;
+       LDKSignerProvider* ret_ret = MALLOC(sizeof(LDKSignerProvider), "LDKSignerProvider");
+       *ret_ret = KeysManager_as_SignerProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_PhantomKeysManager_free(int64_t this_obj) {
+       LDKPhantomKeysManager 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);
+       PhantomKeysManager_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_PhantomKeysManager_as_EntropySource(int64_t this_arg) {
+       LDKPhantomKeysManager 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;
+       LDKEntropySource* ret_ret = MALLOC(sizeof(LDKEntropySource), "LDKEntropySource");
+       *ret_ret = PhantomKeysManager_as_EntropySource(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_PhantomKeysManager_as_NodeSigner(int64_t this_arg) {
+       LDKPhantomKeysManager 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;
+       LDKNodeSigner* ret_ret = MALLOC(sizeof(LDKNodeSigner), "LDKNodeSigner");
+       *ret_ret = PhantomKeysManager_as_NodeSigner(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_PhantomKeysManager_as_SignerProvider(int64_t this_arg) {
+       LDKPhantomKeysManager 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;
+       LDKSignerProvider* ret_ret = MALLOC(sizeof(LDKSignerProvider), "LDKSignerProvider");
+       *ret_ret = PhantomKeysManager_as_SignerProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_PhantomKeysManager_new(int8_tArray seed, int64_t starting_time_secs, int32_t starting_time_nanos, int8_tArray cross_node_seed) {
+       uint8_t seed_arr[32];
+       CHECK(seed->arr_len == 32);
+       memcpy(seed_arr, seed->elems, 32); FREE(seed);
+       uint8_t (*seed_ref)[32] = &seed_arr;
+       uint8_t cross_node_seed_arr[32];
+       CHECK(cross_node_seed->arr_len == 32);
+       memcpy(cross_node_seed_arr, cross_node_seed->elems, 32); FREE(cross_node_seed);
+       uint8_t (*cross_node_seed_ref)[32] = &cross_node_seed_arr;
+       LDKPhantomKeysManager ret_var = PhantomKeysManager_new(seed_ref, starting_time_secs, starting_time_nanos, cross_node_seed_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_PhantomKeysManager_spend_spendable_outputs(int64_t this_arg, int64_tArray descriptors, int64_tArray outputs, int8_tArray change_destination_script, int32_t feerate_sat_per_1000_weight, int64_t locktime) {
+       LDKPhantomKeysManager 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;
+       LDKCVec_SpendableOutputDescriptorZ descriptors_constr;
+       descriptors_constr.datalen = descriptors->arr_len;
+       if (descriptors_constr.datalen > 0)
+               descriptors_constr.data = MALLOC(descriptors_constr.datalen * sizeof(LDKSpendableOutputDescriptor), "LDKCVec_SpendableOutputDescriptorZ Elements");
+       else
+               descriptors_constr.data = NULL;
+       int64_t* descriptors_vals = descriptors->elems;
+       for (size_t b = 0; b < descriptors_constr.datalen; b++) {
+               int64_t descriptors_conv_27 = descriptors_vals[b];
+               void* descriptors_conv_27_ptr = untag_ptr(descriptors_conv_27);
+               CHECK_ACCESS(descriptors_conv_27_ptr);
+               LDKSpendableOutputDescriptor descriptors_conv_27_conv = *(LDKSpendableOutputDescriptor*)(descriptors_conv_27_ptr);
+               descriptors_conv_27_conv = SpendableOutputDescriptor_clone((LDKSpendableOutputDescriptor*)untag_ptr(descriptors_conv_27));
+               descriptors_constr.data[b] = descriptors_conv_27_conv;
+       }
+       FREE(descriptors);
+       LDKCVec_TxOutZ outputs_constr;
+       outputs_constr.datalen = outputs->arr_len;
+       if (outputs_constr.datalen > 0)
+               outputs_constr.data = MALLOC(outputs_constr.datalen * sizeof(LDKTxOut), "LDKCVec_TxOutZ Elements");
+       else
+               outputs_constr.data = NULL;
+       int64_t* outputs_vals = outputs->elems;
+       for (size_t h = 0; h < outputs_constr.datalen; h++) {
+               int64_t outputs_conv_7 = outputs_vals[h];
+               void* outputs_conv_7_ptr = untag_ptr(outputs_conv_7);
+               CHECK_ACCESS(outputs_conv_7_ptr);
+               LDKTxOut outputs_conv_7_conv = *(LDKTxOut*)(outputs_conv_7_ptr);
+               outputs_conv_7_conv = TxOut_clone((LDKTxOut*)untag_ptr(outputs_conv_7));
+               outputs_constr.data[h] = outputs_conv_7_conv;
+       }
+       FREE(outputs);
+       LDKCVec_u8Z change_destination_script_ref;
+       change_destination_script_ref.datalen = change_destination_script->arr_len;
+       change_destination_script_ref.data = MALLOC(change_destination_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(change_destination_script_ref.data, change_destination_script->elems, change_destination_script_ref.datalen); FREE(change_destination_script);
+       void* locktime_ptr = untag_ptr(locktime);
+       CHECK_ACCESS(locktime_ptr);
+       LDKCOption_u32Z locktime_conv = *(LDKCOption_u32Z*)(locktime_ptr);
+       locktime_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(locktime));
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = PhantomKeysManager_spend_spendable_outputs(&this_arg_conv, descriptors_constr, outputs_constr, change_destination_script_ref, feerate_sat_per_1000_weight, locktime_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PhantomKeysManager_derive_channel_keys(int64_t this_arg, int64_t channel_value_satoshis, int8_tArray params) {
+       LDKPhantomKeysManager 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;
+       uint8_t params_arr[32];
+       CHECK(params->arr_len == 32);
+       memcpy(params_arr, params->elems, 32); FREE(params);
+       uint8_t (*params_ref)[32] = &params_arr;
+       LDKInMemorySigner ret_var = PhantomKeysManager_derive_channel_keys(&this_arg_conv, channel_value_satoshis, params_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_PhantomKeysManager_get_node_secret_key(int64_t this_arg) {
+       LDKPhantomKeysManager 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, PhantomKeysManager_get_node_secret_key(&this_arg_conv).bytes, 32);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_PhantomKeysManager_get_phantom_node_secret_key(int64_t this_arg) {
+       LDKPhantomKeysManager 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, PhantomKeysManager_get_phantom_node_secret_key(&this_arg_conv).bytes, 32);
+       return ret_arr;
+}
+
+void  CS_LDK_OnionMessenger_free(int64_t this_obj) {
+       LDKOnionMessenger 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);
+       OnionMessenger_free(this_obj_conv);
+}
+
+void  CS_LDK_MessageRouter_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);
+       LDKMessageRouter this_ptr_conv = *(LDKMessageRouter*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       MessageRouter_free(this_ptr_conv);
+}
+
+void  CS_LDK_DefaultMessageRouter_free(int64_t this_obj) {
+       LDKDefaultMessageRouter 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);
+       DefaultMessageRouter_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_DefaultMessageRouter_new() {
+       LDKDefaultMessageRouter ret_var = DefaultMessageRouter_new();
+       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_DefaultMessageRouter_as_MessageRouter(int64_t this_arg) {
+       LDKDefaultMessageRouter 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 = DefaultMessageRouter_as_MessageRouter(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_OnionMessagePath_free(int64_t this_obj) {
+       LDKOnionMessagePath 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);
+       OnionMessagePath_free(this_obj_conv);
+}
+
+ptrArray  CS_LDK_OnionMessagePath_get_intermediate_nodes(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;
+       LDKCVec_PublicKeyZ ret_var = OnionMessagePath_get_intermediate_nodes(&this_ptr_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(33, __LINE__);
+               memcpy(ret_conv_8_arr->elems, ret_var.data[i].compressed_form, 33);
+               ret_arr_ptr[i] = ret_conv_8_arr;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_OnionMessagePath_set_intermediate_nodes(int64_t this_ptr, ptrArray 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;
+       LDKCVec_PublicKeyZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
+       else
+               val_constr.data = NULL;
+       int8_tArray* val_vals = (void*) val->elems;
+       for (size_t i = 0; i < val_constr.datalen; i++) {
+               int8_tArray val_conv_8 = val_vals[i];
+               LDKPublicKey val_conv_8_ref;
+               CHECK(val_conv_8->arr_len == 33);
+               memcpy(val_conv_8_ref.compressed_form, val_conv_8->elems, 33); FREE(val_conv_8);
+               val_constr.data[i] = val_conv_8_ref;
+       }
+       FREE(val);
+       OnionMessagePath_set_intermediate_nodes(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_OnionMessagePath_get_destination(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;
+       LDKDestination *ret_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
+       *ret_copy = OnionMessagePath_get_destination(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_OnionMessagePath_set_destination(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);
+       LDKDestination val_conv = *(LDKDestination*)(val_ptr);
+       val_conv = Destination_clone((LDKDestination*)untag_ptr(val));
+       OnionMessagePath_set_destination(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_OnionMessagePath_new(ptrArray intermediate_nodes_arg, int64_t destination_arg) {
+       LDKCVec_PublicKeyZ intermediate_nodes_arg_constr;
+       intermediate_nodes_arg_constr.datalen = intermediate_nodes_arg->arr_len;
+       if (intermediate_nodes_arg_constr.datalen > 0)
+               intermediate_nodes_arg_constr.data = MALLOC(intermediate_nodes_arg_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
+       else
+               intermediate_nodes_arg_constr.data = NULL;
+       int8_tArray* intermediate_nodes_arg_vals = (void*) intermediate_nodes_arg->elems;
+       for (size_t i = 0; i < intermediate_nodes_arg_constr.datalen; i++) {
+               int8_tArray intermediate_nodes_arg_conv_8 = intermediate_nodes_arg_vals[i];
+               LDKPublicKey intermediate_nodes_arg_conv_8_ref;
+               CHECK(intermediate_nodes_arg_conv_8->arr_len == 33);
+               memcpy(intermediate_nodes_arg_conv_8_ref.compressed_form, intermediate_nodes_arg_conv_8->elems, 33); FREE(intermediate_nodes_arg_conv_8);
+               intermediate_nodes_arg_constr.data[i] = intermediate_nodes_arg_conv_8_ref;
+       }
+       FREE(intermediate_nodes_arg);
+       void* destination_arg_ptr = untag_ptr(destination_arg);
+       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);
+       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 OnionMessagePath_clone_ptr(LDKOnionMessagePath *NONNULL_PTR arg) {
+       LDKOnionMessagePath ret_var = OnionMessagePath_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_OnionMessagePath_clone_ptr(int64_t arg) {
+       LDKOnionMessagePath 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 = OnionMessagePath_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OnionMessagePath_clone(int64_t orig) {
+       LDKOnionMessagePath 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;
+       LDKOnionMessagePath ret_var = OnionMessagePath_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_Destination_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);
+       LDKDestination this_ptr_conv = *(LDKDestination*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Destination_free(this_ptr_conv);
+}
+
+static inline uint64_t Destination_clone_ptr(LDKDestination *NONNULL_PTR arg) {
+       LDKDestination *ret_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
+       *ret_copy = Destination_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_Destination_clone_ptr(int64_t arg) {
+       LDKDestination* arg_conv = (LDKDestination*)untag_ptr(arg);
+       int64_t ret_conv = Destination_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Destination_clone(int64_t orig) {
+       LDKDestination* orig_conv = (LDKDestination*)untag_ptr(orig);
+       LDKDestination *ret_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
+       *ret_copy = Destination_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Destination_node(int8_tArray a) {
+       LDKPublicKey a_ref;
+       CHECK(a->arr_len == 33);
+       memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
+       LDKDestination *ret_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
+       *ret_copy = Destination_node(a_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Destination_blinded_path(int64_t a) {
+       LDKBlindedPath 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 = BlindedPath_clone(&a_conv);
+       LDKDestination *ret_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
+       *ret_copy = Destination_blinded_path(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_SendError_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);
+       LDKSendError this_ptr_conv = *(LDKSendError*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       SendError_free(this_ptr_conv);
+}
+
+static inline uint64_t SendError_clone_ptr(LDKSendError *NONNULL_PTR arg) {
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_SendError_clone_ptr(int64_t arg) {
+       LDKSendError* arg_conv = (LDKSendError*)untag_ptr(arg);
+       int64_t ret_conv = SendError_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SendError_clone(int64_t orig) {
+       LDKSendError* orig_conv = (LDKSendError*)untag_ptr(orig);
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_secp256k1(int32_t a) {
+       LDKSecp256k1Error a_conv = LDKSecp256k1Error_from_cs(a);
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_secp256k1(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_too_big_packet() {
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_too_big_packet();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_too_few_blinded_hops() {
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_too_few_blinded_hops();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_invalid_first_hop() {
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_invalid_first_hop();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_invalid_message() {
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_invalid_message();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_buffer_full() {
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_buffer_full();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_get_node_id_failed() {
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_get_node_id_failed();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_blinded_path_advance_failed() {
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_blinded_path_advance_failed();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_SendError_eq(int64_t a, int64_t b) {
+       LDKSendError* a_conv = (LDKSendError*)untag_ptr(a);
+       LDKSendError* b_conv = (LDKSendError*)untag_ptr(b);
+       jboolean ret_conv = SendError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CustomOnionMessageHandler_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);
+       LDKCustomOnionMessageHandler this_ptr_conv = *(LDKCustomOnionMessageHandler*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       CustomOnionMessageHandler_free(this_ptr_conv);
+}
+
+void  CS_LDK_PeeledOnion_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);
+       LDKPeeledOnion this_ptr_conv = *(LDKPeeledOnion*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       PeeledOnion_free(this_ptr_conv);
+}
+
+static inline uint64_t PeeledOnion_clone_ptr(LDKPeeledOnion *NONNULL_PTR arg) {
+       LDKPeeledOnion *ret_copy = MALLOC(sizeof(LDKPeeledOnion), "LDKPeeledOnion");
+       *ret_copy = PeeledOnion_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_PeeledOnion_clone_ptr(int64_t arg) {
+       LDKPeeledOnion* arg_conv = (LDKPeeledOnion*)untag_ptr(arg);
+       int64_t ret_conv = PeeledOnion_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PeeledOnion_clone(int64_t orig) {
+       LDKPeeledOnion* orig_conv = (LDKPeeledOnion*)untag_ptr(orig);
+       LDKPeeledOnion *ret_copy = MALLOC(sizeof(LDKPeeledOnion), "LDKPeeledOnion");
+       *ret_copy = PeeledOnion_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PeeledOnion_forward(int8_tArray a, int64_t b) {
+       LDKPublicKey a_ref;
+       CHECK(a->arr_len == 33);
+       memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
+       LDKOnionMessage 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 = OnionMessage_clone(&b_conv);
+       LDKPeeledOnion *ret_copy = MALLOC(sizeof(LDKPeeledOnion), "LDKPeeledOnion");
+       *ret_copy = PeeledOnion_forward(a_ref, b_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PeeledOnion_receive(int64_t a, int8_tArray b, int64_t c) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKParsedOnionMessageContents a_conv = *(LDKParsedOnionMessageContents*)(a_ptr);
+       a_conv = ParsedOnionMessageContents_clone((LDKParsedOnionMessageContents*)untag_ptr(a));
+       LDKThirtyTwoBytes b_ref;
+       CHECK(b->arr_len == 32);
+       memcpy(b_ref.data, b->elems, 32); FREE(b);
+       LDKBlindedPath 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 = BlindedPath_clone(&c_conv);
+       LDKPeeledOnion *ret_copy = MALLOC(sizeof(LDKPeeledOnion), "LDKPeeledOnion");
+       *ret_copy = PeeledOnion_receive(a_conv, b_ref, c_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_create_onion_message(int64_t entropy_source, int64_t node_signer, int64_t path, int64_t contents, int64_t reply_path) {
+       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;
+       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;
+       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);
+       if (contents_conv.free == LDKOnionMessageContents_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOnionMessageContents_JCalls_cloned(&contents_conv);
+       }
+       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_C2Tuple_PublicKeyOnionMessageZSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ), "LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ");
+       *ret_conv = create_onion_message(entropy_source_conv, node_signer_conv, path_conv, contents_conv, reply_path_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_peel_onion_message(int64_t msg, int64_t node_signer, int64_t logger, int64_t custom_handler) {
+       LDKOnionMessage 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);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       void* custom_handler_ptr = untag_ptr(custom_handler);
+       CHECK_ACCESS(custom_handler_ptr);
+       LDKCustomOnionMessageHandler custom_handler_conv = *(LDKCustomOnionMessageHandler*)(custom_handler_ptr);
+       if (custom_handler_conv.free == LDKCustomOnionMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKCustomOnionMessageHandler_JCalls_cloned(&custom_handler_conv);
+       }
+       LDKCResult_PeeledOnionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_PeeledOnionNoneZ), "LDKCResult_PeeledOnionNoneZ");
+       *ret_conv = peel_onion_message(&msg_conv, node_signer_conv, logger_conv, custom_handler_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_OnionMessenger_new(int64_t entropy_source, int64_t node_signer, int64_t logger, int64_t message_router, int64_t offers_handler, int64_t custom_handler) {
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       void* message_router_ptr = untag_ptr(message_router);
+       CHECK_ACCESS(message_router_ptr);
+       LDKMessageRouter message_router_conv = *(LDKMessageRouter*)(message_router_ptr);
+       if (message_router_conv.free == LDKMessageRouter_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKMessageRouter_JCalls_cloned(&message_router_conv);
+       }
+       void* offers_handler_ptr = untag_ptr(offers_handler);
+       CHECK_ACCESS(offers_handler_ptr);
+       LDKOffersMessageHandler offers_handler_conv = *(LDKOffersMessageHandler*)(offers_handler_ptr);
+       if (offers_handler_conv.free == LDKOffersMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOffersMessageHandler_JCalls_cloned(&offers_handler_conv);
+       }
+       void* custom_handler_ptr = untag_ptr(custom_handler);
+       CHECK_ACCESS(custom_handler_ptr);
+       LDKCustomOnionMessageHandler custom_handler_conv = *(LDKCustomOnionMessageHandler*)(custom_handler_ptr);
+       if (custom_handler_conv.free == LDKCustomOnionMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKCustomOnionMessageHandler_JCalls_cloned(&custom_handler_conv);
+       }
+       LDKOnionMessenger ret_var = OnionMessenger_new(entropy_source_conv, node_signer_conv, logger_conv, message_router_conv, offers_handler_conv, custom_handler_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_OnionMessenger_send_onion_message(int64_t this_arg, int64_t path, int64_t contents, 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);
+       if (contents_conv.free == LDKOnionMessageContents_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOnionMessageContents_JCalls_cloned(&contents_conv);
+       }
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_OnionMessenger_as_OnionMessageHandler(int64_t this_arg) {
+       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;
+       LDKOnionMessageHandler* ret_ret = MALLOC(sizeof(LDKOnionMessageHandler), "LDKOnionMessageHandler");
+       *ret_ret = OnionMessenger_as_OnionMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_OffersMessageHandler_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);
+       LDKOffersMessageHandler this_ptr_conv = *(LDKOffersMessageHandler*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       OffersMessageHandler_free(this_ptr_conv);
+}
+
+void  CS_LDK_OffersMessage_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);
+       LDKOffersMessage this_ptr_conv = *(LDKOffersMessage*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       OffersMessage_free(this_ptr_conv);
+}
+
+static inline uint64_t OffersMessage_clone_ptr(LDKOffersMessage *NONNULL_PTR arg) {
+       LDKOffersMessage *ret_copy = MALLOC(sizeof(LDKOffersMessage), "LDKOffersMessage");
+       *ret_copy = OffersMessage_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_OffersMessage_clone_ptr(int64_t arg) {
+       LDKOffersMessage* arg_conv = (LDKOffersMessage*)untag_ptr(arg);
+       int64_t ret_conv = OffersMessage_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OffersMessage_clone(int64_t orig) {
+       LDKOffersMessage* orig_conv = (LDKOffersMessage*)untag_ptr(orig);
+       LDKOffersMessage *ret_copy = MALLOC(sizeof(LDKOffersMessage), "LDKOffersMessage");
+       *ret_copy = OffersMessage_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_OffersMessage_invoice_request(int64_t a) {
+       LDKInvoiceRequest 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 = InvoiceRequest_clone(&a_conv);
+       LDKOffersMessage *ret_copy = MALLOC(sizeof(LDKOffersMessage), "LDKOffersMessage");
+       *ret_copy = OffersMessage_invoice_request(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_OffersMessage_invoice(int64_t a) {
+       LDKBolt12Invoice 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 = Bolt12Invoice_clone(&a_conv);
+       LDKOffersMessage *ret_copy = MALLOC(sizeof(LDKOffersMessage), "LDKOffersMessage");
+       *ret_copy = OffersMessage_invoice(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_OffersMessage_invoice_error(int64_t a) {
+       LDKInvoiceError 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 = InvoiceError_clone(&a_conv);
+       LDKOffersMessage *ret_copy = MALLOC(sizeof(LDKOffersMessage), "LDKOffersMessage");
+       *ret_copy = OffersMessage_invoice_error(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_OffersMessage_is_known_type(int64_t tlv_type) {
+       jboolean ret_conv = OffersMessage_is_known_type(tlv_type);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_OffersMessage_write(int64_t obj) {
+       LDKOffersMessage* obj_conv = (LDKOffersMessage*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = OffersMessage_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_OffersMessage_read(int8_tArray ser, int64_t arg_a, int64_t arg_b) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       void* arg_b_ptr = untag_ptr(arg_b);
+       if (ptr_is_owned(arg_b)) { CHECK_ACCESS(arg_b_ptr); }
+       LDKLogger* arg_b_conv = (LDKLogger*)arg_b_ptr;
+       LDKCResult_OffersMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OffersMessageDecodeErrorZ), "LDKCResult_OffersMessageDecodeErrorZ");
+       *ret_conv = OffersMessage_read(ser_ref, arg_a, arg_b_conv);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_Packet_free(int64_t this_obj) {
+       LDKPacket 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);
+       Packet_free(this_obj_conv);
+}
+
+int8_t  CS_LDK_Packet_get_version(int64_t this_ptr) {
+       LDKPacket 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 = Packet_get_version(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Packet_set_version(int64_t this_ptr, int8_t val) {
+       LDKPacket 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;
+       Packet_set_version(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_Packet_get_public_key(int64_t this_ptr) {
+       LDKPacket 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, Packet_get_public_key(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_Packet_set_public_key(int64_t this_ptr, int8_tArray val) {
+       LDKPacket 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);
+       Packet_set_public_key(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_Packet_get_hop_data(int64_t this_ptr) {
+       LDKPacket 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 = Packet_get_hop_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_Packet_set_hop_data(int64_t this_ptr, int8_tArray val) {
+       LDKPacket 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);
+       Packet_set_hop_data(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_Packet_get_hmac(int64_t this_ptr) {
+       LDKPacket 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, *Packet_get_hmac(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_Packet_set_hmac(int64_t this_ptr, int8_tArray val) {
+       LDKPacket 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);
+       Packet_set_hmac(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_Packet_new(int8_t version_arg, int8_tArray public_key_arg, int8_tArray hop_data_arg, int8_tArray hmac_arg) {
+       LDKPublicKey public_key_arg_ref;
+       CHECK(public_key_arg->arr_len == 33);
+       memcpy(public_key_arg_ref.compressed_form, public_key_arg->elems, 33); FREE(public_key_arg);
+       LDKCVec_u8Z hop_data_arg_ref;
+       hop_data_arg_ref.datalen = hop_data_arg->arr_len;
+       hop_data_arg_ref.data = MALLOC(hop_data_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(hop_data_arg_ref.data, hop_data_arg->elems, hop_data_arg_ref.datalen); FREE(hop_data_arg);
+       LDKThirtyTwoBytes hmac_arg_ref;
+       CHECK(hmac_arg->arr_len == 32);
+       memcpy(hmac_arg_ref.data, hmac_arg->elems, 32); FREE(hmac_arg);
+       LDKPacket ret_var = Packet_new(version_arg, public_key_arg_ref, hop_data_arg_ref, hmac_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 Packet_clone_ptr(LDKPacket *NONNULL_PTR arg) {
+       LDKPacket ret_var = Packet_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_Packet_clone_ptr(int64_t arg) {
+       LDKPacket 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 = Packet_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Packet_clone(int64_t orig) {
+       LDKPacket 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;
+       LDKPacket ret_var = Packet_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_Packet_eq(int64_t a, int64_t b) {
+       LDKPacket 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;
+       LDKPacket 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 = Packet_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Packet_write(int64_t obj) {
+       LDKPacket 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 = Packet_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;
+}
+
+void  CS_LDK_ParsedOnionMessageContents_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);
+       LDKParsedOnionMessageContents this_ptr_conv = *(LDKParsedOnionMessageContents*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       ParsedOnionMessageContents_free(this_ptr_conv);
+}
+
+static inline uint64_t ParsedOnionMessageContents_clone_ptr(LDKParsedOnionMessageContents *NONNULL_PTR arg) {
+       LDKParsedOnionMessageContents *ret_copy = MALLOC(sizeof(LDKParsedOnionMessageContents), "LDKParsedOnionMessageContents");
+       *ret_copy = ParsedOnionMessageContents_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_ParsedOnionMessageContents_clone_ptr(int64_t arg) {
+       LDKParsedOnionMessageContents* arg_conv = (LDKParsedOnionMessageContents*)untag_ptr(arg);
+       int64_t ret_conv = ParsedOnionMessageContents_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ParsedOnionMessageContents_clone(int64_t orig) {
+       LDKParsedOnionMessageContents* orig_conv = (LDKParsedOnionMessageContents*)untag_ptr(orig);
+       LDKParsedOnionMessageContents *ret_copy = MALLOC(sizeof(LDKParsedOnionMessageContents), "LDKParsedOnionMessageContents");
+       *ret_copy = ParsedOnionMessageContents_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ParsedOnionMessageContents_offers(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKOffersMessage a_conv = *(LDKOffersMessage*)(a_ptr);
+       a_conv = OffersMessage_clone((LDKOffersMessage*)untag_ptr(a));
+       LDKParsedOnionMessageContents *ret_copy = MALLOC(sizeof(LDKParsedOnionMessageContents), "LDKParsedOnionMessageContents");
+       *ret_copy = ParsedOnionMessageContents_offers(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ParsedOnionMessageContents_custom(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKOnionMessageContents a_conv = *(LDKOnionMessageContents*)(a_ptr);
+       if (a_conv.free == LDKOnionMessageContents_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOnionMessageContents_JCalls_cloned(&a_conv);
+       }
+       LDKParsedOnionMessageContents *ret_copy = MALLOC(sizeof(LDKParsedOnionMessageContents), "LDKParsedOnionMessageContents");
+       *ret_copy = ParsedOnionMessageContents_custom(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ParsedOnionMessageContents_as_OnionMessageContents(int64_t this_arg) {
+       LDKParsedOnionMessageContents* this_arg_conv = (LDKParsedOnionMessageContents*)untag_ptr(this_arg);
+       LDKOnionMessageContents* ret_ret = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
+       *ret_ret = ParsedOnionMessageContents_as_OnionMessageContents(this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int8_tArray  CS_LDK_ParsedOnionMessageContents_write(int64_t obj) {
+       LDKParsedOnionMessageContents* obj_conv = (LDKParsedOnionMessageContents*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = ParsedOnionMessageContents_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;
+}
+
+static inline uint64_t OnionMessageContents_clone_ptr(LDKOnionMessageContents *NONNULL_PTR arg) {
+       LDKOnionMessageContents* ret_ret = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
+       *ret_ret = OnionMessageContents_clone(arg);
+       return tag_ptr(ret_ret, true);
+}
+int64_t  CS_LDK_OnionMessageContents_clone_ptr(int64_t arg) {
+       void* arg_ptr = untag_ptr(arg);
+       if (ptr_is_owned(arg)) { CHECK_ACCESS(arg_ptr); }
+       LDKOnionMessageContents* arg_conv = (LDKOnionMessageContents*)arg_ptr;
+       int64_t ret_conv = OnionMessageContents_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OnionMessageContents_clone(int64_t orig) {
+       void* orig_ptr = untag_ptr(orig);
+       if (ptr_is_owned(orig)) { CHECK_ACCESS(orig_ptr); }
+       LDKOnionMessageContents* orig_conv = (LDKOnionMessageContents*)orig_ptr;
+       LDKOnionMessageContents* ret_ret = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
+       *ret_ret = OnionMessageContents_clone(orig_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_OnionMessageContents_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);
+       LDKOnionMessageContents this_ptr_conv = *(LDKOnionMessageContents*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       OnionMessageContents_free(this_ptr_conv);
+}
+
+void  CS_LDK_BlindedPath_free(int64_t this_obj) {
+       LDKBlindedPath 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);
+       BlindedPath_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_BlindedPath_get_introduction_node_id(int64_t this_ptr) {
+       LDKBlindedPath 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, BlindedPath_get_introduction_node_id(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_BlindedPath_set_introduction_node_id(int64_t this_ptr, int8_tArray val) {
+       LDKBlindedPath 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);
+       BlindedPath_set_introduction_node_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_BlindedPath_get_blinding_point(int64_t this_ptr) {
+       LDKBlindedPath 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, BlindedPath_get_blinding_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_BlindedPath_set_blinding_point(int64_t this_ptr, int8_tArray val) {
+       LDKBlindedPath 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);
+       BlindedPath_set_blinding_point(&this_ptr_conv, val_ref);
+}
+
+int64_tArray  CS_LDK_BlindedPath_get_blinded_hops(int64_t this_ptr) {
+       LDKBlindedPath 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_BlindedHopZ ret_var = BlindedPath_get_blinded_hops(&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 m = 0; m < ret_var.datalen; m++) {
+               LDKBlindedHop ret_conv_12_var = ret_var.data[m];
+               int64_t ret_conv_12_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_12_var);
+               ret_conv_12_ref = tag_ptr(ret_conv_12_var.inner, ret_conv_12_var.is_owned);
+               ret_arr_ptr[m] = ret_conv_12_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_BlindedPath_set_blinded_hops(int64_t this_ptr, int64_tArray val) {
+       LDKBlindedPath 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_BlindedHopZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKBlindedHop), "LDKCVec_BlindedHopZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t m = 0; m < val_constr.datalen; m++) {
+               int64_t val_conv_12 = val_vals[m];
+               LDKBlindedHop val_conv_12_conv;
+               val_conv_12_conv.inner = untag_ptr(val_conv_12);
+               val_conv_12_conv.is_owned = ptr_is_owned(val_conv_12);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_12_conv);
+               val_conv_12_conv = BlindedHop_clone(&val_conv_12_conv);
+               val_constr.data[m] = val_conv_12_conv;
+       }
+       FREE(val);
+       BlindedPath_set_blinded_hops(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_BlindedPath_new(int8_tArray introduction_node_id_arg, int8_tArray blinding_point_arg, int64_tArray blinded_hops_arg) {
+       LDKPublicKey introduction_node_id_arg_ref;
+       CHECK(introduction_node_id_arg->arr_len == 33);
+       memcpy(introduction_node_id_arg_ref.compressed_form, introduction_node_id_arg->elems, 33); FREE(introduction_node_id_arg);
+       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);
+       LDKCVec_BlindedHopZ blinded_hops_arg_constr;
+       blinded_hops_arg_constr.datalen = blinded_hops_arg->arr_len;
+       if (blinded_hops_arg_constr.datalen > 0)
+               blinded_hops_arg_constr.data = MALLOC(blinded_hops_arg_constr.datalen * sizeof(LDKBlindedHop), "LDKCVec_BlindedHopZ Elements");
+       else
+               blinded_hops_arg_constr.data = NULL;
+       int64_t* blinded_hops_arg_vals = blinded_hops_arg->elems;
+       for (size_t m = 0; m < blinded_hops_arg_constr.datalen; m++) {
+               int64_t blinded_hops_arg_conv_12 = blinded_hops_arg_vals[m];
+               LDKBlindedHop blinded_hops_arg_conv_12_conv;
+               blinded_hops_arg_conv_12_conv.inner = untag_ptr(blinded_hops_arg_conv_12);
+               blinded_hops_arg_conv_12_conv.is_owned = ptr_is_owned(blinded_hops_arg_conv_12);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(blinded_hops_arg_conv_12_conv);
+               blinded_hops_arg_conv_12_conv = BlindedHop_clone(&blinded_hops_arg_conv_12_conv);
+               blinded_hops_arg_constr.data[m] = blinded_hops_arg_conv_12_conv;
+       }
+       FREE(blinded_hops_arg);
+       LDKBlindedPath ret_var = BlindedPath_new(introduction_node_id_arg_ref, blinding_point_arg_ref, blinded_hops_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);
+       return ret_ref;
+}
+
+static inline uint64_t BlindedPath_clone_ptr(LDKBlindedPath *NONNULL_PTR arg) {
+       LDKBlindedPath ret_var = BlindedPath_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_BlindedPath_clone_ptr(int64_t arg) {
+       LDKBlindedPath 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 = BlindedPath_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedPath_clone(int64_t orig) {
+       LDKBlindedPath 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;
+       LDKBlindedPath ret_var = BlindedPath_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_BlindedPath_hash(int64_t o) {
+       LDKBlindedPath 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 = BlindedPath_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BlindedPath_eq(int64_t a, int64_t b) {
+       LDKBlindedPath 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;
+       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.is_owned = false;
+       jboolean ret_conv = BlindedPath_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedHop_free(int64_t this_obj) {
+       LDKBlindedHop 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);
+       BlindedHop_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_BlindedHop_get_blinded_node_id(int64_t this_ptr) {
+       LDKBlindedHop 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, BlindedHop_get_blinded_node_id(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_BlindedHop_set_blinded_node_id(int64_t this_ptr, int8_tArray val) {
+       LDKBlindedHop 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);
+       BlindedHop_set_blinded_node_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_BlindedHop_get_encrypted_payload(int64_t this_ptr) {
+       LDKBlindedHop 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 = BlindedHop_get_encrypted_payload(&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_BlindedHop_set_encrypted_payload(int64_t this_ptr, int8_tArray val) {
+       LDKBlindedHop 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);
+       BlindedHop_set_encrypted_payload(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_BlindedHop_new(int8_tArray blinded_node_id_arg, int8_tArray encrypted_payload_arg) {
+       LDKPublicKey blinded_node_id_arg_ref;
+       CHECK(blinded_node_id_arg->arr_len == 33);
+       memcpy(blinded_node_id_arg_ref.compressed_form, blinded_node_id_arg->elems, 33); FREE(blinded_node_id_arg);
+       LDKCVec_u8Z encrypted_payload_arg_ref;
+       encrypted_payload_arg_ref.datalen = encrypted_payload_arg->arr_len;
+       encrypted_payload_arg_ref.data = MALLOC(encrypted_payload_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(encrypted_payload_arg_ref.data, encrypted_payload_arg->elems, encrypted_payload_arg_ref.datalen); FREE(encrypted_payload_arg);
+       LDKBlindedHop ret_var = BlindedHop_new(blinded_node_id_arg_ref, encrypted_payload_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 BlindedHop_clone_ptr(LDKBlindedHop *NONNULL_PTR arg) {
+       LDKBlindedHop ret_var = BlindedHop_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_BlindedHop_clone_ptr(int64_t arg) {
+       LDKBlindedHop 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 = BlindedHop_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedHop_clone(int64_t orig) {
+       LDKBlindedHop 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;
+       LDKBlindedHop ret_var = BlindedHop_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_BlindedHop_hash(int64_t o) {
+       LDKBlindedHop 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 = BlindedHop_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BlindedHop_eq(int64_t a, int64_t b) {
+       LDKBlindedHop 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;
+       LDKBlindedHop 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 = BlindedHop_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedPath_one_hop_for_message(int8_tArray recipient_node_id, int64_t entropy_source) {
+       LDKPublicKey recipient_node_id_ref;
+       CHECK(recipient_node_id->arr_len == 33);
+       memcpy(recipient_node_id_ref.compressed_form, recipient_node_id->elems, 33); FREE(recipient_node_id);
+       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_BlindedPathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathNoneZ), "LDKCResult_BlindedPathNoneZ");
+       *ret_conv = BlindedPath_one_hop_for_message(recipient_node_id_ref, entropy_source_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_BlindedPath_new_for_message(ptrArray node_pks, int64_t entropy_source) {
+       LDKCVec_PublicKeyZ node_pks_constr;
+       node_pks_constr.datalen = node_pks->arr_len;
+       if (node_pks_constr.datalen > 0)
+               node_pks_constr.data = MALLOC(node_pks_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
+       else
+               node_pks_constr.data = NULL;
+       int8_tArray* node_pks_vals = (void*) node_pks->elems;
+       for (size_t i = 0; i < node_pks_constr.datalen; i++) {
+               int8_tArray node_pks_conv_8 = node_pks_vals[i];
+               LDKPublicKey node_pks_conv_8_ref;
+               CHECK(node_pks_conv_8->arr_len == 33);
+               memcpy(node_pks_conv_8_ref.compressed_form, node_pks_conv_8->elems, 33); FREE(node_pks_conv_8);
+               node_pks_constr.data[i] = node_pks_conv_8_ref;
+       }
+       FREE(node_pks);
+       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_BlindedPathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathNoneZ), "LDKCResult_BlindedPathNoneZ");
+       *ret_conv = BlindedPath_new_for_message(node_pks_constr, entropy_source_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_BlindedPath_one_hop_for_payment(int8_tArray payee_node_id, int64_t payee_tlvs, int64_t entropy_source) {
+       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_one_hop_for_payment(payee_node_id_ref, payee_tlvs_conv, 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);
+       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 = BlindedPath_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_BlindedPath_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BlindedPathDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathDecodeErrorZ), "LDKCResult_BlindedPathDecodeErrorZ");
+       *ret_conv = BlindedPath_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_BlindedHop_write(int64_t obj) {
+       LDKBlindedHop 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 = BlindedHop_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_BlindedHop_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BlindedHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopDecodeErrorZ), "LDKCResult_BlindedHopDecodeErrorZ");
+       *ret_conv = BlindedHop_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ForwardNode_free(int64_t this_obj) {
+       LDKForwardNode 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);
+       ForwardNode_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ForwardNode_get_tlvs(int64_t this_ptr) {
+       LDKForwardNode 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;
+       LDKForwardTlvs ret_var = ForwardNode_get_tlvs(&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_ForwardNode_set_tlvs(int64_t this_ptr, int64_t val) {
+       LDKForwardNode 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;
+       LDKForwardTlvs 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 = ForwardTlvs_clone(&val_conv);
+       ForwardNode_set_tlvs(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_ForwardNode_get_node_id(int64_t this_ptr) {
+       LDKForwardNode 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, ForwardNode_get_node_id(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_ForwardNode_set_node_id(int64_t this_ptr, int8_tArray val) {
+       LDKForwardNode 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);
+       ForwardNode_set_node_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ForwardNode_get_htlc_maximum_msat(int64_t this_ptr) {
+       LDKForwardNode 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 = ForwardNode_get_htlc_maximum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ForwardNode_set_htlc_maximum_msat(int64_t this_ptr, int64_t val) {
+       LDKForwardNode 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;
+       ForwardNode_set_htlc_maximum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ForwardNode_new(int64_t tlvs_arg, int8_tArray node_id_arg, int64_t htlc_maximum_msat_arg) {
+       LDKForwardTlvs tlvs_arg_conv;
+       tlvs_arg_conv.inner = untag_ptr(tlvs_arg);
+       tlvs_arg_conv.is_owned = ptr_is_owned(tlvs_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(tlvs_arg_conv);
+       tlvs_arg_conv = ForwardTlvs_clone(&tlvs_arg_conv);
+       LDKPublicKey node_id_arg_ref;
+       CHECK(node_id_arg->arr_len == 33);
+       memcpy(node_id_arg_ref.compressed_form, node_id_arg->elems, 33); FREE(node_id_arg);
+       LDKForwardNode ret_var = ForwardNode_new(tlvs_arg_conv, node_id_arg_ref, htlc_maximum_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 ForwardNode_clone_ptr(LDKForwardNode *NONNULL_PTR arg) {
+       LDKForwardNode ret_var = ForwardNode_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_ForwardNode_clone_ptr(int64_t arg) {
+       LDKForwardNode 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 = ForwardNode_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ForwardNode_clone(int64_t orig) {
+       LDKForwardNode 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;
+       LDKForwardNode ret_var = ForwardNode_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_ForwardTlvs_free(int64_t this_obj) {
+       LDKForwardTlvs 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);
+       ForwardTlvs_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ForwardTlvs_get_short_channel_id(int64_t this_ptr) {
+       LDKForwardTlvs 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 = ForwardTlvs_get_short_channel_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ForwardTlvs_set_short_channel_id(int64_t this_ptr, int64_t val) {
+       LDKForwardTlvs 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;
+       ForwardTlvs_set_short_channel_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ForwardTlvs_get_payment_relay(int64_t this_ptr) {
+       LDKForwardTlvs 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;
+       LDKPaymentRelay ret_var = ForwardTlvs_get_payment_relay(&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_ForwardTlvs_set_payment_relay(int64_t this_ptr, int64_t val) {
+       LDKForwardTlvs 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;
+       LDKPaymentRelay 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 = PaymentRelay_clone(&val_conv);
+       ForwardTlvs_set_payment_relay(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ForwardTlvs_get_payment_constraints(int64_t this_ptr) {
+       LDKForwardTlvs 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;
+       LDKPaymentConstraints ret_var = ForwardTlvs_get_payment_constraints(&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_ForwardTlvs_set_payment_constraints(int64_t this_ptr, int64_t val) {
+       LDKForwardTlvs 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;
+       LDKPaymentConstraints 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 = PaymentConstraints_clone(&val_conv);
+       ForwardTlvs_set_payment_constraints(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ForwardTlvs_get_features(int64_t this_ptr) {
+       LDKForwardTlvs 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;
+       LDKBlindedHopFeatures ret_var = ForwardTlvs_get_features(&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_ForwardTlvs_set_features(int64_t this_ptr, int64_t val) {
+       LDKForwardTlvs 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;
+       LDKBlindedHopFeatures 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 = BlindedHopFeatures_clone(&val_conv);
+       ForwardTlvs_set_features(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ForwardTlvs_new(int64_t short_channel_id_arg, int64_t payment_relay_arg, int64_t payment_constraints_arg, int64_t features_arg) {
+       LDKPaymentRelay payment_relay_arg_conv;
+       payment_relay_arg_conv.inner = untag_ptr(payment_relay_arg);
+       payment_relay_arg_conv.is_owned = ptr_is_owned(payment_relay_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_relay_arg_conv);
+       payment_relay_arg_conv = PaymentRelay_clone(&payment_relay_arg_conv);
+       LDKPaymentConstraints payment_constraints_arg_conv;
+       payment_constraints_arg_conv.inner = untag_ptr(payment_constraints_arg);
+       payment_constraints_arg_conv.is_owned = ptr_is_owned(payment_constraints_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_constraints_arg_conv);
+       payment_constraints_arg_conv = PaymentConstraints_clone(&payment_constraints_arg_conv);
+       LDKBlindedHopFeatures features_arg_conv;
+       features_arg_conv.inner = untag_ptr(features_arg);
+       features_arg_conv.is_owned = ptr_is_owned(features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_arg_conv);
+       features_arg_conv = BlindedHopFeatures_clone(&features_arg_conv);
+       LDKForwardTlvs ret_var = ForwardTlvs_new(short_channel_id_arg, payment_relay_arg_conv, payment_constraints_arg_conv, features_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 ForwardTlvs_clone_ptr(LDKForwardTlvs *NONNULL_PTR arg) {
+       LDKForwardTlvs ret_var = ForwardTlvs_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_ForwardTlvs_clone_ptr(int64_t arg) {
+       LDKForwardTlvs 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 = ForwardTlvs_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ForwardTlvs_clone(int64_t orig) {
+       LDKForwardTlvs 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;
+       LDKForwardTlvs ret_var = ForwardTlvs_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_ReceiveTlvs_free(int64_t this_obj) {
+       LDKReceiveTlvs 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);
+       ReceiveTlvs_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ReceiveTlvs_get_payment_secret(int64_t this_ptr) {
+       LDKReceiveTlvs 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, *ReceiveTlvs_get_payment_secret(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ReceiveTlvs_set_payment_secret(int64_t this_ptr, int8_tArray val) {
+       LDKReceiveTlvs 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);
+       ReceiveTlvs_set_payment_secret(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ReceiveTlvs_get_payment_constraints(int64_t this_ptr) {
+       LDKReceiveTlvs 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;
+       LDKPaymentConstraints ret_var = ReceiveTlvs_get_payment_constraints(&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_ReceiveTlvs_set_payment_constraints(int64_t this_ptr, int64_t val) {
+       LDKReceiveTlvs 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;
+       LDKPaymentConstraints 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 = PaymentConstraints_clone(&val_conv);
+       ReceiveTlvs_set_payment_constraints(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ReceiveTlvs_new(int8_tArray payment_secret_arg, int64_t payment_constraints_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);
+       LDKPaymentConstraints payment_constraints_arg_conv;
+       payment_constraints_arg_conv.inner = untag_ptr(payment_constraints_arg);
+       payment_constraints_arg_conv.is_owned = ptr_is_owned(payment_constraints_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_constraints_arg_conv);
+       payment_constraints_arg_conv = PaymentConstraints_clone(&payment_constraints_arg_conv);
+       LDKReceiveTlvs ret_var = ReceiveTlvs_new(payment_secret_arg_ref, payment_constraints_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 ReceiveTlvs_clone_ptr(LDKReceiveTlvs *NONNULL_PTR arg) {
+       LDKReceiveTlvs ret_var = ReceiveTlvs_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_ReceiveTlvs_clone_ptr(int64_t arg) {
+       LDKReceiveTlvs 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 = ReceiveTlvs_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ReceiveTlvs_clone(int64_t orig) {
+       LDKReceiveTlvs 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;
+       LDKReceiveTlvs ret_var = ReceiveTlvs_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_PaymentRelay_free(int64_t this_obj) {
+       LDKPaymentRelay 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);
+       PaymentRelay_free(this_obj_conv);
+}
+
+int16_t  CS_LDK_PaymentRelay_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKPaymentRelay 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 = PaymentRelay_get_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentRelay_set_cltv_expiry_delta(int64_t this_ptr, int16_t val) {
+       LDKPaymentRelay 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;
+       PaymentRelay_set_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_PaymentRelay_get_fee_proportional_millionths(int64_t this_ptr) {
+       LDKPaymentRelay 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 = PaymentRelay_get_fee_proportional_millionths(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentRelay_set_fee_proportional_millionths(int64_t this_ptr, int32_t val) {
+       LDKPaymentRelay 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;
+       PaymentRelay_set_fee_proportional_millionths(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_PaymentRelay_get_fee_base_msat(int64_t this_ptr) {
+       LDKPaymentRelay 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 = PaymentRelay_get_fee_base_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentRelay_set_fee_base_msat(int64_t this_ptr, int32_t val) {
+       LDKPaymentRelay 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;
+       PaymentRelay_set_fee_base_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_PaymentRelay_new(int16_t cltv_expiry_delta_arg, int32_t fee_proportional_millionths_arg, int32_t fee_base_msat_arg) {
+       LDKPaymentRelay ret_var = PaymentRelay_new(cltv_expiry_delta_arg, fee_proportional_millionths_arg, fee_base_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 PaymentRelay_clone_ptr(LDKPaymentRelay *NONNULL_PTR arg) {
+       LDKPaymentRelay ret_var = PaymentRelay_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_PaymentRelay_clone_ptr(int64_t arg) {
+       LDKPaymentRelay 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 = PaymentRelay_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PaymentRelay_clone(int64_t orig) {
+       LDKPaymentRelay 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;
+       LDKPaymentRelay ret_var = PaymentRelay_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_PaymentConstraints_free(int64_t this_obj) {
+       LDKPaymentConstraints 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);
+       PaymentConstraints_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_PaymentConstraints_get_max_cltv_expiry(int64_t this_ptr) {
+       LDKPaymentConstraints 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 = PaymentConstraints_get_max_cltv_expiry(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentConstraints_set_max_cltv_expiry(int64_t this_ptr, int32_t val) {
+       LDKPaymentConstraints 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;
+       PaymentConstraints_set_max_cltv_expiry(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_PaymentConstraints_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKPaymentConstraints 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 = PaymentConstraints_get_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentConstraints_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKPaymentConstraints 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;
+       PaymentConstraints_set_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_PaymentConstraints_new(int32_t max_cltv_expiry_arg, int64_t htlc_minimum_msat_arg) {
+       LDKPaymentConstraints ret_var = PaymentConstraints_new(max_cltv_expiry_arg, htlc_minimum_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 PaymentConstraints_clone_ptr(LDKPaymentConstraints *NONNULL_PTR arg) {
+       LDKPaymentConstraints ret_var = PaymentConstraints_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_PaymentConstraints_clone_ptr(int64_t arg) {
+       LDKPaymentConstraints 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 = PaymentConstraints_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PaymentConstraints_clone(int64_t orig) {
+       LDKPaymentConstraints 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;
+       LDKPaymentConstraints ret_var = PaymentConstraints_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_ForwardTlvs_write(int64_t obj) {
+       LDKForwardTlvs 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 = ForwardTlvs_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;
+}
+
+int8_tArray  CS_LDK_ReceiveTlvs_write(int64_t obj) {
+       LDKReceiveTlvs 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 = ReceiveTlvs_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_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);
+       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 = PaymentRelay_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_PaymentRelay_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PaymentRelayDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentRelayDecodeErrorZ), "LDKCResult_PaymentRelayDecodeErrorZ");
+       *ret_conv = PaymentRelay_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_PaymentConstraints_write(int64_t obj) {
+       LDKPaymentConstraints 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 = PaymentConstraints_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_PaymentConstraints_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PaymentConstraintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentConstraintsDecodeErrorZ), "LDKCResult_PaymentConstraintsDecodeErrorZ");
+       *ret_conv = PaymentConstraints_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_PaymentPurpose_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);
+       LDKPaymentPurpose this_ptr_conv = *(LDKPaymentPurpose*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       PaymentPurpose_free(this_ptr_conv);
+}
+
+static inline uint64_t PaymentPurpose_clone_ptr(LDKPaymentPurpose *NONNULL_PTR arg) {
+       LDKPaymentPurpose *ret_copy = MALLOC(sizeof(LDKPaymentPurpose), "LDKPaymentPurpose");
+       *ret_copy = PaymentPurpose_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_PaymentPurpose_clone_ptr(int64_t arg) {
+       LDKPaymentPurpose* arg_conv = (LDKPaymentPurpose*)untag_ptr(arg);
+       int64_t ret_conv = PaymentPurpose_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PaymentPurpose_clone(int64_t orig) {
+       LDKPaymentPurpose* orig_conv = (LDKPaymentPurpose*)untag_ptr(orig);
+       LDKPaymentPurpose *ret_copy = MALLOC(sizeof(LDKPaymentPurpose), "LDKPaymentPurpose");
+       *ret_copy = PaymentPurpose_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PaymentPurpose_invoice_payment(int64_t payment_preimage, int8_tArray payment_secret) {
+       void* payment_preimage_ptr = untag_ptr(payment_preimage);
+       CHECK_ACCESS(payment_preimage_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_preimage_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_preimage_ptr);
+       payment_preimage_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_preimage));
+       LDKThirtyTwoBytes payment_secret_ref;
+       CHECK(payment_secret->arr_len == 32);
+       memcpy(payment_secret_ref.data, payment_secret->elems, 32); FREE(payment_secret);
+       LDKPaymentPurpose *ret_copy = MALLOC(sizeof(LDKPaymentPurpose), "LDKPaymentPurpose");
+       *ret_copy = PaymentPurpose_invoice_payment(payment_preimage_conv, payment_secret_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PaymentPurpose_spontaneous_payment(int8_tArray a) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKPaymentPurpose *ret_copy = MALLOC(sizeof(LDKPaymentPurpose), "LDKPaymentPurpose");
+       *ret_copy = PaymentPurpose_spontaneous_payment(a_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_PaymentPurpose_eq(int64_t a, int64_t b) {
+       LDKPaymentPurpose* a_conv = (LDKPaymentPurpose*)untag_ptr(a);
+       LDKPaymentPurpose* b_conv = (LDKPaymentPurpose*)untag_ptr(b);
+       jboolean ret_conv = PaymentPurpose_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_PaymentPurpose_write(int64_t obj) {
+       LDKPaymentPurpose* obj_conv = (LDKPaymentPurpose*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = PaymentPurpose_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_PaymentPurpose_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PaymentPurposeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentPurposeDecodeErrorZ), "LDKCResult_PaymentPurposeDecodeErrorZ");
+       *ret_conv = PaymentPurpose_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ClaimedHTLC_free(int64_t this_obj) {
+       LDKClaimedHTLC 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);
+       ClaimedHTLC_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ClaimedHTLC_get_channel_id(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;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *ClaimedHTLC_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ClaimedHTLC_set_channel_id(int64_t this_ptr, int8_tArray 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;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       ClaimedHTLC_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_ClaimedHTLC_get_user_channel_id(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;
+       int8_tArray ret_arr = init_int8_tArray(16, __LINE__);
+       memcpy(ret_arr->elems, ClaimedHTLC_get_user_channel_id(&this_ptr_conv).le_bytes, 16);
+       return ret_arr;
+}
+
+void  CS_LDK_ClaimedHTLC_set_user_channel_id(int64_t this_ptr, int8_tArray 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;
+       LDKU128 val_ref;
+       CHECK(val->arr_len == 16);
+       memcpy(val_ref.le_bytes, val->elems, 16); FREE(val);
+       ClaimedHTLC_set_user_channel_id(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_ClaimedHTLC_get_cltv_expiry(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;
+       int32_t ret_conv = ClaimedHTLC_get_cltv_expiry(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ClaimedHTLC_set_cltv_expiry(int64_t this_ptr, int32_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_cltv_expiry(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ClaimedHTLC_get_value_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_value_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ClaimedHTLC_set_value_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_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) {
+       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);
+       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 ClaimedHTLC_clone_ptr(LDKClaimedHTLC *NONNULL_PTR arg) {
+       LDKClaimedHTLC ret_var = ClaimedHTLC_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_ClaimedHTLC_clone_ptr(int64_t arg) {
+       LDKClaimedHTLC 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 = ClaimedHTLC_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ClaimedHTLC_clone(int64_t orig) {
+       LDKClaimedHTLC 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;
+       LDKClaimedHTLC ret_var = ClaimedHTLC_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_ClaimedHTLC_eq(int64_t a, int64_t b) {
+       LDKClaimedHTLC 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;
+       LDKClaimedHTLC 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 = ClaimedHTLC_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_ClaimedHTLC_write(int64_t obj) {
+       LDKClaimedHTLC 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 = ClaimedHTLC_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_ClaimedHTLC_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ClaimedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClaimedHTLCDecodeErrorZ), "LDKCResult_ClaimedHTLCDecodeErrorZ");
+       *ret_conv = ClaimedHTLC_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_PathFailure_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);
+       LDKPathFailure this_ptr_conv = *(LDKPathFailure*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       PathFailure_free(this_ptr_conv);
+}
+
+static inline uint64_t PathFailure_clone_ptr(LDKPathFailure *NONNULL_PTR arg) {
+       LDKPathFailure *ret_copy = MALLOC(sizeof(LDKPathFailure), "LDKPathFailure");
+       *ret_copy = PathFailure_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_PathFailure_clone_ptr(int64_t arg) {
+       LDKPathFailure* arg_conv = (LDKPathFailure*)untag_ptr(arg);
+       int64_t ret_conv = PathFailure_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PathFailure_clone(int64_t orig) {
+       LDKPathFailure* orig_conv = (LDKPathFailure*)untag_ptr(orig);
+       LDKPathFailure *ret_copy = MALLOC(sizeof(LDKPathFailure), "LDKPathFailure");
+       *ret_copy = PathFailure_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PathFailure_initial_send(int64_t err) {
+       void* err_ptr = untag_ptr(err);
+       CHECK_ACCESS(err_ptr);
+       LDKAPIError err_conv = *(LDKAPIError*)(err_ptr);
+       err_conv = APIError_clone((LDKAPIError*)untag_ptr(err));
+       LDKPathFailure *ret_copy = MALLOC(sizeof(LDKPathFailure), "LDKPathFailure");
+       *ret_copy = PathFailure_initial_send(err_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PathFailure_on_path(int64_t network_update) {
+       void* network_update_ptr = untag_ptr(network_update);
+       CHECK_ACCESS(network_update_ptr);
+       LDKCOption_NetworkUpdateZ network_update_conv = *(LDKCOption_NetworkUpdateZ*)(network_update_ptr);
+       network_update_conv = COption_NetworkUpdateZ_clone((LDKCOption_NetworkUpdateZ*)untag_ptr(network_update));
+       LDKPathFailure *ret_copy = MALLOC(sizeof(LDKPathFailure), "LDKPathFailure");
+       *ret_copy = PathFailure_on_path(network_update_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_PathFailure_eq(int64_t a, int64_t b) {
+       LDKPathFailure* a_conv = (LDKPathFailure*)untag_ptr(a);
+       LDKPathFailure* b_conv = (LDKPathFailure*)untag_ptr(b);
+       jboolean ret_conv = PathFailure_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_PathFailure_write(int64_t obj) {
+       LDKPathFailure* obj_conv = (LDKPathFailure*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = PathFailure_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_PathFailure_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_COption_PathFailureZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_PathFailureZDecodeErrorZ), "LDKCResult_COption_PathFailureZDecodeErrorZ");
+       *ret_conv = PathFailure_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ClosureReason_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);
+       LDKClosureReason this_ptr_conv = *(LDKClosureReason*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       ClosureReason_free(this_ptr_conv);
+}
+
+static inline uint64_t ClosureReason_clone_ptr(LDKClosureReason *NONNULL_PTR arg) {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_ClosureReason_clone_ptr(int64_t arg) {
+       LDKClosureReason* arg_conv = (LDKClosureReason*)untag_ptr(arg);
+       int64_t ret_conv = ClosureReason_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ClosureReason_clone(int64_t orig) {
+       LDKClosureReason* orig_conv = (LDKClosureReason*)untag_ptr(orig);
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_counterparty_force_closed(int64_t peer_msg) {
+       LDKUntrustedString peer_msg_conv;
+       peer_msg_conv.inner = untag_ptr(peer_msg);
+       peer_msg_conv.is_owned = ptr_is_owned(peer_msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(peer_msg_conv);
+       peer_msg_conv = UntrustedString_clone(&peer_msg_conv);
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_counterparty_force_closed(peer_msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_holder_force_closed() {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_holder_force_closed();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_cooperative_closure() {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_cooperative_closure();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_commitment_tx_confirmed() {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_commitment_tx_confirmed();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_funding_timed_out() {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_funding_timed_out();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_processing_error(jstring err) {
+       LDKStr err_conv = str_ref_to_owned_c(err);
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_processing_error(err_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_disconnected_peer() {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_disconnected_peer();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_outdated_channel_manager() {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_outdated_channel_manager();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_counterparty_coop_closed_unfunded_channel() {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_counterparty_coop_closed_unfunded_channel();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_funding_batch_closure() {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_funding_batch_closure();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_ClosureReason_eq(int64_t a, int64_t b) {
+       LDKClosureReason* a_conv = (LDKClosureReason*)untag_ptr(a);
+       LDKClosureReason* b_conv = (LDKClosureReason*)untag_ptr(b);
+       jboolean ret_conv = ClosureReason_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_ClosureReason_write(int64_t obj) {
+       LDKClosureReason* obj_conv = (LDKClosureReason*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = ClosureReason_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_ClosureReason_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_ClosureReasonZDecodeErrorZ), "LDKCResult_COption_ClosureReasonZDecodeErrorZ");
+       *ret_conv = ClosureReason_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_HTLCDestination_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);
+       LDKHTLCDestination this_ptr_conv = *(LDKHTLCDestination*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       HTLCDestination_free(this_ptr_conv);
+}
+
+static inline uint64_t HTLCDestination_clone_ptr(LDKHTLCDestination *NONNULL_PTR arg) {
+       LDKHTLCDestination *ret_copy = MALLOC(sizeof(LDKHTLCDestination), "LDKHTLCDestination");
+       *ret_copy = HTLCDestination_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_HTLCDestination_clone_ptr(int64_t arg) {
+       LDKHTLCDestination* arg_conv = (LDKHTLCDestination*)untag_ptr(arg);
+       int64_t ret_conv = HTLCDestination_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_HTLCDestination_clone(int64_t orig) {
+       LDKHTLCDestination* orig_conv = (LDKHTLCDestination*)untag_ptr(orig);
+       LDKHTLCDestination *ret_copy = MALLOC(sizeof(LDKHTLCDestination), "LDKHTLCDestination");
+       *ret_copy = HTLCDestination_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_HTLCDestination_next_hop_channel(int8_tArray node_id, int8_tArray channel_id) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKThirtyTwoBytes channel_id_ref;
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_ref.data, channel_id->elems, 32); FREE(channel_id);
+       LDKHTLCDestination *ret_copy = MALLOC(sizeof(LDKHTLCDestination), "LDKHTLCDestination");
+       *ret_copy = HTLCDestination_next_hop_channel(node_id_ref, channel_id_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_HTLCDestination_unknown_next_hop(int64_t requested_forward_scid) {
+       LDKHTLCDestination *ret_copy = MALLOC(sizeof(LDKHTLCDestination), "LDKHTLCDestination");
+       *ret_copy = HTLCDestination_unknown_next_hop(requested_forward_scid);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_HTLCDestination_invalid_forward(int64_t requested_forward_scid) {
+       LDKHTLCDestination *ret_copy = MALLOC(sizeof(LDKHTLCDestination), "LDKHTLCDestination");
+       *ret_copy = HTLCDestination_invalid_forward(requested_forward_scid);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_HTLCDestination_failed_payment(int8_tArray payment_hash) {
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKHTLCDestination *ret_copy = MALLOC(sizeof(LDKHTLCDestination), "LDKHTLCDestination");
+       *ret_copy = HTLCDestination_failed_payment(payment_hash_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_HTLCDestination_eq(int64_t a, int64_t b) {
+       LDKHTLCDestination* a_conv = (LDKHTLCDestination*)untag_ptr(a);
+       LDKHTLCDestination* b_conv = (LDKHTLCDestination*)untag_ptr(b);
+       jboolean ret_conv = HTLCDestination_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_HTLCDestination_write(int64_t obj) {
+       LDKHTLCDestination* obj_conv = (LDKHTLCDestination*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = HTLCDestination_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_HTLCDestination_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_HTLCDestinationZDecodeErrorZ), "LDKCResult_COption_HTLCDestinationZDecodeErrorZ");
+       *ret_conv = HTLCDestination_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int32_t  CS_LDK_PaymentFailureReason_clone(int64_t orig) {
+       LDKPaymentFailureReason* orig_conv = (LDKPaymentFailureReason*)untag_ptr(orig);
+       int32_t ret_conv = LDKPaymentFailureReason_to_cs(PaymentFailureReason_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_PaymentFailureReason_recipient_rejected() {
+       int32_t ret_conv = LDKPaymentFailureReason_to_cs(PaymentFailureReason_recipient_rejected());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_PaymentFailureReason_user_abandoned() {
+       int32_t ret_conv = LDKPaymentFailureReason_to_cs(PaymentFailureReason_user_abandoned());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_PaymentFailureReason_retries_exhausted() {
+       int32_t ret_conv = LDKPaymentFailureReason_to_cs(PaymentFailureReason_retries_exhausted());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_PaymentFailureReason_payment_expired() {
+       int32_t ret_conv = LDKPaymentFailureReason_to_cs(PaymentFailureReason_payment_expired());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_PaymentFailureReason_route_not_found() {
+       int32_t ret_conv = LDKPaymentFailureReason_to_cs(PaymentFailureReason_route_not_found());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_PaymentFailureReason_unexpected_error() {
+       int32_t ret_conv = LDKPaymentFailureReason_to_cs(PaymentFailureReason_unexpected_error());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_PaymentFailureReason_eq(int64_t a, int64_t b) {
+       LDKPaymentFailureReason* a_conv = (LDKPaymentFailureReason*)untag_ptr(a);
+       LDKPaymentFailureReason* b_conv = (LDKPaymentFailureReason*)untag_ptr(b);
+       jboolean ret_conv = PaymentFailureReason_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_PaymentFailureReason_write(int64_t obj) {
+       LDKPaymentFailureReason* obj_conv = (LDKPaymentFailureReason*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = PaymentFailureReason_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_PaymentFailureReason_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentFailureReasonDecodeErrorZ), "LDKCResult_PaymentFailureReasonDecodeErrorZ");
+       *ret_conv = PaymentFailureReason_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_Event_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);
+       LDKEvent this_ptr_conv = *(LDKEvent*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Event_free(this_ptr_conv);
+}
+
+static inline uint64_t Event_clone_ptr(LDKEvent *NONNULL_PTR arg) {
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_Event_clone_ptr(int64_t arg) {
+       LDKEvent* arg_conv = (LDKEvent*)untag_ptr(arg);
+       int64_t ret_conv = Event_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Event_clone(int64_t orig) {
+       LDKEvent* orig_conv = (LDKEvent*)untag_ptr(orig);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_funding_generation_ready(int8_tArray temporary_channel_id, int8_tArray counterparty_node_id, int64_t channel_value_satoshis, int8_tArray output_script, int8_tArray user_channel_id) {
+       LDKThirtyTwoBytes temporary_channel_id_ref;
+       CHECK(temporary_channel_id->arr_len == 32);
+       memcpy(temporary_channel_id_ref.data, temporary_channel_id->elems, 32); FREE(temporary_channel_id);
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKCVec_u8Z output_script_ref;
+       output_script_ref.datalen = output_script->arr_len;
+       output_script_ref.data = MALLOC(output_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(output_script_ref.data, output_script->elems, output_script_ref.datalen); FREE(output_script);
+       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);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_funding_generation_ready(temporary_channel_id_ref, counterparty_node_id_ref, channel_value_satoshis, output_script_ref, user_channel_id_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_payment_claimable(int8_tArray receiver_node_id, int8_tArray payment_hash, int64_t onion_fields, int64_t amount_msat, int64_t counterparty_skimmed_fee_msat, int64_t purpose, int64_t via_channel_id, int64_t via_user_channel_id, int64_t claim_deadline) {
+       LDKPublicKey receiver_node_id_ref;
+       CHECK(receiver_node_id->arr_len == 33);
+       memcpy(receiver_node_id_ref.compressed_form, receiver_node_id->elems, 33); FREE(receiver_node_id);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKRecipientOnionFields onion_fields_conv;
+       onion_fields_conv.inner = untag_ptr(onion_fields);
+       onion_fields_conv.is_owned = ptr_is_owned(onion_fields);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(onion_fields_conv);
+       onion_fields_conv = RecipientOnionFields_clone(&onion_fields_conv);
+       void* purpose_ptr = untag_ptr(purpose);
+       CHECK_ACCESS(purpose_ptr);
+       LDKPaymentPurpose purpose_conv = *(LDKPaymentPurpose*)(purpose_ptr);
+       purpose_conv = PaymentPurpose_clone((LDKPaymentPurpose*)untag_ptr(purpose));
+       void* via_channel_id_ptr = untag_ptr(via_channel_id);
+       CHECK_ACCESS(via_channel_id_ptr);
+       LDKCOption_ThirtyTwoBytesZ via_channel_id_conv = *(LDKCOption_ThirtyTwoBytesZ*)(via_channel_id_ptr);
+       via_channel_id_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(via_channel_id));
+       void* via_user_channel_id_ptr = untag_ptr(via_user_channel_id);
+       CHECK_ACCESS(via_user_channel_id_ptr);
+       LDKCOption_U128Z via_user_channel_id_conv = *(LDKCOption_U128Z*)(via_user_channel_id_ptr);
+       via_user_channel_id_conv = COption_U128Z_clone((LDKCOption_U128Z*)untag_ptr(via_user_channel_id));
+       void* claim_deadline_ptr = untag_ptr(claim_deadline);
+       CHECK_ACCESS(claim_deadline_ptr);
+       LDKCOption_u32Z claim_deadline_conv = *(LDKCOption_u32Z*)(claim_deadline_ptr);
+       claim_deadline_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(claim_deadline));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_payment_claimable(receiver_node_id_ref, payment_hash_ref, onion_fields_conv, amount_msat, counterparty_skimmed_fee_msat, purpose_conv, via_channel_id_conv, via_user_channel_id_conv, claim_deadline_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_payment_claimed(int8_tArray receiver_node_id, int8_tArray payment_hash, int64_t amount_msat, int64_t purpose, int64_tArray htlcs, int64_t sender_intended_total_msat) {
+       LDKPublicKey receiver_node_id_ref;
+       CHECK(receiver_node_id->arr_len == 33);
+       memcpy(receiver_node_id_ref.compressed_form, receiver_node_id->elems, 33); FREE(receiver_node_id);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       void* purpose_ptr = untag_ptr(purpose);
+       CHECK_ACCESS(purpose_ptr);
+       LDKPaymentPurpose purpose_conv = *(LDKPaymentPurpose*)(purpose_ptr);
+       purpose_conv = PaymentPurpose_clone((LDKPaymentPurpose*)untag_ptr(purpose));
+       LDKCVec_ClaimedHTLCZ htlcs_constr;
+       htlcs_constr.datalen = htlcs->arr_len;
+       if (htlcs_constr.datalen > 0)
+               htlcs_constr.data = MALLOC(htlcs_constr.datalen * sizeof(LDKClaimedHTLC), "LDKCVec_ClaimedHTLCZ Elements");
+       else
+               htlcs_constr.data = NULL;
+       int64_t* htlcs_vals = htlcs->elems;
+       for (size_t n = 0; n < htlcs_constr.datalen; n++) {
+               int64_t htlcs_conv_13 = htlcs_vals[n];
+               LDKClaimedHTLC htlcs_conv_13_conv;
+               htlcs_conv_13_conv.inner = untag_ptr(htlcs_conv_13);
+               htlcs_conv_13_conv.is_owned = ptr_is_owned(htlcs_conv_13);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(htlcs_conv_13_conv);
+               htlcs_conv_13_conv = ClaimedHTLC_clone(&htlcs_conv_13_conv);
+               htlcs_constr.data[n] = htlcs_conv_13_conv;
+       }
+       FREE(htlcs);
+       void* sender_intended_total_msat_ptr = untag_ptr(sender_intended_total_msat);
+       CHECK_ACCESS(sender_intended_total_msat_ptr);
+       LDKCOption_u64Z sender_intended_total_msat_conv = *(LDKCOption_u64Z*)(sender_intended_total_msat_ptr);
+       sender_intended_total_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(sender_intended_total_msat));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_payment_claimed(receiver_node_id_ref, payment_hash_ref, amount_msat, purpose_conv, htlcs_constr, sender_intended_total_msat_conv);
+       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);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_invoice_request_failed(payment_id_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_payment_sent(int64_t payment_id, int8_tArray payment_preimage, int8_tArray payment_hash, int64_t fee_paid_msat) {
+       void* payment_id_ptr = untag_ptr(payment_id);
+       CHECK_ACCESS(payment_id_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_id_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_id_ptr);
+       payment_id_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_id));
+       LDKThirtyTwoBytes payment_preimage_ref;
+       CHECK(payment_preimage->arr_len == 32);
+       memcpy(payment_preimage_ref.data, payment_preimage->elems, 32); FREE(payment_preimage);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       void* fee_paid_msat_ptr = untag_ptr(fee_paid_msat);
+       CHECK_ACCESS(fee_paid_msat_ptr);
+       LDKCOption_u64Z fee_paid_msat_conv = *(LDKCOption_u64Z*)(fee_paid_msat_ptr);
+       fee_paid_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(fee_paid_msat));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_payment_sent(payment_id_conv, payment_preimage_ref, payment_hash_ref, fee_paid_msat_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_payment_failed(int8_tArray payment_id, int8_tArray payment_hash, int64_t reason) {
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       void* reason_ptr = untag_ptr(reason);
+       CHECK_ACCESS(reason_ptr);
+       LDKCOption_PaymentFailureReasonZ reason_conv = *(LDKCOption_PaymentFailureReasonZ*)(reason_ptr);
+       reason_conv = COption_PaymentFailureReasonZ_clone((LDKCOption_PaymentFailureReasonZ*)untag_ptr(reason));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_payment_failed(payment_id_ref, payment_hash_ref, reason_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_payment_path_successful(int8_tArray payment_id, int64_t payment_hash, int64_t path) {
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       void* payment_hash_ptr = untag_ptr(payment_hash);
+       CHECK_ACCESS(payment_hash_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_hash_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_hash_ptr);
+       payment_hash_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_hash));
+       LDKPath 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 = Path_clone(&path_conv);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_payment_path_successful(payment_id_ref, payment_hash_conv, path_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_payment_path_failed(int64_t payment_id, int8_tArray payment_hash, jboolean payment_failed_permanently, int64_t failure, int64_t path, int64_t short_channel_id) {
+       void* payment_id_ptr = untag_ptr(payment_id);
+       CHECK_ACCESS(payment_id_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_id_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_id_ptr);
+       payment_id_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_id));
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       void* failure_ptr = untag_ptr(failure);
+       CHECK_ACCESS(failure_ptr);
+       LDKPathFailure failure_conv = *(LDKPathFailure*)(failure_ptr);
+       failure_conv = PathFailure_clone((LDKPathFailure*)untag_ptr(failure));
+       LDKPath 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 = Path_clone(&path_conv);
+       void* short_channel_id_ptr = untag_ptr(short_channel_id);
+       CHECK_ACCESS(short_channel_id_ptr);
+       LDKCOption_u64Z short_channel_id_conv = *(LDKCOption_u64Z*)(short_channel_id_ptr);
+       short_channel_id_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(short_channel_id));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_payment_path_failed(payment_id_conv, payment_hash_ref, payment_failed_permanently, failure_conv, path_conv, short_channel_id_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_probe_successful(int8_tArray payment_id, int8_tArray payment_hash, int64_t path) {
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKPath 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 = Path_clone(&path_conv);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_probe_successful(payment_id_ref, payment_hash_ref, path_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_probe_failed(int8_tArray payment_id, int8_tArray payment_hash, int64_t path, int64_t short_channel_id) {
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKPath 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 = Path_clone(&path_conv);
+       void* short_channel_id_ptr = untag_ptr(short_channel_id);
+       CHECK_ACCESS(short_channel_id_ptr);
+       LDKCOption_u64Z short_channel_id_conv = *(LDKCOption_u64Z*)(short_channel_id_ptr);
+       short_channel_id_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(short_channel_id));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_probe_failed(payment_id_ref, payment_hash_ref, path_conv, short_channel_id_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_pending_htlcs_forwardable(int64_t time_forwardable) {
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_pending_htlcs_forwardable(time_forwardable);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_htlcintercepted(int8_tArray intercept_id, int64_t requested_next_hop_scid, int8_tArray payment_hash, int64_t inbound_amount_msat, int64_t expected_outbound_amount_msat) {
+       LDKThirtyTwoBytes intercept_id_ref;
+       CHECK(intercept_id->arr_len == 32);
+       memcpy(intercept_id_ref.data, intercept_id->elems, 32); FREE(intercept_id);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_htlcintercepted(intercept_id_ref, requested_next_hop_scid, payment_hash_ref, inbound_amount_msat, expected_outbound_amount_msat);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_spendable_outputs(int64_tArray outputs, int64_t channel_id) {
+       LDKCVec_SpendableOutputDescriptorZ outputs_constr;
+       outputs_constr.datalen = outputs->arr_len;
+       if (outputs_constr.datalen > 0)
+               outputs_constr.data = MALLOC(outputs_constr.datalen * sizeof(LDKSpendableOutputDescriptor), "LDKCVec_SpendableOutputDescriptorZ Elements");
+       else
+               outputs_constr.data = NULL;
+       int64_t* outputs_vals = outputs->elems;
+       for (size_t b = 0; b < outputs_constr.datalen; b++) {
+               int64_t outputs_conv_27 = outputs_vals[b];
+               void* outputs_conv_27_ptr = untag_ptr(outputs_conv_27);
+               CHECK_ACCESS(outputs_conv_27_ptr);
+               LDKSpendableOutputDescriptor outputs_conv_27_conv = *(LDKSpendableOutputDescriptor*)(outputs_conv_27_ptr);
+               outputs_conv_27_conv = SpendableOutputDescriptor_clone((LDKSpendableOutputDescriptor*)untag_ptr(outputs_conv_27));
+               outputs_constr.data[b] = outputs_conv_27_conv;
+       }
+       FREE(outputs);
+       void* channel_id_ptr = untag_ptr(channel_id);
+       CHECK_ACCESS(channel_id_ptr);
+       LDKCOption_ThirtyTwoBytesZ channel_id_conv = *(LDKCOption_ThirtyTwoBytesZ*)(channel_id_ptr);
+       channel_id_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(channel_id));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_spendable_outputs(outputs_constr, channel_id_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_payment_forwarded(int64_t prev_channel_id, int64_t next_channel_id, int64_t fee_earned_msat, jboolean claim_from_onchain_tx, int64_t outbound_amount_forwarded_msat) {
+       void* prev_channel_id_ptr = untag_ptr(prev_channel_id);
+       CHECK_ACCESS(prev_channel_id_ptr);
+       LDKCOption_ThirtyTwoBytesZ prev_channel_id_conv = *(LDKCOption_ThirtyTwoBytesZ*)(prev_channel_id_ptr);
+       prev_channel_id_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(prev_channel_id));
+       void* next_channel_id_ptr = untag_ptr(next_channel_id);
+       CHECK_ACCESS(next_channel_id_ptr);
+       LDKCOption_ThirtyTwoBytesZ next_channel_id_conv = *(LDKCOption_ThirtyTwoBytesZ*)(next_channel_id_ptr);
+       next_channel_id_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(next_channel_id));
+       void* fee_earned_msat_ptr = untag_ptr(fee_earned_msat);
+       CHECK_ACCESS(fee_earned_msat_ptr);
+       LDKCOption_u64Z fee_earned_msat_conv = *(LDKCOption_u64Z*)(fee_earned_msat_ptr);
+       fee_earned_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(fee_earned_msat));
+       void* outbound_amount_forwarded_msat_ptr = untag_ptr(outbound_amount_forwarded_msat);
+       CHECK_ACCESS(outbound_amount_forwarded_msat_ptr);
+       LDKCOption_u64Z outbound_amount_forwarded_msat_conv = *(LDKCOption_u64Z*)(outbound_amount_forwarded_msat_ptr);
+       outbound_amount_forwarded_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(outbound_amount_forwarded_msat));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_payment_forwarded(prev_channel_id_conv, next_channel_id_conv, fee_earned_msat_conv, claim_from_onchain_tx, outbound_amount_forwarded_msat_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_channel_pending(int8_tArray channel_id, int8_tArray user_channel_id, int64_t former_temporary_channel_id, int8_tArray counterparty_node_id, int64_t funding_txo) {
+       LDKThirtyTwoBytes channel_id_ref;
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_ref.data, channel_id->elems, 32); FREE(channel_id);
+       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* former_temporary_channel_id_ptr = untag_ptr(former_temporary_channel_id);
+       CHECK_ACCESS(former_temporary_channel_id_ptr);
+       LDKCOption_ThirtyTwoBytesZ former_temporary_channel_id_conv = *(LDKCOption_ThirtyTwoBytesZ*)(former_temporary_channel_id_ptr);
+       former_temporary_channel_id_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(former_temporary_channel_id));
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKOutPoint funding_txo_conv;
+       funding_txo_conv.inner = untag_ptr(funding_txo);
+       funding_txo_conv.is_owned = ptr_is_owned(funding_txo);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_channel_pending(channel_id_ref, user_channel_id_ref, former_temporary_channel_id_conv, counterparty_node_id_ref, funding_txo_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_channel_ready(int8_tArray channel_id, int8_tArray user_channel_id, int8_tArray counterparty_node_id, int64_t channel_type) {
+       LDKThirtyTwoBytes channel_id_ref;
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_ref.data, channel_id->elems, 32); FREE(channel_id);
+       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);
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKChannelTypeFeatures channel_type_conv;
+       channel_type_conv.inner = untag_ptr(channel_type);
+       channel_type_conv.is_owned = ptr_is_owned(channel_type);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_conv);
+       channel_type_conv = ChannelTypeFeatures_clone(&channel_type_conv);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_channel_ready(channel_id_ref, user_channel_id_ref, counterparty_node_id_ref, channel_type_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       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) {
+       LDKThirtyTwoBytes channel_id_ref;
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_ref.data, channel_id->elems, 32); FREE(channel_id);
+       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* reason_ptr = untag_ptr(reason);
+       CHECK_ACCESS(reason_ptr);
+       LDKClosureReason reason_conv = *(LDKClosureReason*)(reason_ptr);
+       reason_conv = ClosureReason_clone((LDKClosureReason*)untag_ptr(reason));
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       void* channel_capacity_sats_ptr = untag_ptr(channel_capacity_sats);
+       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));
+       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);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_discard_funding(int8_tArray channel_id, int8_tArray transaction) {
+       LDKThirtyTwoBytes channel_id_ref;
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_ref.data, channel_id->elems, 32); FREE(channel_id);
+       LDKTransaction transaction_ref;
+       transaction_ref.datalen = transaction->arr_len;
+       transaction_ref.data = MALLOC(transaction_ref.datalen, "LDKTransaction Bytes");
+       memcpy(transaction_ref.data, transaction->elems, transaction_ref.datalen); FREE(transaction);
+       transaction_ref.data_is_owned = true;
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_discard_funding(channel_id_ref, transaction_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_open_channel_request(int8_tArray temporary_channel_id, int8_tArray counterparty_node_id, int64_t funding_satoshis, int64_t push_msat, int64_t channel_type) {
+       LDKThirtyTwoBytes temporary_channel_id_ref;
+       CHECK(temporary_channel_id->arr_len == 32);
+       memcpy(temporary_channel_id_ref.data, temporary_channel_id->elems, 32); FREE(temporary_channel_id);
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKChannelTypeFeatures channel_type_conv;
+       channel_type_conv.inner = untag_ptr(channel_type);
+       channel_type_conv.is_owned = ptr_is_owned(channel_type);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_conv);
+       channel_type_conv = ChannelTypeFeatures_clone(&channel_type_conv);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_open_channel_request(temporary_channel_id_ref, counterparty_node_id_ref, funding_satoshis, push_msat, channel_type_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_htlchandling_failed(int8_tArray prev_channel_id, int64_t failed_next_destination) {
+       LDKThirtyTwoBytes prev_channel_id_ref;
+       CHECK(prev_channel_id->arr_len == 32);
+       memcpy(prev_channel_id_ref.data, prev_channel_id->elems, 32); FREE(prev_channel_id);
+       void* failed_next_destination_ptr = untag_ptr(failed_next_destination);
+       CHECK_ACCESS(failed_next_destination_ptr);
+       LDKHTLCDestination failed_next_destination_conv = *(LDKHTLCDestination*)(failed_next_destination_ptr);
+       failed_next_destination_conv = HTLCDestination_clone((LDKHTLCDestination*)untag_ptr(failed_next_destination));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_htlchandling_failed(prev_channel_id_ref, failed_next_destination_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_bump_transaction(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKBumpTransactionEvent a_conv = *(LDKBumpTransactionEvent*)(a_ptr);
+       a_conv = BumpTransactionEvent_clone((LDKBumpTransactionEvent*)untag_ptr(a));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_bump_transaction(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_Event_eq(int64_t a, int64_t b) {
+       LDKEvent* a_conv = (LDKEvent*)untag_ptr(a);
+       LDKEvent* b_conv = (LDKEvent*)untag_ptr(b);
+       jboolean ret_conv = Event_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Event_write(int64_t obj) {
+       LDKEvent* obj_conv = (LDKEvent*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = Event_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_Event_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_COption_EventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_EventZDecodeErrorZ), "LDKCResult_COption_EventZDecodeErrorZ");
+       *ret_conv = Event_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_MessageSendEvent_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);
+       LDKMessageSendEvent this_ptr_conv = *(LDKMessageSendEvent*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       MessageSendEvent_free(this_ptr_conv);
+}
+
+static inline uint64_t MessageSendEvent_clone_ptr(LDKMessageSendEvent *NONNULL_PTR arg) {
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_MessageSendEvent_clone_ptr(int64_t arg) {
+       LDKMessageSendEvent* arg_conv = (LDKMessageSendEvent*)untag_ptr(arg);
+       int64_t ret_conv = MessageSendEvent_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_MessageSendEvent_clone(int64_t orig) {
+       LDKMessageSendEvent* orig_conv = (LDKMessageSendEvent*)untag_ptr(orig);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_accept_channel(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);
+       LDKAcceptChannel 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 = AcceptChannel_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_accept_channel(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_accept_channel_v2(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);
+       LDKAcceptChannelV2 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 = AcceptChannelV2_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_accept_channel_v2(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_open_channel(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);
+       LDKOpenChannel 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 = OpenChannel_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_open_channel(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_open_channel_v2(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);
+       LDKOpenChannelV2 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 = OpenChannelV2_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_open_channel_v2(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_funding_created(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);
+       LDKFundingCreated 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 = FundingCreated_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_funding_created(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_funding_signed(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);
+       LDKFundingSigned 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 = FundingSigned_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_funding_signed(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);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKTxAddInput 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 = TxAddInput_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_add_input(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_output(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);
+       LDKTxAddOutput 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 = TxAddOutput_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_add_output(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_tx_remove_input(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);
+       LDKTxRemoveInput 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 = TxRemoveInput_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_remove_input(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_tx_remove_output(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);
+       LDKTxRemoveOutput 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 = TxRemoveOutput_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_remove_output(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_tx_complete(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);
+       LDKTxComplete 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 = TxComplete_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_complete(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_tx_signatures(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);
+       LDKTxSignatures 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 = TxSignatures_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_signatures(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_tx_init_rbf(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);
+       LDKTxInitRbf 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 = TxInitRbf_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_init_rbf(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_tx_ack_rbf(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);
+       LDKTxAckRbf 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 = TxAckRbf_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_ack_rbf(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_tx_abort(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);
+       LDKTxAbort 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 = TxAbort_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_abort(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_channel_ready(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);
+       LDKChannelReady 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 = ChannelReady_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_channel_ready(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_announcement_signatures(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);
+       LDKAnnouncementSignatures 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 = AnnouncementSignatures_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_announcement_signatures(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_update_htlcs(int8_tArray node_id, int64_t updates) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKCommitmentUpdate updates_conv;
+       updates_conv.inner = untag_ptr(updates);
+       updates_conv.is_owned = ptr_is_owned(updates);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(updates_conv);
+       updates_conv = CommitmentUpdate_clone(&updates_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_update_htlcs(node_id_ref, updates_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_revoke_and_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);
+       LDKRevokeAndACK 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 = RevokeAndACK_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_revoke_and_ack(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_closing_signed(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);
+       LDKClosingSigned 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 = ClosingSigned_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_closing_signed(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_shutdown(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);
+       LDKShutdown 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 = Shutdown_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_shutdown(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_channel_reestablish(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);
+       LDKChannelReestablish 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 = ChannelReestablish_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_channel_reestablish(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_channel_announcement(int8_tArray node_id, int64_t msg, int64_t update_msg) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKChannelAnnouncement 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 = ChannelAnnouncement_clone(&msg_conv);
+       LDKChannelUpdate update_msg_conv;
+       update_msg_conv.inner = untag_ptr(update_msg);
+       update_msg_conv.is_owned = ptr_is_owned(update_msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_msg_conv);
+       update_msg_conv = ChannelUpdate_clone(&update_msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_channel_announcement(node_id_ref, msg_conv, update_msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_broadcast_channel_announcement(int64_t msg, int64_t update_msg) {
+       LDKChannelAnnouncement 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 = ChannelAnnouncement_clone(&msg_conv);
+       LDKChannelUpdate update_msg_conv;
+       update_msg_conv.inner = untag_ptr(update_msg);
+       update_msg_conv.is_owned = ptr_is_owned(update_msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_msg_conv);
+       update_msg_conv = ChannelUpdate_clone(&update_msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_broadcast_channel_announcement(msg_conv, update_msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_broadcast_channel_update(int64_t msg) {
+       LDKChannelUpdate 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 = ChannelUpdate_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_broadcast_channel_update(msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_broadcast_node_announcement(int64_t msg) {
+       LDKNodeAnnouncement 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 = NodeAnnouncement_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_broadcast_node_announcement(msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_channel_update(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);
+       LDKChannelUpdate 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 = ChannelUpdate_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_channel_update(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_handle_error(int8_tArray node_id, int64_t action) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       void* action_ptr = untag_ptr(action);
+       CHECK_ACCESS(action_ptr);
+       LDKErrorAction action_conv = *(LDKErrorAction*)(action_ptr);
+       action_conv = ErrorAction_clone((LDKErrorAction*)untag_ptr(action));
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_handle_error(node_id_ref, action_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_channel_range_query(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);
+       LDKQueryChannelRange 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 = QueryChannelRange_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_channel_range_query(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_short_ids_query(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);
+       LDKQueryShortChannelIds 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 = QueryShortChannelIds_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_short_ids_query(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_reply_channel_range(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);
+       LDKReplyChannelRange 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 = ReplyChannelRange_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_reply_channel_range(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_gossip_timestamp_filter(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);
+       LDKGossipTimestampFilter 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 = GossipTimestampFilter_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_gossip_timestamp_filter(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_MessageSendEventsProvider_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);
+       LDKMessageSendEventsProvider this_ptr_conv = *(LDKMessageSendEventsProvider*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       MessageSendEventsProvider_free(this_ptr_conv);
+}
+
+void  CS_LDK_EventsProvider_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);
+       LDKEventsProvider this_ptr_conv = *(LDKEventsProvider*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       EventsProvider_free(this_ptr_conv);
+}
+
+void  CS_LDK_EventHandler_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);
+       LDKEventHandler this_ptr_conv = *(LDKEventHandler*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       EventHandler_free(this_ptr_conv);
+}
+
+void  CS_LDK_AnchorDescriptor_free(int64_t this_obj) {
+       LDKAnchorDescriptor 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);
+       AnchorDescriptor_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_AnchorDescriptor_get_channel_derivation_parameters(int64_t this_ptr) {
+       LDKAnchorDescriptor 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;
+       LDKChannelDerivationParameters ret_var = AnchorDescriptor_get_channel_derivation_parameters(&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_AnchorDescriptor_set_channel_derivation_parameters(int64_t this_ptr, int64_t val) {
+       LDKAnchorDescriptor 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;
+       LDKChannelDerivationParameters 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 = ChannelDerivationParameters_clone(&val_conv);
+       AnchorDescriptor_set_channel_derivation_parameters(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_AnchorDescriptor_get_outpoint(int64_t this_ptr) {
+       LDKAnchorDescriptor 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;
+       LDKOutPoint ret_var = AnchorDescriptor_get_outpoint(&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_AnchorDescriptor_set_outpoint(int64_t this_ptr, int64_t val) {
+       LDKAnchorDescriptor 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;
+       LDKOutPoint 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 = OutPoint_clone(&val_conv);
+       AnchorDescriptor_set_outpoint(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_AnchorDescriptor_new(int64_t channel_derivation_parameters_arg, int64_t outpoint_arg) {
+       LDKChannelDerivationParameters channel_derivation_parameters_arg_conv;
+       channel_derivation_parameters_arg_conv.inner = untag_ptr(channel_derivation_parameters_arg);
+       channel_derivation_parameters_arg_conv.is_owned = ptr_is_owned(channel_derivation_parameters_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_derivation_parameters_arg_conv);
+       channel_derivation_parameters_arg_conv = ChannelDerivationParameters_clone(&channel_derivation_parameters_arg_conv);
+       LDKOutPoint outpoint_arg_conv;
+       outpoint_arg_conv.inner = untag_ptr(outpoint_arg);
+       outpoint_arg_conv.is_owned = ptr_is_owned(outpoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_arg_conv);
+       outpoint_arg_conv = OutPoint_clone(&outpoint_arg_conv);
+       LDKAnchorDescriptor ret_var = AnchorDescriptor_new(channel_derivation_parameters_arg_conv, outpoint_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 AnchorDescriptor_clone_ptr(LDKAnchorDescriptor *NONNULL_PTR arg) {
+       LDKAnchorDescriptor ret_var = AnchorDescriptor_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_AnchorDescriptor_clone_ptr(int64_t arg) {
+       LDKAnchorDescriptor 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 = AnchorDescriptor_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_AnchorDescriptor_clone(int64_t orig) {
+       LDKAnchorDescriptor 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;
+       LDKAnchorDescriptor ret_var = AnchorDescriptor_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_AnchorDescriptor_eq(int64_t a, int64_t b) {
+       LDKAnchorDescriptor 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;
+       LDKAnchorDescriptor 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 = AnchorDescriptor_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_AnchorDescriptor_previous_utxo(int64_t this_arg) {
+       LDKAnchorDescriptor 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;
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = AnchorDescriptor_previous_utxo(&this_arg_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+int64_t  CS_LDK_AnchorDescriptor_unsigned_tx_input(int64_t this_arg) {
+       LDKAnchorDescriptor 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;
+       LDKTxIn* ret_ref = MALLOC(sizeof(LDKTxIn), "LDKTxIn");
+       *ret_ref = AnchorDescriptor_unsigned_tx_input(&this_arg_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+int8_tArray  CS_LDK_AnchorDescriptor_witness_script(int64_t this_arg) {
+       LDKAnchorDescriptor 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;
+       LDKCVec_u8Z ret_var = AnchorDescriptor_witness_script(&this_arg_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;
+}
+
+int8_tArray  CS_LDK_AnchorDescriptor_tx_input_witness(int64_t this_arg, int8_tArray signature) {
+       LDKAnchorDescriptor 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;
+       LDKECDSASignature signature_ref;
+       CHECK(signature->arr_len == 64);
+       memcpy(signature_ref.compact_form, signature->elems, 64); FREE(signature);
+       LDKWitness ret_var = AnchorDescriptor_tx_input_witness(&this_arg_conv, signature_ref);
+       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;
+}
+
+int64_t  CS_LDK_AnchorDescriptor_derive_channel_signer(int64_t this_arg, int64_t signer_provider) {
+       LDKAnchorDescriptor 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;
+       void* signer_provider_ptr = untag_ptr(signer_provider);
+       if (ptr_is_owned(signer_provider)) { CHECK_ACCESS(signer_provider_ptr); }
+       LDKSignerProvider* signer_provider_conv = (LDKSignerProvider*)signer_provider_ptr;
+       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
+       *ret_ret = AnchorDescriptor_derive_channel_signer(&this_arg_conv, signer_provider_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_BumpTransactionEvent_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);
+       LDKBumpTransactionEvent this_ptr_conv = *(LDKBumpTransactionEvent*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       BumpTransactionEvent_free(this_ptr_conv);
+}
+
+static inline uint64_t BumpTransactionEvent_clone_ptr(LDKBumpTransactionEvent *NONNULL_PTR arg) {
+       LDKBumpTransactionEvent *ret_copy = MALLOC(sizeof(LDKBumpTransactionEvent), "LDKBumpTransactionEvent");
+       *ret_copy = BumpTransactionEvent_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_BumpTransactionEvent_clone_ptr(int64_t arg) {
+       LDKBumpTransactionEvent* arg_conv = (LDKBumpTransactionEvent*)untag_ptr(arg);
+       int64_t ret_conv = BumpTransactionEvent_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BumpTransactionEvent_clone(int64_t orig) {
+       LDKBumpTransactionEvent* orig_conv = (LDKBumpTransactionEvent*)untag_ptr(orig);
+       LDKBumpTransactionEvent *ret_copy = MALLOC(sizeof(LDKBumpTransactionEvent), "LDKBumpTransactionEvent");
+       *ret_copy = BumpTransactionEvent_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_BumpTransactionEvent_channel_close(int8_tArray claim_id, int32_t package_target_feerate_sat_per_1000_weight, int8_tArray commitment_tx, int64_t commitment_tx_fee_satoshis, int64_t anchor_descriptor, int64_tArray pending_htlcs) {
+       LDKThirtyTwoBytes claim_id_ref;
+       CHECK(claim_id->arr_len == 32);
+       memcpy(claim_id_ref.data, claim_id->elems, 32); FREE(claim_id);
+       LDKTransaction commitment_tx_ref;
+       commitment_tx_ref.datalen = commitment_tx->arr_len;
+       commitment_tx_ref.data = MALLOC(commitment_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(commitment_tx_ref.data, commitment_tx->elems, commitment_tx_ref.datalen); FREE(commitment_tx);
+       commitment_tx_ref.data_is_owned = true;
+       LDKAnchorDescriptor anchor_descriptor_conv;
+       anchor_descriptor_conv.inner = untag_ptr(anchor_descriptor);
+       anchor_descriptor_conv.is_owned = ptr_is_owned(anchor_descriptor);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(anchor_descriptor_conv);
+       anchor_descriptor_conv = AnchorDescriptor_clone(&anchor_descriptor_conv);
+       LDKCVec_HTLCOutputInCommitmentZ pending_htlcs_constr;
+       pending_htlcs_constr.datalen = pending_htlcs->arr_len;
+       if (pending_htlcs_constr.datalen > 0)
+               pending_htlcs_constr.data = MALLOC(pending_htlcs_constr.datalen * sizeof(LDKHTLCOutputInCommitment), "LDKCVec_HTLCOutputInCommitmentZ Elements");
+       else
+               pending_htlcs_constr.data = NULL;
+       int64_t* pending_htlcs_vals = pending_htlcs->elems;
+       for (size_t y = 0; y < pending_htlcs_constr.datalen; y++) {
+               int64_t pending_htlcs_conv_24 = pending_htlcs_vals[y];
+               LDKHTLCOutputInCommitment pending_htlcs_conv_24_conv;
+               pending_htlcs_conv_24_conv.inner = untag_ptr(pending_htlcs_conv_24);
+               pending_htlcs_conv_24_conv.is_owned = ptr_is_owned(pending_htlcs_conv_24);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(pending_htlcs_conv_24_conv);
+               pending_htlcs_conv_24_conv = HTLCOutputInCommitment_clone(&pending_htlcs_conv_24_conv);
+               pending_htlcs_constr.data[y] = pending_htlcs_conv_24_conv;
+       }
+       FREE(pending_htlcs);
+       LDKBumpTransactionEvent *ret_copy = MALLOC(sizeof(LDKBumpTransactionEvent), "LDKBumpTransactionEvent");
+       *ret_copy = BumpTransactionEvent_channel_close(claim_id_ref, package_target_feerate_sat_per_1000_weight, commitment_tx_ref, commitment_tx_fee_satoshis, anchor_descriptor_conv, pending_htlcs_constr);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_BumpTransactionEvent_htlcresolution(int8_tArray claim_id, int32_t target_feerate_sat_per_1000_weight, int64_tArray htlc_descriptors, int32_t tx_lock_time) {
+       LDKThirtyTwoBytes claim_id_ref;
+       CHECK(claim_id->arr_len == 32);
+       memcpy(claim_id_ref.data, claim_id->elems, 32); FREE(claim_id);
+       LDKCVec_HTLCDescriptorZ htlc_descriptors_constr;
+       htlc_descriptors_constr.datalen = htlc_descriptors->arr_len;
+       if (htlc_descriptors_constr.datalen > 0)
+               htlc_descriptors_constr.data = MALLOC(htlc_descriptors_constr.datalen * sizeof(LDKHTLCDescriptor), "LDKCVec_HTLCDescriptorZ Elements");
+       else
+               htlc_descriptors_constr.data = NULL;
+       int64_t* htlc_descriptors_vals = htlc_descriptors->elems;
+       for (size_t q = 0; q < htlc_descriptors_constr.datalen; q++) {
+               int64_t htlc_descriptors_conv_16 = htlc_descriptors_vals[q];
+               LDKHTLCDescriptor htlc_descriptors_conv_16_conv;
+               htlc_descriptors_conv_16_conv.inner = untag_ptr(htlc_descriptors_conv_16);
+               htlc_descriptors_conv_16_conv.is_owned = ptr_is_owned(htlc_descriptors_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_descriptors_conv_16_conv);
+               htlc_descriptors_conv_16_conv = HTLCDescriptor_clone(&htlc_descriptors_conv_16_conv);
+               htlc_descriptors_constr.data[q] = htlc_descriptors_conv_16_conv;
+       }
+       FREE(htlc_descriptors);
+       LDKBumpTransactionEvent *ret_copy = MALLOC(sizeof(LDKBumpTransactionEvent), "LDKBumpTransactionEvent");
+       *ret_copy = BumpTransactionEvent_htlcresolution(claim_id_ref, target_feerate_sat_per_1000_weight, htlc_descriptors_constr, tx_lock_time);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_BumpTransactionEvent_eq(int64_t a, int64_t b) {
+       LDKBumpTransactionEvent* a_conv = (LDKBumpTransactionEvent*)untag_ptr(a);
+       LDKBumpTransactionEvent* b_conv = (LDKBumpTransactionEvent*)untag_ptr(b);
+       jboolean ret_conv = BumpTransactionEvent_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Input_free(int64_t this_obj) {
+       LDKInput 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);
+       Input_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_Input_get_outpoint(int64_t this_ptr) {
+       LDKInput 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;
+       LDKOutPoint ret_var = Input_get_outpoint(&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_Input_set_outpoint(int64_t this_ptr, int64_t val) {
+       LDKInput 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;
+       LDKOutPoint 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 = OutPoint_clone(&val_conv);
+       Input_set_outpoint(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Input_get_previous_utxo(int64_t this_ptr) {
+       LDKInput 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;
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = Input_get_previous_utxo(&this_ptr_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+void  CS_LDK_Input_set_previous_utxo(int64_t this_ptr, int64_t val) {
+       LDKInput 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);
+       LDKTxOut val_conv = *(LDKTxOut*)(val_ptr);
+       val_conv = TxOut_clone((LDKTxOut*)untag_ptr(val));
+       Input_set_previous_utxo(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Input_get_satisfaction_weight(int64_t this_ptr) {
+       LDKInput 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 = Input_get_satisfaction_weight(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Input_set_satisfaction_weight(int64_t this_ptr, int64_t val) {
+       LDKInput 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;
+       Input_set_satisfaction_weight(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_Input_new(int64_t outpoint_arg, int64_t previous_utxo_arg, int64_t satisfaction_weight_arg) {
+       LDKOutPoint outpoint_arg_conv;
+       outpoint_arg_conv.inner = untag_ptr(outpoint_arg);
+       outpoint_arg_conv.is_owned = ptr_is_owned(outpoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_arg_conv);
+       outpoint_arg_conv = OutPoint_clone(&outpoint_arg_conv);
+       void* previous_utxo_arg_ptr = untag_ptr(previous_utxo_arg);
+       CHECK_ACCESS(previous_utxo_arg_ptr);
+       LDKTxOut previous_utxo_arg_conv = *(LDKTxOut*)(previous_utxo_arg_ptr);
+       previous_utxo_arg_conv = TxOut_clone((LDKTxOut*)untag_ptr(previous_utxo_arg));
+       LDKInput ret_var = Input_new(outpoint_arg_conv, previous_utxo_arg_conv, satisfaction_weight_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 Input_clone_ptr(LDKInput *NONNULL_PTR arg) {
+       LDKInput ret_var = Input_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_Input_clone_ptr(int64_t arg) {
+       LDKInput 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 = Input_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Input_clone(int64_t orig) {
+       LDKInput 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;
+       LDKInput ret_var = Input_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_Input_hash(int64_t o) {
+       LDKInput 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 = Input_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Input_eq(int64_t a, int64_t b) {
+       LDKInput 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;
+       LDKInput 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 = Input_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Utxo_free(int64_t this_obj) {
+       LDKUtxo 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);
+       Utxo_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_Utxo_get_outpoint(int64_t this_ptr) {
+       LDKUtxo 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;
+       LDKOutPoint ret_var = Utxo_get_outpoint(&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_Utxo_set_outpoint(int64_t this_ptr, int64_t val) {
+       LDKUtxo 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;
+       LDKOutPoint 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 = OutPoint_clone(&val_conv);
+       Utxo_set_outpoint(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Utxo_get_output(int64_t this_ptr) {
+       LDKUtxo 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;
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = Utxo_get_output(&this_ptr_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+void  CS_LDK_Utxo_set_output(int64_t this_ptr, int64_t val) {
+       LDKUtxo 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);
+       LDKTxOut val_conv = *(LDKTxOut*)(val_ptr);
+       val_conv = TxOut_clone((LDKTxOut*)untag_ptr(val));
+       Utxo_set_output(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Utxo_get_satisfaction_weight(int64_t this_ptr) {
+       LDKUtxo 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 = Utxo_get_satisfaction_weight(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Utxo_set_satisfaction_weight(int64_t this_ptr, int64_t val) {
+       LDKUtxo 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;
+       Utxo_set_satisfaction_weight(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_Utxo_new(int64_t outpoint_arg, int64_t output_arg, int64_t satisfaction_weight_arg) {
+       LDKOutPoint outpoint_arg_conv;
+       outpoint_arg_conv.inner = untag_ptr(outpoint_arg);
+       outpoint_arg_conv.is_owned = ptr_is_owned(outpoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_arg_conv);
+       outpoint_arg_conv = OutPoint_clone(&outpoint_arg_conv);
+       void* output_arg_ptr = untag_ptr(output_arg);
+       CHECK_ACCESS(output_arg_ptr);
+       LDKTxOut output_arg_conv = *(LDKTxOut*)(output_arg_ptr);
+       output_arg_conv = TxOut_clone((LDKTxOut*)untag_ptr(output_arg));
+       LDKUtxo ret_var = Utxo_new(outpoint_arg_conv, output_arg_conv, satisfaction_weight_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 Utxo_clone_ptr(LDKUtxo *NONNULL_PTR arg) {
+       LDKUtxo ret_var = Utxo_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_Utxo_clone_ptr(int64_t arg) {
+       LDKUtxo 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 = Utxo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Utxo_clone(int64_t orig) {
+       LDKUtxo 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;
+       LDKUtxo ret_var = Utxo_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_Utxo_hash(int64_t o) {
+       LDKUtxo 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 = Utxo_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Utxo_eq(int64_t a, int64_t b) {
+       LDKUtxo 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;
+       LDKUtxo 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 = Utxo_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Utxo_new_p2pkh(int64_t outpoint, int64_t value, int8_tArray pubkey_hash) {
+       LDKOutPoint outpoint_conv;
+       outpoint_conv.inner = untag_ptr(outpoint);
+       outpoint_conv.is_owned = ptr_is_owned(outpoint);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_conv);
+       outpoint_conv = OutPoint_clone(&outpoint_conv);
+       uint8_t pubkey_hash_arr[20];
+       CHECK(pubkey_hash->arr_len == 20);
+       memcpy(pubkey_hash_arr, pubkey_hash->elems, 20); FREE(pubkey_hash);
+       uint8_t (*pubkey_hash_ref)[20] = &pubkey_hash_arr;
+       LDKUtxo ret_var = Utxo_new_p2pkh(outpoint_conv, value, pubkey_hash_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;
+}
+
+void  CS_LDK_CoinSelection_free(int64_t this_obj) {
+       LDKCoinSelection 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);
+       CoinSelection_free(this_obj_conv);
+}
+
+int64_tArray  CS_LDK_CoinSelection_get_confirmed_utxos(int64_t this_ptr) {
+       LDKCoinSelection 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_UtxoZ ret_var = CoinSelection_get_confirmed_utxos(&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++) {
+               LDKUtxo ret_conv_6_var = ret_var.data[g];
+               int64_t ret_conv_6_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_6_var);
+               ret_conv_6_ref = tag_ptr(ret_conv_6_var.inner, ret_conv_6_var.is_owned);
+               ret_arr_ptr[g] = ret_conv_6_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_CoinSelection_set_confirmed_utxos(int64_t this_ptr, int64_tArray val) {
+       LDKCoinSelection 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_UtxoZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKUtxo), "LDKCVec_UtxoZ 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];
+               LDKUtxo val_conv_6_conv;
+               val_conv_6_conv.inner = untag_ptr(val_conv_6);
+               val_conv_6_conv.is_owned = ptr_is_owned(val_conv_6);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_6_conv);
+               val_conv_6_conv = Utxo_clone(&val_conv_6_conv);
+               val_constr.data[g] = val_conv_6_conv;
+       }
+       FREE(val);
+       CoinSelection_set_confirmed_utxos(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_CoinSelection_get_change_output(int64_t this_ptr) {
+       LDKCoinSelection 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_TxOutZ *ret_copy = MALLOC(sizeof(LDKCOption_TxOutZ), "LDKCOption_TxOutZ");
+       *ret_copy = CoinSelection_get_change_output(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CoinSelection_set_change_output(int64_t this_ptr, int64_t val) {
+       LDKCoinSelection 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_TxOutZ val_conv = *(LDKCOption_TxOutZ*)(val_ptr);
+       val_conv = COption_TxOutZ_clone((LDKCOption_TxOutZ*)untag_ptr(val));
+       CoinSelection_set_change_output(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_CoinSelection_new(int64_tArray confirmed_utxos_arg, int64_t change_output_arg) {
+       LDKCVec_UtxoZ confirmed_utxos_arg_constr;
+       confirmed_utxos_arg_constr.datalen = confirmed_utxos_arg->arr_len;
+       if (confirmed_utxos_arg_constr.datalen > 0)
+               confirmed_utxos_arg_constr.data = MALLOC(confirmed_utxos_arg_constr.datalen * sizeof(LDKUtxo), "LDKCVec_UtxoZ Elements");
+       else
+               confirmed_utxos_arg_constr.data = NULL;
+       int64_t* confirmed_utxos_arg_vals = confirmed_utxos_arg->elems;
+       for (size_t g = 0; g < confirmed_utxos_arg_constr.datalen; g++) {
+               int64_t confirmed_utxos_arg_conv_6 = confirmed_utxos_arg_vals[g];
+               LDKUtxo confirmed_utxos_arg_conv_6_conv;
+               confirmed_utxos_arg_conv_6_conv.inner = untag_ptr(confirmed_utxos_arg_conv_6);
+               confirmed_utxos_arg_conv_6_conv.is_owned = ptr_is_owned(confirmed_utxos_arg_conv_6);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(confirmed_utxos_arg_conv_6_conv);
+               confirmed_utxos_arg_conv_6_conv = Utxo_clone(&confirmed_utxos_arg_conv_6_conv);
+               confirmed_utxos_arg_constr.data[g] = confirmed_utxos_arg_conv_6_conv;
+       }
+       FREE(confirmed_utxos_arg);
+       void* change_output_arg_ptr = untag_ptr(change_output_arg);
+       CHECK_ACCESS(change_output_arg_ptr);
+       LDKCOption_TxOutZ change_output_arg_conv = *(LDKCOption_TxOutZ*)(change_output_arg_ptr);
+       change_output_arg_conv = COption_TxOutZ_clone((LDKCOption_TxOutZ*)untag_ptr(change_output_arg));
+       LDKCoinSelection ret_var = CoinSelection_new(confirmed_utxos_arg_constr, change_output_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 CoinSelection_clone_ptr(LDKCoinSelection *NONNULL_PTR arg) {
+       LDKCoinSelection ret_var = CoinSelection_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_CoinSelection_clone_ptr(int64_t arg) {
+       LDKCoinSelection 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 = CoinSelection_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CoinSelection_clone(int64_t orig) {
+       LDKCoinSelection 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;
+       LDKCoinSelection ret_var = CoinSelection_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_CoinSelectionSource_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);
+       LDKCoinSelectionSource this_ptr_conv = *(LDKCoinSelectionSource*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       CoinSelectionSource_free(this_ptr_conv);
+}
+
+void  CS_LDK_WalletSource_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);
+       LDKWalletSource this_ptr_conv = *(LDKWalletSource*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       WalletSource_free(this_ptr_conv);
+}
+
+void  CS_LDK_Wallet_free(int64_t this_obj) {
+       LDKWallet 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);
+       Wallet_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_Wallet_new(int64_t source, int64_t logger) {
+       void* source_ptr = untag_ptr(source);
+       CHECK_ACCESS(source_ptr);
+       LDKWalletSource source_conv = *(LDKWalletSource*)(source_ptr);
+       if (source_conv.free == LDKWalletSource_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKWalletSource_JCalls_cloned(&source_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);
+       }
+       LDKWallet ret_var = Wallet_new(source_conv, logger_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_Wallet_as_CoinSelectionSource(int64_t this_arg) {
+       LDKWallet 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;
+       LDKCoinSelectionSource* ret_ret = MALLOC(sizeof(LDKCoinSelectionSource), "LDKCoinSelectionSource");
+       *ret_ret = Wallet_as_CoinSelectionSource(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_BumpTransactionEventHandler_free(int64_t this_obj) {
+       LDKBumpTransactionEventHandler 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);
+       BumpTransactionEventHandler_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_BumpTransactionEventHandler_new(int64_t broadcaster, int64_t utxo_source, int64_t signer_provider, int64_t logger) {
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       CHECK_ACCESS(broadcaster_ptr);
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(broadcaster_ptr);
+       if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&broadcaster_conv);
+       }
+       void* utxo_source_ptr = untag_ptr(utxo_source);
+       CHECK_ACCESS(utxo_source_ptr);
+       LDKCoinSelectionSource utxo_source_conv = *(LDKCoinSelectionSource*)(utxo_source_ptr);
+       if (utxo_source_conv.free == LDKCoinSelectionSource_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKCoinSelectionSource_JCalls_cloned(&utxo_source_conv);
+       }
+       void* signer_provider_ptr = untag_ptr(signer_provider);
+       CHECK_ACCESS(signer_provider_ptr);
+       LDKSignerProvider signer_provider_conv = *(LDKSignerProvider*)(signer_provider_ptr);
+       if (signer_provider_conv.free == LDKSignerProvider_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKSignerProvider_JCalls_cloned(&signer_provider_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);
+       }
+       LDKBumpTransactionEventHandler ret_var = BumpTransactionEventHandler_new(broadcaster_conv, utxo_source_conv, signer_provider_conv, logger_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_BumpTransactionEventHandler_handle_event(int64_t this_arg, int64_t event) {
+       LDKBumpTransactionEventHandler 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;
+       LDKBumpTransactionEvent* event_conv = (LDKBumpTransactionEvent*)untag_ptr(event);
+       BumpTransactionEventHandler_handle_event(&this_arg_conv, event_conv);
+}
+
+void  CS_LDK_FilesystemStore_free(int64_t this_obj) {
+       LDKFilesystemStore 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);
+       FilesystemStore_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_FilesystemStore_new(jstring data_dir) {
+       LDKStr data_dir_conv = str_ref_to_owned_c(data_dir);
+       LDKFilesystemStore ret_var = FilesystemStore_new(data_dir_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_FilesystemStore_get_data_dir(int64_t this_arg) {
+       LDKFilesystemStore 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 = FilesystemStore_get_data_dir(&this_arg_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_FilesystemStore_as_KVStore(int64_t this_arg) {
+       LDKFilesystemStore 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;
+       LDKKVStore* ret_ret = MALLOC(sizeof(LDKKVStore), "LDKKVStore");
+       *ret_ret = FilesystemStore_as_KVStore(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_BackgroundProcessor_free(int64_t this_obj) {
+       LDKBackgroundProcessor 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);
+       BackgroundProcessor_free(this_obj_conv);
+}
+
+void  CS_LDK_GossipSync_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);
+       LDKGossipSync this_ptr_conv = *(LDKGossipSync*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       GossipSync_free(this_ptr_conv);
+}
+
+int64_t  CS_LDK_GossipSync_p2_p(int64_t a) {
+       LDKP2PGossipSync 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;
+       LDKGossipSync *ret_copy = MALLOC(sizeof(LDKGossipSync), "LDKGossipSync");
+       *ret_copy = GossipSync_p2_p(&a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_GossipSync_rapid(int64_t a) {
+       LDKRapidGossipSync 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;
+       LDKGossipSync *ret_copy = MALLOC(sizeof(LDKGossipSync), "LDKGossipSync");
+       *ret_copy = GossipSync_rapid(&a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_GossipSync_none() {
+       LDKGossipSync *ret_copy = MALLOC(sizeof(LDKGossipSync), "LDKGossipSync");
+       *ret_copy = GossipSync_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_BackgroundProcessor_start(int64_t persister, int64_t event_handler, int64_t chain_monitor, int64_t channel_manager, int64_t gossip_sync, int64_t peer_manager, int64_t logger, int64_t scorer) {
+       void* persister_ptr = untag_ptr(persister);
+       CHECK_ACCESS(persister_ptr);
+       LDKPersister persister_conv = *(LDKPersister*)(persister_ptr);
+       if (persister_conv.free == LDKPersister_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKPersister_JCalls_cloned(&persister_conv);
+       }
+       void* event_handler_ptr = untag_ptr(event_handler);
+       CHECK_ACCESS(event_handler_ptr);
+       LDKEventHandler event_handler_conv = *(LDKEventHandler*)(event_handler_ptr);
+       if (event_handler_conv.free == LDKEventHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKEventHandler_JCalls_cloned(&event_handler_conv);
+       }
+       LDKChainMonitor chain_monitor_conv;
+       chain_monitor_conv.inner = untag_ptr(chain_monitor);
+       chain_monitor_conv.is_owned = ptr_is_owned(chain_monitor);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(chain_monitor_conv);
+       chain_monitor_conv.is_owned = false;
+       LDKChannelManager channel_manager_conv;
+       channel_manager_conv.inner = untag_ptr(channel_manager);
+       channel_manager_conv.is_owned = ptr_is_owned(channel_manager);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_manager_conv);
+       channel_manager_conv.is_owned = false;
+       void* gossip_sync_ptr = untag_ptr(gossip_sync);
+       CHECK_ACCESS(gossip_sync_ptr);
+       LDKGossipSync gossip_sync_conv = *(LDKGossipSync*)(gossip_sync_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKGossipSync
+       LDKPeerManager peer_manager_conv;
+       peer_manager_conv.inner = untag_ptr(peer_manager);
+       peer_manager_conv.is_owned = ptr_is_owned(peer_manager);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(peer_manager_conv);
+       peer_manager_conv.is_owned = false;
+       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);
+       }
+       void* scorer_ptr = untag_ptr(scorer);
+       CHECK_ACCESS(scorer_ptr);
+       LDKCOption_WriteableScoreZ scorer_conv = *(LDKCOption_WriteableScoreZ*)(scorer_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKCOption_WriteableScoreZ
+       if (scorer_conv.tag == LDKCOption_WriteableScoreZ_Some) {
+               // Manually implement clone for Java trait instances
+               if (scorer_conv.some.free == LDKWriteableScore_JCalls_free) {
+                       // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                       LDKWriteableScore_JCalls_cloned(&scorer_conv.some);
+               }
+       }
+       LDKBackgroundProcessor ret_var = BackgroundProcessor_start(persister_conv, event_handler_conv, &chain_monitor_conv, &channel_manager_conv, gossip_sync_conv, &peer_manager_conv, logger_conv, scorer_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_BackgroundProcessor_join(int64_t this_arg) {
+       LDKBackgroundProcessor 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);
+       // WARNING: we need a move here but no clone is available for LDKBackgroundProcessor
+       
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = BackgroundProcessor_join(this_arg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_BackgroundProcessor_stop(int64_t this_arg) {
+       LDKBackgroundProcessor 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);
+       // WARNING: we need a move here but no clone is available for LDKBackgroundProcessor
+       
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = BackgroundProcessor_stop(this_arg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_Bolt11ParseError_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);
+       LDKBolt11ParseError this_ptr_conv = *(LDKBolt11ParseError*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Bolt11ParseError_free(this_ptr_conv);
+}
+
+static inline uint64_t Bolt11ParseError_clone_ptr(LDKBolt11ParseError *NONNULL_PTR arg) {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_Bolt11ParseError_clone_ptr(int64_t arg) {
+       LDKBolt11ParseError* arg_conv = (LDKBolt11ParseError*)untag_ptr(arg);
+       int64_t ret_conv = Bolt11ParseError_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_clone(int64_t orig) {
+       LDKBolt11ParseError* orig_conv = (LDKBolt11ParseError*)untag_ptr(orig);
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_bech32_error(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKBech32Error a_conv = *(LDKBech32Error*)(a_ptr);
+       a_conv = Bech32Error_clone((LDKBech32Error*)untag_ptr(a));
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_bech32_error(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_parse_amount_error(int32_t a) {
+       
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_parse_amount_error((LDKError){ ._dummy = 0 });
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_malformed_signature(int32_t a) {
+       LDKSecp256k1Error a_conv = LDKSecp256k1Error_from_cs(a);
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_malformed_signature(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_bad_prefix() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_bad_prefix();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_unknown_currency() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_unknown_currency();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_unknown_si_prefix() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_unknown_si_prefix();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_malformed_hrp() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_malformed_hrp();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_too_short_data_part() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_too_short_data_part();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_unexpected_end_of_tagged_fields() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_unexpected_end_of_tagged_fields();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_description_decode_error(int32_t a) {
+       
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_description_decode_error((LDKError){ ._dummy = 0 });
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_padding_error() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_padding_error();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_integer_overflow_error() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_integer_overflow_error();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_invalid_seg_wit_program_length() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_invalid_seg_wit_program_length();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_invalid_pub_key_hash_length() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_invalid_pub_key_hash_length();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_invalid_script_hash_length() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_invalid_script_hash_length();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_invalid_recovery_id() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_invalid_recovery_id();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_invalid_slice_length(jstring a) {
+       LDKStr a_conv = str_ref_to_owned_c(a);
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_invalid_slice_length(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_skip() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_skip();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_Bolt11ParseError_eq(int64_t a, int64_t b) {
+       LDKBolt11ParseError* a_conv = (LDKBolt11ParseError*)untag_ptr(a);
+       LDKBolt11ParseError* b_conv = (LDKBolt11ParseError*)untag_ptr(b);
+       jboolean ret_conv = Bolt11ParseError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ParseOrSemanticError_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);
+       LDKParseOrSemanticError this_ptr_conv = *(LDKParseOrSemanticError*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       ParseOrSemanticError_free(this_ptr_conv);
+}
+
+static inline uint64_t ParseOrSemanticError_clone_ptr(LDKParseOrSemanticError *NONNULL_PTR arg) {
+       LDKParseOrSemanticError *ret_copy = MALLOC(sizeof(LDKParseOrSemanticError), "LDKParseOrSemanticError");
+       *ret_copy = ParseOrSemanticError_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_ParseOrSemanticError_clone_ptr(int64_t arg) {
+       LDKParseOrSemanticError* arg_conv = (LDKParseOrSemanticError*)untag_ptr(arg);
+       int64_t ret_conv = ParseOrSemanticError_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ParseOrSemanticError_clone(int64_t orig) {
+       LDKParseOrSemanticError* orig_conv = (LDKParseOrSemanticError*)untag_ptr(orig);
+       LDKParseOrSemanticError *ret_copy = MALLOC(sizeof(LDKParseOrSemanticError), "LDKParseOrSemanticError");
+       *ret_copy = ParseOrSemanticError_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ParseOrSemanticError_parse_error(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKBolt11ParseError a_conv = *(LDKBolt11ParseError*)(a_ptr);
+       a_conv = Bolt11ParseError_clone((LDKBolt11ParseError*)untag_ptr(a));
+       LDKParseOrSemanticError *ret_copy = MALLOC(sizeof(LDKParseOrSemanticError), "LDKParseOrSemanticError");
+       *ret_copy = ParseOrSemanticError_parse_error(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ParseOrSemanticError_semantic_error(int32_t a) {
+       LDKBolt11SemanticError a_conv = LDKBolt11SemanticError_from_cs(a);
+       LDKParseOrSemanticError *ret_copy = MALLOC(sizeof(LDKParseOrSemanticError), "LDKParseOrSemanticError");
+       *ret_copy = ParseOrSemanticError_semantic_error(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_ParseOrSemanticError_eq(int64_t a, int64_t b) {
+       LDKParseOrSemanticError* a_conv = (LDKParseOrSemanticError*)untag_ptr(a);
+       LDKParseOrSemanticError* b_conv = (LDKParseOrSemanticError*)untag_ptr(b);
+       jboolean ret_conv = ParseOrSemanticError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Bolt11Invoice_free(int64_t this_obj) {
+       LDKBolt11Invoice 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);
+       Bolt11Invoice_free(this_obj_conv);
+}
+
+jboolean  CS_LDK_Bolt11Invoice_eq(int64_t a, int64_t b) {
+       LDKBolt11Invoice 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;
+       LDKBolt11Invoice 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 = Bolt11Invoice_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t Bolt11Invoice_clone_ptr(LDKBolt11Invoice *NONNULL_PTR arg) {
+       LDKBolt11Invoice ret_var = Bolt11Invoice_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_Bolt11Invoice_clone_ptr(int64_t arg) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_clone(int64_t orig) {
+       LDKBolt11Invoice 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;
+       LDKBolt11Invoice ret_var = Bolt11Invoice_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_Bolt11Invoice_hash(int64_t o) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_hash(&o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_SignedRawBolt11Invoice_free(int64_t this_obj) {
+       LDKSignedRawBolt11Invoice 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);
+       SignedRawBolt11Invoice_free(this_obj_conv);
+}
+
+jboolean  CS_LDK_SignedRawBolt11Invoice_eq(int64_t a, int64_t b) {
+       LDKSignedRawBolt11Invoice 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;
+       LDKSignedRawBolt11Invoice 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 = SignedRawBolt11Invoice_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t SignedRawBolt11Invoice_clone_ptr(LDKSignedRawBolt11Invoice *NONNULL_PTR arg) {
+       LDKSignedRawBolt11Invoice ret_var = SignedRawBolt11Invoice_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_SignedRawBolt11Invoice_clone_ptr(int64_t arg) {
+       LDKSignedRawBolt11Invoice 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 = SignedRawBolt11Invoice_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SignedRawBolt11Invoice_clone(int64_t orig) {
+       LDKSignedRawBolt11Invoice 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;
+       LDKSignedRawBolt11Invoice ret_var = SignedRawBolt11Invoice_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_SignedRawBolt11Invoice_hash(int64_t o) {
+       LDKSignedRawBolt11Invoice 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 = SignedRawBolt11Invoice_hash(&o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RawBolt11Invoice_free(int64_t this_obj) {
+       LDKRawBolt11Invoice 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);
+       RawBolt11Invoice_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_RawBolt11Invoice_get_data(int64_t this_ptr) {
+       LDKRawBolt11Invoice 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;
+       LDKRawDataPart ret_var = RawBolt11Invoice_get_data(&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_RawBolt11Invoice_set_data(int64_t this_ptr, int64_t val) {
+       LDKRawBolt11Invoice 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;
+       LDKRawDataPart 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 = RawDataPart_clone(&val_conv);
+       RawBolt11Invoice_set_data(&this_ptr_conv, val_conv);
+}
+
+jboolean  CS_LDK_RawBolt11Invoice_eq(int64_t a, int64_t b) {
+       LDKRawBolt11Invoice 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;
+       LDKRawBolt11Invoice 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 = RawBolt11Invoice_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t RawBolt11Invoice_clone_ptr(LDKRawBolt11Invoice *NONNULL_PTR arg) {
+       LDKRawBolt11Invoice ret_var = RawBolt11Invoice_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_RawBolt11Invoice_clone_ptr(int64_t arg) {
+       LDKRawBolt11Invoice 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 = RawBolt11Invoice_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RawBolt11Invoice_clone(int64_t orig) {
+       LDKRawBolt11Invoice 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;
+       LDKRawBolt11Invoice ret_var = RawBolt11Invoice_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_RawBolt11Invoice_hash(int64_t o) {
+       LDKRawBolt11Invoice 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 = RawBolt11Invoice_hash(&o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RawDataPart_free(int64_t this_obj) {
+       LDKRawDataPart 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);
+       RawDataPart_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_RawDataPart_get_timestamp(int64_t this_ptr) {
+       LDKRawDataPart 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;
+       LDKPositiveTimestamp ret_var = RawDataPart_get_timestamp(&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_RawDataPart_set_timestamp(int64_t this_ptr, int64_t val) {
+       LDKRawDataPart 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;
+       LDKPositiveTimestamp 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 = PositiveTimestamp_clone(&val_conv);
+       RawDataPart_set_timestamp(&this_ptr_conv, val_conv);
+}
+
+jboolean  CS_LDK_RawDataPart_eq(int64_t a, int64_t b) {
+       LDKRawDataPart 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;
+       LDKRawDataPart 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 = RawDataPart_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t RawDataPart_clone_ptr(LDKRawDataPart *NONNULL_PTR arg) {
+       LDKRawDataPart ret_var = RawDataPart_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_RawDataPart_clone_ptr(int64_t arg) {
+       LDKRawDataPart 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 = RawDataPart_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RawDataPart_clone(int64_t orig) {
+       LDKRawDataPart 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;
+       LDKRawDataPart ret_var = RawDataPart_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_RawDataPart_hash(int64_t o) {
+       LDKRawDataPart 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 = RawDataPart_hash(&o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PositiveTimestamp_free(int64_t this_obj) {
+       LDKPositiveTimestamp 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);
+       PositiveTimestamp_free(this_obj_conv);
+}
+
+jboolean  CS_LDK_PositiveTimestamp_eq(int64_t a, int64_t b) {
+       LDKPositiveTimestamp 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;
+       LDKPositiveTimestamp 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 = PositiveTimestamp_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t PositiveTimestamp_clone_ptr(LDKPositiveTimestamp *NONNULL_PTR arg) {
+       LDKPositiveTimestamp ret_var = PositiveTimestamp_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_PositiveTimestamp_clone_ptr(int64_t arg) {
+       LDKPositiveTimestamp 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 = PositiveTimestamp_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PositiveTimestamp_clone(int64_t orig) {
+       LDKPositiveTimestamp 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;
+       LDKPositiveTimestamp ret_var = PositiveTimestamp_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_PositiveTimestamp_hash(int64_t o) {
+       LDKPositiveTimestamp 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 = PositiveTimestamp_hash(&o_conv);
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SiPrefix_clone(int64_t orig) {
+       LDKSiPrefix* orig_conv = (LDKSiPrefix*)untag_ptr(orig);
+       int32_t ret_conv = LDKSiPrefix_to_cs(SiPrefix_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SiPrefix_milli() {
+       int32_t ret_conv = LDKSiPrefix_to_cs(SiPrefix_milli());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SiPrefix_micro() {
+       int32_t ret_conv = LDKSiPrefix_to_cs(SiPrefix_micro());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SiPrefix_nano() {
+       int32_t ret_conv = LDKSiPrefix_to_cs(SiPrefix_nano());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SiPrefix_pico() {
+       int32_t ret_conv = LDKSiPrefix_to_cs(SiPrefix_pico());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_SiPrefix_eq(int64_t a, int64_t b) {
+       LDKSiPrefix* a_conv = (LDKSiPrefix*)untag_ptr(a);
+       LDKSiPrefix* b_conv = (LDKSiPrefix*)untag_ptr(b);
+       jboolean ret_conv = SiPrefix_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SiPrefix_hash(int64_t o) {
+       LDKSiPrefix* o_conv = (LDKSiPrefix*)untag_ptr(o);
+       int64_t ret_conv = SiPrefix_hash(o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SiPrefix_multiplier(int64_t this_arg) {
+       LDKSiPrefix* this_arg_conv = (LDKSiPrefix*)untag_ptr(this_arg);
+       int64_t ret_conv = SiPrefix_multiplier(this_arg_conv);
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Currency_clone(int64_t orig) {
+       LDKCurrency* orig_conv = (LDKCurrency*)untag_ptr(orig);
+       int32_t ret_conv = LDKCurrency_to_cs(Currency_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Currency_bitcoin() {
+       int32_t ret_conv = LDKCurrency_to_cs(Currency_bitcoin());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Currency_bitcoin_testnet() {
+       int32_t ret_conv = LDKCurrency_to_cs(Currency_bitcoin_testnet());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Currency_regtest() {
+       int32_t ret_conv = LDKCurrency_to_cs(Currency_regtest());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Currency_simnet() {
+       int32_t ret_conv = LDKCurrency_to_cs(Currency_simnet());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Currency_signet() {
+       int32_t ret_conv = LDKCurrency_to_cs(Currency_signet());
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Currency_hash(int64_t o) {
+       LDKCurrency* o_conv = (LDKCurrency*)untag_ptr(o);
+       int64_t ret_conv = Currency_hash(o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Currency_eq(int64_t a, int64_t b) {
+       LDKCurrency* a_conv = (LDKCurrency*)untag_ptr(a);
+       LDKCurrency* b_conv = (LDKCurrency*)untag_ptr(b);
+       jboolean ret_conv = Currency_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Sha256_free(int64_t this_obj) {
+       LDKSha256 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);
+       Sha256_free(this_obj_conv);
+}
+
+static inline uint64_t Sha256_clone_ptr(LDKSha256 *NONNULL_PTR arg) {
+       LDKSha256 ret_var = Sha256_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_Sha256_clone_ptr(int64_t arg) {
+       LDKSha256 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 = Sha256_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Sha256_clone(int64_t orig) {
+       LDKSha256 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;
+       LDKSha256 ret_var = Sha256_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_Sha256_hash(int64_t o) {
+       LDKSha256 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 = Sha256_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Sha256_eq(int64_t a, int64_t b) {
+       LDKSha256 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;
+       LDKSha256 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 = Sha256_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Sha256_from_bytes(int8_tArray bytes) {
+       uint8_t bytes_arr[32];
+       CHECK(bytes->arr_len == 32);
+       memcpy(bytes_arr, bytes->elems, 32); FREE(bytes);
+       uint8_t (*bytes_ref)[32] = &bytes_arr;
+       LDKSha256 ret_var = Sha256_from_bytes(bytes_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;
+}
+
+void  CS_LDK_Description_free(int64_t this_obj) {
+       LDKDescription 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);
+       Description_free(this_obj_conv);
+}
+
+static inline uint64_t Description_clone_ptr(LDKDescription *NONNULL_PTR arg) {
+       LDKDescription ret_var = Description_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_Description_clone_ptr(int64_t arg) {
+       LDKDescription 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 = Description_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Description_clone(int64_t orig) {
+       LDKDescription 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;
+       LDKDescription ret_var = Description_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_Description_hash(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;
+       int64_t ret_conv = Description_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Description_eq(int64_t a, int64_t b) {
+       LDKDescription 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;
+       LDKDescription 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 = Description_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PayeePubKey_free(int64_t this_obj) {
+       LDKPayeePubKey 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);
+       PayeePubKey_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_PayeePubKey_get_a(int64_t this_ptr) {
+       LDKPayeePubKey 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, PayeePubKey_get_a(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_PayeePubKey_set_a(int64_t this_ptr, int8_tArray val) {
+       LDKPayeePubKey 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);
+       PayeePubKey_set_a(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_PayeePubKey_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);
+       LDKPayeePubKey ret_var = PayeePubKey_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;
+}
+
+static inline uint64_t PayeePubKey_clone_ptr(LDKPayeePubKey *NONNULL_PTR arg) {
+       LDKPayeePubKey ret_var = PayeePubKey_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_PayeePubKey_clone_ptr(int64_t arg) {
+       LDKPayeePubKey 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 = PayeePubKey_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PayeePubKey_clone(int64_t orig) {
+       LDKPayeePubKey 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;
+       LDKPayeePubKey ret_var = PayeePubKey_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_PayeePubKey_hash(int64_t o) {
+       LDKPayeePubKey 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 = PayeePubKey_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_PayeePubKey_eq(int64_t a, int64_t b) {
+       LDKPayeePubKey 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;
+       LDKPayeePubKey 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 = PayeePubKey_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ExpiryTime_free(int64_t this_obj) {
+       LDKExpiryTime 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);
+       ExpiryTime_free(this_obj_conv);
+}
+
+static inline uint64_t ExpiryTime_clone_ptr(LDKExpiryTime *NONNULL_PTR arg) {
+       LDKExpiryTime ret_var = ExpiryTime_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_ExpiryTime_clone_ptr(int64_t arg) {
+       LDKExpiryTime 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 = ExpiryTime_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ExpiryTime_clone(int64_t orig) {
+       LDKExpiryTime 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;
+       LDKExpiryTime ret_var = ExpiryTime_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_ExpiryTime_hash(int64_t o) {
+       LDKExpiryTime 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 = ExpiryTime_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ExpiryTime_eq(int64_t a, int64_t b) {
+       LDKExpiryTime 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;
+       LDKExpiryTime 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 = ExpiryTime_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_MinFinalCltvExpiryDelta_free(int64_t this_obj) {
+       LDKMinFinalCltvExpiryDelta 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);
+       MinFinalCltvExpiryDelta_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_MinFinalCltvExpiryDelta_get_a(int64_t this_ptr) {
+       LDKMinFinalCltvExpiryDelta 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 = MinFinalCltvExpiryDelta_get_a(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_MinFinalCltvExpiryDelta_set_a(int64_t this_ptr, int64_t val) {
+       LDKMinFinalCltvExpiryDelta 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;
+       MinFinalCltvExpiryDelta_set_a(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_MinFinalCltvExpiryDelta_new(int64_t a_arg) {
+       LDKMinFinalCltvExpiryDelta ret_var = MinFinalCltvExpiryDelta_new(a_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 MinFinalCltvExpiryDelta_clone_ptr(LDKMinFinalCltvExpiryDelta *NONNULL_PTR arg) {
+       LDKMinFinalCltvExpiryDelta ret_var = MinFinalCltvExpiryDelta_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_MinFinalCltvExpiryDelta_clone_ptr(int64_t arg) {
+       LDKMinFinalCltvExpiryDelta 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 = MinFinalCltvExpiryDelta_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_MinFinalCltvExpiryDelta_clone(int64_t orig) {
+       LDKMinFinalCltvExpiryDelta 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;
+       LDKMinFinalCltvExpiryDelta ret_var = MinFinalCltvExpiryDelta_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_MinFinalCltvExpiryDelta_hash(int64_t o) {
+       LDKMinFinalCltvExpiryDelta 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 = MinFinalCltvExpiryDelta_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_MinFinalCltvExpiryDelta_eq(int64_t a, int64_t b) {
+       LDKMinFinalCltvExpiryDelta 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;
+       LDKMinFinalCltvExpiryDelta 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 = MinFinalCltvExpiryDelta_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Fallback_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);
+       LDKFallback this_ptr_conv = *(LDKFallback*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Fallback_free(this_ptr_conv);
+}
+
+static inline uint64_t Fallback_clone_ptr(LDKFallback *NONNULL_PTR arg) {
+       LDKFallback *ret_copy = MALLOC(sizeof(LDKFallback), "LDKFallback");
+       *ret_copy = Fallback_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_Fallback_clone_ptr(int64_t arg) {
+       LDKFallback* arg_conv = (LDKFallback*)untag_ptr(arg);
+       int64_t ret_conv = Fallback_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Fallback_clone(int64_t orig) {
+       LDKFallback* orig_conv = (LDKFallback*)untag_ptr(orig);
+       LDKFallback *ret_copy = MALLOC(sizeof(LDKFallback), "LDKFallback");
+       *ret_copy = Fallback_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Fallback_seg_wit_program(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);
+       LDKFallback *ret_copy = MALLOC(sizeof(LDKFallback), "LDKFallback");
+       *ret_copy = Fallback_seg_wit_program((LDKWitnessVersion){ ._0 = version }, program_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Fallback_pub_key_hash(int8_tArray a) {
+       LDKTwentyBytes a_ref;
+       CHECK(a->arr_len == 20);
+       memcpy(a_ref.data, a->elems, 20); FREE(a);
+       LDKFallback *ret_copy = MALLOC(sizeof(LDKFallback), "LDKFallback");
+       *ret_copy = Fallback_pub_key_hash(a_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Fallback_script_hash(int8_tArray a) {
+       LDKTwentyBytes a_ref;
+       CHECK(a->arr_len == 20);
+       memcpy(a_ref.data, a->elems, 20); FREE(a);
+       LDKFallback *ret_copy = MALLOC(sizeof(LDKFallback), "LDKFallback");
+       *ret_copy = Fallback_script_hash(a_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Fallback_hash(int64_t o) {
+       LDKFallback* o_conv = (LDKFallback*)untag_ptr(o);
+       int64_t ret_conv = Fallback_hash(o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Fallback_eq(int64_t a, int64_t b) {
+       LDKFallback* a_conv = (LDKFallback*)untag_ptr(a);
+       LDKFallback* b_conv = (LDKFallback*)untag_ptr(b);
+       jboolean ret_conv = Fallback_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Bolt11InvoiceSignature_free(int64_t this_obj) {
+       LDKBolt11InvoiceSignature 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);
+       Bolt11InvoiceSignature_free(this_obj_conv);
+}
+
+static inline uint64_t Bolt11InvoiceSignature_clone_ptr(LDKBolt11InvoiceSignature *NONNULL_PTR arg) {
+       LDKBolt11InvoiceSignature ret_var = Bolt11InvoiceSignature_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_Bolt11InvoiceSignature_clone_ptr(int64_t arg) {
+       LDKBolt11InvoiceSignature 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 = Bolt11InvoiceSignature_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11InvoiceSignature_clone(int64_t orig) {
+       LDKBolt11InvoiceSignature 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;
+       LDKBolt11InvoiceSignature ret_var = Bolt11InvoiceSignature_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_Bolt11InvoiceSignature_hash(int64_t o) {
+       LDKBolt11InvoiceSignature 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 = Bolt11InvoiceSignature_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11InvoiceSignature_eq(int64_t a, int64_t b) {
+       LDKBolt11InvoiceSignature 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;
+       LDKBolt11InvoiceSignature 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 = Bolt11InvoiceSignature_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PrivateRoute_free(int64_t this_obj) {
+       LDKPrivateRoute 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);
+       PrivateRoute_free(this_obj_conv);
+}
+
+static inline uint64_t PrivateRoute_clone_ptr(LDKPrivateRoute *NONNULL_PTR arg) {
+       LDKPrivateRoute ret_var = PrivateRoute_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_PrivateRoute_clone_ptr(int64_t arg) {
+       LDKPrivateRoute 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 = PrivateRoute_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PrivateRoute_clone(int64_t orig) {
+       LDKPrivateRoute 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;
+       LDKPrivateRoute ret_var = PrivateRoute_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_PrivateRoute_hash(int64_t o) {
+       LDKPrivateRoute 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 = PrivateRoute_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_PrivateRoute_eq(int64_t a, int64_t b) {
+       LDKPrivateRoute 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;
+       LDKPrivateRoute 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 = PrivateRoute_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SignedRawBolt11Invoice_into_parts(int64_t this_arg) {
+       LDKSignedRawBolt11Invoice 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 = SignedRawBolt11Invoice_clone(&this_arg_conv);
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ), "LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ");
+       *ret_conv = SignedRawBolt11Invoice_into_parts(this_arg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_SignedRawBolt11Invoice_raw_invoice(int64_t this_arg) {
+       LDKSignedRawBolt11Invoice 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;
+       LDKRawBolt11Invoice ret_var = SignedRawBolt11Invoice_raw_invoice(&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;
+}
+
+int8_tArray  CS_LDK_SignedRawBolt11Invoice_signable_hash(int64_t this_arg) {
+       LDKSignedRawBolt11Invoice 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, *SignedRawBolt11Invoice_signable_hash(&this_arg_conv), 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_SignedRawBolt11Invoice_signature(int64_t this_arg) {
+       LDKSignedRawBolt11Invoice 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;
+       LDKBolt11InvoiceSignature ret_var = SignedRawBolt11Invoice_signature(&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_SignedRawBolt11Invoice_recover_payee_pub_key(int64_t this_arg) {
+       LDKSignedRawBolt11Invoice 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;
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PayeePubKeySecp256k1ErrorZ), "LDKCResult_PayeePubKeySecp256k1ErrorZ");
+       *ret_conv = SignedRawBolt11Invoice_recover_payee_pub_key(&this_arg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_SignedRawBolt11Invoice_check_signature(int64_t this_arg) {
+       LDKSignedRawBolt11Invoice 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 = SignedRawBolt11Invoice_check_signature(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_RawBolt11Invoice_signable_hash(int64_t this_arg) {
+       LDKRawBolt11Invoice 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, RawBolt11Invoice_signable_hash(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_RawBolt11Invoice_payment_hash(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKSha256 ret_var = RawBolt11Invoice_payment_hash(&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_RawBolt11Invoice_description(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKDescription ret_var = RawBolt11Invoice_description(&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_RawBolt11Invoice_payee_pub_key(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKPayeePubKey ret_var = RawBolt11Invoice_payee_pub_key(&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_RawBolt11Invoice_description_hash(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKSha256 ret_var = RawBolt11Invoice_description_hash(&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_RawBolt11Invoice_expiry_time(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKExpiryTime ret_var = RawBolt11Invoice_expiry_time(&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_RawBolt11Invoice_min_final_cltv_expiry_delta(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKMinFinalCltvExpiryDelta ret_var = RawBolt11Invoice_min_final_cltv_expiry_delta(&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_RawBolt11Invoice_payment_secret(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
+       *ret_copy = RawBolt11Invoice_payment_secret(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RawBolt11Invoice_payment_metadata(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = RawBolt11Invoice_payment_metadata(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RawBolt11Invoice_features(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKBolt11InvoiceFeatures ret_var = RawBolt11Invoice_features(&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_tArray  CS_LDK_RawBolt11Invoice_private_routes(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKCVec_PrivateRouteZ ret_var = RawBolt11Invoice_private_routes(&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 o = 0; o < ret_var.datalen; o++) {
+               LDKPrivateRoute ret_conv_14_var = ret_var.data[o];
+               int64_t ret_conv_14_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_14_var);
+               ret_conv_14_ref = tag_ptr(ret_conv_14_var.inner, ret_conv_14_var.is_owned);
+               ret_arr_ptr[o] = ret_conv_14_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_RawBolt11Invoice_amount_pico_btc(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = RawBolt11Invoice_amount_pico_btc(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int32_t  CS_LDK_RawBolt11Invoice_currency(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       int32_t ret_conv = LDKCurrency_to_cs(RawBolt11Invoice_currency(&this_arg_conv));
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PositiveTimestamp_from_unix_timestamp(int64_t unix_seconds) {
+       LDKCResult_PositiveTimestampCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PositiveTimestampCreationErrorZ), "LDKCResult_PositiveTimestampCreationErrorZ");
+       *ret_conv = PositiveTimestamp_from_unix_timestamp(unix_seconds);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PositiveTimestamp_from_system_time(int64_t time) {
+       LDKCResult_PositiveTimestampCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PositiveTimestampCreationErrorZ), "LDKCResult_PositiveTimestampCreationErrorZ");
+       *ret_conv = PositiveTimestamp_from_system_time(time);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PositiveTimestamp_from_duration_since_epoch(int64_t duration) {
+       LDKCResult_PositiveTimestampCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PositiveTimestampCreationErrorZ), "LDKCResult_PositiveTimestampCreationErrorZ");
+       *ret_conv = PositiveTimestamp_from_duration_since_epoch(duration);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PositiveTimestamp_as_unix_timestamp(int64_t this_arg) {
+       LDKPositiveTimestamp 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 = PositiveTimestamp_as_unix_timestamp(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PositiveTimestamp_as_duration_since_epoch(int64_t this_arg) {
+       LDKPositiveTimestamp 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 = PositiveTimestamp_as_duration_since_epoch(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PositiveTimestamp_as_time(int64_t this_arg) {
+       LDKPositiveTimestamp 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 = PositiveTimestamp_as_time(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Bolt11Invoice_signable_hash(int64_t this_arg) {
+       LDKBolt11Invoice 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, Bolt11Invoice_signable_hash(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_into_signed_raw(int64_t this_arg) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_clone(&this_arg_conv);
+       LDKSignedRawBolt11Invoice ret_var = Bolt11Invoice_into_signed_raw(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_Bolt11Invoice_check_signature(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       LDKCResult_NoneBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt11SemanticErrorZ), "LDKCResult_NoneBolt11SemanticErrorZ");
+       *ret_conv = Bolt11Invoice_check_signature(&this_arg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt11Invoice_from_signed(int64_t signed_invoice) {
+       LDKSignedRawBolt11Invoice signed_invoice_conv;
+       signed_invoice_conv.inner = untag_ptr(signed_invoice);
+       signed_invoice_conv.is_owned = ptr_is_owned(signed_invoice);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(signed_invoice_conv);
+       signed_invoice_conv = SignedRawBolt11Invoice_clone(&signed_invoice_conv);
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ), "LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ");
+       *ret_conv = Bolt11Invoice_from_signed(signed_invoice_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt11Invoice_timestamp(int64_t this_arg) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_timestamp(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_duration_since_epoch(int64_t this_arg) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_duration_since_epoch(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Bolt11Invoice_payment_hash(int64_t this_arg) {
+       LDKBolt11Invoice 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, *Bolt11Invoice_payment_hash(&this_arg_conv), 32);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_Bolt11Invoice_payee_pub_key(int64_t this_arg) {
+       LDKBolt11Invoice 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, Bolt11Invoice_payee_pub_key(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_Bolt11Invoice_payment_secret(int64_t this_arg) {
+       LDKBolt11Invoice 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, *Bolt11Invoice_payment_secret(&this_arg_conv), 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_payment_metadata(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = Bolt11Invoice_payment_metadata(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_features(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       LDKBolt11InvoiceFeatures ret_var = Bolt11Invoice_features(&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;
+}
+
+int8_tArray  CS_LDK_Bolt11Invoice_recover_payee_pub_key(int64_t this_arg) {
+       LDKBolt11Invoice 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, Bolt11Invoice_recover_payee_pub_key(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_expires_at(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = Bolt11Invoice_expires_at(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_expiry_time(int64_t this_arg) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_expiry_time(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11Invoice_is_expired(int64_t this_arg) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_is_expired(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_duration_until_expiry(int64_t this_arg) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_duration_until_expiry(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_expiration_remaining_from_epoch(int64_t this_arg, int64_t time) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_expiration_remaining_from_epoch(&this_arg_conv, time);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11Invoice_would_expire(int64_t this_arg, int64_t at_time) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_would_expire(&this_arg_conv, at_time);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_min_final_cltv_expiry_delta(int64_t this_arg) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_min_final_cltv_expiry_delta(&this_arg_conv);
+       return ret_conv;
+}
+
+ptrArray  CS_LDK_Bolt11Invoice_fallback_addresses(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       LDKCVec_StrZ ret_var = Bolt11Invoice_fallback_addresses(&this_arg_conv);
+       ptrArray ret_arr = NULL;
+       ret_arr = init_ptrArray(ret_var.datalen, __LINE__);
+       jstring *ret_arr_ptr = (jstring*)(((uint8_t*)ret_arr) + 8);
+       for (size_t i = 0; i < ret_var.datalen; i++) {
+               LDKStr ret_conv_8_str = ret_var.data[i];
+               jstring ret_conv_8_conv = str_ref_to_cs(ret_conv_8_str.chars, ret_conv_8_str.len);
+               Str_free(ret_conv_8_str);
+               ret_arr_ptr[i] = ret_conv_8_conv;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_Bolt11Invoice_private_routes(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       LDKCVec_PrivateRouteZ ret_var = Bolt11Invoice_private_routes(&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 o = 0; o < ret_var.datalen; o++) {
+               LDKPrivateRoute ret_conv_14_var = ret_var.data[o];
+               int64_t ret_conv_14_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_14_var);
+               ret_conv_14_ref = tag_ptr(ret_conv_14_var.inner, ret_conv_14_var.is_owned);
+               ret_arr_ptr[o] = ret_conv_14_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_Bolt11Invoice_route_hints(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       LDKCVec_RouteHintZ ret_var = Bolt11Invoice_route_hints(&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 l = 0; l < ret_var.datalen; l++) {
+               LDKRouteHint ret_conv_11_var = ret_var.data[l];
+               int64_t ret_conv_11_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_11_var);
+               ret_conv_11_ref = tag_ptr(ret_conv_11_var.inner, ret_conv_11_var.is_owned);
+               ret_arr_ptr[l] = ret_conv_11_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int32_t  CS_LDK_Bolt11Invoice_currency(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       int32_t ret_conv = LDKCurrency_to_cs(Bolt11Invoice_currency(&this_arg_conv));
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_amount_milli_satoshis(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = Bolt11Invoice_amount_milli_satoshis(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Description_new(jstring description) {
+       LDKStr description_conv = str_ref_to_owned_c(description);
+       LDKCResult_DescriptionCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DescriptionCreationErrorZ), "LDKCResult_DescriptionCreationErrorZ");
+       *ret_conv = Description_new(description_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jstring  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);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ExpiryTime_from_seconds(int64_t seconds) {
+       LDKExpiryTime ret_var = ExpiryTime_from_seconds(seconds);
+       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_ExpiryTime_from_duration(int64_t duration) {
+       LDKExpiryTime ret_var = ExpiryTime_from_duration(duration);
+       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_ExpiryTime_as_seconds(int64_t this_arg) {
+       LDKExpiryTime 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 = ExpiryTime_as_seconds(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ExpiryTime_as_duration(int64_t this_arg) {
+       LDKExpiryTime 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 = ExpiryTime_as_duration(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PrivateRoute_new(int64_t hops) {
+       LDKRouteHint hops_conv;
+       hops_conv.inner = untag_ptr(hops);
+       hops_conv.is_owned = ptr_is_owned(hops);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(hops_conv);
+       hops_conv = RouteHint_clone(&hops_conv);
+       LDKCResult_PrivateRouteCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PrivateRouteCreationErrorZ), "LDKCResult_PrivateRouteCreationErrorZ");
+       *ret_conv = PrivateRoute_new(hops_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PrivateRoute_into_inner(int64_t this_arg) {
+       LDKPrivateRoute 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 = PrivateRoute_clone(&this_arg_conv);
+       LDKRouteHint ret_var = PrivateRoute_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;
+}
+
+int32_t  CS_LDK_CreationError_clone(int64_t orig) {
+       LDKCreationError* orig_conv = (LDKCreationError*)untag_ptr(orig);
+       int32_t ret_conv = LDKCreationError_to_cs(CreationError_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_CreationError_description_too_long() {
+       int32_t ret_conv = LDKCreationError_to_cs(CreationError_description_too_long());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_CreationError_route_too_long() {
+       int32_t ret_conv = LDKCreationError_to_cs(CreationError_route_too_long());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_CreationError_timestamp_out_of_bounds() {
+       int32_t ret_conv = LDKCreationError_to_cs(CreationError_timestamp_out_of_bounds());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_CreationError_invalid_amount() {
+       int32_t ret_conv = LDKCreationError_to_cs(CreationError_invalid_amount());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_CreationError_missing_route_hints() {
+       int32_t ret_conv = LDKCreationError_to_cs(CreationError_missing_route_hints());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_CreationError_min_final_cltv_expiry_delta_too_short() {
+       int32_t ret_conv = LDKCreationError_to_cs(CreationError_min_final_cltv_expiry_delta_too_short());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_CreationError_eq(int64_t a, int64_t b) {
+       LDKCreationError* a_conv = (LDKCreationError*)untag_ptr(a);
+       LDKCreationError* b_conv = (LDKCreationError*)untag_ptr(b);
+       jboolean ret_conv = CreationError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+jstring  CS_LDK_CreationError_to_str(int64_t o) {
+       LDKCreationError* o_conv = (LDKCreationError*)untag_ptr(o);
+       LDKStr ret_str = CreationError_to_str(o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_clone(int64_t orig) {
+       LDKBolt11SemanticError* orig_conv = (LDKBolt11SemanticError*)untag_ptr(orig);
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_no_payment_hash() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_no_payment_hash());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_multiple_payment_hashes() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_multiple_payment_hashes());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_no_description() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_no_description());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_multiple_descriptions() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_multiple_descriptions());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_no_payment_secret() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_no_payment_secret());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_multiple_payment_secrets() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_multiple_payment_secrets());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_invalid_features() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_invalid_features());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_invalid_recovery_id() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_invalid_recovery_id());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_invalid_signature() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_invalid_signature());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_imprecise_amount() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_imprecise_amount());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11SemanticError_eq(int64_t a, int64_t b) {
+       LDKBolt11SemanticError* a_conv = (LDKBolt11SemanticError*)untag_ptr(a);
+       LDKBolt11SemanticError* b_conv = (LDKBolt11SemanticError*)untag_ptr(b);
+       jboolean ret_conv = Bolt11SemanticError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+jstring  CS_LDK_Bolt11SemanticError_to_str(int64_t o) {
+       LDKBolt11SemanticError* o_conv = (LDKBolt11SemanticError*)untag_ptr(o);
+       LDKStr ret_str = Bolt11SemanticError_to_str(o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+void  CS_LDK_SignOrCreationError_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);
+       LDKSignOrCreationError this_ptr_conv = *(LDKSignOrCreationError*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       SignOrCreationError_free(this_ptr_conv);
+}
+
+static inline uint64_t SignOrCreationError_clone_ptr(LDKSignOrCreationError *NONNULL_PTR arg) {
+       LDKSignOrCreationError *ret_copy = MALLOC(sizeof(LDKSignOrCreationError), "LDKSignOrCreationError");
+       *ret_copy = SignOrCreationError_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_SignOrCreationError_clone_ptr(int64_t arg) {
+       LDKSignOrCreationError* arg_conv = (LDKSignOrCreationError*)untag_ptr(arg);
+       int64_t ret_conv = SignOrCreationError_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SignOrCreationError_clone(int64_t orig) {
+       LDKSignOrCreationError* orig_conv = (LDKSignOrCreationError*)untag_ptr(orig);
+       LDKSignOrCreationError *ret_copy = MALLOC(sizeof(LDKSignOrCreationError), "LDKSignOrCreationError");
+       *ret_copy = SignOrCreationError_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SignOrCreationError_sign_error() {
+       LDKSignOrCreationError *ret_copy = MALLOC(sizeof(LDKSignOrCreationError), "LDKSignOrCreationError");
+       *ret_copy = SignOrCreationError_sign_error();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SignOrCreationError_creation_error(int32_t a) {
+       LDKCreationError a_conv = LDKCreationError_from_cs(a);
+       LDKSignOrCreationError *ret_copy = MALLOC(sizeof(LDKSignOrCreationError), "LDKSignOrCreationError");
+       *ret_copy = SignOrCreationError_creation_error(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_SignOrCreationError_eq(int64_t a, int64_t b) {
+       LDKSignOrCreationError* a_conv = (LDKSignOrCreationError*)untag_ptr(a);
+       LDKSignOrCreationError* b_conv = (LDKSignOrCreationError*)untag_ptr(b);
+       jboolean ret_conv = SignOrCreationError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+jstring  CS_LDK_SignOrCreationError_to_str(int64_t o) {
+       LDKSignOrCreationError* o_conv = (LDKSignOrCreationError*)untag_ptr(o);
+       LDKStr ret_str = SignOrCreationError_to_str(o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_pay_invoice(int64_t invoice, 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_invoice(&invoice_conv, retry_strategy_conv, &channelmanager_conv);
+       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) {
+       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);
+       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);
+       LDKCOption_u64Z amt_msat_conv = *(LDKCOption_u64Z*)(amt_msat_ptr);
+       amt_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(amt_msat));
+       void* payment_hash_ptr = untag_ptr(payment_hash);
+       CHECK_ACCESS(payment_hash_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_hash_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_hash_ptr);
+       payment_hash_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_hash));
+       LDKStr description_conv = str_ref_to_owned_c(description);
+       LDKCVec_PhantomRouteHintsZ phantom_route_hints_constr;
+       phantom_route_hints_constr.datalen = phantom_route_hints->arr_len;
+       if (phantom_route_hints_constr.datalen > 0)
+               phantom_route_hints_constr.data = MALLOC(phantom_route_hints_constr.datalen * sizeof(LDKPhantomRouteHints), "LDKCVec_PhantomRouteHintsZ Elements");
+       else
+               phantom_route_hints_constr.data = NULL;
+       int64_t* phantom_route_hints_vals = phantom_route_hints->elems;
+       for (size_t t = 0; t < phantom_route_hints_constr.datalen; t++) {
+               int64_t phantom_route_hints_conv_19 = phantom_route_hints_vals[t];
+               LDKPhantomRouteHints phantom_route_hints_conv_19_conv;
+               phantom_route_hints_conv_19_conv.inner = untag_ptr(phantom_route_hints_conv_19);
+               phantom_route_hints_conv_19_conv.is_owned = ptr_is_owned(phantom_route_hints_conv_19);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(phantom_route_hints_conv_19_conv);
+               phantom_route_hints_conv_19_conv = PhantomRouteHints_clone(&phantom_route_hints_conv_19_conv);
+               phantom_route_hints_constr.data[t] = phantom_route_hints_conv_19_conv;
+       }
+       FREE(phantom_route_hints);
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       LDKCurrency network_conv = LDKCurrency_from_cs(network);
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = create_phantom_invoice(amt_msat_conv, payment_hash_conv, description_conv, invoice_expiry_delta_secs, phantom_route_hints_constr, entropy_source_conv, node_signer_conv, logger_conv, network_conv, min_final_cltv_expiry_delta_conv, duration_since_epoch);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_create_phantom_invoice_with_description_hash(int64_t amt_msat, int64_t payment_hash, int32_t invoice_expiry_delta_secs, int64_t description_hash, 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);
+       LDKCOption_u64Z amt_msat_conv = *(LDKCOption_u64Z*)(amt_msat_ptr);
+       amt_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(amt_msat));
+       void* payment_hash_ptr = untag_ptr(payment_hash);
+       CHECK_ACCESS(payment_hash_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_hash_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_hash_ptr);
+       payment_hash_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_hash));
+       LDKSha256 description_hash_conv;
+       description_hash_conv.inner = untag_ptr(description_hash);
+       description_hash_conv.is_owned = ptr_is_owned(description_hash);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(description_hash_conv);
+       description_hash_conv = Sha256_clone(&description_hash_conv);
+       LDKCVec_PhantomRouteHintsZ phantom_route_hints_constr;
+       phantom_route_hints_constr.datalen = phantom_route_hints->arr_len;
+       if (phantom_route_hints_constr.datalen > 0)
+               phantom_route_hints_constr.data = MALLOC(phantom_route_hints_constr.datalen * sizeof(LDKPhantomRouteHints), "LDKCVec_PhantomRouteHintsZ Elements");
+       else
+               phantom_route_hints_constr.data = NULL;
+       int64_t* phantom_route_hints_vals = phantom_route_hints->elems;
+       for (size_t t = 0; t < phantom_route_hints_constr.datalen; t++) {
+               int64_t phantom_route_hints_conv_19 = phantom_route_hints_vals[t];
+               LDKPhantomRouteHints phantom_route_hints_conv_19_conv;
+               phantom_route_hints_conv_19_conv.inner = untag_ptr(phantom_route_hints_conv_19);
+               phantom_route_hints_conv_19_conv.is_owned = ptr_is_owned(phantom_route_hints_conv_19);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(phantom_route_hints_conv_19_conv);
+               phantom_route_hints_conv_19_conv = PhantomRouteHints_clone(&phantom_route_hints_conv_19_conv);
+               phantom_route_hints_constr.data[t] = phantom_route_hints_conv_19_conv;
+       }
+       FREE(phantom_route_hints);
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       LDKCurrency network_conv = LDKCurrency_from_cs(network);
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = create_phantom_invoice_with_description_hash(amt_msat_conv, payment_hash_conv, invoice_expiry_delta_secs, description_hash_conv, phantom_route_hints_constr, entropy_source_conv, node_signer_conv, logger_conv, network_conv, min_final_cltv_expiry_delta_conv, duration_since_epoch);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_create_invoice_from_channelmanager(int64_t channelmanager, int64_t node_signer, int64_t logger, int32_t network, int64_t amt_msat, jstring description, int32_t invoice_expiry_delta_secs, int64_t min_final_cltv_expiry_delta) {
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       LDKCurrency network_conv = LDKCurrency_from_cs(network);
+       void* amt_msat_ptr = untag_ptr(amt_msat);
+       CHECK_ACCESS(amt_msat_ptr);
+       LDKCOption_u64Z amt_msat_conv = *(LDKCOption_u64Z*)(amt_msat_ptr);
+       amt_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(amt_msat));
+       LDKStr description_conv = str_ref_to_owned_c(description);
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = create_invoice_from_channelmanager(&channelmanager_conv, node_signer_conv, logger_conv, network_conv, amt_msat_conv, description_conv, invoice_expiry_delta_secs, min_final_cltv_expiry_delta_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_create_invoice_from_channelmanager_with_description_hash(int64_t channelmanager, int64_t node_signer, int64_t logger, int32_t network, int64_t amt_msat, int64_t description_hash, int32_t invoice_expiry_delta_secs, int64_t min_final_cltv_expiry_delta) {
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       LDKCurrency network_conv = LDKCurrency_from_cs(network);
+       void* amt_msat_ptr = untag_ptr(amt_msat);
+       CHECK_ACCESS(amt_msat_ptr);
+       LDKCOption_u64Z amt_msat_conv = *(LDKCOption_u64Z*)(amt_msat_ptr);
+       amt_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(amt_msat));
+       LDKSha256 description_hash_conv;
+       description_hash_conv.inner = untag_ptr(description_hash);
+       description_hash_conv.is_owned = ptr_is_owned(description_hash);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(description_hash_conv);
+       description_hash_conv = Sha256_clone(&description_hash_conv);
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = create_invoice_from_channelmanager_with_description_hash(&channelmanager_conv, node_signer_conv, logger_conv, network_conv, amt_msat_conv, description_hash_conv, invoice_expiry_delta_secs, min_final_cltv_expiry_delta_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_create_invoice_from_channelmanager_with_description_hash_and_duration_since_epoch(int64_t channelmanager, int64_t node_signer, int64_t logger, int32_t network, int64_t amt_msat, int64_t description_hash, int64_t duration_since_epoch, int32_t invoice_expiry_delta_secs, int64_t min_final_cltv_expiry_delta) {
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       LDKCurrency network_conv = LDKCurrency_from_cs(network);
+       void* amt_msat_ptr = untag_ptr(amt_msat);
+       CHECK_ACCESS(amt_msat_ptr);
+       LDKCOption_u64Z amt_msat_conv = *(LDKCOption_u64Z*)(amt_msat_ptr);
+       amt_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(amt_msat));
+       LDKSha256 description_hash_conv;
+       description_hash_conv.inner = untag_ptr(description_hash);
+       description_hash_conv.is_owned = ptr_is_owned(description_hash);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(description_hash_conv);
+       description_hash_conv = Sha256_clone(&description_hash_conv);
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = create_invoice_from_channelmanager_with_description_hash_and_duration_since_epoch(&channelmanager_conv, node_signer_conv, logger_conv, network_conv, amt_msat_conv, description_hash_conv, duration_since_epoch, invoice_expiry_delta_secs, min_final_cltv_expiry_delta_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_create_invoice_from_channelmanager_and_duration_since_epoch(int64_t channelmanager, int64_t node_signer, int64_t logger, int32_t network, int64_t amt_msat, jstring description, int64_t duration_since_epoch, int32_t invoice_expiry_delta_secs, int64_t min_final_cltv_expiry_delta) {
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       LDKCurrency network_conv = LDKCurrency_from_cs(network);
+       void* amt_msat_ptr = untag_ptr(amt_msat);
+       CHECK_ACCESS(amt_msat_ptr);
+       LDKCOption_u64Z amt_msat_conv = *(LDKCOption_u64Z*)(amt_msat_ptr);
+       amt_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(amt_msat));
+       LDKStr description_conv = str_ref_to_owned_c(description);
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = create_invoice_from_channelmanager_and_duration_since_epoch(&channelmanager_conv, node_signer_conv, logger_conv, network_conv, amt_msat_conv, description_conv, duration_since_epoch, invoice_expiry_delta_secs, min_final_cltv_expiry_delta_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_hash(int64_t channelmanager, int64_t node_signer, int64_t logger, int32_t network, int64_t amt_msat, jstring description, int64_t duration_since_epoch, int32_t invoice_expiry_delta_secs, int8_tArray payment_hash, int64_t min_final_cltv_expiry_delta) {
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       LDKCurrency network_conv = LDKCurrency_from_cs(network);
+       void* amt_msat_ptr = untag_ptr(amt_msat);
+       CHECK_ACCESS(amt_msat_ptr);
+       LDKCOption_u64Z amt_msat_conv = *(LDKCOption_u64Z*)(amt_msat_ptr);
+       amt_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(amt_msat));
+       LDKStr description_conv = str_ref_to_owned_c(description);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_hash(&channelmanager_conv, node_signer_conv, logger_conv, network_conv, amt_msat_conv, description_conv, duration_since_epoch, invoice_expiry_delta_secs, payment_hash_ref, min_final_cltv_expiry_delta_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_SiPrefix_from_str(jstring s) {
+       LDKStr s_conv = str_ref_to_owned_c(s);
+       LDKCResult_SiPrefixBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SiPrefixBolt11ParseErrorZ), "LDKCResult_SiPrefixBolt11ParseErrorZ");
+       *ret_conv = SiPrefix_from_str(s_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt11Invoice_from_str(jstring s) {
+       LDKStr s_conv = str_ref_to_owned_c(s);
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ), "LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ");
+       *ret_conv = Bolt11Invoice_from_str(s_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_SignedRawBolt11Invoice_from_str(jstring s) {
+       LDKStr s_conv = str_ref_to_owned_c(s);
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ), "LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ");
+       *ret_conv = SignedRawBolt11Invoice_from_str(s_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jstring  CS_LDK_Bolt11ParseError_to_str(int64_t o) {
+       LDKBolt11ParseError* o_conv = (LDKBolt11ParseError*)untag_ptr(o);
+       LDKStr ret_str = Bolt11ParseError_to_str(o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+jstring  CS_LDK_ParseOrSemanticError_to_str(int64_t o) {
+       LDKParseOrSemanticError* o_conv = (LDKParseOrSemanticError*)untag_ptr(o);
+       LDKStr ret_str = ParseOrSemanticError_to_str(o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+jstring  CS_LDK_Bolt11Invoice_to_str(int64_t o) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_to_str(&o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+jstring  CS_LDK_SignedRawBolt11Invoice_to_str(int64_t o) {
+       LDKSignedRawBolt11Invoice 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 = SignedRawBolt11Invoice_to_str(&o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+jstring  CS_LDK_Currency_to_str(int64_t o) {
+       LDKCurrency* o_conv = (LDKCurrency*)untag_ptr(o);
+       LDKStr ret_str = Currency_to_str(o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+jstring  CS_LDK_SiPrefix_to_str(int64_t o) {
+       LDKSiPrefix* o_conv = (LDKSiPrefix*)untag_ptr(o);
+       LDKStr ret_str = SiPrefix_to_str(o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+void  CS_LDK_RapidGossipSync_free(int64_t this_obj) {
+       LDKRapidGossipSync 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);
+       RapidGossipSync_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_RapidGossipSync_new(int64_t network_graph, int64_t logger) {
+       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* 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);
+       }
+       LDKRapidGossipSync ret_var = RapidGossipSync_new(&network_graph_conv, logger_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_RapidGossipSync_sync_network_graph_with_file_path(int64_t this_arg, jstring sync_path) {
+       LDKRapidGossipSync 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 sync_path_conv = str_ref_to_owned_c(sync_path);
+       LDKCResult_u32GraphSyncErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_u32GraphSyncErrorZ), "LDKCResult_u32GraphSyncErrorZ");
+       *ret_conv = RapidGossipSync_sync_network_graph_with_file_path(&this_arg_conv, sync_path_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RapidGossipSync_update_network_graph(int64_t this_arg, int8_tArray update_data) {
+       LDKRapidGossipSync 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;
+       LDKu8slice update_data_ref;
+       update_data_ref.datalen = update_data->arr_len;
+       update_data_ref.data = update_data->elems;
+       LDKCResult_u32GraphSyncErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_u32GraphSyncErrorZ), "LDKCResult_u32GraphSyncErrorZ");
+       *ret_conv = RapidGossipSync_update_network_graph(&this_arg_conv, update_data_ref);
+       FREE(update_data);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RapidGossipSync_update_network_graph_no_std(int64_t this_arg, int8_tArray update_data, int64_t current_time_unix) {
+       LDKRapidGossipSync 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;
+       LDKu8slice update_data_ref;
+       update_data_ref.datalen = update_data->arr_len;
+       update_data_ref.data = update_data->elems;
+       void* current_time_unix_ptr = untag_ptr(current_time_unix);
+       CHECK_ACCESS(current_time_unix_ptr);
+       LDKCOption_u64Z current_time_unix_conv = *(LDKCOption_u64Z*)(current_time_unix_ptr);
+       current_time_unix_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(current_time_unix));
+       LDKCResult_u32GraphSyncErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_u32GraphSyncErrorZ), "LDKCResult_u32GraphSyncErrorZ");
+       *ret_conv = RapidGossipSync_update_network_graph_no_std(&this_arg_conv, update_data_ref, current_time_unix_conv);
+       FREE(update_data);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_RapidGossipSync_is_initial_sync_complete(int64_t this_arg) {
+       LDKRapidGossipSync 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 = RapidGossipSync_is_initial_sync_complete(&this_arg_conv);
+       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/bindings.c.body b/c_sharp/bindings.c.body
new file mode 100644 (file)
index 0000000..672bc9f
--- /dev/null
@@ -0,0 +1,71349 @@
+
+// On OSX jlong (ie long long) is not equivalent to int64_t, so we override here
+#define int64_t jlong
+#include <lightning.h>
+#include <string.h>
+#include <stdatomic.h>
+#include <stdlib.h>
+
+#define LIKELY(v) __builtin_expect(!!(v), 1)
+#define UNLIKELY(v) __builtin_expect(!!(v), 0)
+
+#include <stdio.h>
+#define DEBUG_PRINT(...) fprintf(stderr, __VA_ARGS__)
+#define do_MALLOC(a, _b, _c) malloc(a)
+#define MALLOC(a, _) malloc(a)
+#define FREE(p) if ((uint64_t)(p) > 4096) { free(p); }
+#define CHECK_ACCESS(p)
+#define CHECK_INNER_FIELD_ACCESS_OR_NULL(v)
+#define DO_ASSERT(a) (void)(a)
+#define CHECK(a)
+
+
+// We assume that CVec_u8Z and u8slice are the same size and layout (and thus pointers to the two can be mixed)
+_Static_assert(sizeof(LDKCVec_u8Z) == sizeof(LDKu8slice), "Vec<u8> and [u8] need to have been mapped identically");
+_Static_assert(offsetof(LDKCVec_u8Z, data) == offsetof(LDKu8slice, data), "Vec<u8> and [u8] need to have been mapped identically");
+_Static_assert(offsetof(LDKCVec_u8Z, datalen) == offsetof(LDKu8slice, datalen), "Vec<u8> and [u8] need to have been mapped identically");
+
+_Static_assert(sizeof(void*) <= 8, "Pointers must fit into 64 bits");
+
+#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 */ \
+               ty elems[]; \
+       }; \
+       typedef struct name##array * name##Array; \
+       static inline name##Array init_##name##Array(size_t arr_len, int lineno) { \
+               name##Array arr = (name##Array)do_MALLOC(arr_len * sizeof(ty) + sizeof(uint64_t), #name" array init", lineno); \
+               arr->arr_len = arr_len; \
+               return arr; \
+       }
+
+DECL_ARR_TYPE(int64_t, int64_t);
+DECL_ARR_TYPE(uint64_t, uint64_t);
+DECL_ARR_TYPE(int8_t, int8_t);
+DECL_ARR_TYPE(int16_t, int16_t);
+DECL_ARR_TYPE(uint32_t, uint32_t);
+DECL_ARR_TYPE(void*, ptr);
+DECL_ARR_TYPE(char, char);
+typedef charArray jstring;
+
+static inline jstring str_ref_to_cs(const char* chars, size_t len) {
+       charArray arr = init_charArray(len, __LINE__);
+       memcpy(arr->elems, chars, len);
+       return arr;
+}
+static inline LDKStr str_ref_to_owned_c(const jstring str) {
+       char* newchars = MALLOC(str->arr_len + 1, "String chars");
+       memcpy(newchars, str->elems, str->arr_len);
+       newchars[str->arr_len] = 0;
+       LDKStr res = {
+               .chars = newchars,
+               .len = str->arr_len,
+               .chars_is_owned = true
+       };
+       return res;
+}
+
+typedef bool jboolean;
+
+int64_t CS_LDK_allocate_buffer(int64_t len) {
+       return MALLOC(len, "C#-requested buffer");
+}
+
+void CS_LDK_free_buffer(int64_t buf) {
+       FREE(buf);
+}
+
+jstring CS_LDK_get_ldk_c_bindings_version() {
+       return str_ref_to_cs(check_get_ldk_bindings_version(), strlen(check_get_ldk_bindings_version()));
+}
+jstring CS_LDK_get_ldk_version() {
+       return str_ref_to_cs(check_get_ldk_version(), strlen(check_get_ldk_version()));
+}
+#include "version.c"
+
+typedef int8_tArray (*invoker_l_l)(int obj_ptr, int fn_id, int64_t a);
+static invoker_l_l js_invoke_function_l_l;
+int CS_LDK_register_l_l_invoker(invoker_l_l invoker) {
+       js_invoke_function_l_l = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_ll)(int obj_ptr, int fn_id, int64_t a, ptrArray b);
+static invoker_l_ll js_invoke_function_l_ll;
+int CS_LDK_register_l_ll_invoker(invoker_l_ll invoker) {
+       js_invoke_function_l_ll = invoker;
+       return 0;
+}
+
+typedef int8_tArray (*invoker_l_)(int obj_ptr, int fn_id);
+static invoker_l_ js_invoke_function_l_;
+int CS_LDK_register_l__invoker(invoker_l_ invoker) {
+       js_invoke_function_l_ = invoker;
+       return 0;
+}
+
+typedef void (*invoker_void_l)(int obj_ptr, int fn_id, int64_t a);
+static invoker_void_l js_invoke_function_void_l;
+int CS_LDK_register_void_l_invoker(invoker_void_l invoker) {
+       js_invoke_function_void_l = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_llll)(int obj_ptr, int fn_id, int8_tArray a, int64_t b, int64_t c, int8_tArray d);
+static invoker_l_llll js_invoke_function_l_llll;
+int CS_LDK_register_l_llll_invoker(invoker_l_llll invoker) {
+       js_invoke_function_l_llll = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_lllll)(int obj_ptr, int fn_id, int8_tArray a, int64_t b, int64_t c, int8_tArray d, int64_t e);
+static invoker_l_lllll js_invoke_function_l_lllll;
+int CS_LDK_register_l_lllll_invoker(invoker_l_lllll invoker) {
+       js_invoke_function_l_lllll = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_lll)(int obj_ptr, int fn_id, int8_tArray 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 void (*invoker_void_ll)(int obj_ptr, int fn_id, int64_t a, int64_t b);
+static invoker_void_ll js_invoke_function_void_ll;
+int CS_LDK_register_void_ll_invoker(invoker_void_ll invoker) {
+       js_invoke_function_void_ll = invoker;
+       return 0;
+}
+
+typedef int32_t (*invoker_ChannelMonitorUpdateStatus_ll)(int obj_ptr, int fn_id, int64_t a, int64_t b);
+static invoker_ChannelMonitorUpdateStatus_ll js_invoke_function_ChannelMonitorUpdateStatus_ll;
+int CS_LDK_register_ChannelMonitorUpdateStatus_ll_invoker(invoker_ChannelMonitorUpdateStatus_ll invoker) {
+       js_invoke_function_ChannelMonitorUpdateStatus_ll = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_Recipient)(int obj_ptr, int fn_id, int32_t a);
+static invoker_l_Recipient js_invoke_function_l_Recipient;
+int CS_LDK_register_l_Recipient_invoker(invoker_l_Recipient invoker) {
+       js_invoke_function_l_Recipient = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_Recipientll)(int obj_ptr, int fn_id, int32_t a, int8_tArray b, int64_t c);
+static invoker_l_Recipientll js_invoke_function_l_Recipientll;
+int CS_LDK_register_l_Recipientll_invoker(invoker_l_Recipientll invoker) {
+       js_invoke_function_l_Recipientll = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_llRecipient)(int obj_ptr, int fn_id, int8_tArray a, ptrArray b, int32_t c);
+static invoker_l_llRecipient js_invoke_function_l_llRecipient;
+int CS_LDK_register_l_llRecipient_invoker(invoker_l_llRecipient invoker) {
+       js_invoke_function_l_llRecipient = invoker;
+       return 0;
+}
+
+typedef int8_tArray (*invoker_l_bll)(int obj_ptr, int fn_id, jboolean a, int64_t b, int8_tArray c);
+static invoker_l_bll js_invoke_function_l_bll;
+int CS_LDK_register_l_bll_invoker(invoker_l_bll invoker) {
+       js_invoke_function_l_bll = invoker;
+       return 0;
+}
+
+typedef int32_t (*invoker_i_ConfirmationTarget)(int obj_ptr, int fn_id, int32_t a);
+static invoker_i_ConfirmationTarget js_invoke_function_i_ConfirmationTarget;
+int CS_LDK_register_i_ConfirmationTarget_invoker(invoker_i_ConfirmationTarget invoker) {
+       js_invoke_function_i_ConfirmationTarget = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_llllll)(int obj_ptr, int fn_id, int8_tArray a, int64_t b, int64_tArray c, int64_t d, int8_tArray e, int8_tArray f);
+static invoker_l_llllll js_invoke_function_l_llllll;
+int CS_LDK_register_l_llllll_invoker(invoker_l_llllll invoker) {
+       js_invoke_function_l_llllll = invoker;
+       return 0;
+}
+
+typedef int16_t (*invoker_s_)(int obj_ptr, int fn_id);
+static invoker_s_ js_invoke_function_s_;
+int CS_LDK_register_s__invoker(invoker_s_ invoker) {
+       js_invoke_function_s_ = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_lllb)(int obj_ptr, int fn_id, jstring a, jstring b, jstring c, jboolean d);
+static invoker_l_lllb js_invoke_function_l_lllb;
+int CS_LDK_register_l_lllb_invoker(invoker_l_lllb invoker) {
+       js_invoke_function_l_lllb = invoker;
+       return 0;
+}
+
+typedef int32_t (*invoker_ChannelMonitorUpdateStatus_lll)(int obj_ptr, int fn_id, int64_t a, int64_t b, int64_t c);
+static invoker_ChannelMonitorUpdateStatus_lll js_invoke_function_ChannelMonitorUpdateStatus_lll;
+int CS_LDK_register_ChannelMonitorUpdateStatus_lll_invoker(invoker_ChannelMonitorUpdateStatus_lll invoker) {
+       js_invoke_function_ChannelMonitorUpdateStatus_lll = invoker;
+       return 0;
+}
+
+typedef int32_t (*invoker_ChannelMonitorUpdateStatus_llll)(int obj_ptr, int fn_id, int64_t a, int64_t b, int64_t c, int64_t d);
+static invoker_ChannelMonitorUpdateStatus_llll js_invoke_function_ChannelMonitorUpdateStatus_llll;
+int CS_LDK_register_ChannelMonitorUpdateStatus_llll_invoker(invoker_ChannelMonitorUpdateStatus_llll invoker) {
+       js_invoke_function_ChannelMonitorUpdateStatus_llll = invoker;
+       return 0;
+}
+
+typedef void (*invoker_void_)(int obj_ptr, int fn_id);
+static invoker_void_ js_invoke_function_void_;
+int CS_LDK_register_void__invoker(invoker_void_ invoker) {
+       js_invoke_function_void_ = invoker;
+       return 0;
+}
+
+typedef void (*invoker_void_lli)(int obj_ptr, int fn_id, int8_tArray a, int64_tArray b, int32_t c);
+static invoker_void_lli js_invoke_function_void_lli;
+int CS_LDK_register_void_lli_invoker(invoker_void_lli invoker) {
+       js_invoke_function_void_lli = invoker;
+       return 0;
+}
+
+typedef void (*invoker_void_li)(int obj_ptr, int fn_id, int8_tArray a, int32_t b);
+static invoker_void_li js_invoke_function_void_li;
+int CS_LDK_register_void_li_invoker(invoker_void_li invoker) {
+       js_invoke_function_void_li = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_llb)(int obj_ptr, int fn_id, int8_tArray a, int64_t b, jboolean c);
+static invoker_l_llb js_invoke_function_l_llb;
+int CS_LDK_register_l_llb_invoker(invoker_l_llb invoker) {
+       js_invoke_function_l_llb = invoker;
+       return 0;
+}
+
+typedef jboolean (*invoker_b_)(int obj_ptr, int fn_id);
+static invoker_b_ js_invoke_function_b_;
+int CS_LDK_register_b__invoker(invoker_b_ invoker) {
+       js_invoke_function_b_ = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_sl)(int obj_ptr, int fn_id, int16_t a, int8_tArray b);
+static invoker_l_sl js_invoke_function_l_sl;
+int CS_LDK_register_l_sl_invoker(invoker_l_sl invoker) {
+       js_invoke_function_l_sl = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_lb)(int obj_ptr, int fn_id, int8_tArray a, jboolean b);
+static invoker_l_lb js_invoke_function_l_lb;
+int CS_LDK_register_l_lb_invoker(invoker_l_lb invoker) {
+       js_invoke_function_l_lb = invoker;
+       return 0;
+}
+
+typedef jboolean (*invoker_b_l)(int obj_ptr, int fn_id, int64_t a);
+static invoker_b_l js_invoke_function_b_l;
+int CS_LDK_register_b_l_invoker(invoker_b_l invoker) {
+       js_invoke_function_b_l = invoker;
+       return 0;
+}
+
+typedef int64_t (*invoker_l_llli)(int obj_ptr, int fn_id, int8_tArray a, int64_tArray b, int64_tArray c, int32_t d);
+static invoker_l_llli js_invoke_function_l_llli;
+int CS_LDK_register_l_llli_invoker(invoker_l_llli invoker) {
+       js_invoke_function_l_llli = invoker;
+       return 0;
+}
+static inline struct LDKThirtyTwoBytes ThirtyTwoBytes_clone(const struct LDKThirtyTwoBytes *orig) { struct LDKThirtyTwoBytes ret; memcpy(ret.data, orig->data, 32); return ret; }
+
+static inline void* untag_ptr(uint64_t ptr) {
+       if (ptr < 4096) return (void*)ptr;
+       if (sizeof(void*) == 4) {
+               // For 32-bit systems, store pointers as 64-bit ints and use the 31st bit
+               return (void*)(uintptr_t)ptr;
+       } else {
+               // For 64-bit systems, assume the top byte is used for tagging, then
+               // use bit 9 ^ bit 10.
+               uint64_t tenth_bit = (((uintptr_t)ptr) & (1ULL << 54)) >> 54;
+               uintptr_t p = (ptr & ~(1ULL << 55)) | (tenth_bit << 55);
+#ifdef LDK_DEBUG_BUILD
+               // On debug builds we also use the 11th bit as a debug flag
+               uintptr_t eleventh_bit = (((uintptr_t)ptr) & (1ULL << 53)) >> 53;
+               CHECK(tenth_bit != eleventh_bit);
+               p ^= 1ULL << 53;
+#endif
+               return (void*)p;
+       }
+}
+static inline bool ptr_is_owned(uint64_t ptr) {
+       if(ptr < 4096) return true;
+       if (sizeof(void*) == 4) {
+               return ptr & (1ULL << 32);
+       } else {
+               uintptr_t ninth_bit = (((uintptr_t)ptr) & (1ULL << 55)) >> 55;
+               uintptr_t tenth_bit = (((uintptr_t)ptr) & (1ULL << 54)) >> 54;
+#ifdef LDK_DEBUG_BUILD
+               // On debug builds we also use the 11th bit as a debug flag
+               uintptr_t eleventh_bit = (((uintptr_t)ptr) & (1ULL << 53)) >> 53;
+               CHECK(tenth_bit != eleventh_bit);
+#endif
+               return (ninth_bit ^ tenth_bit) ? true : false;
+       }
+}
+static inline uint64_t tag_ptr(const void* ptr, bool is_owned) {
+       if ((uintptr_t)ptr < 4096) return (uint64_t)ptr;
+       if (sizeof(void*) == 4) {
+               return (((uint64_t)ptr) | ((is_owned ? 1ULL : 0) << 32));
+       } else {
+               CHECK(sizeof(uintptr_t) == 8);
+               uintptr_t tenth_bit = (((uintptr_t)ptr) & (1ULL << 54)) >> 54;
+               uintptr_t t = (((uintptr_t)ptr) | (((is_owned ? 1ULL : 0ULL) ^ tenth_bit) << 55));
+#ifdef LDK_DEBUG_BUILD
+               uintptr_t ninth_bit = (((uintptr_t)ptr) & (1ULL << 55)) >> 55;
+               uintptr_t eleventh_bit = (((uintptr_t)ptr) & (1ULL << 53)) >> 53;
+               CHECK(ninth_bit == tenth_bit);
+               CHECK(ninth_bit == eleventh_bit);
+               t ^= 1ULL << 53;
+#endif
+               CHECK(ptr_is_owned(t) == is_owned);
+               CHECK(untag_ptr(t) == ptr);
+               return t;
+       }
+}
+
+static inline LDKBolt11SemanticError LDKBolt11SemanticError_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKBolt11SemanticError_NoPaymentHash;
+               case 1: return LDKBolt11SemanticError_MultiplePaymentHashes;
+               case 2: return LDKBolt11SemanticError_NoDescription;
+               case 3: return LDKBolt11SemanticError_MultipleDescriptions;
+               case 4: return LDKBolt11SemanticError_NoPaymentSecret;
+               case 5: return LDKBolt11SemanticError_MultiplePaymentSecrets;
+               case 6: return LDKBolt11SemanticError_InvalidFeatures;
+               case 7: return LDKBolt11SemanticError_InvalidRecoveryId;
+               case 8: return LDKBolt11SemanticError_InvalidSignature;
+               case 9: return LDKBolt11SemanticError_ImpreciseAmount;
+               default: abort();
+       }
+}
+static inline int32_t LDKBolt11SemanticError_to_cs(LDKBolt11SemanticError val) {
+       switch (val) {
+               case LDKBolt11SemanticError_NoPaymentHash: return 0;
+               case LDKBolt11SemanticError_MultiplePaymentHashes: return 1;
+               case LDKBolt11SemanticError_NoDescription: return 2;
+               case LDKBolt11SemanticError_MultipleDescriptions: return 3;
+               case LDKBolt11SemanticError_NoPaymentSecret: return 4;
+               case LDKBolt11SemanticError_MultiplePaymentSecrets: return 5;
+               case LDKBolt11SemanticError_InvalidFeatures: return 6;
+               case LDKBolt11SemanticError_InvalidRecoveryId: return 7;
+               case LDKBolt11SemanticError_InvalidSignature: return 8;
+               case LDKBolt11SemanticError_ImpreciseAmount: return 9;
+               default: abort();
+       }
+}
+static inline LDKBolt12SemanticError LDKBolt12SemanticError_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKBolt12SemanticError_AlreadyExpired;
+               case 1: return LDKBolt12SemanticError_UnsupportedChain;
+               case 2: return LDKBolt12SemanticError_UnexpectedChain;
+               case 3: return LDKBolt12SemanticError_MissingAmount;
+               case 4: return LDKBolt12SemanticError_InvalidAmount;
+               case 5: return LDKBolt12SemanticError_InsufficientAmount;
+               case 6: return LDKBolt12SemanticError_UnexpectedAmount;
+               case 7: return LDKBolt12SemanticError_UnsupportedCurrency;
+               case 8: return LDKBolt12SemanticError_UnknownRequiredFeatures;
+               case 9: return LDKBolt12SemanticError_UnexpectedFeatures;
+               case 10: return LDKBolt12SemanticError_MissingDescription;
+               case 11: return LDKBolt12SemanticError_MissingSigningPubkey;
+               case 12: return LDKBolt12SemanticError_InvalidSigningPubkey;
+               case 13: return LDKBolt12SemanticError_UnexpectedSigningPubkey;
+               case 14: return LDKBolt12SemanticError_MissingQuantity;
+               case 15: return LDKBolt12SemanticError_InvalidQuantity;
+               case 16: return LDKBolt12SemanticError_UnexpectedQuantity;
+               case 17: return LDKBolt12SemanticError_InvalidMetadata;
+               case 18: return LDKBolt12SemanticError_UnexpectedMetadata;
+               case 19: return LDKBolt12SemanticError_MissingPayerMetadata;
+               case 20: return LDKBolt12SemanticError_MissingPayerId;
+               case 21: return LDKBolt12SemanticError_DuplicatePaymentId;
+               case 22: return LDKBolt12SemanticError_MissingPaths;
+               case 23: return LDKBolt12SemanticError_InvalidPayInfo;
+               case 24: return LDKBolt12SemanticError_MissingCreationTime;
+               case 25: return LDKBolt12SemanticError_MissingPaymentHash;
+               case 26: return LDKBolt12SemanticError_MissingSignature;
+               default: abort();
+       }
+}
+static inline int32_t LDKBolt12SemanticError_to_cs(LDKBolt12SemanticError val) {
+       switch (val) {
+               case LDKBolt12SemanticError_AlreadyExpired: return 0;
+               case LDKBolt12SemanticError_UnsupportedChain: return 1;
+               case LDKBolt12SemanticError_UnexpectedChain: return 2;
+               case LDKBolt12SemanticError_MissingAmount: return 3;
+               case LDKBolt12SemanticError_InvalidAmount: return 4;
+               case LDKBolt12SemanticError_InsufficientAmount: return 5;
+               case LDKBolt12SemanticError_UnexpectedAmount: return 6;
+               case LDKBolt12SemanticError_UnsupportedCurrency: return 7;
+               case LDKBolt12SemanticError_UnknownRequiredFeatures: return 8;
+               case LDKBolt12SemanticError_UnexpectedFeatures: return 9;
+               case LDKBolt12SemanticError_MissingDescription: return 10;
+               case LDKBolt12SemanticError_MissingSigningPubkey: return 11;
+               case LDKBolt12SemanticError_InvalidSigningPubkey: return 12;
+               case LDKBolt12SemanticError_UnexpectedSigningPubkey: return 13;
+               case LDKBolt12SemanticError_MissingQuantity: return 14;
+               case LDKBolt12SemanticError_InvalidQuantity: return 15;
+               case LDKBolt12SemanticError_UnexpectedQuantity: return 16;
+               case LDKBolt12SemanticError_InvalidMetadata: return 17;
+               case LDKBolt12SemanticError_UnexpectedMetadata: return 18;
+               case LDKBolt12SemanticError_MissingPayerMetadata: return 19;
+               case LDKBolt12SemanticError_MissingPayerId: return 20;
+               case LDKBolt12SemanticError_DuplicatePaymentId: return 21;
+               case LDKBolt12SemanticError_MissingPaths: return 22;
+               case LDKBolt12SemanticError_InvalidPayInfo: return 23;
+               case LDKBolt12SemanticError_MissingCreationTime: return 24;
+               case LDKBolt12SemanticError_MissingPaymentHash: return 25;
+               case LDKBolt12SemanticError_MissingSignature: return 26;
+               default: abort();
+       }
+}
+static inline LDKCOption_NoneZ LDKCOption_NoneZ_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKCOption_NoneZ_Some;
+               case 1: return LDKCOption_NoneZ_None;
+               default: abort();
+       }
+}
+static inline int32_t LDKCOption_NoneZ_to_cs(LDKCOption_NoneZ val) {
+       switch (val) {
+               case LDKCOption_NoneZ_Some: return 0;
+               case LDKCOption_NoneZ_None: return 1;
+               default: abort();
+       }
+}
+static inline LDKChannelMonitorUpdateStatus LDKChannelMonitorUpdateStatus_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKChannelMonitorUpdateStatus_Completed;
+               case 1: return LDKChannelMonitorUpdateStatus_InProgress;
+               case 2: return LDKChannelMonitorUpdateStatus_UnrecoverableError;
+               default: abort();
+       }
+}
+static inline int32_t LDKChannelMonitorUpdateStatus_to_cs(LDKChannelMonitorUpdateStatus val) {
+       switch (val) {
+               case LDKChannelMonitorUpdateStatus_Completed: return 0;
+               case LDKChannelMonitorUpdateStatus_InProgress: return 1;
+               case LDKChannelMonitorUpdateStatus_UnrecoverableError: return 2;
+               default: abort();
+       }
+}
+static inline LDKChannelShutdownState LDKChannelShutdownState_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKChannelShutdownState_NotShuttingDown;
+               case 1: return LDKChannelShutdownState_ShutdownInitiated;
+               case 2: return LDKChannelShutdownState_ResolvingHTLCs;
+               case 3: return LDKChannelShutdownState_NegotiatingClosingFee;
+               case 4: return LDKChannelShutdownState_ShutdownComplete;
+               default: abort();
+       }
+}
+static inline int32_t LDKChannelShutdownState_to_cs(LDKChannelShutdownState val) {
+       switch (val) {
+               case LDKChannelShutdownState_NotShuttingDown: return 0;
+               case LDKChannelShutdownState_ShutdownInitiated: return 1;
+               case LDKChannelShutdownState_ResolvingHTLCs: return 2;
+               case LDKChannelShutdownState_NegotiatingClosingFee: return 3;
+               case LDKChannelShutdownState_ShutdownComplete: return 4;
+               default: abort();
+       }
+}
+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;
+               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;
+               default: abort();
+       }
+}
+static inline LDKCreationError LDKCreationError_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKCreationError_DescriptionTooLong;
+               case 1: return LDKCreationError_RouteTooLong;
+               case 2: return LDKCreationError_TimestampOutOfBounds;
+               case 3: return LDKCreationError_InvalidAmount;
+               case 4: return LDKCreationError_MissingRouteHints;
+               case 5: return LDKCreationError_MinFinalCltvExpiryDeltaTooShort;
+               default: abort();
+       }
+}
+static inline int32_t LDKCreationError_to_cs(LDKCreationError val) {
+       switch (val) {
+               case LDKCreationError_DescriptionTooLong: return 0;
+               case LDKCreationError_RouteTooLong: return 1;
+               case LDKCreationError_TimestampOutOfBounds: return 2;
+               case LDKCreationError_InvalidAmount: return 3;
+               case LDKCreationError_MissingRouteHints: return 4;
+               case LDKCreationError_MinFinalCltvExpiryDeltaTooShort: return 5;
+               default: abort();
+       }
+}
+static inline LDKCurrency LDKCurrency_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKCurrency_Bitcoin;
+               case 1: return LDKCurrency_BitcoinTestnet;
+               case 2: return LDKCurrency_Regtest;
+               case 3: return LDKCurrency_Simnet;
+               case 4: return LDKCurrency_Signet;
+               default: abort();
+       }
+}
+static inline int32_t LDKCurrency_to_cs(LDKCurrency val) {
+       switch (val) {
+               case LDKCurrency_Bitcoin: return 0;
+               case LDKCurrency_BitcoinTestnet: return 1;
+               case LDKCurrency_Regtest: return 2;
+               case LDKCurrency_Simnet: return 3;
+               case LDKCurrency_Signet: return 4;
+               default: abort();
+       }
+}
+static inline LDKHTLCClaim LDKHTLCClaim_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKHTLCClaim_OfferedTimeout;
+               case 1: return LDKHTLCClaim_OfferedPreimage;
+               case 2: return LDKHTLCClaim_AcceptedTimeout;
+               case 3: return LDKHTLCClaim_AcceptedPreimage;
+               case 4: return LDKHTLCClaim_Revocation;
+               default: abort();
+       }
+}
+static inline int32_t LDKHTLCClaim_to_cs(LDKHTLCClaim val) {
+       switch (val) {
+               case LDKHTLCClaim_OfferedTimeout: return 0;
+               case LDKHTLCClaim_OfferedPreimage: return 1;
+               case LDKHTLCClaim_AcceptedTimeout: return 2;
+               case LDKHTLCClaim_AcceptedPreimage: return 3;
+               case LDKHTLCClaim_Revocation: return 4;
+               default: abort();
+       }
+}
+static inline LDKIOError LDKIOError_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKIOError_NotFound;
+               case 1: return LDKIOError_PermissionDenied;
+               case 2: return LDKIOError_ConnectionRefused;
+               case 3: return LDKIOError_ConnectionReset;
+               case 4: return LDKIOError_ConnectionAborted;
+               case 5: return LDKIOError_NotConnected;
+               case 6: return LDKIOError_AddrInUse;
+               case 7: return LDKIOError_AddrNotAvailable;
+               case 8: return LDKIOError_BrokenPipe;
+               case 9: return LDKIOError_AlreadyExists;
+               case 10: return LDKIOError_WouldBlock;
+               case 11: return LDKIOError_InvalidInput;
+               case 12: return LDKIOError_InvalidData;
+               case 13: return LDKIOError_TimedOut;
+               case 14: return LDKIOError_WriteZero;
+               case 15: return LDKIOError_Interrupted;
+               case 16: return LDKIOError_Other;
+               case 17: return LDKIOError_UnexpectedEof;
+               default: abort();
+       }
+}
+static inline int32_t LDKIOError_to_cs(LDKIOError val) {
+       switch (val) {
+               case LDKIOError_NotFound: return 0;
+               case LDKIOError_PermissionDenied: return 1;
+               case LDKIOError_ConnectionRefused: return 2;
+               case LDKIOError_ConnectionReset: return 3;
+               case LDKIOError_ConnectionAborted: return 4;
+               case LDKIOError_NotConnected: return 5;
+               case LDKIOError_AddrInUse: return 6;
+               case LDKIOError_AddrNotAvailable: return 7;
+               case LDKIOError_BrokenPipe: return 8;
+               case LDKIOError_AlreadyExists: return 9;
+               case LDKIOError_WouldBlock: return 10;
+               case LDKIOError_InvalidInput: return 11;
+               case LDKIOError_InvalidData: return 12;
+               case LDKIOError_TimedOut: return 13;
+               case LDKIOError_WriteZero: return 14;
+               case LDKIOError_Interrupted: return 15;
+               case LDKIOError_Other: return 16;
+               case LDKIOError_UnexpectedEof: return 17;
+               default: abort();
+       }
+}
+static inline LDKLevel LDKLevel_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKLevel_Gossip;
+               case 1: return LDKLevel_Trace;
+               case 2: return LDKLevel_Debug;
+               case 3: return LDKLevel_Info;
+               case 4: return LDKLevel_Warn;
+               case 5: return LDKLevel_Error;
+               default: abort();
+       }
+}
+static inline int32_t LDKLevel_to_cs(LDKLevel val) {
+       switch (val) {
+               case LDKLevel_Gossip: return 0;
+               case LDKLevel_Trace: return 1;
+               case LDKLevel_Debug: return 2;
+               case LDKLevel_Info: return 3;
+               case LDKLevel_Warn: return 4;
+               case LDKLevel_Error: return 5;
+               default: abort();
+       }
+}
+static inline LDKNetwork LDKNetwork_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKNetwork_Bitcoin;
+               case 1: return LDKNetwork_Testnet;
+               case 2: return LDKNetwork_Regtest;
+               case 3: return LDKNetwork_Signet;
+               default: abort();
+       }
+}
+static inline int32_t LDKNetwork_to_cs(LDKNetwork val) {
+       switch (val) {
+               case LDKNetwork_Bitcoin: return 0;
+               case LDKNetwork_Testnet: return 1;
+               case LDKNetwork_Regtest: return 2;
+               case LDKNetwork_Signet: return 3;
+               default: abort();
+       }
+}
+static inline LDKPaymentFailureReason LDKPaymentFailureReason_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKPaymentFailureReason_RecipientRejected;
+               case 1: return LDKPaymentFailureReason_UserAbandoned;
+               case 2: return LDKPaymentFailureReason_RetriesExhausted;
+               case 3: return LDKPaymentFailureReason_PaymentExpired;
+               case 4: return LDKPaymentFailureReason_RouteNotFound;
+               case 5: return LDKPaymentFailureReason_UnexpectedError;
+               default: abort();
+       }
+}
+static inline int32_t LDKPaymentFailureReason_to_cs(LDKPaymentFailureReason val) {
+       switch (val) {
+               case LDKPaymentFailureReason_RecipientRejected: return 0;
+               case LDKPaymentFailureReason_UserAbandoned: return 1;
+               case LDKPaymentFailureReason_RetriesExhausted: return 2;
+               case LDKPaymentFailureReason_PaymentExpired: return 3;
+               case LDKPaymentFailureReason_RouteNotFound: return 4;
+               case LDKPaymentFailureReason_UnexpectedError: return 5;
+               default: abort();
+       }
+}
+static inline LDKRecipient LDKRecipient_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKRecipient_Node;
+               case 1: return LDKRecipient_PhantomNode;
+               default: abort();
+       }
+}
+static inline int32_t LDKRecipient_to_cs(LDKRecipient val) {
+       switch (val) {
+               case LDKRecipient_Node: return 0;
+               case LDKRecipient_PhantomNode: return 1;
+               default: abort();
+       }
+}
+static inline LDKRetryableSendFailure LDKRetryableSendFailure_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKRetryableSendFailure_PaymentExpired;
+               case 1: return LDKRetryableSendFailure_RouteNotFound;
+               case 2: return LDKRetryableSendFailure_DuplicatePayment;
+               default: abort();
+       }
+}
+static inline int32_t LDKRetryableSendFailure_to_cs(LDKRetryableSendFailure val) {
+       switch (val) {
+               case LDKRetryableSendFailure_PaymentExpired: return 0;
+               case LDKRetryableSendFailure_RouteNotFound: return 1;
+               case LDKRetryableSendFailure_DuplicatePayment: return 2;
+               default: abort();
+       }
+}
+static inline LDKSecp256k1Error LDKSecp256k1Error_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKSecp256k1Error_IncorrectSignature;
+               case 1: return LDKSecp256k1Error_InvalidMessage;
+               case 2: return LDKSecp256k1Error_InvalidPublicKey;
+               case 3: return LDKSecp256k1Error_InvalidSignature;
+               case 4: return LDKSecp256k1Error_InvalidSecretKey;
+               case 5: return LDKSecp256k1Error_InvalidSharedSecret;
+               case 6: return LDKSecp256k1Error_InvalidRecoveryId;
+               case 7: return LDKSecp256k1Error_InvalidTweak;
+               case 8: return LDKSecp256k1Error_NotEnoughMemory;
+               case 9: return LDKSecp256k1Error_InvalidPublicKeySum;
+               case 10: return LDKSecp256k1Error_InvalidParityValue;
+               default: abort();
+       }
+}
+static inline int32_t LDKSecp256k1Error_to_cs(LDKSecp256k1Error val) {
+       switch (val) {
+               case LDKSecp256k1Error_IncorrectSignature: return 0;
+               case LDKSecp256k1Error_InvalidMessage: return 1;
+               case LDKSecp256k1Error_InvalidPublicKey: return 2;
+               case LDKSecp256k1Error_InvalidSignature: return 3;
+               case LDKSecp256k1Error_InvalidSecretKey: return 4;
+               case LDKSecp256k1Error_InvalidSharedSecret: return 5;
+               case LDKSecp256k1Error_InvalidRecoveryId: return 6;
+               case LDKSecp256k1Error_InvalidTweak: return 7;
+               case LDKSecp256k1Error_NotEnoughMemory: return 8;
+               case LDKSecp256k1Error_InvalidPublicKeySum: return 9;
+               case LDKSecp256k1Error_InvalidParityValue: return 10;
+               default: abort();
+       }
+}
+static inline LDKSiPrefix LDKSiPrefix_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKSiPrefix_Milli;
+               case 1: return LDKSiPrefix_Micro;
+               case 2: return LDKSiPrefix_Nano;
+               case 3: return LDKSiPrefix_Pico;
+               default: abort();
+       }
+}
+static inline int32_t LDKSiPrefix_to_cs(LDKSiPrefix val) {
+       switch (val) {
+               case LDKSiPrefix_Milli: return 0;
+               case LDKSiPrefix_Micro: return 1;
+               case LDKSiPrefix_Nano: return 2;
+               case LDKSiPrefix_Pico: return 3;
+               default: abort();
+       }
+}
+static inline LDKSocketAddressParseError LDKSocketAddressParseError_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKSocketAddressParseError_SocketAddrParse;
+               case 1: return LDKSocketAddressParseError_InvalidInput;
+               case 2: return LDKSocketAddressParseError_InvalidPort;
+               case 3: return LDKSocketAddressParseError_InvalidOnionV3;
+               default: abort();
+       }
+}
+static inline int32_t LDKSocketAddressParseError_to_cs(LDKSocketAddressParseError val) {
+       switch (val) {
+               case LDKSocketAddressParseError_SocketAddrParse: return 0;
+               case LDKSocketAddressParseError_InvalidInput: return 1;
+               case LDKSocketAddressParseError_InvalidPort: return 2;
+               case LDKSocketAddressParseError_InvalidOnionV3: return 3;
+               default: abort();
+       }
+}
+static inline LDKUtxoLookupError LDKUtxoLookupError_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKUtxoLookupError_UnknownChain;
+               case 1: return LDKUtxoLookupError_UnknownTx;
+               default: abort();
+       }
+}
+static inline int32_t LDKUtxoLookupError_to_cs(LDKUtxoLookupError val) {
+       switch (val) {
+               case LDKUtxoLookupError_UnknownChain: return 0;
+               case LDKUtxoLookupError_UnknownTx: return 1;
+               default: abort();
+       }
+}
+struct LDKThirtyTwoBytes BigEndianScalar_get_bytes (struct LDKBigEndianScalar* thing) {
+       LDKThirtyTwoBytes ret = { .data = *thing->big_endian_bytes };
+       return ret;
+}
+int8_tArray  CS_LDK_BigEndianScalar_get_bytes(int64_t thing) {
+       LDKBigEndianScalar* thing_conv = (LDKBigEndianScalar*)untag_ptr(thing);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, BigEndianScalar_get_bytes(thing_conv).data, 32);
+       return ret_arr;
+}
+
+static void BigEndianScalar_free (struct LDKBigEndianScalar thing) {}
+void  CS_LDK_BigEndianScalar_free(int64_t thing) {
+       if (!ptr_is_owned(thing)) return;
+       void* thing_ptr = untag_ptr(thing);
+       CHECK_ACCESS(thing_ptr);
+       LDKBigEndianScalar thing_conv = *(LDKBigEndianScalar*)(thing_ptr);
+       FREE(untag_ptr(thing));
+       BigEndianScalar_free(thing_conv);
+}
+
+uint32_t CS_LDK_LDKBech32Error_ty_from_ptr(int64_t ptr) {
+       LDKBech32Error *obj = (LDKBech32Error*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKBech32Error_MissingSeparator: return 0;
+               case LDKBech32Error_InvalidChecksum: return 1;
+               case LDKBech32Error_InvalidLength: return 2;
+               case LDKBech32Error_InvalidChar: return 3;
+               case LDKBech32Error_InvalidData: return 4;
+               case LDKBech32Error_InvalidPadding: return 5;
+               case LDKBech32Error_MixedCase: return 6;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKBech32Error_InvalidChar_get_invalid_char(int64_t ptr) {
+       LDKBech32Error *obj = (LDKBech32Error*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBech32Error_InvalidChar);
+       int32_t invalid_char_conv = obj->invalid_char;
+       return invalid_char_conv;
+}
+int8_t CS_LDK_LDKBech32Error_InvalidData_get_invalid_data(int64_t ptr) {
+       LDKBech32Error *obj = (LDKBech32Error*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBech32Error_InvalidData);
+       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) {
+               case LDKCOption_u64Z_Some: return 0;
+               case LDKCOption_u64Z_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_u64Z_Some_get_some(int64_t ptr) {
+       LDKCOption_u64Z *obj = (LDKCOption_u64Z*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_u64Z_Some);
+       int64_t some_conv = obj->some;
+       return some_conv;
+}
+static inline LDKCVec_BlindedPathZ CVec_BlindedPathZ_clone(const LDKCVec_BlindedPathZ *orig) {
+       LDKCVec_BlindedPathZ ret = { .data = MALLOC(sizeof(LDKBlindedPath) * orig->datalen, "LDKCVec_BlindedPathZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = BlindedPath_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKRefund CResult_RefundBolt12ParseErrorZ_get_ok(LDKCResult_RefundBolt12ParseErrorZ *NONNULL_PTR owner){
+       LDKRefund ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RefundBolt12ParseErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RefundBolt12ParseErrorZ* owner_conv = (LDKCResult_RefundBolt12ParseErrorZ*)untag_ptr(owner);
+       LDKRefund ret_var = CResult_RefundBolt12ParseErrorZ_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 LDKBolt12ParseError CResult_RefundBolt12ParseErrorZ_get_err(LDKCResult_RefundBolt12ParseErrorZ *NONNULL_PTR owner){
+       LDKBolt12ParseError ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RefundBolt12ParseErrorZ_get_err(int64_t owner) {
+       LDKCResult_RefundBolt12ParseErrorZ* owner_conv = (LDKCResult_RefundBolt12ParseErrorZ*)untag_ptr(owner);
+       LDKBolt12ParseError ret_var = CResult_RefundBolt12ParseErrorZ_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;
+}
+
+uint32_t CS_LDK_LDKRetry_ty_from_ptr(int64_t ptr) {
+       LDKRetry *obj = (LDKRetry*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKRetry_Attempts: return 0;
+               case LDKRetry_Timeout: return 1;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKRetry_Attempts_get_attempts(int64_t ptr) {
+       LDKRetry *obj = (LDKRetry*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRetry_Attempts);
+       int32_t attempts_conv = obj->attempts;
+       return attempts_conv;
+}
+int64_t CS_LDK_LDKRetry_Timeout_get_timeout(int64_t ptr) {
+       LDKRetry *obj = (LDKRetry*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRetry_Timeout);
+       int64_t timeout_conv = obj->timeout;
+       return timeout_conv;
+}
+uint32_t CS_LDK_LDKDecodeError_ty_from_ptr(int64_t ptr) {
+       LDKDecodeError *obj = (LDKDecodeError*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKDecodeError_UnknownVersion: return 0;
+               case LDKDecodeError_UnknownRequiredFeature: return 1;
+               case LDKDecodeError_InvalidValue: return 2;
+               case LDKDecodeError_ShortRead: return 3;
+               case LDKDecodeError_BadLengthDescriptor: return 4;
+               case LDKDecodeError_Io: return 5;
+               case LDKDecodeError_UnsupportedCompression: return 6;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKDecodeError_Io_get_io(int64_t ptr) {
+       LDKDecodeError *obj = (LDKDecodeError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKDecodeError_Io);
+       int32_t io_conv = LDKIOError_to_cs(obj->io);
+       return io_conv;
+}
+static inline struct LDKRetry CResult_RetryDecodeErrorZ_get_ok(LDKCResult_RetryDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return Retry_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_RetryDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RetryDecodeErrorZ* owner_conv = (LDKCResult_RetryDecodeErrorZ*)untag_ptr(owner);
+       LDKRetry *ret_copy = MALLOC(sizeof(LDKRetry), "LDKRetry");
+       *ret_copy = CResult_RetryDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_RetryDecodeErrorZ_get_err(LDKCResult_RetryDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RetryDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RetryDecodeErrorZ* owner_conv = (LDKCResult_RetryDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RetryDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKAPIError_ty_from_ptr(int64_t ptr) {
+       LDKAPIError *obj = (LDKAPIError*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKAPIError_APIMisuseError: return 0;
+               case LDKAPIError_FeeRateTooHigh: return 1;
+               case LDKAPIError_InvalidRoute: return 2;
+               case LDKAPIError_ChannelUnavailable: return 3;
+               case LDKAPIError_MonitorUpdateInProgress: return 4;
+               case LDKAPIError_IncompatibleShutdownScript: return 5;
+               default: abort();
+       }
+}
+jstring CS_LDK_LDKAPIError_APIMisuseError_get_err(int64_t ptr) {
+       LDKAPIError *obj = (LDKAPIError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKAPIError_APIMisuseError);
+       LDKStr err_str = obj->api_misuse_error.err;
+                       jstring err_conv = str_ref_to_cs(err_str.chars, err_str.len);
+       return err_conv;
+}
+jstring CS_LDK_LDKAPIError_FeeRateTooHigh_get_err(int64_t ptr) {
+       LDKAPIError *obj = (LDKAPIError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKAPIError_FeeRateTooHigh);
+       LDKStr err_str = obj->fee_rate_too_high.err;
+                       jstring err_conv = str_ref_to_cs(err_str.chars, err_str.len);
+       return err_conv;
+}
+int32_t CS_LDK_LDKAPIError_FeeRateTooHigh_get_feerate(int64_t ptr) {
+       LDKAPIError *obj = (LDKAPIError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKAPIError_FeeRateTooHigh);
+       int32_t feerate_conv = obj->fee_rate_too_high.feerate;
+       return feerate_conv;
+}
+jstring CS_LDK_LDKAPIError_InvalidRoute_get_err(int64_t ptr) {
+       LDKAPIError *obj = (LDKAPIError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKAPIError_InvalidRoute);
+       LDKStr err_str = obj->invalid_route.err;
+                       jstring err_conv = str_ref_to_cs(err_str.chars, err_str.len);
+       return err_conv;
+}
+jstring CS_LDK_LDKAPIError_ChannelUnavailable_get_err(int64_t ptr) {
+       LDKAPIError *obj = (LDKAPIError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKAPIError_ChannelUnavailable);
+       LDKStr err_str = obj->channel_unavailable.err;
+                       jstring err_conv = str_ref_to_cs(err_str.chars, err_str.len);
+       return err_conv;
+}
+int64_t CS_LDK_LDKAPIError_IncompatibleShutdownScript_get_script(int64_t ptr) {
+       LDKAPIError *obj = (LDKAPIError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKAPIError_IncompatibleShutdownScript);
+       LDKShutdownScript script_var = obj->incompatible_shutdown_script.script;
+                       int64_t script_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(script_var);
+                       script_ref = tag_ptr(script_var.inner, false);
+       return script_ref;
+}
+static inline void CResult_NoneAPIErrorZ_get_ok(LDKCResult_NoneAPIErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NoneAPIErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NoneAPIErrorZ* owner_conv = (LDKCResult_NoneAPIErrorZ*)untag_ptr(owner);
+       CResult_NoneAPIErrorZ_get_ok(owner_conv);
+}
+
+static inline struct LDKAPIError CResult_NoneAPIErrorZ_get_err(LDKCResult_NoneAPIErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return APIError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NoneAPIErrorZ_get_err(int64_t owner) {
+       LDKCResult_NoneAPIErrorZ* owner_conv = (LDKCResult_NoneAPIErrorZ*)untag_ptr(owner);
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = CResult_NoneAPIErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_CResult_NoneAPIErrorZZ CVec_CResult_NoneAPIErrorZZ_clone(const LDKCVec_CResult_NoneAPIErrorZZ *orig) {
+       LDKCVec_CResult_NoneAPIErrorZZ ret = { .data = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ) * orig->datalen, "LDKCVec_CResult_NoneAPIErrorZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = CResult_NoneAPIErrorZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_APIErrorZ CVec_APIErrorZ_clone(const LDKCVec_APIErrorZ *orig) {
+       LDKCVec_APIErrorZ ret = { .data = MALLOC(sizeof(LDKAPIError) * orig->datalen, "LDKCVec_APIErrorZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = APIError_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKCOption_ThirtyTwoBytesZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_ThirtyTwoBytesZ *obj = (LDKCOption_ThirtyTwoBytesZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_ThirtyTwoBytesZ_Some: return 0;
+               case LDKCOption_ThirtyTwoBytesZ_None: return 1;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKCOption_ThirtyTwoBytesZ_Some_get_some(int64_t ptr) {
+       LDKCOption_ThirtyTwoBytesZ *obj = (LDKCOption_ThirtyTwoBytesZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_ThirtyTwoBytesZ_Some);
+       int8_tArray some_arr = init_int8_tArray(32, __LINE__);
+       memcpy(some_arr->elems, obj->some.data, 32);
+       return some_arr;
+}
+uint32_t CS_LDK_LDKCOption_CVec_u8ZZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_CVec_u8ZZ *obj = (LDKCOption_CVec_u8ZZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_CVec_u8ZZ_Some: return 0;
+               case LDKCOption_CVec_u8ZZ_None: return 1;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKCOption_CVec_u8ZZ_Some_get_some(int64_t ptr) {
+       LDKCOption_CVec_u8ZZ *obj = (LDKCOption_CVec_u8ZZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_CVec_u8ZZ_Some);
+       LDKCVec_u8Z some_var = obj->some;
+                       int8_tArray some_arr = init_int8_tArray(some_var.datalen, __LINE__);
+                       memcpy(some_arr->elems, some_var.data, some_var.datalen);
+       return some_arr;
+}
+static inline struct LDKRecipientOnionFields CResult_RecipientOnionFieldsDecodeErrorZ_get_ok(LDKCResult_RecipientOnionFieldsDecodeErrorZ *NONNULL_PTR owner){
+       LDKRecipientOnionFields ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* owner_conv = (LDKCResult_RecipientOnionFieldsDecodeErrorZ*)untag_ptr(owner);
+       LDKRecipientOnionFields ret_var = CResult_RecipientOnionFieldsDecodeErrorZ_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_RecipientOnionFieldsDecodeErrorZ_get_err(LDKCResult_RecipientOnionFieldsDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* owner_conv = (LDKCResult_RecipientOnionFieldsDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RecipientOnionFieldsDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline uint64_t C2Tuple_u64CVec_u8ZZ_get_a(LDKC2Tuple_u64CVec_u8ZZ *NONNULL_PTR owner){
+       return owner->a;
+}
+int64_t  CS_LDK_C2Tuple_u64CVec_u8ZZ_get_a(int64_t owner) {
+       LDKC2Tuple_u64CVec_u8ZZ* owner_conv = (LDKC2Tuple_u64CVec_u8ZZ*)untag_ptr(owner);
+       int64_t ret_conv = C2Tuple_u64CVec_u8ZZ_get_a(owner_conv);
+       return ret_conv;
+}
+
+static inline struct LDKCVec_u8Z C2Tuple_u64CVec_u8ZZ_get_b(LDKC2Tuple_u64CVec_u8ZZ *NONNULL_PTR owner){
+       return CVec_u8Z_clone(&owner->b);
+}
+int8_tArray  CS_LDK_C2Tuple_u64CVec_u8ZZ_get_b(int64_t owner) {
+       LDKC2Tuple_u64CVec_u8ZZ* owner_conv = (LDKC2Tuple_u64CVec_u8ZZ*)untag_ptr(owner);
+       LDKCVec_u8Z ret_var = C2Tuple_u64CVec_u8ZZ_get_b(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 LDKCVec_C2Tuple_u64CVec_u8ZZZ CVec_C2Tuple_u64CVec_u8ZZZ_clone(const LDKCVec_C2Tuple_u64CVec_u8ZZZ *orig) {
+       LDKCVec_C2Tuple_u64CVec_u8ZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_u64CVec_u8ZZ) * orig->datalen, "LDKCVec_C2Tuple_u64CVec_u8ZZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_u64CVec_u8ZZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKRecipientOnionFields CResult_RecipientOnionFieldsNoneZ_get_ok(LDKCResult_RecipientOnionFieldsNoneZ *NONNULL_PTR owner){
+       LDKRecipientOnionFields ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RecipientOnionFieldsNoneZ_get_ok(int64_t owner) {
+       LDKCResult_RecipientOnionFieldsNoneZ* owner_conv = (LDKCResult_RecipientOnionFieldsNoneZ*)untag_ptr(owner);
+       LDKRecipientOnionFields ret_var = CResult_RecipientOnionFieldsNoneZ_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_RecipientOnionFieldsNoneZ_get_err(LDKCResult_RecipientOnionFieldsNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_RecipientOnionFieldsNoneZ_get_err(int64_t owner) {
+       LDKCResult_RecipientOnionFieldsNoneZ* owner_conv = (LDKCResult_RecipientOnionFieldsNoneZ*)untag_ptr(owner);
+       CResult_RecipientOnionFieldsNoneZ_get_err(owner_conv);
+}
+
+static inline LDKCVec_ThirtyTwoBytesZ CVec_ThirtyTwoBytesZ_clone(const LDKCVec_ThirtyTwoBytesZ *orig) {
+       LDKCVec_ThirtyTwoBytesZ ret = { .data = MALLOC(sizeof(LDKThirtyTwoBytes) * orig->datalen, "LDKCVec_ThirtyTwoBytesZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = ThirtyTwoBytes_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKCOption_CVec_ThirtyTwoBytesZZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_CVec_ThirtyTwoBytesZZ *obj = (LDKCOption_CVec_ThirtyTwoBytesZZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_CVec_ThirtyTwoBytesZZ_Some: return 0;
+               case LDKCOption_CVec_ThirtyTwoBytesZZ_None: return 1;
+               default: abort();
+       }
+}
+ptrArray CS_LDK_LDKCOption_CVec_ThirtyTwoBytesZZ_Some_get_some(int64_t ptr) {
+       LDKCOption_CVec_ThirtyTwoBytesZZ *obj = (LDKCOption_CVec_ThirtyTwoBytesZZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_CVec_ThirtyTwoBytesZZ_Some);
+       LDKCVec_ThirtyTwoBytesZ some_var = obj->some;
+                       ptrArray some_arr = NULL;
+                       some_arr = init_ptrArray(some_var.datalen, __LINE__);
+                       int8_tArray *some_arr_ptr = (int8_tArray*)(((uint8_t*)some_arr) + 8);
+                       for (size_t i = 0; i < some_var.datalen; i++) {
+                               int8_tArray some_conv_8_arr = init_int8_tArray(32, __LINE__);
+                               memcpy(some_conv_8_arr->elems, some_var.data[i].data, 32);
+                               some_arr_ptr[i] = some_conv_8_arr;
+                       }
+                       
+       return some_arr;
+}
+static inline struct LDKThirtyTwoBytes CResult_ThirtyTwoBytesNoneZ_get_ok(LDKCResult_ThirtyTwoBytesNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return ThirtyTwoBytes_clone(&*owner->contents.result);
+}
+int8_tArray  CS_LDK_CResult_ThirtyTwoBytesNoneZ_get_ok(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesNoneZ* owner_conv = (LDKCResult_ThirtyTwoBytesNoneZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, CResult_ThirtyTwoBytesNoneZ_get_ok(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline void CResult_ThirtyTwoBytesNoneZ_get_err(LDKCResult_ThirtyTwoBytesNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_ThirtyTwoBytesNoneZ_get_err(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesNoneZ* owner_conv = (LDKCResult_ThirtyTwoBytesNoneZ*)untag_ptr(owner);
+       CResult_ThirtyTwoBytesNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKBlindedPayInfo CResult_BlindedPayInfoDecodeErrorZ_get_ok(LDKCResult_BlindedPayInfoDecodeErrorZ *NONNULL_PTR owner){
+       LDKBlindedPayInfo ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BlindedPayInfoDecodeErrorZ* owner_conv = (LDKCResult_BlindedPayInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKBlindedPayInfo ret_var = CResult_BlindedPayInfoDecodeErrorZ_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_BlindedPayInfoDecodeErrorZ_get_err(LDKCResult_BlindedPayInfoDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BlindedPayInfoDecodeErrorZ* owner_conv = (LDKCResult_BlindedPayInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BlindedPayInfoDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDelayedPaymentOutputDescriptor CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_get_ok(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ *NONNULL_PTR owner){
+       LDKDelayedPaymentOutputDescriptor ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* owner_conv = (LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(owner);
+       LDKDelayedPaymentOutputDescriptor ret_var = CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_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_DelayedPaymentOutputDescriptorDecodeErrorZ_get_err(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* owner_conv = (LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKStaticPaymentOutputDescriptor CResult_StaticPaymentOutputDescriptorDecodeErrorZ_get_ok(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ *NONNULL_PTR owner){
+       LDKStaticPaymentOutputDescriptor ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_StaticPaymentOutputDescriptorDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* owner_conv = (LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(owner);
+       LDKStaticPaymentOutputDescriptor ret_var = CResult_StaticPaymentOutputDescriptorDecodeErrorZ_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_StaticPaymentOutputDescriptorDecodeErrorZ_get_err(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_StaticPaymentOutputDescriptorDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* owner_conv = (LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_StaticPaymentOutputDescriptorDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKSpendableOutputDescriptor_ty_from_ptr(int64_t ptr) {
+       LDKSpendableOutputDescriptor *obj = (LDKSpendableOutputDescriptor*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKSpendableOutputDescriptor_StaticOutput: return 0;
+               case LDKSpendableOutputDescriptor_DelayedPaymentOutput: return 1;
+               case LDKSpendableOutputDescriptor_StaticPaymentOutput: return 2;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKSpendableOutputDescriptor_StaticOutput_get_outpoint(int64_t ptr) {
+       LDKSpendableOutputDescriptor *obj = (LDKSpendableOutputDescriptor*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSpendableOutputDescriptor_StaticOutput);
+       LDKOutPoint outpoint_var = obj->static_output.outpoint;
+                       int64_t outpoint_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_var);
+                       outpoint_ref = tag_ptr(outpoint_var.inner, false);
+       return outpoint_ref;
+}
+int64_t CS_LDK_LDKSpendableOutputDescriptor_StaticOutput_get_output(int64_t ptr) {
+       LDKSpendableOutputDescriptor *obj = (LDKSpendableOutputDescriptor*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSpendableOutputDescriptor_StaticOutput);
+       LDKTxOut* output_ref = &obj->static_output.output;
+       return tag_ptr(output_ref, false);
+}
+int64_t CS_LDK_LDKSpendableOutputDescriptor_DelayedPaymentOutput_get_delayed_payment_output(int64_t ptr) {
+       LDKSpendableOutputDescriptor *obj = (LDKSpendableOutputDescriptor*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSpendableOutputDescriptor_DelayedPaymentOutput);
+       LDKDelayedPaymentOutputDescriptor delayed_payment_output_var = obj->delayed_payment_output;
+                       int64_t delayed_payment_output_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(delayed_payment_output_var);
+                       delayed_payment_output_ref = tag_ptr(delayed_payment_output_var.inner, false);
+       return delayed_payment_output_ref;
+}
+int64_t CS_LDK_LDKSpendableOutputDescriptor_StaticPaymentOutput_get_static_payment_output(int64_t ptr) {
+       LDKSpendableOutputDescriptor *obj = (LDKSpendableOutputDescriptor*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSpendableOutputDescriptor_StaticPaymentOutput);
+       LDKStaticPaymentOutputDescriptor static_payment_output_var = obj->static_payment_output;
+                       int64_t static_payment_output_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(static_payment_output_var);
+                       static_payment_output_ref = tag_ptr(static_payment_output_var.inner, false);
+       return static_payment_output_ref;
+}
+static inline struct LDKSpendableOutputDescriptor CResult_SpendableOutputDescriptorDecodeErrorZ_get_ok(LDKCResult_SpendableOutputDescriptorDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return SpendableOutputDescriptor_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* owner_conv = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)untag_ptr(owner);
+       LDKSpendableOutputDescriptor *ret_copy = MALLOC(sizeof(LDKSpendableOutputDescriptor), "LDKSpendableOutputDescriptor");
+       *ret_copy = CResult_SpendableOutputDescriptorDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_SpendableOutputDescriptorDecodeErrorZ_get_err(LDKCResult_SpendableOutputDescriptorDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* owner_conv = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_SpendableOutputDescriptorDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_SpendableOutputDescriptorZ CVec_SpendableOutputDescriptorZ_clone(const LDKCVec_SpendableOutputDescriptorZ *orig) {
+       LDKCVec_SpendableOutputDescriptorZ ret = { .data = MALLOC(sizeof(LDKSpendableOutputDescriptor) * orig->datalen, "LDKCVec_SpendableOutputDescriptorZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = SpendableOutputDescriptor_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_TxOutZ CVec_TxOutZ_clone(const LDKCVec_TxOutZ *orig) {
+       LDKCVec_TxOutZ ret = { .data = MALLOC(sizeof(LDKTxOut) * orig->datalen, "LDKCVec_TxOutZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = TxOut_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKCOption_u32Z_ty_from_ptr(int64_t ptr) {
+       LDKCOption_u32Z *obj = (LDKCOption_u32Z*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_u32Z_Some: return 0;
+               case LDKCOption_u32Z_None: return 1;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKCOption_u32Z_Some_get_some(int64_t ptr) {
+       LDKCOption_u32Z *obj = (LDKCOption_u32Z*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_u32Z_Some);
+       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){
+       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 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){
+       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);
+       return ret_conv;
+}
+
+static inline struct LDKC2Tuple_CVec_u8ZusizeZ CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_ok(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return C2Tuple_CVec_u8ZusizeZ_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);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline void CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_err(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ *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);
+}
+
+static inline struct LDKChannelDerivationParameters CResult_ChannelDerivationParametersDecodeErrorZ_get_ok(LDKCResult_ChannelDerivationParametersDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelDerivationParameters ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* owner_conv = (LDKCResult_ChannelDerivationParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelDerivationParameters ret_var = CResult_ChannelDerivationParametersDecodeErrorZ_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_ChannelDerivationParametersDecodeErrorZ_get_err(LDKCResult_ChannelDerivationParametersDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* owner_conv = (LDKCResult_ChannelDerivationParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelDerivationParametersDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKHTLCDescriptor CResult_HTLCDescriptorDecodeErrorZ_get_ok(LDKCResult_HTLCDescriptorDecodeErrorZ *NONNULL_PTR owner){
+       LDKHTLCDescriptor ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_HTLCDescriptorDecodeErrorZ* owner_conv = (LDKCResult_HTLCDescriptorDecodeErrorZ*)untag_ptr(owner);
+       LDKHTLCDescriptor ret_var = CResult_HTLCDescriptorDecodeErrorZ_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_HTLCDescriptorDecodeErrorZ_get_err(LDKCResult_HTLCDescriptorDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_HTLCDescriptorDecodeErrorZ* owner_conv = (LDKCResult_HTLCDescriptorDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_HTLCDescriptorDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline void CResult_NoneNoneZ_get_ok(LDKCResult_NoneNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NoneNoneZ_get_ok(int64_t owner) {
+       LDKCResult_NoneNoneZ* owner_conv = (LDKCResult_NoneNoneZ*)untag_ptr(owner);
+       CResult_NoneNoneZ_get_ok(owner_conv);
+}
+
+static inline void CResult_NoneNoneZ_get_err(LDKCResult_NoneNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_NoneNoneZ_get_err(int64_t owner) {
+       LDKCResult_NoneNoneZ* owner_conv = (LDKCResult_NoneNoneZ*)untag_ptr(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;
+}
+int8_tArray  CS_LDK_CResult_PublicKeyNoneZ_get_ok(int64_t owner) {
+       LDKCResult_PublicKeyNoneZ* owner_conv = (LDKCResult_PublicKeyNoneZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, CResult_PublicKeyNoneZ_get_ok(owner_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+static inline void CResult_PublicKeyNoneZ_get_err(LDKCResult_PublicKeyNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_PublicKeyNoneZ_get_err(int64_t owner) {
+       LDKCResult_PublicKeyNoneZ* owner_conv = (LDKCResult_PublicKeyNoneZ*)untag_ptr(owner);
+       CResult_PublicKeyNoneZ_get_err(owner_conv);
+}
+
+uint32_t CS_LDK_LDKCOption_BigEndianScalarZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_BigEndianScalarZ *obj = (LDKCOption_BigEndianScalarZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_BigEndianScalarZ_Some: return 0;
+               case LDKCOption_BigEndianScalarZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_BigEndianScalarZ_Some_get_some(int64_t ptr) {
+       LDKCOption_BigEndianScalarZ *obj = (LDKCOption_BigEndianScalarZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_BigEndianScalarZ_Some);
+       LDKBigEndianScalar* some_ref = &obj->some;
+       return tag_ptr(some_ref, false);
+}
+static inline struct LDKRecoverableSignature CResult_RecoverableSignatureNoneZ_get_ok(LDKCResult_RecoverableSignatureNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+int8_tArray  CS_LDK_CResult_RecoverableSignatureNoneZ_get_ok(int64_t owner) {
+       LDKCResult_RecoverableSignatureNoneZ* owner_conv = (LDKCResult_RecoverableSignatureNoneZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(68, __LINE__);
+       memcpy(ret_arr->elems, CResult_RecoverableSignatureNoneZ_get_ok(owner_conv).serialized_form, 68);
+       return ret_arr;
+}
+
+static inline void CResult_RecoverableSignatureNoneZ_get_err(LDKCResult_RecoverableSignatureNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_RecoverableSignatureNoneZ_get_err(int64_t owner) {
+       LDKCResult_RecoverableSignatureNoneZ* owner_conv = (LDKCResult_RecoverableSignatureNoneZ*)untag_ptr(owner);
+       CResult_RecoverableSignatureNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKSchnorrSignature CResult_SchnorrSignatureNoneZ_get_ok(LDKCResult_SchnorrSignatureNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+int8_tArray  CS_LDK_CResult_SchnorrSignatureNoneZ_get_ok(int64_t owner) {
+       LDKCResult_SchnorrSignatureNoneZ* owner_conv = (LDKCResult_SchnorrSignatureNoneZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(64, __LINE__);
+       memcpy(ret_arr->elems, CResult_SchnorrSignatureNoneZ_get_ok(owner_conv).compact_form, 64);
+       return ret_arr;
+}
+
+static inline void CResult_SchnorrSignatureNoneZ_get_err(LDKCResult_SchnorrSignatureNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_SchnorrSignatureNoneZ_get_err(int64_t owner) {
+       LDKCResult_SchnorrSignatureNoneZ* owner_conv = (LDKCResult_SchnorrSignatureNoneZ*)untag_ptr(owner);
+       CResult_SchnorrSignatureNoneZ_get_err(owner_conv);
+}
+
+typedef struct LDKChannelSigner_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKChannelSigner_JCalls;
+static void LDKChannelSigner_JCalls_free(void* this_arg) {
+       LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKPublicKey get_per_commitment_point_LDKChannelSigner_jcall(const void* this_arg, uint64_t idx) {
+       LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) this_arg;
+       int64_t idx_conv = idx;
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_l(j_calls->instance_ptr, 0, idx_conv);
+       LDKPublicKey ret_ref;
+       CHECK(ret->arr_len == 33);
+       memcpy(ret_ref.compressed_form, ret->elems, 33); FREE(ret);
+       return ret_ref;
+}
+LDKThirtyTwoBytes release_commitment_secret_LDKChannelSigner_jcall(const void* this_arg, uint64_t idx) {
+       LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) this_arg;
+       int64_t idx_conv = idx;
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_l(j_calls->instance_ptr, 1, idx_conv);
+       LDKThirtyTwoBytes ret_ref;
+       CHECK(ret->arr_len == 32);
+       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) {
+       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;
+       }
+       
+       FREE(preimages_var.data);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 2, holder_tx_ref, (int64_t)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;
+}
+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);
+       LDKThirtyTwoBytes ret_ref;
+       CHECK(ret->arr_len == 32);
+       memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
+       return ret_ref;
+}
+void provide_channel_parameters_LDKChannelSigner_jcall(void* this_arg, const LDKChannelTransactionParameters * channel_parameters) {
+       LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) this_arg;
+       LDKChannelTransactionParameters channel_parameters_var = *channel_parameters;
+       int64_t channel_parameters_ref = 0;
+       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);
+}
+static void LDKChannelSigner_JCalls_cloned(LDKChannelSigner* new_obj) {
+       LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKChannelSigner LDKChannelSigner_init (int64_t o, int64_t pubkeys) {
+       LDKChannelSigner_JCalls *calls = MALLOC(sizeof(LDKChannelSigner_JCalls), "LDKChannelSigner_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKChannelPublicKeys pubkeys_conv;
+       pubkeys_conv.inner = untag_ptr(pubkeys);
+       pubkeys_conv.is_owned = ptr_is_owned(pubkeys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(pubkeys_conv);
+
+       LDKChannelSigner ret = {
+               .this_arg = (void*) calls,
+               .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,
+               .channel_keys_id = channel_keys_id_LDKChannelSigner_jcall,
+               .provide_channel_parameters = provide_channel_parameters_LDKChannelSigner_jcall,
+               .free = LDKChannelSigner_JCalls_free,
+               .pubkeys = pubkeys_conv,
+               .set_pubkeys = NULL,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKChannelSigner_new(int32_t o, int64_t pubkeys) {
+       LDKChannelSigner *res_ptr = MALLOC(sizeof(LDKChannelSigner), "LDKChannelSigner");
+       *res_ptr = LDKChannelSigner_init(o, pubkeys);
+       return tag_ptr(res_ptr, true);
+}
+int8_tArray  CS_LDK_ChannelSigner_get_per_commitment_point(int64_t this_arg, int64_t idx) {
+       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;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, (this_arg_conv->get_per_commitment_point)(this_arg_conv->this_arg, idx).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_ChannelSigner_release_commitment_secret(int64_t this_arg, int64_t idx) {
+       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;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, (this_arg_conv->release_commitment_secret)(this_arg_conv->this_arg, idx).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_ChannelSigner_validate_holder_commitment(int64_t this_arg, int64_t holder_tx, ptrArray 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;
+       LDKHolderCommitmentTransaction holder_tx_conv;
+       holder_tx_conv.inner = untag_ptr(holder_tx);
+       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");
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelSigner_channel_keys_id(int64_t this_arg) {
+       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;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, (this_arg_conv->channel_keys_id)(this_arg_conv->this_arg).data, 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelSigner_provide_channel_parameters(int64_t this_arg, int64_t channel_parameters) {
+       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;
+       LDKChannelTransactionParameters channel_parameters_conv;
+       channel_parameters_conv.inner = untag_ptr(channel_parameters);
+       channel_parameters_conv.is_owned = ptr_is_owned(channel_parameters);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_parameters_conv);
+       channel_parameters_conv.is_owned = false;
+       (this_arg_conv->provide_channel_parameters)(this_arg_conv->this_arg, &channel_parameters_conv);
+}
+
+LDKChannelPublicKeys LDKChannelSigner_set_get_pubkeys(LDKChannelSigner* this_arg) {
+       if (this_arg->set_pubkeys != NULL)
+               this_arg->set_pubkeys(this_arg);
+       return this_arg->pubkeys;
+}
+int64_t  CS_LDK_ChannelSigner_get_pubkeys(int64_t this_arg) {
+       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;
+       LDKChannelPublicKeys ret_var = LDKChannelSigner_set_get_pubkeys(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;
+}
+
+typedef struct LDKEcdsaChannelSigner_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+       LDKChannelSigner_JCalls* ChannelSigner;
+} LDKEcdsaChannelSigner_JCalls;
+static void LDKEcdsaChannelSigner_JCalls_free(void* this_arg) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ sign_counterparty_commitment_LDKEcdsaChannelSigner_jcall(const void* this_arg, const LDKCommitmentTransaction * commitment_tx, LDKCVec_ThirtyTwoBytesZ 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;
+       }
+       
+       FREE(preimages_var.data);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 5, commitment_tx_ref, (int64_t)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;
+       int64_t commitment_tx_ref = 0;
+       commitment_tx_var = HolderCommitmentTransaction_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);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 7, commitment_tx_ref);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ECDSASignatureNoneZ sign_justice_revoked_output_LDKEcdsaChannelSigner_jcall(const void* this_arg, LDKTransaction justice_tx, uintptr_t input, uint64_t amount, const uint8_t (* per_commitment_key)[32]) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
+       LDKTransaction justice_tx_var = justice_tx;
+       int8_tArray justice_tx_arr = init_int8_tArray(justice_tx_var.datalen, __LINE__);
+       memcpy(justice_tx_arr->elems, justice_tx_var.data, justice_tx_var.datalen);
+       Transaction_free(justice_tx_var);
+       int64_t input_conv = input;
+       int64_t amount_conv = amount;
+       int8_tArray per_commitment_key_arr = init_int8_tArray(32, __LINE__);
+       memcpy(per_commitment_key_arr->elems, *per_commitment_key, 32);
+       uint64_t ret = js_invoke_function_l_llll(j_calls->instance_ptr, 8, (int64_t)justice_tx_arr, input_conv, amount_conv, (int64_t)per_commitment_key_arr);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ECDSASignatureNoneZ sign_justice_revoked_htlc_LDKEcdsaChannelSigner_jcall(const void* this_arg, LDKTransaction justice_tx, uintptr_t input, uint64_t amount, const uint8_t (* per_commitment_key)[32], const LDKHTLCOutputInCommitment * htlc) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
+       LDKTransaction justice_tx_var = justice_tx;
+       int8_tArray justice_tx_arr = init_int8_tArray(justice_tx_var.datalen, __LINE__);
+       memcpy(justice_tx_arr->elems, justice_tx_var.data, justice_tx_var.datalen);
+       Transaction_free(justice_tx_var);
+       int64_t input_conv = input;
+       int64_t amount_conv = amount;
+       int8_tArray per_commitment_key_arr = init_int8_tArray(32, __LINE__);
+       memcpy(per_commitment_key_arr->elems, *per_commitment_key, 32);
+       LDKHTLCOutputInCommitment htlc_var = *htlc;
+       int64_t htlc_ref = 0;
+       htlc_var = HTLCOutputInCommitment_clone(&htlc_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_var);
+       htlc_ref = tag_ptr(htlc_var.inner, htlc_var.is_owned);
+       uint64_t ret = js_invoke_function_l_lllll(j_calls->instance_ptr, 9, (int64_t)justice_tx_arr, input_conv, amount_conv, (int64_t)per_commitment_key_arr, htlc_ref);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ECDSASignatureNoneZ sign_holder_htlc_transaction_LDKEcdsaChannelSigner_jcall(const void* this_arg, LDKTransaction htlc_tx, uintptr_t input, const LDKHTLCDescriptor * htlc_descriptor) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
+       LDKTransaction htlc_tx_var = htlc_tx;
+       int8_tArray htlc_tx_arr = init_int8_tArray(htlc_tx_var.datalen, __LINE__);
+       memcpy(htlc_tx_arr->elems, htlc_tx_var.data, htlc_tx_var.datalen);
+       Transaction_free(htlc_tx_var);
+       int64_t input_conv = input;
+       LDKHTLCDescriptor htlc_descriptor_var = *htlc_descriptor;
+       int64_t htlc_descriptor_ref = 0;
+       htlc_descriptor_var = HTLCDescriptor_clone(&htlc_descriptor_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_descriptor_var);
+       htlc_descriptor_ref = tag_ptr(htlc_descriptor_var.inner, htlc_descriptor_var.is_owned);
+       uint64_t ret = js_invoke_function_l_lll(j_calls->instance_ptr, 10, (int64_t)htlc_tx_arr, input_conv, htlc_descriptor_ref);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ECDSASignatureNoneZ sign_counterparty_htlc_transaction_LDKEcdsaChannelSigner_jcall(const void* this_arg, LDKTransaction htlc_tx, uintptr_t input, uint64_t amount, LDKPublicKey per_commitment_point, const LDKHTLCOutputInCommitment * htlc) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
+       LDKTransaction htlc_tx_var = htlc_tx;
+       int8_tArray htlc_tx_arr = init_int8_tArray(htlc_tx_var.datalen, __LINE__);
+       memcpy(htlc_tx_arr->elems, htlc_tx_var.data, htlc_tx_var.datalen);
+       Transaction_free(htlc_tx_var);
+       int64_t input_conv = input;
+       int64_t amount_conv = amount;
+       int8_tArray per_commitment_point_arr = init_int8_tArray(33, __LINE__);
+       memcpy(per_commitment_point_arr->elems, per_commitment_point.compressed_form, 33);
+       LDKHTLCOutputInCommitment htlc_var = *htlc;
+       int64_t htlc_ref = 0;
+       htlc_var = HTLCOutputInCommitment_clone(&htlc_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_var);
+       htlc_ref = tag_ptr(htlc_var.inner, htlc_var.is_owned);
+       uint64_t ret = js_invoke_function_l_lllll(j_calls->instance_ptr, 11, (int64_t)htlc_tx_arr, input_conv, amount_conv, (int64_t)per_commitment_point_arr, htlc_ref);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ECDSASignatureNoneZ sign_closing_transaction_LDKEcdsaChannelSigner_jcall(const void* this_arg, const LDKClosingTransaction * closing_tx) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
+       LDKClosingTransaction closing_tx_var = *closing_tx;
+       int64_t closing_tx_ref = 0;
+       closing_tx_var = ClosingTransaction_clone(&closing_tx_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(closing_tx_var);
+       closing_tx_ref = tag_ptr(closing_tx_var.inner, closing_tx_var.is_owned);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 12, closing_tx_ref);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ECDSASignatureNoneZ sign_holder_anchor_input_LDKEcdsaChannelSigner_jcall(const void* this_arg, LDKTransaction anchor_tx, uintptr_t input) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
+       LDKTransaction anchor_tx_var = anchor_tx;
+       int8_tArray anchor_tx_arr = init_int8_tArray(anchor_tx_var.datalen, __LINE__);
+       memcpy(anchor_tx_arr->elems, anchor_tx_var.data, anchor_tx_var.datalen);
+       Transaction_free(anchor_tx_var);
+       int64_t input_conv = input;
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 13, (int64_t)anchor_tx_arr, input_conv);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ECDSASignatureNoneZ sign_channel_announcement_with_funding_key_LDKEcdsaChannelSigner_jcall(const void* this_arg, const LDKUnsignedChannelAnnouncement * msg) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
+       LDKUnsignedChannelAnnouncement msg_var = *msg;
+       int64_t msg_ref = 0;
+       msg_var = UnsignedChannelAnnouncement_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, 14, msg_ref);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKEcdsaChannelSigner_JCalls_cloned(LDKEcdsaChannelSigner* new_obj) {
+       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->ChannelSigner->refcnt, 1, memory_order_release);
+}
+static inline LDKEcdsaChannelSigner LDKEcdsaChannelSigner_init (int64_t o, int64_t ChannelSigner, int64_t pubkeys) {
+       LDKEcdsaChannelSigner_JCalls *calls = MALLOC(sizeof(LDKEcdsaChannelSigner_JCalls), "LDKEcdsaChannelSigner_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKChannelPublicKeys pubkeys_conv;
+       pubkeys_conv.inner = untag_ptr(pubkeys);
+       pubkeys_conv.is_owned = ptr_is_owned(pubkeys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(pubkeys_conv);
+
+       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,
+               .sign_holder_htlc_transaction = sign_holder_htlc_transaction_LDKEcdsaChannelSigner_jcall,
+               .sign_counterparty_htlc_transaction = sign_counterparty_htlc_transaction_LDKEcdsaChannelSigner_jcall,
+               .sign_closing_transaction = sign_closing_transaction_LDKEcdsaChannelSigner_jcall,
+               .sign_holder_anchor_input = sign_holder_anchor_input_LDKEcdsaChannelSigner_jcall,
+               .sign_channel_announcement_with_funding_key = sign_channel_announcement_with_funding_key_LDKEcdsaChannelSigner_jcall,
+               .free = LDKEcdsaChannelSigner_JCalls_free,
+               .ChannelSigner = LDKChannelSigner_init(ChannelSigner, pubkeys),
+       };
+       calls->ChannelSigner = ret.ChannelSigner.this_arg;
+       return ret;
+}
+uint64_t  CS_LDK_LDKEcdsaChannelSigner_new(int32_t o, int32_t ChannelSigner, int64_t pubkeys) {
+       LDKEcdsaChannelSigner *res_ptr = MALLOC(sizeof(LDKEcdsaChannelSigner), "LDKEcdsaChannelSigner");
+       *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) {
+       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;
+       LDKCommitmentTransaction commitment_tx_conv;
+       commitment_tx_conv.inner = untag_ptr(commitment_tx);
+       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");
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_EcdsaChannelSigner_sign_holder_commitment(int64_t this_arg, int64_t commitment_tx) {
+       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;
+       LDKHolderCommitmentTransaction commitment_tx_conv;
+       commitment_tx_conv.inner = untag_ptr(commitment_tx);
+       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;
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_holder_commitment)(this_arg_conv->this_arg, &commitment_tx_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_EcdsaChannelSigner_sign_justice_revoked_output(int64_t this_arg, int8_tArray justice_tx, int64_t input, int64_t amount, int8_tArray per_commitment_key) {
+       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;
+       LDKTransaction justice_tx_ref;
+       justice_tx_ref.datalen = justice_tx->arr_len;
+       justice_tx_ref.data = MALLOC(justice_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(justice_tx_ref.data, justice_tx->elems, justice_tx_ref.datalen); FREE(justice_tx);
+       justice_tx_ref.data_is_owned = true;
+       uint8_t per_commitment_key_arr[32];
+       CHECK(per_commitment_key->arr_len == 32);
+       memcpy(per_commitment_key_arr, per_commitment_key->elems, 32); FREE(per_commitment_key);
+       uint8_t (*per_commitment_key_ref)[32] = &per_commitment_key_arr;
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_justice_revoked_output)(this_arg_conv->this_arg, justice_tx_ref, input, amount, per_commitment_key_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_EcdsaChannelSigner_sign_justice_revoked_htlc(int64_t this_arg, int8_tArray justice_tx, int64_t input, int64_t amount, int8_tArray per_commitment_key, int64_t htlc) {
+       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;
+       LDKTransaction justice_tx_ref;
+       justice_tx_ref.datalen = justice_tx->arr_len;
+       justice_tx_ref.data = MALLOC(justice_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(justice_tx_ref.data, justice_tx->elems, justice_tx_ref.datalen); FREE(justice_tx);
+       justice_tx_ref.data_is_owned = true;
+       uint8_t per_commitment_key_arr[32];
+       CHECK(per_commitment_key->arr_len == 32);
+       memcpy(per_commitment_key_arr, per_commitment_key->elems, 32); FREE(per_commitment_key);
+       uint8_t (*per_commitment_key_ref)[32] = &per_commitment_key_arr;
+       LDKHTLCOutputInCommitment htlc_conv;
+       htlc_conv.inner = untag_ptr(htlc);
+       htlc_conv.is_owned = ptr_is_owned(htlc);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_conv);
+       htlc_conv.is_owned = false;
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_justice_revoked_htlc)(this_arg_conv->this_arg, justice_tx_ref, input, amount, per_commitment_key_ref, &htlc_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_EcdsaChannelSigner_sign_holder_htlc_transaction(int64_t this_arg, int8_tArray htlc_tx, int64_t input, int64_t htlc_descriptor) {
+       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;
+       LDKTransaction htlc_tx_ref;
+       htlc_tx_ref.datalen = htlc_tx->arr_len;
+       htlc_tx_ref.data = MALLOC(htlc_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(htlc_tx_ref.data, htlc_tx->elems, htlc_tx_ref.datalen); FREE(htlc_tx);
+       htlc_tx_ref.data_is_owned = true;
+       LDKHTLCDescriptor htlc_descriptor_conv;
+       htlc_descriptor_conv.inner = untag_ptr(htlc_descriptor);
+       htlc_descriptor_conv.is_owned = ptr_is_owned(htlc_descriptor);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_descriptor_conv);
+       htlc_descriptor_conv.is_owned = false;
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_holder_htlc_transaction)(this_arg_conv->this_arg, htlc_tx_ref, input, &htlc_descriptor_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_EcdsaChannelSigner_sign_counterparty_htlc_transaction(int64_t this_arg, int8_tArray htlc_tx, int64_t input, int64_t amount, int8_tArray per_commitment_point, int64_t htlc) {
+       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;
+       LDKTransaction htlc_tx_ref;
+       htlc_tx_ref.datalen = htlc_tx->arr_len;
+       htlc_tx_ref.data = MALLOC(htlc_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(htlc_tx_ref.data, htlc_tx->elems, htlc_tx_ref.datalen); FREE(htlc_tx);
+       htlc_tx_ref.data_is_owned = true;
+       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);
+       LDKHTLCOutputInCommitment htlc_conv;
+       htlc_conv.inner = untag_ptr(htlc);
+       htlc_conv.is_owned = ptr_is_owned(htlc);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_conv);
+       htlc_conv.is_owned = false;
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_counterparty_htlc_transaction)(this_arg_conv->this_arg, htlc_tx_ref, input, amount, per_commitment_point_ref, &htlc_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_EcdsaChannelSigner_sign_closing_transaction(int64_t this_arg, int64_t closing_tx) {
+       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;
+       LDKClosingTransaction closing_tx_conv;
+       closing_tx_conv.inner = untag_ptr(closing_tx);
+       closing_tx_conv.is_owned = ptr_is_owned(closing_tx);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(closing_tx_conv);
+       closing_tx_conv.is_owned = false;
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_closing_transaction)(this_arg_conv->this_arg, &closing_tx_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_EcdsaChannelSigner_sign_holder_anchor_input(int64_t this_arg, int8_tArray anchor_tx, int64_t input) {
+       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;
+       LDKTransaction anchor_tx_ref;
+       anchor_tx_ref.datalen = anchor_tx->arr_len;
+       anchor_tx_ref.data = MALLOC(anchor_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(anchor_tx_ref.data, anchor_tx->elems, anchor_tx_ref.datalen); FREE(anchor_tx);
+       anchor_tx_ref.data_is_owned = true;
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_holder_anchor_input)(this_arg_conv->this_arg, anchor_tx_ref, input);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_EcdsaChannelSigner_sign_channel_announcement_with_funding_key(int64_t this_arg, int64_t msg) {
+       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;
+       LDKUnsignedChannelAnnouncement 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;
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_channel_announcement_with_funding_key)(this_arg_conv->this_arg, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+typedef struct LDKWriteableEcdsaChannelSigner_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+       LDKEcdsaChannelSigner_JCalls* EcdsaChannelSigner;
+       LDKChannelSigner_JCalls* ChannelSigner;
+} LDKWriteableEcdsaChannelSigner_JCalls;
+static void LDKWriteableEcdsaChannelSigner_JCalls_free(void* this_arg) {
+       LDKWriteableEcdsaChannelSigner_JCalls *j_calls = (LDKWriteableEcdsaChannelSigner_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCVec_u8Z write_LDKWriteableEcdsaChannelSigner_jcall(const void* this_arg) {
+       LDKWriteableEcdsaChannelSigner_JCalls *j_calls = (LDKWriteableEcdsaChannelSigner_JCalls*) this_arg;
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 15);
+       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;
+}
+static void LDKWriteableEcdsaChannelSigner_JCalls_cloned(LDKWriteableEcdsaChannelSigner* new_obj) {
+       LDKWriteableEcdsaChannelSigner_JCalls *j_calls = (LDKWriteableEcdsaChannelSigner_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->EcdsaChannelSigner->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->EcdsaChannelSigner->ChannelSigner->refcnt, 1, memory_order_release);
+}
+static inline LDKWriteableEcdsaChannelSigner LDKWriteableEcdsaChannelSigner_init (int64_t o, int64_t EcdsaChannelSigner, int64_t ChannelSigner, int64_t pubkeys) {
+       LDKWriteableEcdsaChannelSigner_JCalls *calls = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner_JCalls), "LDKWriteableEcdsaChannelSigner_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKChannelPublicKeys pubkeys_conv;
+       pubkeys_conv.inner = untag_ptr(pubkeys);
+       pubkeys_conv.is_owned = ptr_is_owned(pubkeys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(pubkeys_conv);
+
+       LDKWriteableEcdsaChannelSigner ret = {
+               .this_arg = (void*) calls,
+               .write = write_LDKWriteableEcdsaChannelSigner_jcall,
+               .cloned = LDKWriteableEcdsaChannelSigner_JCalls_cloned,
+               .free = LDKWriteableEcdsaChannelSigner_JCalls_free,
+               .EcdsaChannelSigner = LDKEcdsaChannelSigner_init(EcdsaChannelSigner, ChannelSigner, pubkeys),
+       };
+       calls->EcdsaChannelSigner = ret.EcdsaChannelSigner.this_arg;
+       calls->ChannelSigner = ret.EcdsaChannelSigner.ChannelSigner.this_arg;
+       return ret;
+}
+uint64_t  CS_LDK_LDKWriteableEcdsaChannelSigner_new(int32_t o, int32_t EcdsaChannelSigner, int32_t ChannelSigner, int64_t pubkeys) {
+       LDKWriteableEcdsaChannelSigner *res_ptr = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
+       *res_ptr = LDKWriteableEcdsaChannelSigner_init(o, EcdsaChannelSigner, ChannelSigner, pubkeys);
+       return tag_ptr(res_ptr, true);
+}
+int8_tArray  CS_LDK_WriteableEcdsaChannelSigner_write(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKWriteableEcdsaChannelSigner* this_arg_conv = (LDKWriteableEcdsaChannelSigner*)this_arg_ptr;
+       LDKCVec_u8Z ret_var = (this_arg_conv->write)(this_arg_conv->this_arg);
+       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 struct LDKWriteableEcdsaChannelSigner CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_ok(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return WriteableEcdsaChannelSigner_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* owner_conv = (LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ*)untag_ptr(owner);
+       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
+       *ret_ret = CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_ok(owner_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+static inline struct LDKDecodeError CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_err(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* owner_conv = (LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKCVec_u8Z CResult_CVec_u8ZNoneZ_get_ok(LDKCResult_CVec_u8ZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return CVec_u8Z_clone(&*owner->contents.result);
+}
+int8_tArray  CS_LDK_CResult_CVec_u8ZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_u8ZNoneZ* owner_conv = (LDKCResult_CVec_u8ZNoneZ*)untag_ptr(owner);
+       LDKCVec_u8Z ret_var = CResult_CVec_u8ZNoneZ_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);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+static inline void CResult_CVec_u8ZNoneZ_get_err(LDKCResult_CVec_u8ZNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_CVec_u8ZNoneZ_get_err(int64_t owner) {
+       LDKCResult_CVec_u8ZNoneZ* owner_conv = (LDKCResult_CVec_u8ZNoneZ*)untag_ptr(owner);
+       CResult_CVec_u8ZNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKShutdownScript CResult_ShutdownScriptNoneZ_get_ok(LDKCResult_ShutdownScriptNoneZ *NONNULL_PTR owner){
+       LDKShutdownScript ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ShutdownScriptNoneZ_get_ok(int64_t owner) {
+       LDKCResult_ShutdownScriptNoneZ* owner_conv = (LDKCResult_ShutdownScriptNoneZ*)untag_ptr(owner);
+       LDKShutdownScript ret_var = CResult_ShutdownScriptNoneZ_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_ShutdownScriptNoneZ_get_err(LDKCResult_ShutdownScriptNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_ShutdownScriptNoneZ_get_err(int64_t owner) {
+       LDKCResult_ShutdownScriptNoneZ* owner_conv = (LDKCResult_ShutdownScriptNoneZ*)untag_ptr(owner);
+       CResult_ShutdownScriptNoneZ_get_err(owner_conv);
+}
+
+uint32_t CS_LDK_LDKCOption_u16Z_ty_from_ptr(int64_t ptr) {
+       LDKCOption_u16Z *obj = (LDKCOption_u16Z*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_u16Z_Some: return 0;
+               case LDKCOption_u16Z_None: return 1;
+               default: abort();
+       }
+}
+int16_t CS_LDK_LDKCOption_u16Z_Some_get_some(int64_t ptr) {
+       LDKCOption_u16Z *obj = (LDKCOption_u16Z*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_u16Z_Some);
+       int16_t some_conv = obj->some;
+       return some_conv;
+}
+uint32_t CS_LDK_LDKCOption_boolZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_boolZ *obj = (LDKCOption_boolZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_boolZ_Some: return 0;
+               case LDKCOption_boolZ_None: return 1;
+               default: abort();
+       }
+}
+jboolean CS_LDK_LDKCOption_boolZ_Some_get_some(int64_t ptr) {
+       LDKCOption_boolZ *obj = (LDKCOption_boolZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_boolZ_Some);
+       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){
+CHECK(owner->result_ok);
+       return CVec_CVec_u8ZZ_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);
+       return ret_arr;
+}
+
+static inline void CResult_CVec_CVec_u8ZZNoneZ_get_err(LDKCResult_CVec_CVec_u8ZZNoneZ *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);
+}
+
+static inline struct LDKInMemorySigner CResult_InMemorySignerDecodeErrorZ_get_ok(LDKCResult_InMemorySignerDecodeErrorZ *NONNULL_PTR owner){
+       LDKInMemorySigner ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_InMemorySignerDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_InMemorySignerDecodeErrorZ* owner_conv = (LDKCResult_InMemorySignerDecodeErrorZ*)untag_ptr(owner);
+       LDKInMemorySigner ret_var = CResult_InMemorySignerDecodeErrorZ_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_InMemorySignerDecodeErrorZ_get_err(LDKCResult_InMemorySignerDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_InMemorySignerDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_InMemorySignerDecodeErrorZ* owner_conv = (LDKCResult_InMemorySignerDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_InMemorySignerDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTransaction CResult_TransactionNoneZ_get_ok(LDKCResult_TransactionNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+int8_tArray  CS_LDK_CResult_TransactionNoneZ_get_ok(int64_t owner) {
+       LDKCResult_TransactionNoneZ* owner_conv = (LDKCResult_TransactionNoneZ*)untag_ptr(owner);
+       LDKTransaction ret_var = CResult_TransactionNoneZ_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);
+       return ret_arr;
+}
+
+static inline void CResult_TransactionNoneZ_get_err(LDKCResult_TransactionNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_TransactionNoneZ_get_err(int64_t owner) {
+       LDKCResult_TransactionNoneZ* owner_conv = (LDKCResult_TransactionNoneZ*)untag_ptr(owner);
+       CResult_TransactionNoneZ_get_err(owner_conv);
+}
+
+typedef struct LDKScoreLookUp_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKScoreLookUp_JCalls;
+static void LDKScoreLookUp_JCalls_free(void* this_arg) {
+       LDKScoreLookUp_JCalls *j_calls = (LDKScoreLookUp_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               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) {
+       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);
+       LDKChannelUsage usage_var = usage;
+       int64_t usage_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(usage_var);
+       usage_ref = tag_ptr(usage_var.inner, usage_var.is_owned);
+       LDKProbabilisticScoringFeeParameters score_params_var = *score_params;
+       int64_t score_params_ref = 0;
+       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);
+}
+static void LDKScoreLookUp_JCalls_cloned(LDKScoreLookUp* new_obj) {
+       LDKScoreLookUp_JCalls *j_calls = (LDKScoreLookUp_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKScoreLookUp LDKScoreLookUp_init (int64_t o) {
+       LDKScoreLookUp_JCalls *calls = MALLOC(sizeof(LDKScoreLookUp_JCalls), "LDKScoreLookUp_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKScoreLookUp ret = {
+               .this_arg = (void*) calls,
+               .channel_penalty_msat = channel_penalty_msat_LDKScoreLookUp_jcall,
+               .free = LDKScoreLookUp_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKScoreLookUp_new(int32_t o) {
+       LDKScoreLookUp *res_ptr = MALLOC(sizeof(LDKScoreLookUp), "LDKScoreLookUp");
+       *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) {
+       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;
+       LDKChannelUsage usage_conv;
+       usage_conv.inner = untag_ptr(usage);
+       usage_conv.is_owned = ptr_is_owned(usage);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(usage_conv);
+       usage_conv = ChannelUsage_clone(&usage_conv);
+       LDKProbabilisticScoringFeeParameters score_params_conv;
+       score_params_conv.inner = untag_ptr(score_params);
+       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);
+       return ret_conv;
+}
+
+typedef struct LDKScoreUpdate_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKScoreUpdate_JCalls;
+static void LDKScoreUpdate_JCalls_free(void* this_arg) {
+       LDKScoreUpdate_JCalls *j_calls = (LDKScoreUpdate_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void payment_path_failed_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uint64_t short_channel_id) {
+       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);
+       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);
+}
+void payment_path_successful_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path) {
+       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);
+}
+void probe_failed_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uint64_t short_channel_id) {
+       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);
+       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);
+}
+void probe_successful_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path) {
+       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);
+}
+static void LDKScoreUpdate_JCalls_cloned(LDKScoreUpdate* new_obj) {
+       LDKScoreUpdate_JCalls *j_calls = (LDKScoreUpdate_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKScoreUpdate LDKScoreUpdate_init (int64_t o) {
+       LDKScoreUpdate_JCalls *calls = MALLOC(sizeof(LDKScoreUpdate_JCalls), "LDKScoreUpdate_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKScoreUpdate ret = {
+               .this_arg = (void*) calls,
+               .payment_path_failed = payment_path_failed_LDKScoreUpdate_jcall,
+               .payment_path_successful = payment_path_successful_LDKScoreUpdate_jcall,
+               .probe_failed = probe_failed_LDKScoreUpdate_jcall,
+               .probe_successful = probe_successful_LDKScoreUpdate_jcall,
+               .free = LDKScoreUpdate_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKScoreUpdate_new(int32_t o) {
+       LDKScoreUpdate *res_ptr = MALLOC(sizeof(LDKScoreUpdate), "LDKScoreUpdate");
+       *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* 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;
+       LDKPath 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.is_owned = false;
+       (this_arg_conv->payment_path_failed)(this_arg_conv->this_arg, &path_conv, short_channel_id);
+}
+
+void  CS_LDK_ScoreUpdate_payment_path_successful(int64_t this_arg, int64_t path) {
+       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;
+       LDKPath 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.is_owned = false;
+       (this_arg_conv->payment_path_successful)(this_arg_conv->this_arg, &path_conv);
+}
+
+void  CS_LDK_ScoreUpdate_probe_failed(int64_t this_arg, int64_t path, int64_t short_channel_id) {
+       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;
+       LDKPath 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.is_owned = false;
+       (this_arg_conv->probe_failed)(this_arg_conv->this_arg, &path_conv, short_channel_id);
+}
+
+void  CS_LDK_ScoreUpdate_probe_successful(int64_t this_arg, int64_t path) {
+       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;
+       LDKPath 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.is_owned = false;
+       (this_arg_conv->probe_successful)(this_arg_conv->this_arg, &path_conv);
+}
+
+typedef struct LDKLockableScore_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKLockableScore_JCalls;
+static void LDKLockableScore_JCalls_free(void* this_arg) {
+       LDKLockableScore_JCalls *j_calls = (LDKLockableScore_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKScoreLookUp ret_conv = *(LDKScoreLookUp*)(ret_ptr);
+       if (ret_conv.free == LDKScoreLookUp_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKScoreLookUp_JCalls_cloned(&ret_conv);
+       }// WARNING: we may need a move here but no clone is available for LDKScoreLookUp
+       
+       return ret_conv;
+}
+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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKScoreUpdate ret_conv = *(LDKScoreUpdate*)(ret_ptr);
+       if (ret_conv.free == LDKScoreUpdate_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKScoreUpdate_JCalls_cloned(&ret_conv);
+       }// WARNING: we may need a move here but no clone is available for LDKScoreUpdate
+       
+       return ret_conv;
+}
+static void LDKLockableScore_JCalls_cloned(LDKLockableScore* new_obj) {
+       LDKLockableScore_JCalls *j_calls = (LDKLockableScore_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKLockableScore LDKLockableScore_init (int64_t o) {
+       LDKLockableScore_JCalls *calls = MALLOC(sizeof(LDKLockableScore_JCalls), "LDKLockableScore_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKLockableScore ret = {
+               .this_arg = (void*) calls,
+               .read_lock = read_lock_LDKLockableScore_jcall,
+               .write_lock = write_lock_LDKLockableScore_jcall,
+               .free = LDKLockableScore_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKLockableScore_new(int32_t o) {
+       LDKLockableScore *res_ptr = MALLOC(sizeof(LDKLockableScore), "LDKLockableScore");
+       *res_ptr = LDKLockableScore_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_LockableScore_read_lock(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKLockableScore* this_arg_conv = (LDKLockableScore*)this_arg_ptr;
+       LDKScoreLookUp* ret_ret = MALLOC(sizeof(LDKScoreLookUp), "LDKScoreLookUp");
+       *ret_ret = (this_arg_conv->read_lock)(this_arg_conv->this_arg);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_LockableScore_write_lock(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKLockableScore* this_arg_conv = (LDKLockableScore*)this_arg_ptr;
+       LDKScoreUpdate* ret_ret = MALLOC(sizeof(LDKScoreUpdate), "LDKScoreUpdate");
+       *ret_ret = (this_arg_conv->write_lock)(this_arg_conv->this_arg);
+       return tag_ptr(ret_ret, true);
+}
+
+typedef struct LDKWriteableScore_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+       LDKLockableScore_JCalls* LockableScore;
+} LDKWriteableScore_JCalls;
+static void LDKWriteableScore_JCalls_free(void* this_arg) {
+       LDKWriteableScore_JCalls *j_calls = (LDKWriteableScore_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+       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;
+}
+static void LDKWriteableScore_JCalls_cloned(LDKWriteableScore* new_obj) {
+       LDKWriteableScore_JCalls *j_calls = (LDKWriteableScore_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->LockableScore->refcnt, 1, memory_order_release);
+}
+static inline LDKWriteableScore LDKWriteableScore_init (int64_t o, int64_t LockableScore) {
+       LDKWriteableScore_JCalls *calls = MALLOC(sizeof(LDKWriteableScore_JCalls), "LDKWriteableScore_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKWriteableScore ret = {
+               .this_arg = (void*) calls,
+               .write = write_LDKWriteableScore_jcall,
+               .free = LDKWriteableScore_JCalls_free,
+               .LockableScore = LDKLockableScore_init(LockableScore),
+       };
+       calls->LockableScore = ret.LockableScore.this_arg;
+       return ret;
+}
+uint64_t  CS_LDK_LDKWriteableScore_new(int32_t o, int32_t LockableScore) {
+       LDKWriteableScore *res_ptr = MALLOC(sizeof(LDKWriteableScore), "LDKWriteableScore");
+       *res_ptr = LDKWriteableScore_init(o, LockableScore);
+       return tag_ptr(res_ptr, true);
+}
+int8_tArray  CS_LDK_WriteableScore_write(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKWriteableScore* this_arg_conv = (LDKWriteableScore*)this_arg_ptr;
+       LDKCVec_u8Z ret_var = (this_arg_conv->write)(this_arg_conv->this_arg);
+       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;
+}
+
+uint32_t CS_LDK_LDKCOption_WriteableScoreZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_WriteableScoreZ *obj = (LDKCOption_WriteableScoreZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_WriteableScoreZ_Some: return 0;
+               case LDKCOption_WriteableScoreZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_WriteableScoreZ_Some_get_some(int64_t ptr) {
+       LDKCOption_WriteableScoreZ *obj = (LDKCOption_WriteableScoreZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_WriteableScoreZ_Some);
+       LDKWriteableScore* some_ret = MALLOC(sizeof(LDKWriteableScore), "LDKWriteableScore");
+       *some_ret = obj->some;
+                       // WARNING: We likely need to clone here, but no clone is available, so we just do it for Java instances
+                       if ((*some_ret).free == LDKWriteableScore_JCalls_free) {
+                               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                               LDKWriteableScore_JCalls_cloned(&(*some_ret));
+                       }
+       return tag_ptr(some_ret, true);
+}
+static inline void CResult_NoneIOErrorZ_get_ok(LDKCResult_NoneIOErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NoneIOErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NoneIOErrorZ* owner_conv = (LDKCResult_NoneIOErrorZ*)untag_ptr(owner);
+       CResult_NoneIOErrorZ_get_ok(owner_conv);
+}
+
+static inline enum LDKIOError CResult_NoneIOErrorZ_get_err(LDKCResult_NoneIOErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+int32_t  CS_LDK_CResult_NoneIOErrorZ_get_err(int64_t owner) {
+       LDKCResult_NoneIOErrorZ* owner_conv = (LDKCResult_NoneIOErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKIOError_to_cs(CResult_NoneIOErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline LDKCVec_ChannelDetailsZ CVec_ChannelDetailsZ_clone(const LDKCVec_ChannelDetailsZ *orig) {
+       LDKCVec_ChannelDetailsZ ret = { .data = MALLOC(sizeof(LDKChannelDetails) * orig->datalen, "LDKCVec_ChannelDetailsZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = ChannelDetails_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKRoute CResult_RouteLightningErrorZ_get_ok(LDKCResult_RouteLightningErrorZ *NONNULL_PTR owner){
+       LDKRoute ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RouteLightningErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RouteLightningErrorZ* owner_conv = (LDKCResult_RouteLightningErrorZ*)untag_ptr(owner);
+       LDKRoute ret_var = CResult_RouteLightningErrorZ_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 LDKLightningError CResult_RouteLightningErrorZ_get_err(LDKCResult_RouteLightningErrorZ *NONNULL_PTR owner){
+       LDKLightningError ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RouteLightningErrorZ_get_err(int64_t owner) {
+       LDKCResult_RouteLightningErrorZ* owner_conv = (LDKCResult_RouteLightningErrorZ*)untag_ptr(owner);
+       LDKLightningError ret_var = CResult_RouteLightningErrorZ_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 struct LDKInFlightHtlcs CResult_InFlightHtlcsDecodeErrorZ_get_ok(LDKCResult_InFlightHtlcsDecodeErrorZ *NONNULL_PTR owner){
+       LDKInFlightHtlcs ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_InFlightHtlcsDecodeErrorZ* owner_conv = (LDKCResult_InFlightHtlcsDecodeErrorZ*)untag_ptr(owner);
+       LDKInFlightHtlcs ret_var = CResult_InFlightHtlcsDecodeErrorZ_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_InFlightHtlcsDecodeErrorZ_get_err(LDKCResult_InFlightHtlcsDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_InFlightHtlcsDecodeErrorZ* owner_conv = (LDKCResult_InFlightHtlcsDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_InFlightHtlcsDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKRouteHop CResult_RouteHopDecodeErrorZ_get_ok(LDKCResult_RouteHopDecodeErrorZ *NONNULL_PTR owner){
+       LDKRouteHop ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RouteHopDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RouteHopDecodeErrorZ* owner_conv = (LDKCResult_RouteHopDecodeErrorZ*)untag_ptr(owner);
+       LDKRouteHop ret_var = CResult_RouteHopDecodeErrorZ_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_RouteHopDecodeErrorZ_get_err(LDKCResult_RouteHopDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RouteHopDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RouteHopDecodeErrorZ* owner_conv = (LDKCResult_RouteHopDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RouteHopDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_BlindedHopZ CVec_BlindedHopZ_clone(const LDKCVec_BlindedHopZ *orig) {
+       LDKCVec_BlindedHopZ ret = { .data = MALLOC(sizeof(LDKBlindedHop) * orig->datalen, "LDKCVec_BlindedHopZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = BlindedHop_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKBlindedTail CResult_BlindedTailDecodeErrorZ_get_ok(LDKCResult_BlindedTailDecodeErrorZ *NONNULL_PTR owner){
+       LDKBlindedTail ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BlindedTailDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BlindedTailDecodeErrorZ* owner_conv = (LDKCResult_BlindedTailDecodeErrorZ*)untag_ptr(owner);
+       LDKBlindedTail ret_var = CResult_BlindedTailDecodeErrorZ_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_BlindedTailDecodeErrorZ_get_err(LDKCResult_BlindedTailDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BlindedTailDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BlindedTailDecodeErrorZ* owner_conv = (LDKCResult_BlindedTailDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BlindedTailDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_RouteHopZ CVec_RouteHopZ_clone(const LDKCVec_RouteHopZ *orig) {
+       LDKCVec_RouteHopZ ret = { .data = MALLOC(sizeof(LDKRouteHop) * orig->datalen, "LDKCVec_RouteHopZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = RouteHop_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_PathZ CVec_PathZ_clone(const LDKCVec_PathZ *orig) {
+       LDKCVec_PathZ ret = { .data = MALLOC(sizeof(LDKPath) * orig->datalen, "LDKCVec_PathZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = Path_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKRoute CResult_RouteDecodeErrorZ_get_ok(LDKCResult_RouteDecodeErrorZ *NONNULL_PTR owner){
+       LDKRoute ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RouteDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RouteDecodeErrorZ* owner_conv = (LDKCResult_RouteDecodeErrorZ*)untag_ptr(owner);
+       LDKRoute ret_var = CResult_RouteDecodeErrorZ_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_RouteDecodeErrorZ_get_err(LDKCResult_RouteDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RouteDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RouteDecodeErrorZ* owner_conv = (LDKCResult_RouteDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RouteDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKRouteParameters CResult_RouteParametersDecodeErrorZ_get_ok(LDKCResult_RouteParametersDecodeErrorZ *NONNULL_PTR owner){
+       LDKRouteParameters ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RouteParametersDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RouteParametersDecodeErrorZ* owner_conv = (LDKCResult_RouteParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKRouteParameters ret_var = CResult_RouteParametersDecodeErrorZ_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_RouteParametersDecodeErrorZ_get_err(LDKCResult_RouteParametersDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RouteParametersDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RouteParametersDecodeErrorZ* owner_conv = (LDKCResult_RouteParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RouteParametersDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_u64Z CVec_u64Z_clone(const LDKCVec_u64Z *orig) {
+       LDKCVec_u64Z ret = { .data = MALLOC(sizeof(int64_t) * orig->datalen, "LDKCVec_u64Z clone bytes"), .datalen = orig->datalen };
+       memcpy(ret.data, orig->data, sizeof(int64_t) * ret.datalen);
+       return ret;
+}
+static inline struct LDKPaymentParameters CResult_PaymentParametersDecodeErrorZ_get_ok(LDKCResult_PaymentParametersDecodeErrorZ *NONNULL_PTR owner){
+       LDKPaymentParameters ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PaymentParametersDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PaymentParametersDecodeErrorZ* owner_conv = (LDKCResult_PaymentParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKPaymentParameters ret_var = CResult_PaymentParametersDecodeErrorZ_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_PaymentParametersDecodeErrorZ_get_err(LDKCResult_PaymentParametersDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PaymentParametersDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PaymentParametersDecodeErrorZ* owner_conv = (LDKCResult_PaymentParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PaymentParametersDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       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++) {
+               ret.data[i] = RouteHint_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_RouteHintHopZ CVec_RouteHintHopZ_clone(const LDKCVec_RouteHintHopZ *orig) {
+       LDKCVec_RouteHintHopZ ret = { .data = MALLOC(sizeof(LDKRouteHintHop) * orig->datalen, "LDKCVec_RouteHintHopZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = RouteHintHop_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKRouteHint CResult_RouteHintDecodeErrorZ_get_ok(LDKCResult_RouteHintDecodeErrorZ *NONNULL_PTR owner){
+       LDKRouteHint ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RouteHintDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RouteHintDecodeErrorZ* owner_conv = (LDKCResult_RouteHintDecodeErrorZ*)untag_ptr(owner);
+       LDKRouteHint ret_var = CResult_RouteHintDecodeErrorZ_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_RouteHintDecodeErrorZ_get_err(LDKCResult_RouteHintDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RouteHintDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RouteHintDecodeErrorZ* owner_conv = (LDKCResult_RouteHintDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RouteHintDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKRouteHintHop CResult_RouteHintHopDecodeErrorZ_get_ok(LDKCResult_RouteHintHopDecodeErrorZ *NONNULL_PTR owner){
+       LDKRouteHintHop ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RouteHintHopDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RouteHintHopDecodeErrorZ* owner_conv = (LDKCResult_RouteHintHopDecodeErrorZ*)untag_ptr(owner);
+       LDKRouteHintHop ret_var = CResult_RouteHintHopDecodeErrorZ_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_RouteHintHopDecodeErrorZ_get_err(LDKCResult_RouteHintHopDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RouteHintHopDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RouteHintHopDecodeErrorZ* owner_conv = (LDKCResult_RouteHintHopDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RouteHintHopDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKFixedPenaltyScorer CResult_FixedPenaltyScorerDecodeErrorZ_get_ok(LDKCResult_FixedPenaltyScorerDecodeErrorZ *NONNULL_PTR owner){
+       LDKFixedPenaltyScorer ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* owner_conv = (LDKCResult_FixedPenaltyScorerDecodeErrorZ*)untag_ptr(owner);
+       LDKFixedPenaltyScorer ret_var = CResult_FixedPenaltyScorerDecodeErrorZ_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_FixedPenaltyScorerDecodeErrorZ_get_err(LDKCResult_FixedPenaltyScorerDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* owner_conv = (LDKCResult_FixedPenaltyScorerDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_FixedPenaltyScorerDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_NodeIdZ CVec_NodeIdZ_clone(const LDKCVec_NodeIdZ *orig) {
+       LDKCVec_NodeIdZ ret = { .data = MALLOC(sizeof(LDKNodeId) * orig->datalen, "LDKCVec_NodeIdZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = NodeId_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline uint64_t C2Tuple_u64u64Z_get_a(LDKC2Tuple_u64u64Z *NONNULL_PTR owner){
+       return owner->a;
+}
+int64_t  CS_LDK_C2Tuple_u64u64Z_get_a(int64_t owner) {
+       LDKC2Tuple_u64u64Z* owner_conv = (LDKC2Tuple_u64u64Z*)untag_ptr(owner);
+       int64_t ret_conv = C2Tuple_u64u64Z_get_a(owner_conv);
+       return ret_conv;
+}
+
+static inline uint64_t C2Tuple_u64u64Z_get_b(LDKC2Tuple_u64u64Z *NONNULL_PTR owner){
+       return owner->b;
+}
+int64_t  CS_LDK_C2Tuple_u64u64Z_get_b(int64_t owner) {
+       LDKC2Tuple_u64u64Z* owner_conv = (LDKC2Tuple_u64u64Z*)untag_ptr(owner);
+       int64_t ret_conv = C2Tuple_u64u64Z_get_b(owner_conv);
+       return ret_conv;
+}
+
+uint32_t CS_LDK_LDKCOption_C2Tuple_u64u64ZZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_C2Tuple_u64u64ZZ *obj = (LDKCOption_C2Tuple_u64u64ZZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_C2Tuple_u64u64ZZ_Some: return 0;
+               case LDKCOption_C2Tuple_u64u64ZZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_C2Tuple_u64u64ZZ_Some_get_some(int64_t ptr) {
+       LDKCOption_C2Tuple_u64u64ZZ *obj = (LDKCOption_C2Tuple_u64u64ZZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_C2Tuple_u64u64ZZ_Some);
+       LDKC2Tuple_u64u64Z* some_conv = MALLOC(sizeof(LDKC2Tuple_u64u64Z), "LDKC2Tuple_u64u64Z");
+       *some_conv = obj->some;
+                       *some_conv = C2Tuple_u64u64Z_clone(some_conv);
+       return tag_ptr(some_conv, true);
+}
+static inline struct LDKThirtyTwoU16s C2Tuple_Z_get_a(LDKC2Tuple_Z *NONNULL_PTR owner){
+       return owner->a;
+}
+int16_tArray  CS_LDK_C2Tuple_Z_get_a(int64_t owner) {
+       LDKC2Tuple_Z* owner_conv = (LDKC2Tuple_Z*)untag_ptr(owner);
+       int16_tArray ret_arr = init_int16_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_Z_get_a(owner_conv).data, 32 * 2);
+       return ret_arr;
+}
+
+static inline struct LDKThirtyTwoU16s C2Tuple_Z_get_b(LDKC2Tuple_Z *NONNULL_PTR owner){
+       return owner->b;
+}
+int16_tArray  CS_LDK_C2Tuple_Z_get_b(int64_t owner) {
+       LDKC2Tuple_Z* owner_conv = (LDKC2Tuple_Z*)untag_ptr(owner);
+       int16_tArray ret_arr = init_int16_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_Z_get_b(owner_conv).data, 32 * 2);
+       return ret_arr;
+}
+
+static inline struct LDKThirtyTwoU16s C2Tuple__u1632_u1632Z_get_a(LDKC2Tuple__u1632_u1632Z *NONNULL_PTR owner){
+       return owner->a;
+}
+int16_tArray  CS_LDK_C2Tuple__u1632_u1632Z_get_a(int64_t owner) {
+       LDKC2Tuple__u1632_u1632Z* owner_conv = (LDKC2Tuple__u1632_u1632Z*)untag_ptr(owner);
+       int16_tArray ret_arr = init_int16_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple__u1632_u1632Z_get_a(owner_conv).data, 32 * 2);
+       return ret_arr;
+}
+
+static inline struct LDKThirtyTwoU16s C2Tuple__u1632_u1632Z_get_b(LDKC2Tuple__u1632_u1632Z *NONNULL_PTR owner){
+       return owner->b;
+}
+int16_tArray  CS_LDK_C2Tuple__u1632_u1632Z_get_b(int64_t owner) {
+       LDKC2Tuple__u1632_u1632Z* owner_conv = (LDKC2Tuple__u1632_u1632Z*)untag_ptr(owner);
+       int16_tArray ret_arr = init_int16_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple__u1632_u1632Z_get_b(owner_conv).data, 32 * 2);
+       return ret_arr;
+}
+
+uint32_t CS_LDK_LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ *obj = (LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_Some: return 0;
+               case LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_Some_get_some(int64_t ptr) {
+       LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ *obj = (LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_Some);
+       LDKC2Tuple__u1632_u1632Z* some_conv = &obj->some;
+                       // WARNING: we really need to clone here, but no clone is available for LDKC2Tuple__u1632_u1632Z
+       return tag_ptr(some_conv, false);
+}
+uint32_t CS_LDK_LDKCOption_f64Z_ty_from_ptr(int64_t ptr) {
+       LDKCOption_f64Z *obj = (LDKCOption_f64Z*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_f64Z_Some: return 0;
+               case LDKCOption_f64Z_None: return 1;
+               default: abort();
+       }
+}
+double CS_LDK_LDKCOption_f64Z_Some_get_some(int64_t ptr) {
+       LDKCOption_f64Z *obj = (LDKCOption_f64Z*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_f64Z_Some);
+       double some_conv = obj->some;
+       return some_conv;
+}
+typedef struct LDKLogger_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKLogger_JCalls;
+static void LDKLogger_JCalls_free(void* this_arg) {
+       LDKLogger_JCalls *j_calls = (LDKLogger_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void log_LDKLogger_jcall(const void* this_arg, const LDKRecord * record) {
+       LDKLogger_JCalls *j_calls = (LDKLogger_JCalls*) this_arg;
+       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);
+}
+static void LDKLogger_JCalls_cloned(LDKLogger* new_obj) {
+       LDKLogger_JCalls *j_calls = (LDKLogger_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKLogger LDKLogger_init (int64_t o) {
+       LDKLogger_JCalls *calls = MALLOC(sizeof(LDKLogger_JCalls), "LDKLogger_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKLogger ret = {
+               .this_arg = (void*) calls,
+               .log = log_LDKLogger_jcall,
+               .free = LDKLogger_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKLogger_new(int32_t o) {
+       LDKLogger *res_ptr = MALLOC(sizeof(LDKLogger), "LDKLogger");
+       *res_ptr = LDKLogger_init(o);
+       return tag_ptr(res_ptr, true);
+}
+static inline struct LDKProbabilisticScorer CResult_ProbabilisticScorerDecodeErrorZ_get_ok(LDKCResult_ProbabilisticScorerDecodeErrorZ *NONNULL_PTR owner){
+       LDKProbabilisticScorer ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ProbabilisticScorerDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ProbabilisticScorerDecodeErrorZ* owner_conv = (LDKCResult_ProbabilisticScorerDecodeErrorZ*)untag_ptr(owner);
+       LDKProbabilisticScorer ret_var = CResult_ProbabilisticScorerDecodeErrorZ_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_ProbabilisticScorerDecodeErrorZ_get_err(LDKCResult_ProbabilisticScorerDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ProbabilisticScorerDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ProbabilisticScorerDecodeErrorZ* owner_conv = (LDKCResult_ProbabilisticScorerDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ProbabilisticScorerDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline uintptr_t C2Tuple_usizeTransactionZ_get_a(LDKC2Tuple_usizeTransactionZ *NONNULL_PTR owner){
+       return owner->a;
+}
+int64_t  CS_LDK_C2Tuple_usizeTransactionZ_get_a(int64_t owner) {
+       LDKC2Tuple_usizeTransactionZ* owner_conv = (LDKC2Tuple_usizeTransactionZ*)untag_ptr(owner);
+       int64_t ret_conv = C2Tuple_usizeTransactionZ_get_a(owner_conv);
+       return ret_conv;
+}
+
+static inline struct LDKTransaction C2Tuple_usizeTransactionZ_get_b(LDKC2Tuple_usizeTransactionZ *NONNULL_PTR owner){
+       return owner->b;
+}
+int8_tArray  CS_LDK_C2Tuple_usizeTransactionZ_get_b(int64_t owner) {
+       LDKC2Tuple_usizeTransactionZ* owner_conv = (LDKC2Tuple_usizeTransactionZ*)untag_ptr(owner);
+       LDKTransaction ret_var = C2Tuple_usizeTransactionZ_get_b(owner_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 LDKCVec_C2Tuple_usizeTransactionZZ CVec_C2Tuple_usizeTransactionZZ_clone(const LDKCVec_C2Tuple_usizeTransactionZZ *orig) {
+       LDKCVec_C2Tuple_usizeTransactionZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_usizeTransactionZ) * orig->datalen, "LDKCVec_C2Tuple_usizeTransactionZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_usizeTransactionZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_a(LDKC2Tuple_ThirtyTwoBytesCOption_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 ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesCOption_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);
+}
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_b(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ*)untag_ptr(owner);
+       LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
+       *ret_copy = C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_b(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 };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline enum LDKChannelMonitorUpdateStatus CResult_ChannelMonitorUpdateStatusNoneZ_get_ok(LDKCResult_ChannelMonitorUpdateStatusNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return ChannelMonitorUpdateStatus_clone(&*owner->contents.result);
+}
+int32_t  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* owner_conv = (LDKCResult_ChannelMonitorUpdateStatusNoneZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKChannelMonitorUpdateStatus_to_cs(CResult_ChannelMonitorUpdateStatusNoneZ_get_ok(owner_conv));
+       return ret_conv;
+}
+
+static inline void CResult_ChannelMonitorUpdateStatusNoneZ_get_err(LDKCResult_ChannelMonitorUpdateStatusNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_get_err(int64_t owner) {
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* owner_conv = (LDKCResult_ChannelMonitorUpdateStatusNoneZ*)untag_ptr(owner);
+       CResult_ChannelMonitorUpdateStatusNoneZ_get_err(owner_conv);
+}
+
+uint32_t CS_LDK_LDKMonitorEvent_ty_from_ptr(int64_t ptr) {
+       LDKMonitorEvent *obj = (LDKMonitorEvent*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKMonitorEvent_HTLCEvent: return 0;
+               case LDKMonitorEvent_HolderForceClosed: return 1;
+               case LDKMonitorEvent_Completed: return 2;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKMonitorEvent_HTLCEvent_get_htlc_event(int64_t ptr) {
+       LDKMonitorEvent *obj = (LDKMonitorEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMonitorEvent_HTLCEvent);
+       LDKHTLCUpdate htlc_event_var = obj->htlc_event;
+                       int64_t htlc_event_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_event_var);
+                       htlc_event_ref = tag_ptr(htlc_event_var.inner, false);
+       return htlc_event_ref;
+}
+int64_t CS_LDK_LDKMonitorEvent_HolderForceClosed_get_holder_force_closed(int64_t ptr) {
+       LDKMonitorEvent *obj = (LDKMonitorEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMonitorEvent_HolderForceClosed);
+       LDKOutPoint holder_force_closed_var = obj->holder_force_closed;
+                       int64_t holder_force_closed_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(holder_force_closed_var);
+                       holder_force_closed_ref = tag_ptr(holder_force_closed_var.inner, false);
+       return holder_force_closed_ref;
+}
+int64_t CS_LDK_LDKMonitorEvent_Completed_get_funding_txo(int64_t ptr) {
+       LDKMonitorEvent *obj = (LDKMonitorEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMonitorEvent_Completed);
+       LDKOutPoint funding_txo_var = obj->completed.funding_txo;
+                       int64_t funding_txo_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_var);
+                       funding_txo_ref = tag_ptr(funding_txo_var.inner, false);
+       return funding_txo_ref;
+}
+int64_t CS_LDK_LDKMonitorEvent_Completed_get_monitor_update_id(int64_t ptr) {
+       LDKMonitorEvent *obj = (LDKMonitorEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMonitorEvent_Completed);
+       int64_t monitor_update_id_conv = obj->completed.monitor_update_id;
+       return monitor_update_id_conv;
+}
+static inline LDKCVec_MonitorEventZ CVec_MonitorEventZ_clone(const LDKCVec_MonitorEventZ *orig) {
+       LDKCVec_MonitorEventZ ret = { .data = MALLOC(sizeof(LDKMonitorEvent) * orig->datalen, "LDKCVec_MonitorEventZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = MonitorEvent_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKOutPoint C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_a(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ *NONNULL_PTR owner){
+       LDKOutPoint ret = owner->a;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_a(int64_t owner) {
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* owner_conv = (LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ*)untag_ptr(owner);
+       LDKOutPoint ret_var = C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_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 LDKCVec_MonitorEventZ C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_b(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ *NONNULL_PTR owner){
+       return CVec_MonitorEventZ_clone(&owner->b);
+}
+int64_tArray  CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_b(int64_t owner) {
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* owner_conv = (LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ*)untag_ptr(owner);
+       LDKCVec_MonitorEventZ ret_var = C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_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 o = 0; o < ret_var.datalen; o++) {
+               LDKMonitorEvent *ret_conv_14_copy = MALLOC(sizeof(LDKMonitorEvent), "LDKMonitorEvent");
+               *ret_conv_14_copy = ret_var.data[o];
+               int64_t ret_conv_14_ref = tag_ptr(ret_conv_14_copy, true);
+               ret_arr_ptr[o] = ret_conv_14_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+static inline struct LDKPublicKey C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_c(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ *NONNULL_PTR owner){
+       return owner->c;
+}
+int8_tArray  CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_c(int64_t owner) {
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* owner_conv = (LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_c(owner_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+static inline LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ CVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ_clone(const LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ *orig) {
+       LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ ret = { .data = MALLOC(sizeof(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ) * orig->datalen, "LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKInitFeatures CResult_InitFeaturesDecodeErrorZ_get_ok(LDKCResult_InitFeaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKInitFeatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_InitFeaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_InitFeaturesDecodeErrorZ* owner_conv = (LDKCResult_InitFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKInitFeatures ret_var = CResult_InitFeaturesDecodeErrorZ_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_InitFeaturesDecodeErrorZ_get_err(LDKCResult_InitFeaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_InitFeaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_InitFeaturesDecodeErrorZ* owner_conv = (LDKCResult_InitFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_InitFeaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelFeatures CResult_ChannelFeaturesDecodeErrorZ_get_ok(LDKCResult_ChannelFeaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelFeatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelFeaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelFeaturesDecodeErrorZ* owner_conv = (LDKCResult_ChannelFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelFeatures ret_var = CResult_ChannelFeaturesDecodeErrorZ_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_ChannelFeaturesDecodeErrorZ_get_err(LDKCResult_ChannelFeaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelFeaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelFeaturesDecodeErrorZ* owner_conv = (LDKCResult_ChannelFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelFeaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKNodeFeatures CResult_NodeFeaturesDecodeErrorZ_get_ok(LDKCResult_NodeFeaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKNodeFeatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NodeFeaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NodeFeaturesDecodeErrorZ* owner_conv = (LDKCResult_NodeFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKNodeFeatures ret_var = CResult_NodeFeaturesDecodeErrorZ_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_NodeFeaturesDecodeErrorZ_get_err(LDKCResult_NodeFeaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NodeFeaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_NodeFeaturesDecodeErrorZ* owner_conv = (LDKCResult_NodeFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_NodeFeaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBolt11InvoiceFeatures CResult_Bolt11InvoiceFeaturesDecodeErrorZ_get_ok(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKBolt11InvoiceFeatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceFeaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* owner_conv = (LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKBolt11InvoiceFeatures ret_var = CResult_Bolt11InvoiceFeaturesDecodeErrorZ_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_Bolt11InvoiceFeaturesDecodeErrorZ_get_err(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceFeaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* owner_conv = (LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_Bolt11InvoiceFeaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBolt12InvoiceFeatures CResult_Bolt12InvoiceFeaturesDecodeErrorZ_get_ok(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKBolt12InvoiceFeatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_Bolt12InvoiceFeaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* owner_conv = (LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKBolt12InvoiceFeatures ret_var = CResult_Bolt12InvoiceFeaturesDecodeErrorZ_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_Bolt12InvoiceFeaturesDecodeErrorZ_get_err(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_Bolt12InvoiceFeaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* owner_conv = (LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_Bolt12InvoiceFeaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBlindedHopFeatures CResult_BlindedHopFeaturesDecodeErrorZ_get_ok(LDKCResult_BlindedHopFeaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKBlindedHopFeatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BlindedHopFeaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* owner_conv = (LDKCResult_BlindedHopFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKBlindedHopFeatures ret_var = CResult_BlindedHopFeaturesDecodeErrorZ_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_BlindedHopFeaturesDecodeErrorZ_get_err(LDKCResult_BlindedHopFeaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BlindedHopFeaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* owner_conv = (LDKCResult_BlindedHopFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BlindedHopFeaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelTypeFeatures CResult_ChannelTypeFeaturesDecodeErrorZ_get_ok(LDKCResult_ChannelTypeFeaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelTypeFeatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* owner_conv = (LDKCResult_ChannelTypeFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelTypeFeatures ret_var = CResult_ChannelTypeFeaturesDecodeErrorZ_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_ChannelTypeFeaturesDecodeErrorZ_get_err(LDKCResult_ChannelTypeFeaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* owner_conv = (LDKCResult_ChannelTypeFeaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelTypeFeaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKOffer CResult_OfferBolt12ParseErrorZ_get_ok(LDKCResult_OfferBolt12ParseErrorZ *NONNULL_PTR owner){
+       LDKOffer ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_OfferBolt12ParseErrorZ_get_ok(int64_t owner) {
+       LDKCResult_OfferBolt12ParseErrorZ* owner_conv = (LDKCResult_OfferBolt12ParseErrorZ*)untag_ptr(owner);
+       LDKOffer ret_var = CResult_OfferBolt12ParseErrorZ_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 LDKBolt12ParseError CResult_OfferBolt12ParseErrorZ_get_err(LDKCResult_OfferBolt12ParseErrorZ *NONNULL_PTR owner){
+       LDKBolt12ParseError ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_OfferBolt12ParseErrorZ_get_err(int64_t owner) {
+       LDKCResult_OfferBolt12ParseErrorZ* owner_conv = (LDKCResult_OfferBolt12ParseErrorZ*)untag_ptr(owner);
+       LDKBolt12ParseError ret_var = CResult_OfferBolt12ParseErrorZ_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 struct LDKPublicKey CResult_PublicKeySecp256k1ErrorZ_get_ok(LDKCResult_PublicKeySecp256k1ErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+int8_tArray  CS_LDK_CResult_PublicKeySecp256k1ErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PublicKeySecp256k1ErrorZ* owner_conv = (LDKCResult_PublicKeySecp256k1ErrorZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, CResult_PublicKeySecp256k1ErrorZ_get_ok(owner_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+static inline enum LDKSecp256k1Error CResult_PublicKeySecp256k1ErrorZ_get_err(LDKCResult_PublicKeySecp256k1ErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+int32_t  CS_LDK_CResult_PublicKeySecp256k1ErrorZ_get_err(int64_t owner) {
+       LDKCResult_PublicKeySecp256k1ErrorZ* owner_conv = (LDKCResult_PublicKeySecp256k1ErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKSecp256k1Error_to_cs(CResult_PublicKeySecp256k1ErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKNodeId CResult_NodeIdDecodeErrorZ_get_ok(LDKCResult_NodeIdDecodeErrorZ *NONNULL_PTR owner){
+       LDKNodeId ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NodeIdDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NodeIdDecodeErrorZ* owner_conv = (LDKCResult_NodeIdDecodeErrorZ*)untag_ptr(owner);
+       LDKNodeId ret_var = CResult_NodeIdDecodeErrorZ_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_NodeIdDecodeErrorZ_get_err(LDKCResult_NodeIdDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NodeIdDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_NodeIdDecodeErrorZ* owner_conv = (LDKCResult_NodeIdDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_NodeIdDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKNetworkUpdate_ty_from_ptr(int64_t ptr) {
+       LDKNetworkUpdate *obj = (LDKNetworkUpdate*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKNetworkUpdate_ChannelUpdateMessage: return 0;
+               case LDKNetworkUpdate_ChannelFailure: return 1;
+               case LDKNetworkUpdate_NodeFailure: return 2;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKNetworkUpdate_ChannelUpdateMessage_get_msg(int64_t ptr) {
+       LDKNetworkUpdate *obj = (LDKNetworkUpdate*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKNetworkUpdate_ChannelUpdateMessage);
+       LDKChannelUpdate msg_var = obj->channel_update_message.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;
+}
+int64_t CS_LDK_LDKNetworkUpdate_ChannelFailure_get_short_channel_id(int64_t ptr) {
+       LDKNetworkUpdate *obj = (LDKNetworkUpdate*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKNetworkUpdate_ChannelFailure);
+       int64_t short_channel_id_conv = obj->channel_failure.short_channel_id;
+       return short_channel_id_conv;
+}
+jboolean CS_LDK_LDKNetworkUpdate_ChannelFailure_get_is_permanent(int64_t ptr) {
+       LDKNetworkUpdate *obj = (LDKNetworkUpdate*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKNetworkUpdate_ChannelFailure);
+       jboolean is_permanent_conv = obj->channel_failure.is_permanent;
+       return is_permanent_conv;
+}
+int8_tArray CS_LDK_LDKNetworkUpdate_NodeFailure_get_node_id(int64_t ptr) {
+       LDKNetworkUpdate *obj = (LDKNetworkUpdate*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKNetworkUpdate_NodeFailure);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->node_failure.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+jboolean CS_LDK_LDKNetworkUpdate_NodeFailure_get_is_permanent(int64_t ptr) {
+       LDKNetworkUpdate *obj = (LDKNetworkUpdate*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKNetworkUpdate_NodeFailure);
+       jboolean is_permanent_conv = obj->node_failure.is_permanent;
+       return is_permanent_conv;
+}
+uint32_t CS_LDK_LDKCOption_NetworkUpdateZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_NetworkUpdateZ *obj = (LDKCOption_NetworkUpdateZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_NetworkUpdateZ_Some: return 0;
+               case LDKCOption_NetworkUpdateZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_NetworkUpdateZ_Some_get_some(int64_t ptr) {
+       LDKCOption_NetworkUpdateZ *obj = (LDKCOption_NetworkUpdateZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_NetworkUpdateZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+static inline struct LDKCOption_NetworkUpdateZ CResult_COption_NetworkUpdateZDecodeErrorZ_get_ok(LDKCResult_COption_NetworkUpdateZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_NetworkUpdateZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_NetworkUpdateZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* owner_conv = (LDKCResult_COption_NetworkUpdateZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_NetworkUpdateZ *ret_copy = MALLOC(sizeof(LDKCOption_NetworkUpdateZ), "LDKCOption_NetworkUpdateZ");
+       *ret_copy = CResult_COption_NetworkUpdateZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_NetworkUpdateZDecodeErrorZ_get_err(LDKCResult_COption_NetworkUpdateZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_NetworkUpdateZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* owner_conv = (LDKCResult_COption_NetworkUpdateZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_NetworkUpdateZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxOut CResult_TxOutUtxoLookupErrorZ_get_ok(LDKCResult_TxOutUtxoLookupErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return TxOut_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_TxOutUtxoLookupErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxOutUtxoLookupErrorZ* owner_conv = (LDKCResult_TxOutUtxoLookupErrorZ*)untag_ptr(owner);
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = CResult_TxOutUtxoLookupErrorZ_get_ok(owner_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+static inline enum LDKUtxoLookupError CResult_TxOutUtxoLookupErrorZ_get_err(LDKCResult_TxOutUtxoLookupErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return UtxoLookupError_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_TxOutUtxoLookupErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxOutUtxoLookupErrorZ* owner_conv = (LDKCResult_TxOutUtxoLookupErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKUtxoLookupError_to_cs(CResult_TxOutUtxoLookupErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+uint32_t CS_LDK_LDKUtxoResult_ty_from_ptr(int64_t ptr) {
+       LDKUtxoResult *obj = (LDKUtxoResult*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKUtxoResult_Sync: return 0;
+               case LDKUtxoResult_Async: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKUtxoResult_Sync_get_sync(int64_t ptr) {
+       LDKUtxoResult *obj = (LDKUtxoResult*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKUtxoResult_Sync);
+       LDKCResult_TxOutUtxoLookupErrorZ* sync_conv = MALLOC(sizeof(LDKCResult_TxOutUtxoLookupErrorZ), "LDKCResult_TxOutUtxoLookupErrorZ");
+       *sync_conv = obj->sync;
+                       *sync_conv = CResult_TxOutUtxoLookupErrorZ_clone(sync_conv);
+       return tag_ptr(sync_conv, true);
+}
+int64_t CS_LDK_LDKUtxoResult_Async_get_async(int64_t ptr) {
+       LDKUtxoResult *obj = (LDKUtxoResult*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKUtxoResult_Async);
+       LDKUtxoFuture async_var = obj->async;
+                       int64_t async_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(async_var);
+                       async_ref = tag_ptr(async_var.inner, false);
+       return async_ref;
+}
+typedef struct LDKUtxoLookup_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKUtxoLookup_JCalls;
+static void LDKUtxoLookup_JCalls_free(void* this_arg) {
+       LDKUtxoLookup_JCalls *j_calls = (LDKUtxoLookup_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKUtxoResult get_utxo_LDKUtxoLookup_jcall(const void* this_arg, const uint8_t (* chain_hash)[32], uint64_t short_channel_id) {
+       LDKUtxoLookup_JCalls *j_calls = (LDKUtxoLookup_JCalls*) this_arg;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKUtxoResult ret_conv = *(LDKUtxoResult*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKUtxoLookup_JCalls_cloned(LDKUtxoLookup* new_obj) {
+       LDKUtxoLookup_JCalls *j_calls = (LDKUtxoLookup_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKUtxoLookup LDKUtxoLookup_init (int64_t o) {
+       LDKUtxoLookup_JCalls *calls = MALLOC(sizeof(LDKUtxoLookup_JCalls), "LDKUtxoLookup_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKUtxoLookup ret = {
+               .this_arg = (void*) calls,
+               .get_utxo = get_utxo_LDKUtxoLookup_jcall,
+               .free = LDKUtxoLookup_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKUtxoLookup_new(int32_t o) {
+       LDKUtxoLookup *res_ptr = MALLOC(sizeof(LDKUtxoLookup), "LDKUtxoLookup");
+       *res_ptr = LDKUtxoLookup_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_UtxoLookup_get_utxo(int64_t this_arg, int8_tArray chain_hash, int64_t short_channel_id) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKUtxoLookup* this_arg_conv = (LDKUtxoLookup*)this_arg_ptr;
+       uint8_t chain_hash_arr[32];
+       CHECK(chain_hash->arr_len == 32);
+       memcpy(chain_hash_arr, chain_hash->elems, 32); FREE(chain_hash);
+       uint8_t (*chain_hash_ref)[32] = &chain_hash_arr;
+       LDKUtxoResult *ret_copy = MALLOC(sizeof(LDKUtxoResult), "LDKUtxoResult");
+       *ret_copy = (this_arg_conv->get_utxo)(this_arg_conv->this_arg, chain_hash_ref, short_channel_id);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKCOption_UtxoLookupZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_UtxoLookupZ *obj = (LDKCOption_UtxoLookupZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_UtxoLookupZ_Some: return 0;
+               case LDKCOption_UtxoLookupZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_UtxoLookupZ_Some_get_some(int64_t ptr) {
+       LDKCOption_UtxoLookupZ *obj = (LDKCOption_UtxoLookupZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_UtxoLookupZ_Some);
+       LDKUtxoLookup* some_ret = MALLOC(sizeof(LDKUtxoLookup), "LDKUtxoLookup");
+       *some_ret = obj->some;
+                       // WARNING: We likely need to clone here, but no clone is available, so we just do it for Java instances
+                       if ((*some_ret).free == LDKUtxoLookup_JCalls_free) {
+                               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                               LDKUtxoLookup_JCalls_cloned(&(*some_ret));
+                       }
+       return tag_ptr(some_ret, true);
+}
+static inline void CResult_NoneLightningErrorZ_get_ok(LDKCResult_NoneLightningErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NoneLightningErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NoneLightningErrorZ* owner_conv = (LDKCResult_NoneLightningErrorZ*)untag_ptr(owner);
+       CResult_NoneLightningErrorZ_get_ok(owner_conv);
+}
+
+static inline struct LDKLightningError CResult_NoneLightningErrorZ_get_err(LDKCResult_NoneLightningErrorZ *NONNULL_PTR owner){
+       LDKLightningError ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NoneLightningErrorZ_get_err(int64_t owner) {
+       LDKCResult_NoneLightningErrorZ* owner_conv = (LDKCResult_NoneLightningErrorZ*)untag_ptr(owner);
+       LDKLightningError ret_var = CResult_NoneLightningErrorZ_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 bool CResult_boolLightningErrorZ_get_ok(LDKCResult_boolLightningErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+jboolean  CS_LDK_CResult_boolLightningErrorZ_get_ok(int64_t owner) {
+       LDKCResult_boolLightningErrorZ* owner_conv = (LDKCResult_boolLightningErrorZ*)untag_ptr(owner);
+       jboolean ret_conv = CResult_boolLightningErrorZ_get_ok(owner_conv);
+       return ret_conv;
+}
+
+static inline struct LDKLightningError CResult_boolLightningErrorZ_get_err(LDKCResult_boolLightningErrorZ *NONNULL_PTR owner){
+       LDKLightningError ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_boolLightningErrorZ_get_err(int64_t owner) {
+       LDKCResult_boolLightningErrorZ* owner_conv = (LDKCResult_boolLightningErrorZ*)untag_ptr(owner);
+       LDKLightningError ret_var = CResult_boolLightningErrorZ_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 struct LDKChannelAnnouncement C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_a(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *NONNULL_PTR owner){
+       LDKChannelAnnouncement ret = owner->a;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_a(int64_t owner) {
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* owner_conv = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)untag_ptr(owner);
+       LDKChannelAnnouncement ret_var = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_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 LDKChannelUpdate C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_b(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *NONNULL_PTR owner){
+       LDKChannelUpdate ret = owner->b;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_b(int64_t owner) {
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* owner_conv = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)untag_ptr(owner);
+       LDKChannelUpdate ret_var = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_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 LDKChannelUpdate C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_c(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *NONNULL_PTR owner){
+       LDKChannelUpdate ret = owner->c;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_c(int64_t owner) {
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* owner_conv = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)untag_ptr(owner);
+       LDKChannelUpdate ret_var = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_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_LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *obj = (LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_Some: return 0;
+               case LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_Some_get_some(int64_t ptr) {
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *obj = (LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_Some);
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* some_conv = MALLOC(sizeof(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ), "LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ");
+       *some_conv = obj->some;
+                       *some_conv = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone(some_conv);
+       return tag_ptr(some_conv, true);
+}
+uint32_t CS_LDK_LDKErrorAction_ty_from_ptr(int64_t ptr) {
+       LDKErrorAction *obj = (LDKErrorAction*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKErrorAction_DisconnectPeer: return 0;
+               case LDKErrorAction_DisconnectPeerWithWarning: return 1;
+               case LDKErrorAction_IgnoreError: return 2;
+               case LDKErrorAction_IgnoreAndLog: return 3;
+               case LDKErrorAction_IgnoreDuplicateGossip: return 4;
+               case LDKErrorAction_SendErrorMessage: return 5;
+               case LDKErrorAction_SendWarningMessage: return 6;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKErrorAction_DisconnectPeer_get_msg(int64_t ptr) {
+       LDKErrorAction *obj = (LDKErrorAction*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKErrorAction_DisconnectPeer);
+       LDKErrorMessage msg_var = obj->disconnect_peer.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;
+}
+int64_t CS_LDK_LDKErrorAction_DisconnectPeerWithWarning_get_msg(int64_t ptr) {
+       LDKErrorAction *obj = (LDKErrorAction*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKErrorAction_DisconnectPeerWithWarning);
+       LDKWarningMessage msg_var = obj->disconnect_peer_with_warning.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;
+}
+int32_t CS_LDK_LDKErrorAction_IgnoreAndLog_get_ignore_and_log(int64_t ptr) {
+       LDKErrorAction *obj = (LDKErrorAction*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKErrorAction_IgnoreAndLog);
+       int32_t ignore_and_log_conv = LDKLevel_to_cs(obj->ignore_and_log);
+       return ignore_and_log_conv;
+}
+int64_t CS_LDK_LDKErrorAction_SendErrorMessage_get_msg(int64_t ptr) {
+       LDKErrorAction *obj = (LDKErrorAction*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKErrorAction_SendErrorMessage);
+       LDKErrorMessage msg_var = obj->send_error_message.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;
+}
+int64_t CS_LDK_LDKErrorAction_SendWarningMessage_get_msg(int64_t ptr) {
+       LDKErrorAction *obj = (LDKErrorAction*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKErrorAction_SendWarningMessage);
+       LDKWarningMessage msg_var = obj->send_warning_message.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;
+}
+int32_t CS_LDK_LDKErrorAction_SendWarningMessage_get_log_level(int64_t ptr) {
+       LDKErrorAction *obj = (LDKErrorAction*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKErrorAction_SendWarningMessage);
+       int32_t log_level_conv = LDKLevel_to_cs(obj->send_warning_message.log_level);
+       return log_level_conv;
+}
+uint32_t CS_LDK_LDKMessageSendEvent_ty_from_ptr(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKMessageSendEvent_SendAcceptChannel: return 0;
+               case LDKMessageSendEvent_SendAcceptChannelV2: return 1;
+               case LDKMessageSendEvent_SendOpenChannel: return 2;
+               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;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKMessageSendEvent_SendAcceptChannel_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendAcceptChannel);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_accept_channel.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendAcceptChannel_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendAcceptChannel);
+       LDKAcceptChannel msg_var = obj->send_accept_channel.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_SendAcceptChannelV2_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendAcceptChannelV2);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_accept_channel_v2.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendAcceptChannelV2_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendAcceptChannelV2);
+       LDKAcceptChannelV2 msg_var = obj->send_accept_channel_v2.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_SendOpenChannel_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendOpenChannel);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_open_channel.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendOpenChannel_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendOpenChannel);
+       LDKOpenChannel msg_var = obj->send_open_channel.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_SendOpenChannelV2_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendOpenChannelV2);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_open_channel_v2.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendOpenChannelV2_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendOpenChannelV2);
+       LDKOpenChannelV2 msg_var = obj->send_open_channel_v2.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_SendFundingCreated_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendFundingCreated);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_funding_created.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendFundingCreated_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendFundingCreated);
+       LDKFundingCreated msg_var = obj->send_funding_created.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_SendFundingSigned_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendFundingSigned);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_funding_signed.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendFundingSigned_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendFundingSigned);
+       LDKFundingSigned msg_var = obj->send_funding_signed.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);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_add_input.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxAddInput_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxAddInput);
+       LDKTxAddInput msg_var = obj->send_tx_add_input.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_SendTxAddOutput_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxAddOutput);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_add_output.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxAddOutput_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxAddOutput);
+       LDKTxAddOutput msg_var = obj->send_tx_add_output.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_SendTxRemoveInput_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxRemoveInput);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_remove_input.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxRemoveInput_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxRemoveInput);
+       LDKTxRemoveInput msg_var = obj->send_tx_remove_input.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_SendTxRemoveOutput_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxRemoveOutput);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_remove_output.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxRemoveOutput_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxRemoveOutput);
+       LDKTxRemoveOutput msg_var = obj->send_tx_remove_output.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_SendTxComplete_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxComplete);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_complete.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxComplete_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxComplete);
+       LDKTxComplete msg_var = obj->send_tx_complete.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_SendTxSignatures_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxSignatures);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_signatures.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxSignatures_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxSignatures);
+       LDKTxSignatures msg_var = obj->send_tx_signatures.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_SendTxInitRbf_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxInitRbf);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_init_rbf.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxInitRbf_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxInitRbf);
+       LDKTxInitRbf msg_var = obj->send_tx_init_rbf.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_SendTxAckRbf_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxAckRbf);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_ack_rbf.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxAckRbf_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxAckRbf);
+       LDKTxAckRbf msg_var = obj->send_tx_ack_rbf.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_SendTxAbort_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxAbort);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_tx_abort.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendTxAbort_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendTxAbort);
+       LDKTxAbort msg_var = obj->send_tx_abort.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_SendChannelReady_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelReady);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_channel_ready.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendChannelReady_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelReady);
+       LDKChannelReady msg_var = obj->send_channel_ready.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_SendAnnouncementSignatures_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendAnnouncementSignatures);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_announcement_signatures.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendAnnouncementSignatures_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendAnnouncementSignatures);
+       LDKAnnouncementSignatures msg_var = obj->send_announcement_signatures.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_UpdateHTLCs_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_UpdateHTLCs);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->update_htl_cs.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_UpdateHTLCs_get_updates(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_UpdateHTLCs);
+       LDKCommitmentUpdate updates_var = obj->update_htl_cs.updates;
+                       int64_t updates_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(updates_var);
+                       updates_ref = tag_ptr(updates_var.inner, false);
+       return updates_ref;
+}
+int8_tArray CS_LDK_LDKMessageSendEvent_SendRevokeAndACK_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendRevokeAndACK);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_revoke_and_ack.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendRevokeAndACK_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendRevokeAndACK);
+       LDKRevokeAndACK msg_var = obj->send_revoke_and_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_SendClosingSigned_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendClosingSigned);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_closing_signed.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendClosingSigned_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendClosingSigned);
+       LDKClosingSigned msg_var = obj->send_closing_signed.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_SendShutdown_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendShutdown);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_shutdown.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendShutdown_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendShutdown);
+       LDKShutdown msg_var = obj->send_shutdown.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_SendChannelReestablish_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelReestablish);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_channel_reestablish.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendChannelReestablish_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelReestablish);
+       LDKChannelReestablish msg_var = obj->send_channel_reestablish.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_SendChannelAnnouncement_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelAnnouncement);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_channel_announcement.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendChannelAnnouncement_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelAnnouncement);
+       LDKChannelAnnouncement msg_var = obj->send_channel_announcement.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;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendChannelAnnouncement_get_update_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelAnnouncement);
+       LDKChannelUpdate update_msg_var = obj->send_channel_announcement.update_msg;
+                       int64_t update_msg_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_msg_var);
+                       update_msg_ref = tag_ptr(update_msg_var.inner, false);
+       return update_msg_ref;
+}
+int64_t CS_LDK_LDKMessageSendEvent_BroadcastChannelAnnouncement_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_BroadcastChannelAnnouncement);
+       LDKChannelAnnouncement msg_var = obj->broadcast_channel_announcement.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;
+}
+int64_t CS_LDK_LDKMessageSendEvent_BroadcastChannelAnnouncement_get_update_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_BroadcastChannelAnnouncement);
+       LDKChannelUpdate update_msg_var = obj->broadcast_channel_announcement.update_msg;
+                       int64_t update_msg_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_msg_var);
+                       update_msg_ref = tag_ptr(update_msg_var.inner, false);
+       return update_msg_ref;
+}
+int64_t CS_LDK_LDKMessageSendEvent_BroadcastChannelUpdate_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_BroadcastChannelUpdate);
+       LDKChannelUpdate msg_var = obj->broadcast_channel_update.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;
+}
+int64_t CS_LDK_LDKMessageSendEvent_BroadcastNodeAnnouncement_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_BroadcastNodeAnnouncement);
+       LDKNodeAnnouncement msg_var = obj->broadcast_node_announcement.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_SendChannelUpdate_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelUpdate);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_channel_update.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendChannelUpdate_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelUpdate);
+       LDKChannelUpdate msg_var = obj->send_channel_update.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_HandleError_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_HandleError);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->handle_error.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_HandleError_get_action(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_HandleError);
+       int64_t action_ref = tag_ptr(&obj->handle_error.action, false);
+       return action_ref;
+}
+int8_tArray CS_LDK_LDKMessageSendEvent_SendChannelRangeQuery_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelRangeQuery);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_channel_range_query.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendChannelRangeQuery_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendChannelRangeQuery);
+       LDKQueryChannelRange msg_var = obj->send_channel_range_query.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_SendShortIdsQuery_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendShortIdsQuery);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_short_ids_query.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendShortIdsQuery_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendShortIdsQuery);
+       LDKQueryShortChannelIds msg_var = obj->send_short_ids_query.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_SendReplyChannelRange_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendReplyChannelRange);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_reply_channel_range.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendReplyChannelRange_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendReplyChannelRange);
+       LDKReplyChannelRange msg_var = obj->send_reply_channel_range.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_SendGossipTimestampFilter_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendGossipTimestampFilter);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_gossip_timestamp_filter.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendGossipTimestampFilter_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendGossipTimestampFilter);
+       LDKGossipTimestampFilter msg_var = obj->send_gossip_timestamp_filter.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;
+}
+static inline LDKCVec_MessageSendEventZ CVec_MessageSendEventZ_clone(const LDKCVec_MessageSendEventZ *orig) {
+       LDKCVec_MessageSendEventZ ret = { .data = MALLOC(sizeof(LDKMessageSendEvent) * orig->datalen, "LDKCVec_MessageSendEventZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = MessageSendEvent_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKChannelUpdateInfo CResult_ChannelUpdateInfoDecodeErrorZ_get_ok(LDKCResult_ChannelUpdateInfoDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelUpdateInfo ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* owner_conv = (LDKCResult_ChannelUpdateInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelUpdateInfo ret_var = CResult_ChannelUpdateInfoDecodeErrorZ_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_ChannelUpdateInfoDecodeErrorZ_get_err(LDKCResult_ChannelUpdateInfoDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* owner_conv = (LDKCResult_ChannelUpdateInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelUpdateInfoDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelInfo CResult_ChannelInfoDecodeErrorZ_get_ok(LDKCResult_ChannelInfoDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelInfo ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelInfoDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelInfoDecodeErrorZ* owner_conv = (LDKCResult_ChannelInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelInfo ret_var = CResult_ChannelInfoDecodeErrorZ_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_ChannelInfoDecodeErrorZ_get_err(LDKCResult_ChannelInfoDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelInfoDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelInfoDecodeErrorZ* owner_conv = (LDKCResult_ChannelInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelInfoDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKRoutingFees CResult_RoutingFeesDecodeErrorZ_get_ok(LDKCResult_RoutingFeesDecodeErrorZ *NONNULL_PTR owner){
+       LDKRoutingFees ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RoutingFeesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RoutingFeesDecodeErrorZ* owner_conv = (LDKCResult_RoutingFeesDecodeErrorZ*)untag_ptr(owner);
+       LDKRoutingFees ret_var = CResult_RoutingFeesDecodeErrorZ_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_RoutingFeesDecodeErrorZ_get_err(LDKCResult_RoutingFeesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RoutingFeesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RoutingFeesDecodeErrorZ* owner_conv = (LDKCResult_RoutingFeesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RoutingFeesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKSocketAddress_ty_from_ptr(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKSocketAddress_TcpIpV4: return 0;
+               case LDKSocketAddress_TcpIpV6: return 1;
+               case LDKSocketAddress_OnionV2: return 2;
+               case LDKSocketAddress_OnionV3: return 3;
+               case LDKSocketAddress_Hostname: return 4;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKSocketAddress_TcpIpV4_get_addr(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_TcpIpV4);
+       int8_tArray addr_arr = init_int8_tArray(4, __LINE__);
+       memcpy(addr_arr->elems, obj->tcp_ip_v4.addr.data, 4);
+       return addr_arr;
+}
+int16_t CS_LDK_LDKSocketAddress_TcpIpV4_get_port(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_TcpIpV4);
+       int16_t port_conv = obj->tcp_ip_v4.port;
+       return port_conv;
+}
+int8_tArray CS_LDK_LDKSocketAddress_TcpIpV6_get_addr(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_TcpIpV6);
+       int8_tArray addr_arr = init_int8_tArray(16, __LINE__);
+       memcpy(addr_arr->elems, obj->tcp_ip_v6.addr.data, 16);
+       return addr_arr;
+}
+int16_t CS_LDK_LDKSocketAddress_TcpIpV6_get_port(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_TcpIpV6);
+       int16_t port_conv = obj->tcp_ip_v6.port;
+       return port_conv;
+}
+int8_tArray CS_LDK_LDKSocketAddress_OnionV2_get_onion_v2(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_OnionV2);
+       int8_tArray onion_v2_arr = init_int8_tArray(12, __LINE__);
+       memcpy(onion_v2_arr->elems, obj->onion_v2.data, 12);
+       return onion_v2_arr;
+}
+int8_tArray CS_LDK_LDKSocketAddress_OnionV3_get_ed25519_pubkey(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_OnionV3);
+       int8_tArray ed25519_pubkey_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ed25519_pubkey_arr->elems, obj->onion_v3.ed25519_pubkey.data, 32);
+       return ed25519_pubkey_arr;
+}
+int16_t CS_LDK_LDKSocketAddress_OnionV3_get_checksum(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_OnionV3);
+       int16_t checksum_conv = obj->onion_v3.checksum;
+       return checksum_conv;
+}
+int8_t CS_LDK_LDKSocketAddress_OnionV3_get_version(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_OnionV3);
+       int8_t version_conv = obj->onion_v3.version;
+       return version_conv;
+}
+int16_t CS_LDK_LDKSocketAddress_OnionV3_get_port(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_OnionV3);
+       int16_t port_conv = obj->onion_v3.port;
+       return port_conv;
+}
+int64_t CS_LDK_LDKSocketAddress_Hostname_get_hostname(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_Hostname);
+       LDKHostname hostname_var = obj->hostname.hostname;
+                       int64_t hostname_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(hostname_var);
+                       hostname_ref = tag_ptr(hostname_var.inner, false);
+       return hostname_ref;
+}
+int16_t CS_LDK_LDKSocketAddress_Hostname_get_port(int64_t ptr) {
+       LDKSocketAddress *obj = (LDKSocketAddress*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSocketAddress_Hostname);
+       int16_t port_conv = obj->hostname.port;
+       return port_conv;
+}
+static inline LDKCVec_SocketAddressZ CVec_SocketAddressZ_clone(const LDKCVec_SocketAddressZ *orig) {
+       LDKCVec_SocketAddressZ ret = { .data = MALLOC(sizeof(LDKSocketAddress) * orig->datalen, "LDKCVec_SocketAddressZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = SocketAddress_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKNodeAnnouncementInfo CResult_NodeAnnouncementInfoDecodeErrorZ_get_ok(LDKCResult_NodeAnnouncementInfoDecodeErrorZ *NONNULL_PTR owner){
+       LDKNodeAnnouncementInfo ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* owner_conv = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKNodeAnnouncementInfo ret_var = CResult_NodeAnnouncementInfoDecodeErrorZ_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_NodeAnnouncementInfoDecodeErrorZ_get_err(LDKCResult_NodeAnnouncementInfoDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* owner_conv = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_NodeAnnouncementInfoDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKNodeAlias CResult_NodeAliasDecodeErrorZ_get_ok(LDKCResult_NodeAliasDecodeErrorZ *NONNULL_PTR owner){
+       LDKNodeAlias ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NodeAliasDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NodeAliasDecodeErrorZ* owner_conv = (LDKCResult_NodeAliasDecodeErrorZ*)untag_ptr(owner);
+       LDKNodeAlias ret_var = CResult_NodeAliasDecodeErrorZ_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_NodeAliasDecodeErrorZ_get_err(LDKCResult_NodeAliasDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NodeAliasDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_NodeAliasDecodeErrorZ* owner_conv = (LDKCResult_NodeAliasDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_NodeAliasDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKNodeInfo CResult_NodeInfoDecodeErrorZ_get_ok(LDKCResult_NodeInfoDecodeErrorZ *NONNULL_PTR owner){
+       LDKNodeInfo ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NodeInfoDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NodeInfoDecodeErrorZ* owner_conv = (LDKCResult_NodeInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKNodeInfo ret_var = CResult_NodeInfoDecodeErrorZ_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_NodeInfoDecodeErrorZ_get_err(LDKCResult_NodeInfoDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NodeInfoDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_NodeInfoDecodeErrorZ* owner_conv = (LDKCResult_NodeInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_NodeInfoDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKNetworkGraph CResult_NetworkGraphDecodeErrorZ_get_ok(LDKCResult_NetworkGraphDecodeErrorZ *NONNULL_PTR owner){
+       LDKNetworkGraph ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NetworkGraphDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NetworkGraphDecodeErrorZ* owner_conv = (LDKCResult_NetworkGraphDecodeErrorZ*)untag_ptr(owner);
+       LDKNetworkGraph ret_var = CResult_NetworkGraphDecodeErrorZ_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_NetworkGraphDecodeErrorZ_get_err(LDKCResult_NetworkGraphDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NetworkGraphDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_NetworkGraphDecodeErrorZ* owner_conv = (LDKCResult_NetworkGraphDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_NetworkGraphDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKCOption_CVec_SocketAddressZZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_CVec_SocketAddressZZ *obj = (LDKCOption_CVec_SocketAddressZZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_CVec_SocketAddressZZ_Some: return 0;
+               case LDKCOption_CVec_SocketAddressZZ_None: return 1;
+               default: abort();
+       }
+}
+int64_tArray CS_LDK_LDKCOption_CVec_SocketAddressZZ_Some_get_some(int64_t ptr) {
+       LDKCOption_CVec_SocketAddressZZ *obj = (LDKCOption_CVec_SocketAddressZZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_CVec_SocketAddressZZ_Some);
+       LDKCVec_SocketAddressZ some_var = obj->some;
+                       int64_tArray some_arr = NULL;
+                       some_arr = init_int64_tArray(some_var.datalen, __LINE__);
+                       int64_t *some_arr_ptr = (int64_t*)(((uint8_t*)some_arr) + 8);
+                       for (size_t p = 0; p < some_var.datalen; p++) {
+                               int64_t some_conv_15_ref = tag_ptr(&some_var.data[p], false);
+                               some_arr_ptr[p] = some_conv_15_ref;
+                       }
+                       
+       return some_arr;
+}
+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++) {
+               ret.data[i] = HTLCOutputInCommitment_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_HTLCDescriptorZ CVec_HTLCDescriptorZ_clone(const LDKCVec_HTLCDescriptorZ *orig) {
+       LDKCVec_HTLCDescriptorZ ret = { .data = MALLOC(sizeof(LDKHTLCDescriptor) * orig->datalen, "LDKCVec_HTLCDescriptorZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = HTLCDescriptor_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_UtxoZ CVec_UtxoZ_clone(const LDKCVec_UtxoZ *orig) {
+       LDKCVec_UtxoZ ret = { .data = MALLOC(sizeof(LDKUtxo) * orig->datalen, "LDKCVec_UtxoZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = Utxo_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKCOption_TxOutZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_TxOutZ *obj = (LDKCOption_TxOutZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_TxOutZ_Some: return 0;
+               case LDKCOption_TxOutZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_TxOutZ_Some_get_some(int64_t ptr) {
+       LDKCOption_TxOutZ *obj = (LDKCOption_TxOutZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_TxOutZ_Some);
+       LDKTxOut* some_ref = &obj->some;
+       return tag_ptr(some_ref, false);
+}
+static inline LDKCVec_InputZ CVec_InputZ_clone(const LDKCVec_InputZ *orig) {
+       LDKCVec_InputZ ret = { .data = MALLOC(sizeof(LDKInput) * orig->datalen, "LDKCVec_InputZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = Input_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKCoinSelection CResult_CoinSelectionNoneZ_get_ok(LDKCResult_CoinSelectionNoneZ *NONNULL_PTR owner){
+       LDKCoinSelection ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_CoinSelectionNoneZ_get_ok(int64_t owner) {
+       LDKCResult_CoinSelectionNoneZ* owner_conv = (LDKCResult_CoinSelectionNoneZ*)untag_ptr(owner);
+       LDKCoinSelection ret_var = CResult_CoinSelectionNoneZ_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_CoinSelectionNoneZ_get_err(LDKCResult_CoinSelectionNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_CoinSelectionNoneZ_get_err(int64_t owner) {
+       LDKCResult_CoinSelectionNoneZ* owner_conv = (LDKCResult_CoinSelectionNoneZ*)untag_ptr(owner);
+       CResult_CoinSelectionNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKCVec_UtxoZ CResult_CVec_UtxoZNoneZ_get_ok(LDKCResult_CVec_UtxoZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return CVec_UtxoZ_clone(&*owner->contents.result);
+}
+int64_tArray  CS_LDK_CResult_CVec_UtxoZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_UtxoZNoneZ* owner_conv = (LDKCResult_CVec_UtxoZNoneZ*)untag_ptr(owner);
+       LDKCVec_UtxoZ ret_var = CResult_CVec_UtxoZNoneZ_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 g = 0; g < ret_var.datalen; g++) {
+               LDKUtxo ret_conv_6_var = ret_var.data[g];
+               int64_t ret_conv_6_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_6_var);
+               ret_conv_6_ref = tag_ptr(ret_conv_6_var.inner, ret_conv_6_var.is_owned);
+               ret_arr_ptr[g] = ret_conv_6_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+static inline void CResult_CVec_UtxoZNoneZ_get_err(LDKCResult_CVec_UtxoZNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_CVec_UtxoZNoneZ_get_err(int64_t owner) {
+       LDKCResult_CVec_UtxoZNoneZ* owner_conv = (LDKCResult_CVec_UtxoZNoneZ*)untag_ptr(owner);
+       CResult_CVec_UtxoZNoneZ_get_err(owner_conv);
+}
+
+static inline uint64_t C2Tuple_u64u16Z_get_a(LDKC2Tuple_u64u16Z *NONNULL_PTR owner){
+       return owner->a;
+}
+int64_t  CS_LDK_C2Tuple_u64u16Z_get_a(int64_t owner) {
+       LDKC2Tuple_u64u16Z* owner_conv = (LDKC2Tuple_u64u16Z*)untag_ptr(owner);
+       int64_t ret_conv = C2Tuple_u64u16Z_get_a(owner_conv);
+       return ret_conv;
+}
+
+static inline uint16_t C2Tuple_u64u16Z_get_b(LDKC2Tuple_u64u16Z *NONNULL_PTR owner){
+       return owner->b;
+}
+int16_t  CS_LDK_C2Tuple_u64u16Z_get_b(int64_t owner) {
+       LDKC2Tuple_u64u16Z* owner_conv = (LDKC2Tuple_u64u16Z*)untag_ptr(owner);
+       int16_t ret_conv = C2Tuple_u64u16Z_get_b(owner_conv);
+       return ret_conv;
+}
+
+uint32_t CS_LDK_LDKCOption_C2Tuple_u64u16ZZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_C2Tuple_u64u16ZZ *obj = (LDKCOption_C2Tuple_u64u16ZZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_C2Tuple_u64u16ZZ_Some: return 0;
+               case LDKCOption_C2Tuple_u64u16ZZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_C2Tuple_u64u16ZZ_Some_get_some(int64_t ptr) {
+       LDKCOption_C2Tuple_u64u16ZZ *obj = (LDKCOption_C2Tuple_u64u16ZZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_C2Tuple_u64u16ZZ_Some);
+       LDKC2Tuple_u64u16Z* some_conv = MALLOC(sizeof(LDKC2Tuple_u64u16Z), "LDKC2Tuple_u64u16Z");
+       *some_conv = obj->some;
+                       *some_conv = C2Tuple_u64u16Z_clone(some_conv);
+       return tag_ptr(some_conv, true);
+}
+uint32_t CS_LDK_LDKCOption_ChannelShutdownStateZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_ChannelShutdownStateZ *obj = (LDKCOption_ChannelShutdownStateZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_ChannelShutdownStateZ_Some: return 0;
+               case LDKCOption_ChannelShutdownStateZ_None: return 1;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKCOption_ChannelShutdownStateZ_Some_get_some(int64_t ptr) {
+       LDKCOption_ChannelShutdownStateZ *obj = (LDKCOption_ChannelShutdownStateZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_ChannelShutdownStateZ_Some);
+       int32_t some_conv = LDKChannelShutdownState_to_cs(obj->some);
+       return some_conv;
+}
+static inline struct LDKThirtyTwoBytes CResult_ThirtyTwoBytesAPIErrorZ_get_ok(LDKCResult_ThirtyTwoBytesAPIErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return ThirtyTwoBytes_clone(&*owner->contents.result);
+}
+int8_tArray  CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* owner_conv = (LDKCResult_ThirtyTwoBytesAPIErrorZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, CResult_ThirtyTwoBytesAPIErrorZ_get_ok(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKAPIError CResult_ThirtyTwoBytesAPIErrorZ_get_err(LDKCResult_ThirtyTwoBytesAPIErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return APIError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_get_err(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* owner_conv = (LDKCResult_ThirtyTwoBytesAPIErrorZ*)untag_ptr(owner);
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = CResult_ThirtyTwoBytesAPIErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKRecentPaymentDetails_ty_from_ptr(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKRecentPaymentDetails_AwaitingInvoice: return 0;
+               case LDKRecentPaymentDetails_Pending: return 1;
+               case LDKRecentPaymentDetails_Fulfilled: return 2;
+               case LDKRecentPaymentDetails_Abandoned: return 3;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKRecentPaymentDetails_AwaitingInvoice_get_payment_id(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRecentPaymentDetails_AwaitingInvoice);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->awaiting_invoice.payment_id.data, 32);
+       return payment_id_arr;
+}
+int8_tArray CS_LDK_LDKRecentPaymentDetails_Pending_get_payment_id(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRecentPaymentDetails_Pending);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->pending.payment_id.data, 32);
+       return payment_id_arr;
+}
+int8_tArray CS_LDK_LDKRecentPaymentDetails_Pending_get_payment_hash(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRecentPaymentDetails_Pending);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->pending.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKRecentPaymentDetails_Pending_get_total_msat(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRecentPaymentDetails_Pending);
+       int64_t total_msat_conv = obj->pending.total_msat;
+       return total_msat_conv;
+}
+int8_tArray CS_LDK_LDKRecentPaymentDetails_Fulfilled_get_payment_id(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRecentPaymentDetails_Fulfilled);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->fulfilled.payment_id.data, 32);
+       return payment_id_arr;
+}
+int64_t CS_LDK_LDKRecentPaymentDetails_Fulfilled_get_payment_hash(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRecentPaymentDetails_Fulfilled);
+       int64_t payment_hash_ref = tag_ptr(&obj->fulfilled.payment_hash, false);
+       return payment_hash_ref;
+}
+int8_tArray CS_LDK_LDKRecentPaymentDetails_Abandoned_get_payment_id(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRecentPaymentDetails_Abandoned);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->abandoned.payment_id.data, 32);
+       return payment_id_arr;
+}
+int8_tArray CS_LDK_LDKRecentPaymentDetails_Abandoned_get_payment_hash(int64_t ptr) {
+       LDKRecentPaymentDetails *obj = (LDKRecentPaymentDetails*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKRecentPaymentDetails_Abandoned);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->abandoned.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+static inline LDKCVec_RecentPaymentDetailsZ CVec_RecentPaymentDetailsZ_clone(const LDKCVec_RecentPaymentDetailsZ *orig) {
+       LDKCVec_RecentPaymentDetailsZ ret = { .data = MALLOC(sizeof(LDKRecentPaymentDetails) * orig->datalen, "LDKCVec_RecentPaymentDetailsZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = RecentPaymentDetails_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKPaymentSendFailure_ty_from_ptr(int64_t ptr) {
+       LDKPaymentSendFailure *obj = (LDKPaymentSendFailure*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKPaymentSendFailure_ParameterError: return 0;
+               case LDKPaymentSendFailure_PathParameterError: return 1;
+               case LDKPaymentSendFailure_AllFailedResendSafe: return 2;
+               case LDKPaymentSendFailure_DuplicatePayment: return 3;
+               case LDKPaymentSendFailure_PartialFailure: return 4;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKPaymentSendFailure_ParameterError_get_parameter_error(int64_t ptr) {
+       LDKPaymentSendFailure *obj = (LDKPaymentSendFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentSendFailure_ParameterError);
+       int64_t parameter_error_ref = tag_ptr(&obj->parameter_error, false);
+       return parameter_error_ref;
+}
+int64_tArray CS_LDK_LDKPaymentSendFailure_PathParameterError_get_path_parameter_error(int64_t ptr) {
+       LDKPaymentSendFailure *obj = (LDKPaymentSendFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentSendFailure_PathParameterError);
+       LDKCVec_CResult_NoneAPIErrorZZ path_parameter_error_var = obj->path_parameter_error;
+                       int64_tArray path_parameter_error_arr = NULL;
+                       path_parameter_error_arr = init_int64_tArray(path_parameter_error_var.datalen, __LINE__);
+                       int64_t *path_parameter_error_arr_ptr = (int64_t*)(((uint8_t*)path_parameter_error_arr) + 8);
+                       for (size_t w = 0; w < path_parameter_error_var.datalen; w++) {
+                               LDKCResult_NoneAPIErrorZ* path_parameter_error_conv_22_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+                               *path_parameter_error_conv_22_conv = path_parameter_error_var.data[w];
+                               *path_parameter_error_conv_22_conv = CResult_NoneAPIErrorZ_clone(path_parameter_error_conv_22_conv);
+                               path_parameter_error_arr_ptr[w] = tag_ptr(path_parameter_error_conv_22_conv, true);
+                       }
+                       
+       return path_parameter_error_arr;
+}
+int64_tArray CS_LDK_LDKPaymentSendFailure_AllFailedResendSafe_get_all_failed_resend_safe(int64_t ptr) {
+       LDKPaymentSendFailure *obj = (LDKPaymentSendFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentSendFailure_AllFailedResendSafe);
+       LDKCVec_APIErrorZ all_failed_resend_safe_var = obj->all_failed_resend_safe;
+                       int64_tArray all_failed_resend_safe_arr = NULL;
+                       all_failed_resend_safe_arr = init_int64_tArray(all_failed_resend_safe_var.datalen, __LINE__);
+                       int64_t *all_failed_resend_safe_arr_ptr = (int64_t*)(((uint8_t*)all_failed_resend_safe_arr) + 8);
+                       for (size_t k = 0; k < all_failed_resend_safe_var.datalen; k++) {
+                               int64_t all_failed_resend_safe_conv_10_ref = tag_ptr(&all_failed_resend_safe_var.data[k], false);
+                               all_failed_resend_safe_arr_ptr[k] = all_failed_resend_safe_conv_10_ref;
+                       }
+                       
+       return all_failed_resend_safe_arr;
+}
+int64_tArray CS_LDK_LDKPaymentSendFailure_PartialFailure_get_results(int64_t ptr) {
+       LDKPaymentSendFailure *obj = (LDKPaymentSendFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentSendFailure_PartialFailure);
+       LDKCVec_CResult_NoneAPIErrorZZ results_var = obj->partial_failure.results;
+                       int64_tArray results_arr = NULL;
+                       results_arr = init_int64_tArray(results_var.datalen, __LINE__);
+                       int64_t *results_arr_ptr = (int64_t*)(((uint8_t*)results_arr) + 8);
+                       for (size_t w = 0; w < results_var.datalen; w++) {
+                               LDKCResult_NoneAPIErrorZ* results_conv_22_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+                               *results_conv_22_conv = results_var.data[w];
+                               *results_conv_22_conv = CResult_NoneAPIErrorZ_clone(results_conv_22_conv);
+                               results_arr_ptr[w] = tag_ptr(results_conv_22_conv, true);
+                       }
+                       
+       return results_arr;
+}
+int64_t CS_LDK_LDKPaymentSendFailure_PartialFailure_get_failed_paths_retry(int64_t ptr) {
+       LDKPaymentSendFailure *obj = (LDKPaymentSendFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentSendFailure_PartialFailure);
+       LDKRouteParameters failed_paths_retry_var = obj->partial_failure.failed_paths_retry;
+                       int64_t failed_paths_retry_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(failed_paths_retry_var);
+                       failed_paths_retry_ref = tag_ptr(failed_paths_retry_var.inner, false);
+       return failed_paths_retry_ref;
+}
+int8_tArray CS_LDK_LDKPaymentSendFailure_PartialFailure_get_payment_id(int64_t ptr) {
+       LDKPaymentSendFailure *obj = (LDKPaymentSendFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentSendFailure_PartialFailure);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->partial_failure.payment_id.data, 32);
+       return payment_id_arr;
+}
+static inline void CResult_NonePaymentSendFailureZ_get_ok(LDKCResult_NonePaymentSendFailureZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NonePaymentSendFailureZ_get_ok(int64_t owner) {
+       LDKCResult_NonePaymentSendFailureZ* owner_conv = (LDKCResult_NonePaymentSendFailureZ*)untag_ptr(owner);
+       CResult_NonePaymentSendFailureZ_get_ok(owner_conv);
+}
+
+static inline struct LDKPaymentSendFailure CResult_NonePaymentSendFailureZ_get_err(LDKCResult_NonePaymentSendFailureZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return PaymentSendFailure_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NonePaymentSendFailureZ_get_err(int64_t owner) {
+       LDKCResult_NonePaymentSendFailureZ* owner_conv = (LDKCResult_NonePaymentSendFailureZ*)untag_ptr(owner);
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = CResult_NonePaymentSendFailureZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline void CResult_NoneRetryableSendFailureZ_get_ok(LDKCResult_NoneRetryableSendFailureZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NoneRetryableSendFailureZ_get_ok(int64_t owner) {
+       LDKCResult_NoneRetryableSendFailureZ* owner_conv = (LDKCResult_NoneRetryableSendFailureZ*)untag_ptr(owner);
+       CResult_NoneRetryableSendFailureZ_get_ok(owner_conv);
+}
+
+static inline enum LDKRetryableSendFailure CResult_NoneRetryableSendFailureZ_get_err(LDKCResult_NoneRetryableSendFailureZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return RetryableSendFailure_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_NoneRetryableSendFailureZ_get_err(int64_t owner) {
+       LDKCResult_NoneRetryableSendFailureZ* owner_conv = (LDKCResult_NoneRetryableSendFailureZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKRetryableSendFailure_to_cs(CResult_NoneRetryableSendFailureZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKThirtyTwoBytes CResult_ThirtyTwoBytesPaymentSendFailureZ_get_ok(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return ThirtyTwoBytes_clone(&*owner->contents.result);
+}
+int8_tArray  CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_get_ok(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* owner_conv = (LDKCResult_ThirtyTwoBytesPaymentSendFailureZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, CResult_ThirtyTwoBytesPaymentSendFailureZ_get_ok(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKPaymentSendFailure CResult_ThirtyTwoBytesPaymentSendFailureZ_get_err(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return PaymentSendFailure_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_get_err(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* owner_conv = (LDKCResult_ThirtyTwoBytesPaymentSendFailureZ*)untag_ptr(owner);
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = CResult_ThirtyTwoBytesPaymentSendFailureZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKThirtyTwoBytes CResult_ThirtyTwoBytesRetryableSendFailureZ_get_ok(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return ThirtyTwoBytes_clone(&*owner->contents.result);
+}
+int8_tArray  CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_get_ok(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* owner_conv = (LDKCResult_ThirtyTwoBytesRetryableSendFailureZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, CResult_ThirtyTwoBytesRetryableSendFailureZ_get_ok(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline enum LDKRetryableSendFailure CResult_ThirtyTwoBytesRetryableSendFailureZ_get_err(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return RetryableSendFailure_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_get_err(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* owner_conv = (LDKCResult_ThirtyTwoBytesRetryableSendFailureZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKRetryableSendFailure_to_cs(CResult_ThirtyTwoBytesRetryableSendFailureZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_a(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->a);
+}
+int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_a(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_a(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_b(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->b);
+}
+int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_b(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_b(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_ok(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_ok(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ*)untag_ptr(owner);
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ), "LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_ok(owner_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline struct LDKPaymentSendFailure CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_err(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return PaymentSendFailure_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_err(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ*)untag_ptr(owner);
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ_clone(const LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ *orig) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ) * orig->datalen, "LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKProbeSendFailure_ty_from_ptr(int64_t ptr) {
+       LDKProbeSendFailure *obj = (LDKProbeSendFailure*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKProbeSendFailure_RouteNotFound: return 0;
+               case LDKProbeSendFailure_SendingFailed: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKProbeSendFailure_SendingFailed_get_sending_failed(int64_t ptr) {
+       LDKProbeSendFailure *obj = (LDKProbeSendFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKProbeSendFailure_SendingFailed);
+       int64_t sending_failed_ref = tag_ptr(&obj->sending_failed, false);
+       return sending_failed_ref;
+}
+static inline struct LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_ok(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ_clone(&*owner->contents.result);
+}
+int64_tArray  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* owner_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ*)untag_ptr(owner);
+       LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ ret_var = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_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;
+}
+
+static inline struct LDKProbeSendFailure CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_err(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return ProbeSendFailure_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_err(int64_t owner) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* owner_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ*)untag_ptr(owner);
+       LDKProbeSendFailure *ret_copy = MALLOC(sizeof(LDKProbeSendFailure), "LDKProbeSendFailure");
+       *ret_copy = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesPublicKeyZ_get_a(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->a);
+}
+int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_get_a(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesPublicKeyZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesPublicKeyZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesPublicKeyZ_get_a(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKPublicKey C2Tuple_ThirtyTwoBytesPublicKeyZ_get_b(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ *NONNULL_PTR owner){
+       return owner->b;
+}
+int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_get_b(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesPublicKeyZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesPublicKeyZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesPublicKeyZ_get_b(owner_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+static inline LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ CVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ_clone(const LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ *orig) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ) * orig->datalen, "LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_ThirtyTwoBytesPublicKeyZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKCOption_StrZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_StrZ *obj = (LDKCOption_StrZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_StrZ_Some: return 0;
+               case LDKCOption_StrZ_None: return 1;
+               default: abort();
+       }
+}
+jstring CS_LDK_LDKCOption_StrZ_Some_get_some(int64_t ptr) {
+       LDKCOption_StrZ *obj = (LDKCOption_StrZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_StrZ_Some);
+       LDKStr some_str = obj->some;
+                       jstring some_conv = str_ref_to_cs(some_str.chars, some_str.len);
+       return some_conv;
+}
+static inline void CResult_NoneBolt12SemanticErrorZ_get_ok(LDKCResult_NoneBolt12SemanticErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NoneBolt12SemanticErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NoneBolt12SemanticErrorZ* owner_conv = (LDKCResult_NoneBolt12SemanticErrorZ*)untag_ptr(owner);
+       CResult_NoneBolt12SemanticErrorZ_get_ok(owner_conv);
+}
+
+static inline enum LDKBolt12SemanticError CResult_NoneBolt12SemanticErrorZ_get_err(LDKCResult_NoneBolt12SemanticErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return Bolt12SemanticError_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_NoneBolt12SemanticErrorZ_get_err(int64_t owner) {
+       LDKCResult_NoneBolt12SemanticErrorZ* owner_conv = (LDKCResult_NoneBolt12SemanticErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(CResult_NoneBolt12SemanticErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_ok(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ*)untag_ptr(owner);
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ), "LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_ok(owner_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline void CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_err(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_err(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ*)untag_ptr(owner);
+       CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_err(owner_conv);
+}
+
+uint32_t CS_LDK_LDKOffersMessage_ty_from_ptr(int64_t ptr) {
+       LDKOffersMessage *obj = (LDKOffersMessage*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKOffersMessage_InvoiceRequest: return 0;
+               case LDKOffersMessage_Invoice: return 1;
+               case LDKOffersMessage_InvoiceError: return 2;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKOffersMessage_InvoiceRequest_get_invoice_request(int64_t ptr) {
+       LDKOffersMessage *obj = (LDKOffersMessage*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKOffersMessage_InvoiceRequest);
+       LDKInvoiceRequest invoice_request_var = obj->invoice_request;
+                       int64_t invoice_request_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_request_var);
+                       invoice_request_ref = tag_ptr(invoice_request_var.inner, false);
+       return invoice_request_ref;
+}
+int64_t CS_LDK_LDKOffersMessage_Invoice_get_invoice(int64_t ptr) {
+       LDKOffersMessage *obj = (LDKOffersMessage*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKOffersMessage_Invoice);
+       LDKBolt12Invoice invoice_var = obj->invoice;
+                       int64_t invoice_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_var);
+                       invoice_ref = tag_ptr(invoice_var.inner, false);
+       return invoice_ref;
+}
+int64_t CS_LDK_LDKOffersMessage_InvoiceError_get_invoice_error(int64_t ptr) {
+       LDKOffersMessage *obj = (LDKOffersMessage*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKOffersMessage_InvoiceError);
+       LDKInvoiceError invoice_error_var = obj->invoice_error;
+                       int64_t invoice_error_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_error_var);
+                       invoice_error_ref = tag_ptr(invoice_error_var.inner, false);
+       return invoice_error_ref;
+}
+uint32_t CS_LDK_LDKCOption_OffersMessageZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_OffersMessageZ *obj = (LDKCOption_OffersMessageZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_OffersMessageZ_Some: return 0;
+               case LDKCOption_OffersMessageZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_OffersMessageZ_Some_get_some(int64_t ptr) {
+       LDKCOption_OffersMessageZ *obj = (LDKCOption_OffersMessageZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_OffersMessageZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+uint32_t CS_LDK_LDKDestination_ty_from_ptr(int64_t ptr) {
+       LDKDestination *obj = (LDKDestination*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKDestination_Node: return 0;
+               case LDKDestination_BlindedPath: return 1;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKDestination_Node_get_node(int64_t ptr) {
+       LDKDestination *obj = (LDKDestination*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKDestination_Node);
+       int8_tArray node_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_arr->elems, obj->node.compressed_form, 33);
+       return node_arr;
+}
+int64_t CS_LDK_LDKDestination_BlindedPath_get_blinded_path(int64_t ptr) {
+       LDKDestination *obj = (LDKDestination*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKDestination_BlindedPath);
+       LDKBlindedPath blinded_path_var = obj->blinded_path;
+                       int64_t blinded_path_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(blinded_path_var);
+                       blinded_path_ref = tag_ptr(blinded_path_var.inner, false);
+       return blinded_path_ref;
+}
+static inline struct LDKOffersMessage C3Tuple_OffersMessageDestinationBlindedPathZ_get_a(LDKC3Tuple_OffersMessageDestinationBlindedPathZ *NONNULL_PTR owner){
+       return OffersMessage_clone(&owner->a);
+}
+int64_t  CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_get_a(int64_t owner) {
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ* owner_conv = (LDKC3Tuple_OffersMessageDestinationBlindedPathZ*)untag_ptr(owner);
+       LDKOffersMessage *ret_copy = MALLOC(sizeof(LDKOffersMessage), "LDKOffersMessage");
+       *ret_copy = C3Tuple_OffersMessageDestinationBlindedPathZ_get_a(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDestination C3Tuple_OffersMessageDestinationBlindedPathZ_get_b(LDKC3Tuple_OffersMessageDestinationBlindedPathZ *NONNULL_PTR owner){
+       return Destination_clone(&owner->b);
+}
+int64_t  CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_get_b(int64_t owner) {
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ* owner_conv = (LDKC3Tuple_OffersMessageDestinationBlindedPathZ*)untag_ptr(owner);
+       LDKDestination *ret_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
+       *ret_copy = C3Tuple_OffersMessageDestinationBlindedPathZ_get_b(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBlindedPath C3Tuple_OffersMessageDestinationBlindedPathZ_get_c(LDKC3Tuple_OffersMessageDestinationBlindedPathZ *NONNULL_PTR owner){
+       LDKBlindedPath ret = owner->c;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_get_c(int64_t owner) {
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ* owner_conv = (LDKC3Tuple_OffersMessageDestinationBlindedPathZ*)untag_ptr(owner);
+       LDKBlindedPath ret_var = C3Tuple_OffersMessageDestinationBlindedPathZ_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;
+}
+
+static inline LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ CVec_C3Tuple_OffersMessageDestinationBlindedPathZZ_clone(const LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ *orig) {
+       LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ ret = { .data = MALLOC(sizeof(LDKC3Tuple_OffersMessageDestinationBlindedPathZ) * orig->datalen, "LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C3Tuple_OffersMessageDestinationBlindedPathZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKCounterpartyForwardingInfo CResult_CounterpartyForwardingInfoDecodeErrorZ_get_ok(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ *NONNULL_PTR owner){
+       LDKCounterpartyForwardingInfo ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* owner_conv = (LDKCResult_CounterpartyForwardingInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKCounterpartyForwardingInfo ret_var = CResult_CounterpartyForwardingInfoDecodeErrorZ_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_CounterpartyForwardingInfoDecodeErrorZ_get_err(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* owner_conv = (LDKCResult_CounterpartyForwardingInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_CounterpartyForwardingInfoDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelCounterparty CResult_ChannelCounterpartyDecodeErrorZ_get_ok(LDKCResult_ChannelCounterpartyDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelCounterparty ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelCounterpartyDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* owner_conv = (LDKCResult_ChannelCounterpartyDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelCounterparty ret_var = CResult_ChannelCounterpartyDecodeErrorZ_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_ChannelCounterpartyDecodeErrorZ_get_err(LDKCResult_ChannelCounterpartyDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelCounterpartyDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* owner_conv = (LDKCResult_ChannelCounterpartyDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelCounterpartyDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelDetails CResult_ChannelDetailsDecodeErrorZ_get_ok(LDKCResult_ChannelDetailsDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelDetails ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelDetailsDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelDetailsDecodeErrorZ* owner_conv = (LDKCResult_ChannelDetailsDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelDetails ret_var = CResult_ChannelDetailsDecodeErrorZ_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_ChannelDetailsDecodeErrorZ_get_err(LDKCResult_ChannelDetailsDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelDetailsDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelDetailsDecodeErrorZ* owner_conv = (LDKCResult_ChannelDetailsDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelDetailsDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKPhantomRouteHints CResult_PhantomRouteHintsDecodeErrorZ_get_ok(LDKCResult_PhantomRouteHintsDecodeErrorZ *NONNULL_PTR owner){
+       LDKPhantomRouteHints ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* owner_conv = (LDKCResult_PhantomRouteHintsDecodeErrorZ*)untag_ptr(owner);
+       LDKPhantomRouteHints ret_var = CResult_PhantomRouteHintsDecodeErrorZ_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_PhantomRouteHintsDecodeErrorZ_get_err(LDKCResult_PhantomRouteHintsDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* owner_conv = (LDKCResult_PhantomRouteHintsDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PhantomRouteHintsDecodeErrorZ_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);
+}
+int32_t  CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelShutdownStateDecodeErrorZ* owner_conv = (LDKCResult_ChannelShutdownStateDecodeErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKChannelShutdownState_to_cs(CResult_ChannelShutdownStateDecodeErrorZ_get_ok(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKDecodeError CResult_ChannelShutdownStateDecodeErrorZ_get_err(LDKCResult_ChannelShutdownStateDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelShutdownStateDecodeErrorZ* owner_conv = (LDKCResult_ChannelShutdownStateDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelShutdownStateDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_ChannelMonitorZ CVec_ChannelMonitorZ_clone(const LDKCVec_ChannelMonitorZ *orig) {
+       LDKCVec_ChannelMonitorZ ret = { .data = MALLOC(sizeof(LDKChannelMonitor) * orig->datalen, "LDKCVec_ChannelMonitorZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = ChannelMonitor_clone(&orig->data[i]);
+       }
+       return ret;
+}
+typedef struct LDKWatch_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKWatch_JCalls;
+static void LDKWatch_JCalls_free(void* this_arg) {
+       LDKWatch_JCalls *j_calls = (LDKWatch_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_ChannelMonitorUpdateStatusNoneZ watch_channel_LDKWatch_jcall(const void* this_arg, LDKOutPoint funding_txo, LDKChannelMonitor monitor) {
+       LDKWatch_JCalls *j_calls = (LDKWatch_JCalls*) this_arg;
+       LDKOutPoint funding_txo_var = funding_txo;
+       int64_t funding_txo_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_var);
+       funding_txo_ref = tag_ptr(funding_txo_var.inner, funding_txo_var.is_owned);
+       LDKChannelMonitor monitor_var = monitor;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ ret_conv = *(LDKCResult_ChannelMonitorUpdateStatusNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKChannelMonitorUpdateStatus update_channel_LDKWatch_jcall(const void* this_arg, LDKOutPoint funding_txo, const LDKChannelMonitorUpdate * update) {
+       LDKWatch_JCalls *j_calls = (LDKWatch_JCalls*) this_arg;
+       LDKOutPoint funding_txo_var = funding_txo;
+       int64_t funding_txo_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_var);
+       funding_txo_ref = tag_ptr(funding_txo_var.inner, funding_txo_var.is_owned);
+       LDKChannelMonitorUpdate update_var = *update;
+       int64_t update_ref = 0;
+       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);
+       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);
+       LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ ret_constr;
+       ret_constr.datalen = ret->arr_len;
+       if (ret_constr.datalen > 0)
+               ret_constr.data = MALLOC(ret_constr.datalen * sizeof(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ), "LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ 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);
+               LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ ret_conv_49_conv = *(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ*)(ret_conv_49_ptr);
+               FREE(untag_ptr(ret_conv_49));
+               ret_constr.data[x] = ret_conv_49_conv;
+       }
+       FREE(ret);
+       return ret_constr;
+}
+static void LDKWatch_JCalls_cloned(LDKWatch* new_obj) {
+       LDKWatch_JCalls *j_calls = (LDKWatch_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKWatch LDKWatch_init (int64_t o) {
+       LDKWatch_JCalls *calls = MALLOC(sizeof(LDKWatch_JCalls), "LDKWatch_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKWatch ret = {
+               .this_arg = (void*) calls,
+               .watch_channel = watch_channel_LDKWatch_jcall,
+               .update_channel = update_channel_LDKWatch_jcall,
+               .release_pending_monitor_events = release_pending_monitor_events_LDKWatch_jcall,
+               .free = LDKWatch_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKWatch_new(int32_t o) {
+       LDKWatch *res_ptr = MALLOC(sizeof(LDKWatch), "LDKWatch");
+       *res_ptr = LDKWatch_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_Watch_watch_channel(int64_t this_arg, int64_t funding_txo, int64_t monitor) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKWatch* this_arg_conv = (LDKWatch*)this_arg_ptr;
+       LDKOutPoint funding_txo_conv;
+       funding_txo_conv.inner = untag_ptr(funding_txo);
+       funding_txo_conv.is_owned = ptr_is_owned(funding_txo);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       LDKChannelMonitor monitor_conv;
+       monitor_conv.inner = untag_ptr(monitor);
+       monitor_conv.is_owned = ptr_is_owned(monitor);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(monitor_conv);
+       monitor_conv = ChannelMonitor_clone(&monitor_conv);
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateStatusNoneZ), "LDKCResult_ChannelMonitorUpdateStatusNoneZ");
+       *ret_conv = (this_arg_conv->watch_channel)(this_arg_conv->this_arg, funding_txo_conv, monitor_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int32_t  CS_LDK_Watch_update_channel(int64_t this_arg, int64_t funding_txo, int64_t update) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKWatch* this_arg_conv = (LDKWatch*)this_arg_ptr;
+       LDKOutPoint funding_txo_conv;
+       funding_txo_conv.inner = untag_ptr(funding_txo);
+       funding_txo_conv.is_owned = ptr_is_owned(funding_txo);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       LDKChannelMonitorUpdate update_conv;
+       update_conv.inner = untag_ptr(update);
+       update_conv.is_owned = ptr_is_owned(update);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_conv);
+       update_conv.is_owned = false;
+       int32_t ret_conv = LDKChannelMonitorUpdateStatus_to_cs((this_arg_conv->update_channel)(this_arg_conv->this_arg, funding_txo_conv, &update_conv));
+       return ret_conv;
+}
+
+int64_tArray  CS_LDK_Watch_release_pending_monitor_events(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKWatch* this_arg_conv = (LDKWatch*)this_arg_ptr;
+       LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ ret_var = (this_arg_conv->release_pending_monitor_events)(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++) {
+               LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* ret_conv_49_conv = MALLOC(sizeof(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ), "LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ");
+               *ret_conv_49_conv = ret_var.data[x];
+               ret_arr_ptr[x] = tag_ptr(ret_conv_49_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+typedef struct LDKBroadcasterInterface_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKBroadcasterInterface_JCalls;
+static void LDKBroadcasterInterface_JCalls_free(void* this_arg) {
+       LDKBroadcasterInterface_JCalls *j_calls = (LDKBroadcasterInterface_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void broadcast_transactions_LDKBroadcasterInterface_jcall(const void* this_arg, LDKCVec_TransactionZ txs) {
+       LDKBroadcasterInterface_JCalls *j_calls = (LDKBroadcasterInterface_JCalls*) this_arg;
+       LDKCVec_TransactionZ txs_var = txs;
+       ptrArray txs_arr = NULL;
+       txs_arr = init_ptrArray(txs_var.datalen, __LINE__);
+       int8_tArray *txs_arr_ptr = (int8_tArray*)(((uint8_t*)txs_arr) + 8);
+       for (size_t i = 0; i < txs_var.datalen; i++) {
+               LDKTransaction txs_conv_8_var = txs_var.data[i];
+               int8_tArray txs_conv_8_arr = init_int8_tArray(txs_conv_8_var.datalen, __LINE__);
+               memcpy(txs_conv_8_arr->elems, txs_conv_8_var.data, txs_conv_8_var.datalen);
+               Transaction_free(txs_conv_8_var);
+               txs_arr_ptr[i] = txs_conv_8_arr;
+       }
+       
+       FREE(txs_var.data);
+       js_invoke_function_void_l(j_calls->instance_ptr, 29, (int64_t)txs_arr);
+}
+static void LDKBroadcasterInterface_JCalls_cloned(LDKBroadcasterInterface* new_obj) {
+       LDKBroadcasterInterface_JCalls *j_calls = (LDKBroadcasterInterface_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKBroadcasterInterface LDKBroadcasterInterface_init (int64_t o) {
+       LDKBroadcasterInterface_JCalls *calls = MALLOC(sizeof(LDKBroadcasterInterface_JCalls), "LDKBroadcasterInterface_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKBroadcasterInterface ret = {
+               .this_arg = (void*) calls,
+               .broadcast_transactions = broadcast_transactions_LDKBroadcasterInterface_jcall,
+               .free = LDKBroadcasterInterface_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKBroadcasterInterface_new(int32_t o) {
+       LDKBroadcasterInterface *res_ptr = MALLOC(sizeof(LDKBroadcasterInterface), "LDKBroadcasterInterface");
+       *res_ptr = LDKBroadcasterInterface_init(o);
+       return tag_ptr(res_ptr, true);
+}
+void  CS_LDK_BroadcasterInterface_broadcast_transactions(int64_t this_arg, ptrArray txs) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKBroadcasterInterface* this_arg_conv = (LDKBroadcasterInterface*)this_arg_ptr;
+       LDKCVec_TransactionZ txs_constr;
+       txs_constr.datalen = txs->arr_len;
+       if (txs_constr.datalen > 0)
+               txs_constr.data = MALLOC(txs_constr.datalen * sizeof(LDKTransaction), "LDKCVec_TransactionZ Elements");
+       else
+               txs_constr.data = NULL;
+       int8_tArray* txs_vals = (void*) txs->elems;
+       for (size_t i = 0; i < txs_constr.datalen; i++) {
+               int8_tArray txs_conv_8 = txs_vals[i];
+               LDKTransaction txs_conv_8_ref;
+               txs_conv_8_ref.datalen = txs_conv_8->arr_len;
+               txs_conv_8_ref.data = MALLOC(txs_conv_8_ref.datalen, "LDKTransaction Bytes");
+               memcpy(txs_conv_8_ref.data, txs_conv_8->elems, txs_conv_8_ref.datalen); FREE(txs_conv_8);
+               txs_conv_8_ref.data_is_owned = true;
+               txs_constr.data[i] = txs_conv_8_ref;
+       }
+       FREE(txs);
+       (this_arg_conv->broadcast_transactions)(this_arg_conv->this_arg, txs_constr);
+}
+
+typedef struct LDKEntropySource_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKEntropySource_JCalls;
+static void LDKEntropySource_JCalls_free(void* this_arg) {
+       LDKEntropySource_JCalls *j_calls = (LDKEntropySource_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+       LDKThirtyTwoBytes ret_ref;
+       CHECK(ret->arr_len == 32);
+       memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
+       return ret_ref;
+}
+static void LDKEntropySource_JCalls_cloned(LDKEntropySource* new_obj) {
+       LDKEntropySource_JCalls *j_calls = (LDKEntropySource_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKEntropySource LDKEntropySource_init (int64_t o) {
+       LDKEntropySource_JCalls *calls = MALLOC(sizeof(LDKEntropySource_JCalls), "LDKEntropySource_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKEntropySource ret = {
+               .this_arg = (void*) calls,
+               .get_secure_random_bytes = get_secure_random_bytes_LDKEntropySource_jcall,
+               .free = LDKEntropySource_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKEntropySource_new(int32_t o) {
+       LDKEntropySource *res_ptr = MALLOC(sizeof(LDKEntropySource), "LDKEntropySource");
+       *res_ptr = LDKEntropySource_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int8_tArray  CS_LDK_EntropySource_get_secure_random_bytes(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKEntropySource* this_arg_conv = (LDKEntropySource*)this_arg_ptr;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, (this_arg_conv->get_secure_random_bytes)(this_arg_conv->this_arg).data, 32);
+       return ret_arr;
+}
+
+uint32_t CS_LDK_LDKUnsignedGossipMessage_ty_from_ptr(int64_t ptr) {
+       LDKUnsignedGossipMessage *obj = (LDKUnsignedGossipMessage*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKUnsignedGossipMessage_ChannelAnnouncement: return 0;
+               case LDKUnsignedGossipMessage_ChannelUpdate: return 1;
+               case LDKUnsignedGossipMessage_NodeAnnouncement: return 2;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKUnsignedGossipMessage_ChannelAnnouncement_get_channel_announcement(int64_t ptr) {
+       LDKUnsignedGossipMessage *obj = (LDKUnsignedGossipMessage*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKUnsignedGossipMessage_ChannelAnnouncement);
+       LDKUnsignedChannelAnnouncement channel_announcement_var = obj->channel_announcement;
+                       int64_t channel_announcement_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_announcement_var);
+                       channel_announcement_ref = tag_ptr(channel_announcement_var.inner, false);
+       return channel_announcement_ref;
+}
+int64_t CS_LDK_LDKUnsignedGossipMessage_ChannelUpdate_get_channel_update(int64_t ptr) {
+       LDKUnsignedGossipMessage *obj = (LDKUnsignedGossipMessage*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKUnsignedGossipMessage_ChannelUpdate);
+       LDKUnsignedChannelUpdate channel_update_var = obj->channel_update;
+                       int64_t channel_update_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_update_var);
+                       channel_update_ref = tag_ptr(channel_update_var.inner, false);
+       return channel_update_ref;
+}
+int64_t CS_LDK_LDKUnsignedGossipMessage_NodeAnnouncement_get_node_announcement(int64_t ptr) {
+       LDKUnsignedGossipMessage *obj = (LDKUnsignedGossipMessage*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKUnsignedGossipMessage_NodeAnnouncement);
+       LDKUnsignedNodeAnnouncement node_announcement_var = obj->node_announcement;
+                       int64_t node_announcement_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_announcement_var);
+                       node_announcement_ref = tag_ptr(node_announcement_var.inner, false);
+       return node_announcement_ref;
+}
+typedef struct LDKNodeSigner_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKNodeSigner_JCalls;
+static void LDKNodeSigner_JCalls_free(void* this_arg) {
+       LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+       LDKThirtyTwoBytes ret_ref;
+       CHECK(ret->arr_len == 32);
+       memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
+       return ret_ref;
+}
+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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_PublicKeyNoneZ ret_conv = *(LDKCResult_PublicKeyNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ThirtyTwoBytesNoneZ ecdh_LDKNodeSigner_jcall(const void* this_arg, LDKRecipient recipient, LDKPublicKey other_key, LDKCOption_BigEndianScalarZ tweak) {
+       LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) this_arg;
+       int32_t recipient_conv = LDKRecipient_to_cs(recipient);
+       int8_tArray other_key_arr = init_int8_tArray(33, __LINE__);
+       memcpy(other_key_arr->elems, other_key.compressed_form, 33);
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ThirtyTwoBytesNoneZ ret_conv = *(LDKCResult_ThirtyTwoBytesNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_RecoverableSignatureNoneZ sign_invoice_LDKNodeSigner_jcall(const void* this_arg, LDKu8slice hrp_bytes, LDKCVec_U5Z invoice_data, LDKRecipient recipient) {
+       LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) this_arg;
+       LDKu8slice hrp_bytes_var = hrp_bytes;
+       int8_tArray hrp_bytes_arr = init_int8_tArray(hrp_bytes_var.datalen, __LINE__);
+       memcpy(hrp_bytes_arr->elems, hrp_bytes_var.data, hrp_bytes_var.datalen);
+       LDKCVec_U5Z invoice_data_var = invoice_data;
+       ptrArray invoice_data_arr = NULL;
+       invoice_data_arr = init_ptrArray(invoice_data_var.datalen, __LINE__);
+       int8_t *invoice_data_arr_ptr = (int8_t*)(((uint8_t*)invoice_data_arr) + 8);
+       for (size_t h = 0; h < invoice_data_var.datalen; h++) {
+               uint8_t invoice_data_conv_7_val = invoice_data_var.data[h]._0;
+               invoice_data_arr_ptr[h] = invoice_data_conv_7_val;
+       }
+       
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_RecoverableSignatureNoneZ ret_conv = *(LDKCResult_RecoverableSignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_SchnorrSignatureNoneZ sign_bolt12_invoice_request_LDKNodeSigner_jcall(const void* this_arg, const LDKUnsignedInvoiceRequest * invoice_request) {
+       LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) this_arg;
+       LDKUnsignedInvoiceRequest invoice_request_var = *invoice_request;
+       int64_t invoice_request_ref = 0;
+       // 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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_SchnorrSignatureNoneZ ret_conv = *(LDKCResult_SchnorrSignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_SchnorrSignatureNoneZ sign_bolt12_invoice_LDKNodeSigner_jcall(const void* this_arg, const LDKUnsignedBolt12Invoice * invoice) {
+       LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) this_arg;
+       LDKUnsignedBolt12Invoice invoice_var = *invoice;
+       int64_t invoice_ref = 0;
+       // 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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_SchnorrSignatureNoneZ ret_conv = *(LDKCResult_SchnorrSignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_ECDSASignatureNoneZ sign_gossip_message_LDKNodeSigner_jcall(const void* this_arg, LDKUnsignedGossipMessage msg) {
+       LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) this_arg;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKNodeSigner_JCalls_cloned(LDKNodeSigner* new_obj) {
+       LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKNodeSigner LDKNodeSigner_init (int64_t o) {
+       LDKNodeSigner_JCalls *calls = MALLOC(sizeof(LDKNodeSigner_JCalls), "LDKNodeSigner_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKNodeSigner ret = {
+               .this_arg = (void*) calls,
+               .get_inbound_payment_key_material = get_inbound_payment_key_material_LDKNodeSigner_jcall,
+               .get_node_id = get_node_id_LDKNodeSigner_jcall,
+               .ecdh = ecdh_LDKNodeSigner_jcall,
+               .sign_invoice = sign_invoice_LDKNodeSigner_jcall,
+               .sign_bolt12_invoice_request = sign_bolt12_invoice_request_LDKNodeSigner_jcall,
+               .sign_bolt12_invoice = sign_bolt12_invoice_LDKNodeSigner_jcall,
+               .sign_gossip_message = sign_gossip_message_LDKNodeSigner_jcall,
+               .free = LDKNodeSigner_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKNodeSigner_new(int32_t o) {
+       LDKNodeSigner *res_ptr = MALLOC(sizeof(LDKNodeSigner), "LDKNodeSigner");
+       *res_ptr = LDKNodeSigner_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int8_tArray  CS_LDK_NodeSigner_get_inbound_payment_key_material(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKNodeSigner* this_arg_conv = (LDKNodeSigner*)this_arg_ptr;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, (this_arg_conv->get_inbound_payment_key_material)(this_arg_conv->this_arg).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_NodeSigner_get_node_id(int64_t this_arg, int32_t recipient) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKNodeSigner* this_arg_conv = (LDKNodeSigner*)this_arg_ptr;
+       LDKRecipient recipient_conv = LDKRecipient_from_cs(recipient);
+       LDKCResult_PublicKeyNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeyNoneZ), "LDKCResult_PublicKeyNoneZ");
+       *ret_conv = (this_arg_conv->get_node_id)(this_arg_conv->this_arg, recipient_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeSigner_ecdh(int64_t this_arg, int32_t recipient, int8_tArray other_key, int64_t tweak) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKNodeSigner* this_arg_conv = (LDKNodeSigner*)this_arg_ptr;
+       LDKRecipient recipient_conv = LDKRecipient_from_cs(recipient);
+       LDKPublicKey other_key_ref;
+       CHECK(other_key->arr_len == 33);
+       memcpy(other_key_ref.compressed_form, other_key->elems, 33); FREE(other_key);
+       void* tweak_ptr = untag_ptr(tweak);
+       CHECK_ACCESS(tweak_ptr);
+       LDKCOption_BigEndianScalarZ tweak_conv = *(LDKCOption_BigEndianScalarZ*)(tweak_ptr);
+       tweak_conv = COption_BigEndianScalarZ_clone((LDKCOption_BigEndianScalarZ*)untag_ptr(tweak));
+       LDKCResult_ThirtyTwoBytesNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesNoneZ), "LDKCResult_ThirtyTwoBytesNoneZ");
+       *ret_conv = (this_arg_conv->ecdh)(this_arg_conv->this_arg, recipient_conv, other_key_ref, tweak_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeSigner_sign_invoice(int64_t this_arg, int8_tArray hrp_bytes, ptrArray invoice_data, int32_t recipient) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKNodeSigner* this_arg_conv = (LDKNodeSigner*)this_arg_ptr;
+       LDKu8slice hrp_bytes_ref;
+       hrp_bytes_ref.datalen = hrp_bytes->arr_len;
+       hrp_bytes_ref.data = hrp_bytes->elems;
+       LDKCVec_U5Z invoice_data_constr;
+       invoice_data_constr.datalen = invoice_data->arr_len;
+       if (invoice_data_constr.datalen > 0)
+               invoice_data_constr.data = MALLOC(invoice_data_constr.datalen * sizeof(LDKU5), "LDKCVec_U5Z Elements");
+       else
+               invoice_data_constr.data = NULL;
+       int8_t* invoice_data_vals = (void*) invoice_data->elems;
+       for (size_t h = 0; h < invoice_data_constr.datalen; h++) {
+               int8_t invoice_data_conv_7 = invoice_data_vals[h];
+               
+               invoice_data_constr.data[h] = (LDKU5){ ._0 = invoice_data_conv_7 };
+       }
+       FREE(invoice_data);
+       LDKRecipient recipient_conv = LDKRecipient_from_cs(recipient);
+       LDKCResult_RecoverableSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecoverableSignatureNoneZ), "LDKCResult_RecoverableSignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_invoice)(this_arg_conv->this_arg, hrp_bytes_ref, invoice_data_constr, recipient_conv);
+       FREE(hrp_bytes);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeSigner_sign_bolt12_invoice_request(int64_t this_arg, int64_t invoice_request) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKNodeSigner* this_arg_conv = (LDKNodeSigner*)this_arg_ptr;
+       LDKUnsignedInvoiceRequest invoice_request_conv;
+       invoice_request_conv.inner = untag_ptr(invoice_request);
+       invoice_request_conv.is_owned = ptr_is_owned(invoice_request);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_request_conv);
+       invoice_request_conv.is_owned = false;
+       LDKCResult_SchnorrSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_SchnorrSignatureNoneZ), "LDKCResult_SchnorrSignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_bolt12_invoice_request)(this_arg_conv->this_arg, &invoice_request_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeSigner_sign_bolt12_invoice(int64_t this_arg, int64_t invoice) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKNodeSigner* this_arg_conv = (LDKNodeSigner*)this_arg_ptr;
+       LDKUnsignedBolt12Invoice 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;
+       LDKCResult_SchnorrSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_SchnorrSignatureNoneZ), "LDKCResult_SchnorrSignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_bolt12_invoice)(this_arg_conv->this_arg, &invoice_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeSigner_sign_gossip_message(int64_t this_arg, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKNodeSigner* this_arg_conv = (LDKNodeSigner*)this_arg_ptr;
+       void* msg_ptr = untag_ptr(msg);
+       CHECK_ACCESS(msg_ptr);
+       LDKUnsignedGossipMessage msg_conv = *(LDKUnsignedGossipMessage*)(msg_ptr);
+       msg_conv = UnsignedGossipMessage_clone((LDKUnsignedGossipMessage*)untag_ptr(msg));
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = (this_arg_conv->sign_gossip_message)(this_arg_conv->this_arg, msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+typedef struct LDKSignerProvider_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKSignerProvider_JCalls;
+static void LDKSignerProvider_JCalls_free(void* this_arg) {
+       LDKSignerProvider_JCalls *j_calls = (LDKSignerProvider_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKThirtyTwoBytes generate_channel_keys_id_LDKSignerProvider_jcall(const void* this_arg, bool inbound, uint64_t channel_value_satoshis, LDKU128 user_channel_id) {
+       LDKSignerProvider_JCalls *j_calls = (LDKSignerProvider_JCalls*) this_arg;
+       jboolean inbound_conv = inbound;
+       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);
+       LDKThirtyTwoBytes ret_ref;
+       CHECK(ret->arr_len == 32);
+       memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
+       return ret_ref;
+}
+LDKWriteableEcdsaChannelSigner derive_channel_signer_LDKSignerProvider_jcall(const void* this_arg, uint64_t channel_value_satoshis, LDKThirtyTwoBytes channel_keys_id) {
+       LDKSignerProvider_JCalls *j_calls = (LDKSignerProvider_JCalls*) this_arg;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKWriteableEcdsaChannelSigner ret_conv = *(LDKWriteableEcdsaChannelSigner*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ read_chan_signer_LDKSignerProvider_jcall(const void* this_arg, LDKu8slice reader) {
+       LDKSignerProvider_JCalls *j_calls = (LDKSignerProvider_JCalls*) this_arg;
+       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);
+       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) {
+       LDKSignerProvider_JCalls *j_calls = (LDKSignerProvider_JCalls*) this_arg;
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 41);
+       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_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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_ShutdownScriptNoneZ ret_conv = *(LDKCResult_ShutdownScriptNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKSignerProvider_JCalls_cloned(LDKSignerProvider* new_obj) {
+       LDKSignerProvider_JCalls *j_calls = (LDKSignerProvider_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKSignerProvider LDKSignerProvider_init (int64_t o) {
+       LDKSignerProvider_JCalls *calls = MALLOC(sizeof(LDKSignerProvider_JCalls), "LDKSignerProvider_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKSignerProvider ret = {
+               .this_arg = (void*) calls,
+               .generate_channel_keys_id = generate_channel_keys_id_LDKSignerProvider_jcall,
+               .derive_channel_signer = derive_channel_signer_LDKSignerProvider_jcall,
+               .read_chan_signer = read_chan_signer_LDKSignerProvider_jcall,
+               .get_destination_script = get_destination_script_LDKSignerProvider_jcall,
+               .get_shutdown_scriptpubkey = get_shutdown_scriptpubkey_LDKSignerProvider_jcall,
+               .free = LDKSignerProvider_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKSignerProvider_new(int32_t o) {
+       LDKSignerProvider *res_ptr = MALLOC(sizeof(LDKSignerProvider), "LDKSignerProvider");
+       *res_ptr = LDKSignerProvider_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int8_tArray  CS_LDK_SignerProvider_generate_channel_keys_id(int64_t this_arg, jboolean inbound, int64_t channel_value_satoshis, int8_tArray user_channel_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;
+       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);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, (this_arg_conv->generate_channel_keys_id)(this_arg_conv->this_arg, inbound, channel_value_satoshis, user_channel_id_ref).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_SignerProvider_derive_channel_signer(int64_t this_arg, int64_t channel_value_satoshis, 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);
+       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
+       *ret_ret = (this_arg_conv->derive_channel_signer)(this_arg_conv->this_arg, channel_value_satoshis, channel_keys_id_ref);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_SignerProvider_read_chan_signer(int64_t this_arg, int8_tArray reader) {
+       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;
+       LDKu8slice reader_ref;
+       reader_ref.datalen = reader->arr_len;
+       reader_ref.data = reader->elems;
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ), "LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ");
+       *ret_conv = (this_arg_conv->read_chan_signer)(this_arg_conv->this_arg, reader_ref);
+       FREE(reader);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_SignerProvider_get_destination_script(int64_t this_arg) {
+       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;
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_SignerProvider_get_shutdown_scriptpubkey(int64_t this_arg) {
+       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;
+       LDKCResult_ShutdownScriptNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptNoneZ), "LDKCResult_ShutdownScriptNoneZ");
+       *ret_conv = (this_arg_conv->get_shutdown_scriptpubkey)(this_arg_conv->this_arg);
+       return tag_ptr(ret_conv, true);
+}
+
+typedef struct LDKFeeEstimator_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKFeeEstimator_JCalls;
+static void LDKFeeEstimator_JCalls_free(void* this_arg) {
+       LDKFeeEstimator_JCalls *j_calls = (LDKFeeEstimator_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+}
+static void LDKFeeEstimator_JCalls_cloned(LDKFeeEstimator* new_obj) {
+       LDKFeeEstimator_JCalls *j_calls = (LDKFeeEstimator_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKFeeEstimator LDKFeeEstimator_init (int64_t o) {
+       LDKFeeEstimator_JCalls *calls = MALLOC(sizeof(LDKFeeEstimator_JCalls), "LDKFeeEstimator_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKFeeEstimator ret = {
+               .this_arg = (void*) calls,
+               .get_est_sat_per_1000_weight = get_est_sat_per_1000_weight_LDKFeeEstimator_jcall,
+               .free = LDKFeeEstimator_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKFeeEstimator_new(int32_t o) {
+       LDKFeeEstimator *res_ptr = MALLOC(sizeof(LDKFeeEstimator), "LDKFeeEstimator");
+       *res_ptr = LDKFeeEstimator_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int32_t  CS_LDK_FeeEstimator_get_est_sat_per_1000_weight(int64_t this_arg, int32_t confirmation_target) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKFeeEstimator* this_arg_conv = (LDKFeeEstimator*)this_arg_ptr;
+       LDKConfirmationTarget confirmation_target_conv = LDKConfirmationTarget_from_cs(confirmation_target);
+       int32_t ret_conv = (this_arg_conv->get_est_sat_per_1000_weight)(this_arg_conv->this_arg, confirmation_target_conv);
+       return ret_conv;
+}
+
+typedef struct LDKRouter_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKRouter_JCalls;
+static void LDKRouter_JCalls_free(void* this_arg) {
+       LDKRouter_JCalls *j_calls = (LDKRouter_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_RouteLightningErrorZ find_route_LDKRouter_jcall(const void* this_arg, LDKPublicKey payer, const LDKRouteParameters * route_params, LDKCVec_ChannelDetailsZ * first_hops, LDKInFlightHtlcs inflight_htlcs) {
+       LDKRouter_JCalls *j_calls = (LDKRouter_JCalls*) this_arg;
+       int8_tArray payer_arr = init_int8_tArray(33, __LINE__);
+       memcpy(payer_arr->elems, payer.compressed_form, 33);
+       LDKRouteParameters route_params_var = *route_params;
+       int64_t route_params_ref = 0;
+       route_params_var = RouteParameters_clone(&route_params_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_var);
+       route_params_ref = tag_ptr(route_params_var.inner, route_params_var.is_owned);
+       LDKCVec_ChannelDetailsZ *first_hops_var_ptr = first_hops;
+       int64_tArray first_hops_arr = NULL;
+       if (first_hops != NULL) {
+               LDKCVec_ChannelDetailsZ first_hops_var = *first_hops_var_ptr;
+               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;
+               }
+       
+       }
+       LDKInFlightHtlcs inflight_htlcs_var = inflight_htlcs;
+       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);
+       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_RouteLightningErrorZ find_route_with_id_LDKRouter_jcall(const void* this_arg, LDKPublicKey payer, const LDKRouteParameters * route_params, LDKCVec_ChannelDetailsZ * first_hops, LDKInFlightHtlcs inflight_htlcs, LDKThirtyTwoBytes _payment_hash, LDKThirtyTwoBytes _payment_id) {
+       LDKRouter_JCalls *j_calls = (LDKRouter_JCalls*) this_arg;
+       int8_tArray payer_arr = init_int8_tArray(33, __LINE__);
+       memcpy(payer_arr->elems, payer.compressed_form, 33);
+       LDKRouteParameters route_params_var = *route_params;
+       int64_t route_params_ref = 0;
+       route_params_var = RouteParameters_clone(&route_params_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_var);
+       route_params_ref = tag_ptr(route_params_var.inner, route_params_var.is_owned);
+       LDKCVec_ChannelDetailsZ *first_hops_var_ptr = first_hops;
+       int64_tArray first_hops_arr = NULL;
+       if (first_hops != NULL) {
+               LDKCVec_ChannelDetailsZ first_hops_var = *first_hops_var_ptr;
+               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;
+               }
+       
+       }
+       LDKInFlightHtlcs inflight_htlcs_var = inflight_htlcs;
+       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);
+       int8_tArray _payment_hash_arr = init_int8_tArray(32, __LINE__);
+       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);
+       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;
+}
+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);
+}
+static inline LDKRouter LDKRouter_init (int64_t o) {
+       LDKRouter_JCalls *calls = MALLOC(sizeof(LDKRouter_JCalls), "LDKRouter_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKRouter ret = {
+               .this_arg = (void*) calls,
+               .find_route = find_route_LDKRouter_jcall,
+               .find_route_with_id = find_route_with_id_LDKRouter_jcall,
+               .free = LDKRouter_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKRouter_new(int32_t o) {
+       LDKRouter *res_ptr = MALLOC(sizeof(LDKRouter), "LDKRouter");
+       *res_ptr = LDKRouter_init(o);
+       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) {
+       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 payer_ref;
+       CHECK(payer->arr_len == 33);
+       memcpy(payer_ref.compressed_form, payer->elems, 33); FREE(payer);
+       LDKRouteParameters route_params_conv;
+       route_params_conv.inner = untag_ptr(route_params);
+       route_params_conv.is_owned = ptr_is_owned(route_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_conv);
+       route_params_conv.is_owned = false;
+       LDKCVec_ChannelDetailsZ first_hops_constr;
+       LDKCVec_ChannelDetailsZ *first_hops_ptr = NULL;
+       if (first_hops != NULL) {
+               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.is_owned = false;
+                       first_hops_constr.data[q] = first_hops_conv_16_conv;
+               }
+               FREE(first_hops);
+               first_hops_ptr = &first_hops_constr;
+       }
+       LDKInFlightHtlcs inflight_htlcs_conv;
+       inflight_htlcs_conv.inner = untag_ptr(inflight_htlcs);
+       inflight_htlcs_conv.is_owned = ptr_is_owned(inflight_htlcs);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(inflight_htlcs_conv);
+       inflight_htlcs_conv = InFlightHtlcs_clone(&inflight_htlcs_conv);
+       LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
+       *ret_conv = (this_arg_conv->find_route)(this_arg_conv->this_arg, payer_ref, &route_params_conv, first_hops_ptr, inflight_htlcs_conv);
+       if (first_hops_ptr != NULL) { FREE(first_hops_constr.data); }
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Router_find_route_with_id(int64_t this_arg, int8_tArray payer, int64_t route_params, int64_tArray first_hops, int64_t inflight_htlcs, int8_tArray _payment_hash, int8_tArray _payment_id) {
+       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 payer_ref;
+       CHECK(payer->arr_len == 33);
+       memcpy(payer_ref.compressed_form, payer->elems, 33); FREE(payer);
+       LDKRouteParameters route_params_conv;
+       route_params_conv.inner = untag_ptr(route_params);
+       route_params_conv.is_owned = ptr_is_owned(route_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_conv);
+       route_params_conv.is_owned = false;
+       LDKCVec_ChannelDetailsZ first_hops_constr;
+       LDKCVec_ChannelDetailsZ *first_hops_ptr = NULL;
+       if (first_hops != NULL) {
+               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.is_owned = false;
+                       first_hops_constr.data[q] = first_hops_conv_16_conv;
+               }
+               FREE(first_hops);
+               first_hops_ptr = &first_hops_constr;
+       }
+       LDKInFlightHtlcs inflight_htlcs_conv;
+       inflight_htlcs_conv.inner = untag_ptr(inflight_htlcs);
+       inflight_htlcs_conv.is_owned = ptr_is_owned(inflight_htlcs);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(inflight_htlcs_conv);
+       inflight_htlcs_conv = InFlightHtlcs_clone(&inflight_htlcs_conv);
+       LDKThirtyTwoBytes _payment_hash_ref;
+       CHECK(_payment_hash->arr_len == 32);
+       memcpy(_payment_hash_ref.data, _payment_hash->elems, 32); FREE(_payment_hash);
+       LDKThirtyTwoBytes _payment_id_ref;
+       CHECK(_payment_id->arr_len == 32);
+       memcpy(_payment_id_ref.data, _payment_id->elems, 32); FREE(_payment_id);
+       LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
+       *ret_conv = (this_arg_conv->find_route_with_id)(this_arg_conv->this_arg, payer_ref, &route_params_conv, first_hops_ptr, inflight_htlcs_conv, _payment_hash_ref, _payment_id_ref);
+       if (first_hops_ptr != NULL) { FREE(first_hops_constr.data); }
+       return tag_ptr(ret_conv, true);
+}
+
+static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesChannelManagerZ_get_a(LDKC2Tuple_ThirtyTwoBytesChannelManagerZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->a);
+}
+int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_get_a(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesChannelManagerZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesChannelManagerZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesChannelManagerZ_get_a(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKChannelManager C2Tuple_ThirtyTwoBytesChannelManagerZ_get_b(LDKC2Tuple_ThirtyTwoBytesChannelManagerZ *NONNULL_PTR owner){
+       LDKChannelManager ret = owner->b;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_get_b(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesChannelManagerZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesChannelManagerZ*)untag_ptr(owner);
+       LDKChannelManager ret_var = C2Tuple_ThirtyTwoBytesChannelManagerZ_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 LDKC2Tuple_ThirtyTwoBytesChannelManagerZ *CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_ok(LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return &*owner->contents.result;
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ*)untag_ptr(owner);
+       int64_t ret_ret = tag_ptr(CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_ok(owner_conv), false);
+       return ret_ret;
+}
+
+static inline struct LDKDecodeError CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_err(LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKMaxDustHTLCExposure_ty_from_ptr(int64_t ptr) {
+       LDKMaxDustHTLCExposure *obj = (LDKMaxDustHTLCExposure*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKMaxDustHTLCExposure_FixedLimitMsat: return 0;
+               case LDKMaxDustHTLCExposure_FeeRateMultiplier: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKMaxDustHTLCExposure_FixedLimitMsat_get_fixed_limit_msat(int64_t ptr) {
+       LDKMaxDustHTLCExposure *obj = (LDKMaxDustHTLCExposure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMaxDustHTLCExposure_FixedLimitMsat);
+       int64_t fixed_limit_msat_conv = obj->fixed_limit_msat;
+       return fixed_limit_msat_conv;
+}
+int64_t CS_LDK_LDKMaxDustHTLCExposure_FeeRateMultiplier_get_fee_rate_multiplier(int64_t ptr) {
+       LDKMaxDustHTLCExposure *obj = (LDKMaxDustHTLCExposure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMaxDustHTLCExposure_FeeRateMultiplier);
+       int64_t fee_rate_multiplier_conv = obj->fee_rate_multiplier;
+       return fee_rate_multiplier_conv;
+}
+static inline struct LDKMaxDustHTLCExposure CResult_MaxDustHTLCExposureDecodeErrorZ_get_ok(LDKCResult_MaxDustHTLCExposureDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return MaxDustHTLCExposure_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* owner_conv = (LDKCResult_MaxDustHTLCExposureDecodeErrorZ*)untag_ptr(owner);
+       LDKMaxDustHTLCExposure *ret_copy = MALLOC(sizeof(LDKMaxDustHTLCExposure), "LDKMaxDustHTLCExposure");
+       *ret_copy = CResult_MaxDustHTLCExposureDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_MaxDustHTLCExposureDecodeErrorZ_get_err(LDKCResult_MaxDustHTLCExposureDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* owner_conv = (LDKCResult_MaxDustHTLCExposureDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_MaxDustHTLCExposureDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelConfig CResult_ChannelConfigDecodeErrorZ_get_ok(LDKCResult_ChannelConfigDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelConfig ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelConfigDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelConfigDecodeErrorZ* owner_conv = (LDKCResult_ChannelConfigDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelConfig ret_var = CResult_ChannelConfigDecodeErrorZ_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_ChannelConfigDecodeErrorZ_get_err(LDKCResult_ChannelConfigDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelConfigDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelConfigDecodeErrorZ* owner_conv = (LDKCResult_ChannelConfigDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelConfigDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKCOption_MaxDustHTLCExposureZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_MaxDustHTLCExposureZ *obj = (LDKCOption_MaxDustHTLCExposureZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_MaxDustHTLCExposureZ_Some: return 0;
+               case LDKCOption_MaxDustHTLCExposureZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_MaxDustHTLCExposureZ_Some_get_some(int64_t ptr) {
+       LDKCOption_MaxDustHTLCExposureZ *obj = (LDKCOption_MaxDustHTLCExposureZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_MaxDustHTLCExposureZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+uint32_t CS_LDK_LDKCOption_APIErrorZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_APIErrorZ *obj = (LDKCOption_APIErrorZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_APIErrorZ_Some: return 0;
+               case LDKCOption_APIErrorZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_APIErrorZ_Some_get_some(int64_t ptr) {
+       LDKCOption_APIErrorZ *obj = (LDKCOption_APIErrorZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_APIErrorZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+static inline struct LDKCOption_APIErrorZ CResult_COption_APIErrorZDecodeErrorZ_get_ok(LDKCResult_COption_APIErrorZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_APIErrorZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_APIErrorZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_APIErrorZDecodeErrorZ* owner_conv = (LDKCResult_COption_APIErrorZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_APIErrorZ *ret_copy = MALLOC(sizeof(LDKCOption_APIErrorZ), "LDKCOption_APIErrorZ");
+       *ret_copy = CResult_COption_APIErrorZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_APIErrorZDecodeErrorZ_get_err(LDKCResult_COption_APIErrorZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_APIErrorZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_APIErrorZDecodeErrorZ* owner_conv = (LDKCResult_COption_APIErrorZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_APIErrorZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelMonitorUpdate CResult_ChannelMonitorUpdateDecodeErrorZ_get_ok(LDKCResult_ChannelMonitorUpdateDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelMonitorUpdate ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* owner_conv = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelMonitorUpdate ret_var = CResult_ChannelMonitorUpdateDecodeErrorZ_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_ChannelMonitorUpdateDecodeErrorZ_get_err(LDKCResult_ChannelMonitorUpdateDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* owner_conv = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelMonitorUpdateDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKCOption_MonitorEventZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_MonitorEventZ *obj = (LDKCOption_MonitorEventZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_MonitorEventZ_Some: return 0;
+               case LDKCOption_MonitorEventZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_MonitorEventZ_Some_get_some(int64_t ptr) {
+       LDKCOption_MonitorEventZ *obj = (LDKCOption_MonitorEventZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_MonitorEventZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+static inline struct LDKCOption_MonitorEventZ CResult_COption_MonitorEventZDecodeErrorZ_get_ok(LDKCResult_COption_MonitorEventZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_MonitorEventZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_MonitorEventZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* owner_conv = (LDKCResult_COption_MonitorEventZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_MonitorEventZ *ret_copy = MALLOC(sizeof(LDKCOption_MonitorEventZ), "LDKCOption_MonitorEventZ");
+       *ret_copy = CResult_COption_MonitorEventZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_MonitorEventZDecodeErrorZ_get_err(LDKCResult_COption_MonitorEventZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_MonitorEventZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* owner_conv = (LDKCResult_COption_MonitorEventZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_MonitorEventZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKHTLCUpdate CResult_HTLCUpdateDecodeErrorZ_get_ok(LDKCResult_HTLCUpdateDecodeErrorZ *NONNULL_PTR owner){
+       LDKHTLCUpdate ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_HTLCUpdateDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_HTLCUpdateDecodeErrorZ* owner_conv = (LDKCResult_HTLCUpdateDecodeErrorZ*)untag_ptr(owner);
+       LDKHTLCUpdate ret_var = CResult_HTLCUpdateDecodeErrorZ_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_HTLCUpdateDecodeErrorZ_get_err(LDKCResult_HTLCUpdateDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_HTLCUpdateDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_HTLCUpdateDecodeErrorZ* owner_conv = (LDKCResult_HTLCUpdateDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_HTLCUpdateDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKOutPoint C2Tuple_OutPointCVec_u8ZZ_get_a(LDKC2Tuple_OutPointCVec_u8ZZ *NONNULL_PTR owner){
+       LDKOutPoint ret = owner->a;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C2Tuple_OutPointCVec_u8ZZ_get_a(int64_t owner) {
+       LDKC2Tuple_OutPointCVec_u8ZZ* owner_conv = (LDKC2Tuple_OutPointCVec_u8ZZ*)untag_ptr(owner);
+       LDKOutPoint ret_var = C2Tuple_OutPointCVec_u8ZZ_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 LDKCVec_u8Z C2Tuple_OutPointCVec_u8ZZ_get_b(LDKC2Tuple_OutPointCVec_u8ZZ *NONNULL_PTR owner){
+       return CVec_u8Z_clone(&owner->b);
+}
+int8_tArray  CS_LDK_C2Tuple_OutPointCVec_u8ZZ_get_b(int64_t owner) {
+       LDKC2Tuple_OutPointCVec_u8ZZ* owner_conv = (LDKC2Tuple_OutPointCVec_u8ZZ*)untag_ptr(owner);
+       LDKCVec_u8Z ret_var = C2Tuple_OutPointCVec_u8ZZ_get_b(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 uint32_t C2Tuple_u32CVec_u8ZZ_get_a(LDKC2Tuple_u32CVec_u8ZZ *NONNULL_PTR owner){
+       return owner->a;
+}
+int32_t  CS_LDK_C2Tuple_u32CVec_u8ZZ_get_a(int64_t owner) {
+       LDKC2Tuple_u32CVec_u8ZZ* owner_conv = (LDKC2Tuple_u32CVec_u8ZZ*)untag_ptr(owner);
+       int32_t ret_conv = C2Tuple_u32CVec_u8ZZ_get_a(owner_conv);
+       return ret_conv;
+}
+
+static inline struct LDKCVec_u8Z C2Tuple_u32CVec_u8ZZ_get_b(LDKC2Tuple_u32CVec_u8ZZ *NONNULL_PTR owner){
+       return CVec_u8Z_clone(&owner->b);
+}
+int8_tArray  CS_LDK_C2Tuple_u32CVec_u8ZZ_get_b(int64_t owner) {
+       LDKC2Tuple_u32CVec_u8ZZ* owner_conv = (LDKC2Tuple_u32CVec_u8ZZ*)untag_ptr(owner);
+       LDKCVec_u8Z ret_var = C2Tuple_u32CVec_u8ZZ_get_b(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 LDKCVec_C2Tuple_u32CVec_u8ZZZ CVec_C2Tuple_u32CVec_u8ZZZ_clone(const LDKCVec_C2Tuple_u32CVec_u8ZZZ *orig) {
+       LDKCVec_C2Tuple_u32CVec_u8ZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_u32CVec_u8ZZ) * orig->datalen, "LDKCVec_C2Tuple_u32CVec_u8ZZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_u32CVec_u8ZZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_a(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->a);
+}
+int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_a(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_a(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKCVec_C2Tuple_u32CVec_u8ZZZ C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_b(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ *NONNULL_PTR owner){
+       return CVec_C2Tuple_u32CVec_u8ZZZ_clone(&owner->b);
+}
+int64_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_b(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ*)untag_ptr(owner);
+       LDKCVec_C2Tuple_u32CVec_u8ZZZ ret_var = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_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 x = 0; x < ret_var.datalen; x++) {
+               LDKC2Tuple_u32CVec_u8ZZ* ret_conv_23_conv = MALLOC(sizeof(LDKC2Tuple_u32CVec_u8ZZ), "LDKC2Tuple_u32CVec_u8ZZ");
+               *ret_conv_23_conv = ret_var.data[x];
+               ret_arr_ptr[x] = tag_ptr(ret_conv_23_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+static inline LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ_clone(const LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ *orig) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ) * orig->datalen, "LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_CommitmentTransactionZ CVec_CommitmentTransactionZ_clone(const LDKCVec_CommitmentTransactionZ *orig) {
+       LDKCVec_CommitmentTransactionZ ret = { .data = MALLOC(sizeof(LDKCommitmentTransaction) * orig->datalen, "LDKCVec_CommitmentTransactionZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = CommitmentTransaction_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline uint32_t C2Tuple_u32TxOutZ_get_a(LDKC2Tuple_u32TxOutZ *NONNULL_PTR owner){
+       return owner->a;
+}
+int32_t  CS_LDK_C2Tuple_u32TxOutZ_get_a(int64_t owner) {
+       LDKC2Tuple_u32TxOutZ* owner_conv = (LDKC2Tuple_u32TxOutZ*)untag_ptr(owner);
+       int32_t ret_conv = C2Tuple_u32TxOutZ_get_a(owner_conv);
+       return ret_conv;
+}
+
+static inline struct LDKTxOut C2Tuple_u32TxOutZ_get_b(LDKC2Tuple_u32TxOutZ *NONNULL_PTR owner){
+       return TxOut_clone(&owner->b);
+}
+int64_t  CS_LDK_C2Tuple_u32TxOutZ_get_b(int64_t owner) {
+       LDKC2Tuple_u32TxOutZ* owner_conv = (LDKC2Tuple_u32TxOutZ*)untag_ptr(owner);
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = C2Tuple_u32TxOutZ_get_b(owner_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+static inline LDKCVec_C2Tuple_u32TxOutZZ CVec_C2Tuple_u32TxOutZZ_clone(const LDKCVec_C2Tuple_u32TxOutZZ *orig) {
+       LDKCVec_C2Tuple_u32TxOutZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_u32TxOutZ) * orig->datalen, "LDKCVec_C2Tuple_u32TxOutZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_u32TxOutZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_a(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->a);
+}
+int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_a(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_a(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKCVec_C2Tuple_u32TxOutZZ C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_b(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ *NONNULL_PTR owner){
+       return CVec_C2Tuple_u32TxOutZZ_clone(&owner->b);
+}
+int64_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_b(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ*)untag_ptr(owner);
+       LDKCVec_C2Tuple_u32TxOutZZ ret_var = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_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 u = 0; u < ret_var.datalen; u++) {
+               LDKC2Tuple_u32TxOutZ* ret_conv_20_conv = MALLOC(sizeof(LDKC2Tuple_u32TxOutZ), "LDKC2Tuple_u32TxOutZ");
+               *ret_conv_20_conv = ret_var.data[u];
+               ret_arr_ptr[u] = tag_ptr(ret_conv_20_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+static inline LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ_clone(const LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ *orig) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ) * orig->datalen, "LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKBalance_ty_from_ptr(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKBalance_ClaimableOnChannelClose: return 0;
+               case LDKBalance_ClaimableAwaitingConfirmations: return 1;
+               case LDKBalance_ContentiousClaimable: return 2;
+               case LDKBalance_MaybeTimeoutClaimableHTLC: return 3;
+               case LDKBalance_MaybePreimageClaimableHTLC: return 4;
+               case LDKBalance_CounterpartyRevokedOutputClaimable: return 5;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKBalance_ClaimableOnChannelClose_get_amount_satoshis(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_ClaimableOnChannelClose);
+       int64_t amount_satoshis_conv = obj->claimable_on_channel_close.amount_satoshis;
+       return amount_satoshis_conv;
+}
+int64_t CS_LDK_LDKBalance_ClaimableAwaitingConfirmations_get_amount_satoshis(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_ClaimableAwaitingConfirmations);
+       int64_t amount_satoshis_conv = obj->claimable_awaiting_confirmations.amount_satoshis;
+       return amount_satoshis_conv;
+}
+int32_t CS_LDK_LDKBalance_ClaimableAwaitingConfirmations_get_confirmation_height(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_ClaimableAwaitingConfirmations);
+       int32_t confirmation_height_conv = obj->claimable_awaiting_confirmations.confirmation_height;
+       return confirmation_height_conv;
+}
+int64_t CS_LDK_LDKBalance_ContentiousClaimable_get_amount_satoshis(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_ContentiousClaimable);
+       int64_t amount_satoshis_conv = obj->contentious_claimable.amount_satoshis;
+       return amount_satoshis_conv;
+}
+int32_t CS_LDK_LDKBalance_ContentiousClaimable_get_timeout_height(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_ContentiousClaimable);
+       int32_t timeout_height_conv = obj->contentious_claimable.timeout_height;
+       return timeout_height_conv;
+}
+int8_tArray CS_LDK_LDKBalance_ContentiousClaimable_get_payment_hash(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_ContentiousClaimable);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->contentious_claimable.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int8_tArray CS_LDK_LDKBalance_ContentiousClaimable_get_payment_preimage(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_ContentiousClaimable);
+       int8_tArray payment_preimage_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_preimage_arr->elems, obj->contentious_claimable.payment_preimage.data, 32);
+       return payment_preimage_arr;
+}
+int64_t CS_LDK_LDKBalance_MaybeTimeoutClaimableHTLC_get_amount_satoshis(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_MaybeTimeoutClaimableHTLC);
+       int64_t amount_satoshis_conv = obj->maybe_timeout_claimable_htlc.amount_satoshis;
+       return amount_satoshis_conv;
+}
+int32_t CS_LDK_LDKBalance_MaybeTimeoutClaimableHTLC_get_claimable_height(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_MaybeTimeoutClaimableHTLC);
+       int32_t claimable_height_conv = obj->maybe_timeout_claimable_htlc.claimable_height;
+       return claimable_height_conv;
+}
+int8_tArray CS_LDK_LDKBalance_MaybeTimeoutClaimableHTLC_get_payment_hash(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_MaybeTimeoutClaimableHTLC);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->maybe_timeout_claimable_htlc.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKBalance_MaybePreimageClaimableHTLC_get_amount_satoshis(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_MaybePreimageClaimableHTLC);
+       int64_t amount_satoshis_conv = obj->maybe_preimage_claimable_htlc.amount_satoshis;
+       return amount_satoshis_conv;
+}
+int32_t CS_LDK_LDKBalance_MaybePreimageClaimableHTLC_get_expiry_height(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_MaybePreimageClaimableHTLC);
+       int32_t expiry_height_conv = obj->maybe_preimage_claimable_htlc.expiry_height;
+       return expiry_height_conv;
+}
+int8_tArray CS_LDK_LDKBalance_MaybePreimageClaimableHTLC_get_payment_hash(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_MaybePreimageClaimableHTLC);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->maybe_preimage_claimable_htlc.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKBalance_CounterpartyRevokedOutputClaimable_get_amount_satoshis(int64_t ptr) {
+       LDKBalance *obj = (LDKBalance*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBalance_CounterpartyRevokedOutputClaimable);
+       int64_t amount_satoshis_conv = obj->counterparty_revoked_output_claimable.amount_satoshis;
+       return amount_satoshis_conv;
+}
+static inline LDKCVec_BalanceZ CVec_BalanceZ_clone(const LDKCVec_BalanceZ *orig) {
+       LDKCVec_BalanceZ ret = { .data = MALLOC(sizeof(LDKBalance) * orig->datalen, "LDKCVec_BalanceZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = Balance_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_a(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->a);
+}
+int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_a(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_a(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKChannelMonitor C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_b(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ *NONNULL_PTR owner){
+       LDKChannelMonitor ret = owner->b;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_b(int64_t owner) {
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)untag_ptr(owner);
+       LDKChannelMonitor ret_var = C2Tuple_ThirtyTwoBytesChannelMonitorZ_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 LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_ok(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ*)untag_ptr(owner);
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ), "LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_ok(owner_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline struct LDKDecodeError CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_err(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+typedef struct LDKType_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKType_JCalls;
+static void LDKType_JCalls_free(void* this_arg) {
+       LDKType_JCalls *j_calls = (LDKType_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+}
+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);
+       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);
+       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;
+}
+static void LDKType_JCalls_cloned(LDKType* new_obj) {
+       LDKType_JCalls *j_calls = (LDKType_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKType LDKType_init (int64_t o) {
+       LDKType_JCalls *calls = MALLOC(sizeof(LDKType_JCalls), "LDKType_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKType ret = {
+               .this_arg = (void*) calls,
+               .type_id = type_id_LDKType_jcall,
+               .debug_str = debug_str_LDKType_jcall,
+               .write = write_LDKType_jcall,
+               .cloned = LDKType_JCalls_cloned,
+               .free = LDKType_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKType_new(int32_t o) {
+       LDKType *res_ptr = MALLOC(sizeof(LDKType), "LDKType");
+       *res_ptr = LDKType_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int16_t  CS_LDK_Type_type_id(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKType* this_arg_conv = (LDKType*)this_arg_ptr;
+       int16_t ret_conv = (this_arg_conv->type_id)(this_arg_conv->this_arg);
+       return ret_conv;
+}
+
+jstring  CS_LDK_Type_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); }
+       LDKType* this_arg_conv = (LDKType*)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;
+}
+
+int8_tArray  CS_LDK_Type_write(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKType* this_arg_conv = (LDKType*)this_arg_ptr;
+       LDKCVec_u8Z ret_var = (this_arg_conv->write)(this_arg_conv->this_arg);
+       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 struct LDKPublicKey C2Tuple_PublicKeyTypeZ_get_a(LDKC2Tuple_PublicKeyTypeZ *NONNULL_PTR owner){
+       return owner->a;
+}
+int8_tArray  CS_LDK_C2Tuple_PublicKeyTypeZ_get_a(int64_t owner) {
+       LDKC2Tuple_PublicKeyTypeZ* owner_conv = (LDKC2Tuple_PublicKeyTypeZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_PublicKeyTypeZ_get_a(owner_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+static inline struct LDKType C2Tuple_PublicKeyTypeZ_get_b(LDKC2Tuple_PublicKeyTypeZ *NONNULL_PTR owner){
+       return Type_clone(&owner->b);
+}
+int64_t  CS_LDK_C2Tuple_PublicKeyTypeZ_get_b(int64_t owner) {
+       LDKC2Tuple_PublicKeyTypeZ* owner_conv = (LDKC2Tuple_PublicKeyTypeZ*)untag_ptr(owner);
+       LDKType* ret_ret = MALLOC(sizeof(LDKType), "LDKType");
+       *ret_ret = C2Tuple_PublicKeyTypeZ_get_b(owner_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+static inline LDKCVec_C2Tuple_PublicKeyTypeZZ CVec_C2Tuple_PublicKeyTypeZZ_clone(const LDKCVec_C2Tuple_PublicKeyTypeZZ *orig) {
+       LDKCVec_C2Tuple_PublicKeyTypeZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_PublicKeyTypeZ) * orig->datalen, "LDKCVec_C2Tuple_PublicKeyTypeZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_PublicKeyTypeZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+typedef struct LDKOnionMessageContents_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKOnionMessageContents_JCalls;
+static void LDKOnionMessageContents_JCalls_free(void* this_arg) {
+       LDKOnionMessageContents_JCalls *j_calls = (LDKOnionMessageContents_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+}
+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);
+       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;
+}
+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);
+}
+static inline LDKOnionMessageContents LDKOnionMessageContents_init (int64_t o) {
+       LDKOnionMessageContents_JCalls *calls = MALLOC(sizeof(LDKOnionMessageContents_JCalls), "LDKOnionMessageContents_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKOnionMessageContents ret = {
+               .this_arg = (void*) calls,
+               .tlv_type = tlv_type_LDKOnionMessageContents_jcall,
+               .write = write_LDKOnionMessageContents_jcall,
+               .cloned = LDKOnionMessageContents_JCalls_cloned,
+               .free = LDKOnionMessageContents_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKOnionMessageContents_new(int32_t o) {
+       LDKOnionMessageContents *res_ptr = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
+       *res_ptr = LDKOnionMessageContents_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_OnionMessageContents_tlv_type(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;
+       int64_t ret_conv = (this_arg_conv->tlv_type)(this_arg_conv->this_arg);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_OnionMessageContents_write(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;
+       LDKCVec_u8Z ret_var = (this_arg_conv->write)(this_arg_conv->this_arg);
+       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;
+}
+
+uint32_t CS_LDK_LDKCOption_OnionMessageContentsZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_OnionMessageContentsZ *obj = (LDKCOption_OnionMessageContentsZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_OnionMessageContentsZ_Some: return 0;
+               case LDKCOption_OnionMessageContentsZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_OnionMessageContentsZ_Some_get_some(int64_t ptr) {
+       LDKCOption_OnionMessageContentsZ *obj = (LDKCOption_OnionMessageContentsZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_OnionMessageContentsZ_Some);
+       LDKOnionMessageContents* some_ret = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
+       *some_ret = OnionMessageContents_clone(&obj->some);
+       return tag_ptr(some_ret, true);
+}
+static inline struct LDKCOption_OnionMessageContentsZ CResult_COption_OnionMessageContentsZDecodeErrorZ_get_ok(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_OnionMessageContentsZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* owner_conv = (LDKCResult_COption_OnionMessageContentsZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_OnionMessageContentsZ *ret_copy = MALLOC(sizeof(LDKCOption_OnionMessageContentsZ), "LDKCOption_OnionMessageContentsZ");
+       *ret_copy = CResult_COption_OnionMessageContentsZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_OnionMessageContentsZDecodeErrorZ_get_err(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* owner_conv = (LDKCResult_COption_OnionMessageContentsZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_OnionMessageContentsZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKOnionMessageContents C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_a(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ *NONNULL_PTR owner){
+       return OnionMessageContents_clone(&owner->a);
+}
+int64_t  CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_a(int64_t owner) {
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* owner_conv = (LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ*)untag_ptr(owner);
+       LDKOnionMessageContents* ret_ret = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
+       *ret_ret = C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_a(owner_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+static inline struct LDKDestination C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_b(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ *NONNULL_PTR owner){
+       return Destination_clone(&owner->b);
+}
+int64_t  CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_b(int64_t owner) {
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* owner_conv = (LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ*)untag_ptr(owner);
+       LDKDestination *ret_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
+       *ret_copy = C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_b(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBlindedPath C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_c(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ *NONNULL_PTR owner){
+       LDKBlindedPath ret = owner->c;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_c(int64_t owner) {
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* owner_conv = (LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ*)untag_ptr(owner);
+       LDKBlindedPath ret_var = C3Tuple_OnionMessageContentsDestinationBlindedPathZ_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;
+}
+
+static inline LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ CVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ_clone(const LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ *orig) {
+       LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ ret = { .data = MALLOC(sizeof(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ) * orig->datalen, "LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKCOption_TypeZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_TypeZ *obj = (LDKCOption_TypeZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_TypeZ_Some: return 0;
+               case LDKCOption_TypeZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_TypeZ_Some_get_some(int64_t ptr) {
+       LDKCOption_TypeZ *obj = (LDKCOption_TypeZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_TypeZ_Some);
+       LDKType* some_ret = MALLOC(sizeof(LDKType), "LDKType");
+       *some_ret = Type_clone(&obj->some);
+       return tag_ptr(some_ret, true);
+}
+static inline struct LDKCOption_TypeZ CResult_COption_TypeZDecodeErrorZ_get_ok(LDKCResult_COption_TypeZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_TypeZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_TypeZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_TypeZDecodeErrorZ* owner_conv = (LDKCResult_COption_TypeZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_TypeZ *ret_copy = MALLOC(sizeof(LDKCOption_TypeZ), "LDKCOption_TypeZ");
+       *ret_copy = CResult_COption_TypeZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_TypeZDecodeErrorZ_get_err(LDKCResult_COption_TypeZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_TypeZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_TypeZDecodeErrorZ* owner_conv = (LDKCResult_COption_TypeZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_TypeZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKCOption_SocketAddressZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_SocketAddressZ *obj = (LDKCOption_SocketAddressZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_SocketAddressZ_Some: return 0;
+               case LDKCOption_SocketAddressZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_SocketAddressZ_Some_get_some(int64_t ptr) {
+       LDKCOption_SocketAddressZ *obj = (LDKCOption_SocketAddressZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_SocketAddressZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+static inline struct LDKPublicKey C2Tuple_PublicKeyCOption_SocketAddressZZ_get_a(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ *NONNULL_PTR owner){
+       return owner->a;
+}
+int8_tArray  CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_get_a(int64_t owner) {
+       LDKC2Tuple_PublicKeyCOption_SocketAddressZZ* owner_conv = (LDKC2Tuple_PublicKeyCOption_SocketAddressZZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_PublicKeyCOption_SocketAddressZZ_get_a(owner_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+static inline struct LDKCOption_SocketAddressZ C2Tuple_PublicKeyCOption_SocketAddressZZ_get_b(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ *NONNULL_PTR owner){
+       return COption_SocketAddressZ_clone(&owner->b);
+}
+int64_t  CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_get_b(int64_t owner) {
+       LDKC2Tuple_PublicKeyCOption_SocketAddressZZ* owner_conv = (LDKC2Tuple_PublicKeyCOption_SocketAddressZZ*)untag_ptr(owner);
+       LDKCOption_SocketAddressZ *ret_copy = MALLOC(sizeof(LDKCOption_SocketAddressZ), "LDKCOption_SocketAddressZ");
+       *ret_copy = C2Tuple_PublicKeyCOption_SocketAddressZZ_get_b(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ CVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ_clone(const LDKCVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ *orig) {
+       LDKCVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ) * orig->datalen, "LDKCVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_PublicKeyCOption_SocketAddressZZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKCVec_u8Z CResult_CVec_u8ZPeerHandleErrorZ_get_ok(LDKCResult_CVec_u8ZPeerHandleErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return CVec_u8Z_clone(&*owner->contents.result);
+}
+int8_tArray  CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* owner_conv = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)untag_ptr(owner);
+       LDKCVec_u8Z ret_var = CResult_CVec_u8ZPeerHandleErrorZ_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);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+static inline struct LDKPeerHandleError CResult_CVec_u8ZPeerHandleErrorZ_get_err(LDKCResult_CVec_u8ZPeerHandleErrorZ *NONNULL_PTR owner){
+       LDKPeerHandleError ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_get_err(int64_t owner) {
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* owner_conv = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)untag_ptr(owner);
+       LDKPeerHandleError ret_var = CResult_CVec_u8ZPeerHandleErrorZ_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 void CResult_NonePeerHandleErrorZ_get_ok(LDKCResult_NonePeerHandleErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NonePeerHandleErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NonePeerHandleErrorZ* owner_conv = (LDKCResult_NonePeerHandleErrorZ*)untag_ptr(owner);
+       CResult_NonePeerHandleErrorZ_get_ok(owner_conv);
+}
+
+static inline struct LDKPeerHandleError CResult_NonePeerHandleErrorZ_get_err(LDKCResult_NonePeerHandleErrorZ *NONNULL_PTR owner){
+       LDKPeerHandleError ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NonePeerHandleErrorZ_get_err(int64_t owner) {
+       LDKCResult_NonePeerHandleErrorZ* owner_conv = (LDKCResult_NonePeerHandleErrorZ*)untag_ptr(owner);
+       LDKPeerHandleError ret_var = CResult_NonePeerHandleErrorZ_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 bool CResult_boolPeerHandleErrorZ_get_ok(LDKCResult_boolPeerHandleErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+jboolean  CS_LDK_CResult_boolPeerHandleErrorZ_get_ok(int64_t owner) {
+       LDKCResult_boolPeerHandleErrorZ* owner_conv = (LDKCResult_boolPeerHandleErrorZ*)untag_ptr(owner);
+       jboolean ret_conv = CResult_boolPeerHandleErrorZ_get_ok(owner_conv);
+       return ret_conv;
+}
+
+static inline struct LDKPeerHandleError CResult_boolPeerHandleErrorZ_get_err(LDKCResult_boolPeerHandleErrorZ *NONNULL_PTR owner){
+       LDKPeerHandleError ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_boolPeerHandleErrorZ_get_err(int64_t owner) {
+       LDKCResult_boolPeerHandleErrorZ* owner_conv = (LDKCResult_boolPeerHandleErrorZ*)untag_ptr(owner);
+       LDKPeerHandleError ret_var = CResult_boolPeerHandleErrorZ_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;
+}
+
+uint32_t CS_LDK_LDKGraphSyncError_ty_from_ptr(int64_t ptr) {
+       LDKGraphSyncError *obj = (LDKGraphSyncError*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKGraphSyncError_DecodeError: return 0;
+               case LDKGraphSyncError_LightningError: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKGraphSyncError_DecodeError_get_decode_error(int64_t ptr) {
+       LDKGraphSyncError *obj = (LDKGraphSyncError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKGraphSyncError_DecodeError);
+       int64_t decode_error_ref = tag_ptr(&obj->decode_error, false);
+       return decode_error_ref;
+}
+int64_t CS_LDK_LDKGraphSyncError_LightningError_get_lightning_error(int64_t ptr) {
+       LDKGraphSyncError *obj = (LDKGraphSyncError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKGraphSyncError_LightningError);
+       LDKLightningError lightning_error_var = obj->lightning_error;
+                       int64_t lightning_error_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(lightning_error_var);
+                       lightning_error_ref = tag_ptr(lightning_error_var.inner, false);
+       return lightning_error_ref;
+}
+static inline uint32_t CResult_u32GraphSyncErrorZ_get_ok(LDKCResult_u32GraphSyncErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+int32_t  CS_LDK_CResult_u32GraphSyncErrorZ_get_ok(int64_t owner) {
+       LDKCResult_u32GraphSyncErrorZ* owner_conv = (LDKCResult_u32GraphSyncErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = CResult_u32GraphSyncErrorZ_get_ok(owner_conv);
+       return ret_conv;
+}
+
+static inline struct LDKGraphSyncError CResult_u32GraphSyncErrorZ_get_err(LDKCResult_u32GraphSyncErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return GraphSyncError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_u32GraphSyncErrorZ_get_err(int64_t owner) {
+       LDKCResult_u32GraphSyncErrorZ* owner_conv = (LDKCResult_u32GraphSyncErrorZ*)untag_ptr(owner);
+       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
+       *ret_copy = CResult_u32GraphSyncErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKCVec_u8Z CResult_CVec_u8ZIOErrorZ_get_ok(LDKCResult_CVec_u8ZIOErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return CVec_u8Z_clone(&*owner->contents.result);
+}
+int8_tArray  CS_LDK_CResult_CVec_u8ZIOErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_u8ZIOErrorZ* owner_conv = (LDKCResult_CVec_u8ZIOErrorZ*)untag_ptr(owner);
+       LDKCVec_u8Z ret_var = CResult_CVec_u8ZIOErrorZ_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);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+static inline enum LDKIOError CResult_CVec_u8ZIOErrorZ_get_err(LDKCResult_CVec_u8ZIOErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+int32_t  CS_LDK_CResult_CVec_u8ZIOErrorZ_get_err(int64_t owner) {
+       LDKCResult_CVec_u8ZIOErrorZ* owner_conv = (LDKCResult_CVec_u8ZIOErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKIOError_to_cs(CResult_CVec_u8ZIOErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKCVec_StrZ CResult_CVec_StrZIOErrorZ_get_ok(LDKCResult_CVec_StrZIOErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+ptrArray  CS_LDK_CResult_CVec_StrZIOErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_StrZIOErrorZ* owner_conv = (LDKCResult_CVec_StrZIOErrorZ*)untag_ptr(owner);
+       LDKCVec_StrZ ret_var = CResult_CVec_StrZIOErrorZ_get_ok(owner_conv);
+       ptrArray ret_arr = NULL;
+       ret_arr = init_ptrArray(ret_var.datalen, __LINE__);
+       jstring *ret_arr_ptr = (jstring*)(((uint8_t*)ret_arr) + 8);
+       for (size_t i = 0; i < ret_var.datalen; i++) {
+               LDKStr ret_conv_8_str = ret_var.data[i];
+               jstring ret_conv_8_conv = str_ref_to_cs(ret_conv_8_str.chars, ret_conv_8_str.len);
+               ret_arr_ptr[i] = ret_conv_8_conv;
+       }
+       
+       return ret_arr;
+}
+
+static inline enum LDKIOError CResult_CVec_StrZIOErrorZ_get_err(LDKCResult_CVec_StrZIOErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+int32_t  CS_LDK_CResult_CVec_StrZIOErrorZ_get_err(int64_t owner) {
+       LDKCResult_CVec_StrZIOErrorZ* owner_conv = (LDKCResult_CVec_StrZIOErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKIOError_to_cs(CResult_CVec_StrZIOErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ_clone(const LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ *orig) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ) * orig->datalen, "LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_ok(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ_clone(&*owner->contents.result);
+}
+int64_tArray  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* owner_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ*)untag_ptr(owner);
+       LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ ret_var = CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_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_ThirtyTwoBytesChannelMonitorZ* ret_conv_40_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ), "LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ");
+               *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;
+}
+
+static inline enum LDKIOError CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_err(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+int32_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_err(int64_t owner) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* owner_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKIOError_to_cs(CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_ok(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_ok(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ*)untag_ptr(owner);
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ), "LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_ok(owner_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline enum LDKIOError CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_err(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+int32_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_err(int64_t owner) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* owner_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKIOError_to_cs(CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+uint32_t CS_LDK_LDKCOption_SecretKeyZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_SecretKeyZ *obj = (LDKCOption_SecretKeyZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_SecretKeyZ_Some: return 0;
+               case LDKCOption_SecretKeyZ_None: return 1;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKCOption_SecretKeyZ_Some_get_some(int64_t ptr) {
+       LDKCOption_SecretKeyZ *obj = (LDKCOption_SecretKeyZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_SecretKeyZ_Some);
+       int8_tArray some_arr = init_int8_tArray(32, __LINE__);
+       memcpy(some_arr->elems, obj->some.bytes, 32);
+       return some_arr;
+}
+static inline struct LDKVerifiedInvoiceRequest CResult_VerifiedInvoiceRequestNoneZ_get_ok(LDKCResult_VerifiedInvoiceRequestNoneZ *NONNULL_PTR owner){
+       LDKVerifiedInvoiceRequest ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_get_ok(int64_t owner) {
+       LDKCResult_VerifiedInvoiceRequestNoneZ* owner_conv = (LDKCResult_VerifiedInvoiceRequestNoneZ*)untag_ptr(owner);
+       LDKVerifiedInvoiceRequest ret_var = CResult_VerifiedInvoiceRequestNoneZ_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_VerifiedInvoiceRequestNoneZ_get_err(LDKCResult_VerifiedInvoiceRequestNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_get_err(int64_t owner) {
+       LDKCResult_VerifiedInvoiceRequestNoneZ* owner_conv = (LDKCResult_VerifiedInvoiceRequestNoneZ*)untag_ptr(owner);
+       CResult_VerifiedInvoiceRequestNoneZ_get_err(owner_conv);
+}
+
+static inline LDKCVec_WitnessZ CVec_WitnessZ_clone(const LDKCVec_WitnessZ *orig) {
+       LDKCVec_WitnessZ ret = { .data = MALLOC(sizeof(LDKWitness) * orig->datalen, "LDKCVec_WitnessZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = Witness_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKCOption_i64Z_ty_from_ptr(int64_t ptr) {
+       LDKCOption_i64Z *obj = (LDKCOption_i64Z*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_i64Z_Some: return 0;
+               case LDKCOption_i64Z_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_i64Z_Some_get_some(int64_t ptr) {
+       LDKCOption_i64Z *obj = (LDKCOption_i64Z*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_i64Z_Some);
+       int64_t some_conv = obj->some;
+       return some_conv;
+}
+static inline struct LDKSocketAddress CResult_SocketAddressDecodeErrorZ_get_ok(LDKCResult_SocketAddressDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return SocketAddress_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_SocketAddressDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SocketAddressDecodeErrorZ* owner_conv = (LDKCResult_SocketAddressDecodeErrorZ*)untag_ptr(owner);
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = CResult_SocketAddressDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_SocketAddressDecodeErrorZ_get_err(LDKCResult_SocketAddressDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_SocketAddressDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_SocketAddressDecodeErrorZ* owner_conv = (LDKCResult_SocketAddressDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_SocketAddressDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKSocketAddress CResult_SocketAddressSocketAddressParseErrorZ_get_ok(LDKCResult_SocketAddressSocketAddressParseErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return SocketAddress_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* owner_conv = (LDKCResult_SocketAddressSocketAddressParseErrorZ*)untag_ptr(owner);
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = CResult_SocketAddressSocketAddressParseErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline enum LDKSocketAddressParseError CResult_SocketAddressSocketAddressParseErrorZ_get_err(LDKCResult_SocketAddressSocketAddressParseErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return SocketAddressParseError_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_get_err(int64_t owner) {
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* owner_conv = (LDKCResult_SocketAddressSocketAddressParseErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKSocketAddressParseError_to_cs(CResult_SocketAddressSocketAddressParseErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline LDKCVec_UpdateAddHTLCZ CVec_UpdateAddHTLCZ_clone(const LDKCVec_UpdateAddHTLCZ *orig) {
+       LDKCVec_UpdateAddHTLCZ ret = { .data = MALLOC(sizeof(LDKUpdateAddHTLC) * orig->datalen, "LDKCVec_UpdateAddHTLCZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = UpdateAddHTLC_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_UpdateFulfillHTLCZ CVec_UpdateFulfillHTLCZ_clone(const LDKCVec_UpdateFulfillHTLCZ *orig) {
+       LDKCVec_UpdateFulfillHTLCZ ret = { .data = MALLOC(sizeof(LDKUpdateFulfillHTLC) * orig->datalen, "LDKCVec_UpdateFulfillHTLCZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = UpdateFulfillHTLC_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_UpdateFailHTLCZ CVec_UpdateFailHTLCZ_clone(const LDKCVec_UpdateFailHTLCZ *orig) {
+       LDKCVec_UpdateFailHTLCZ ret = { .data = MALLOC(sizeof(LDKUpdateFailHTLC) * orig->datalen, "LDKCVec_UpdateFailHTLCZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = UpdateFailHTLC_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_UpdateFailMalformedHTLCZ CVec_UpdateFailMalformedHTLCZ_clone(const LDKCVec_UpdateFailMalformedHTLCZ *orig) {
+       LDKCVec_UpdateFailMalformedHTLCZ ret = { .data = MALLOC(sizeof(LDKUpdateFailMalformedHTLC) * orig->datalen, "LDKCVec_UpdateFailMalformedHTLCZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = UpdateFailMalformedHTLC_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKAcceptChannel CResult_AcceptChannelDecodeErrorZ_get_ok(LDKCResult_AcceptChannelDecodeErrorZ *NONNULL_PTR owner){
+       LDKAcceptChannel ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_AcceptChannelDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_AcceptChannelDecodeErrorZ* owner_conv = (LDKCResult_AcceptChannelDecodeErrorZ*)untag_ptr(owner);
+       LDKAcceptChannel ret_var = CResult_AcceptChannelDecodeErrorZ_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_AcceptChannelDecodeErrorZ_get_err(LDKCResult_AcceptChannelDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_AcceptChannelDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_AcceptChannelDecodeErrorZ* owner_conv = (LDKCResult_AcceptChannelDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_AcceptChannelDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKAcceptChannelV2 CResult_AcceptChannelV2DecodeErrorZ_get_ok(LDKCResult_AcceptChannelV2DecodeErrorZ *NONNULL_PTR owner){
+       LDKAcceptChannelV2 ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_AcceptChannelV2DecodeErrorZ* owner_conv = (LDKCResult_AcceptChannelV2DecodeErrorZ*)untag_ptr(owner);
+       LDKAcceptChannelV2 ret_var = CResult_AcceptChannelV2DecodeErrorZ_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_AcceptChannelV2DecodeErrorZ_get_err(LDKCResult_AcceptChannelV2DecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_AcceptChannelV2DecodeErrorZ* owner_conv = (LDKCResult_AcceptChannelV2DecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_AcceptChannelV2DecodeErrorZ_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;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxAddInputDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxAddInputDecodeErrorZ* owner_conv = (LDKCResult_TxAddInputDecodeErrorZ*)untag_ptr(owner);
+       LDKTxAddInput ret_var = CResult_TxAddInputDecodeErrorZ_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_TxAddInputDecodeErrorZ_get_err(LDKCResult_TxAddInputDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxAddInputDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxAddInputDecodeErrorZ* owner_conv = (LDKCResult_TxAddInputDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxAddInputDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxAddOutput CResult_TxAddOutputDecodeErrorZ_get_ok(LDKCResult_TxAddOutputDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxAddOutput ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxAddOutputDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxAddOutputDecodeErrorZ* owner_conv = (LDKCResult_TxAddOutputDecodeErrorZ*)untag_ptr(owner);
+       LDKTxAddOutput ret_var = CResult_TxAddOutputDecodeErrorZ_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_TxAddOutputDecodeErrorZ_get_err(LDKCResult_TxAddOutputDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxAddOutputDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxAddOutputDecodeErrorZ* owner_conv = (LDKCResult_TxAddOutputDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxAddOutputDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxRemoveInput CResult_TxRemoveInputDecodeErrorZ_get_ok(LDKCResult_TxRemoveInputDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxRemoveInput ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxRemoveInputDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxRemoveInputDecodeErrorZ* owner_conv = (LDKCResult_TxRemoveInputDecodeErrorZ*)untag_ptr(owner);
+       LDKTxRemoveInput ret_var = CResult_TxRemoveInputDecodeErrorZ_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_TxRemoveInputDecodeErrorZ_get_err(LDKCResult_TxRemoveInputDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxRemoveInputDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxRemoveInputDecodeErrorZ* owner_conv = (LDKCResult_TxRemoveInputDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxRemoveInputDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxRemoveOutput CResult_TxRemoveOutputDecodeErrorZ_get_ok(LDKCResult_TxRemoveOutputDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxRemoveOutput ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxRemoveOutputDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxRemoveOutputDecodeErrorZ* owner_conv = (LDKCResult_TxRemoveOutputDecodeErrorZ*)untag_ptr(owner);
+       LDKTxRemoveOutput ret_var = CResult_TxRemoveOutputDecodeErrorZ_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_TxRemoveOutputDecodeErrorZ_get_err(LDKCResult_TxRemoveOutputDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxRemoveOutputDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxRemoveOutputDecodeErrorZ* owner_conv = (LDKCResult_TxRemoveOutputDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxRemoveOutputDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxComplete CResult_TxCompleteDecodeErrorZ_get_ok(LDKCResult_TxCompleteDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxComplete ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxCompleteDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxCompleteDecodeErrorZ* owner_conv = (LDKCResult_TxCompleteDecodeErrorZ*)untag_ptr(owner);
+       LDKTxComplete ret_var = CResult_TxCompleteDecodeErrorZ_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_TxCompleteDecodeErrorZ_get_err(LDKCResult_TxCompleteDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxCompleteDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxCompleteDecodeErrorZ* owner_conv = (LDKCResult_TxCompleteDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxCompleteDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxSignatures CResult_TxSignaturesDecodeErrorZ_get_ok(LDKCResult_TxSignaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxSignatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxSignaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxSignaturesDecodeErrorZ* owner_conv = (LDKCResult_TxSignaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKTxSignatures ret_var = CResult_TxSignaturesDecodeErrorZ_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_TxSignaturesDecodeErrorZ_get_err(LDKCResult_TxSignaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxSignaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxSignaturesDecodeErrorZ* owner_conv = (LDKCResult_TxSignaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxSignaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxInitRbf CResult_TxInitRbfDecodeErrorZ_get_ok(LDKCResult_TxInitRbfDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxInitRbf ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxInitRbfDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxInitRbfDecodeErrorZ* owner_conv = (LDKCResult_TxInitRbfDecodeErrorZ*)untag_ptr(owner);
+       LDKTxInitRbf ret_var = CResult_TxInitRbfDecodeErrorZ_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_TxInitRbfDecodeErrorZ_get_err(LDKCResult_TxInitRbfDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxInitRbfDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxInitRbfDecodeErrorZ* owner_conv = (LDKCResult_TxInitRbfDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxInitRbfDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxAckRbf CResult_TxAckRbfDecodeErrorZ_get_ok(LDKCResult_TxAckRbfDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxAckRbf ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxAckRbfDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxAckRbfDecodeErrorZ* owner_conv = (LDKCResult_TxAckRbfDecodeErrorZ*)untag_ptr(owner);
+       LDKTxAckRbf ret_var = CResult_TxAckRbfDecodeErrorZ_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_TxAckRbfDecodeErrorZ_get_err(LDKCResult_TxAckRbfDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxAckRbfDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxAckRbfDecodeErrorZ* owner_conv = (LDKCResult_TxAckRbfDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxAckRbfDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxAbort CResult_TxAbortDecodeErrorZ_get_ok(LDKCResult_TxAbortDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxAbort ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxAbortDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxAbortDecodeErrorZ* owner_conv = (LDKCResult_TxAbortDecodeErrorZ*)untag_ptr(owner);
+       LDKTxAbort ret_var = CResult_TxAbortDecodeErrorZ_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_TxAbortDecodeErrorZ_get_err(LDKCResult_TxAbortDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxAbortDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxAbortDecodeErrorZ* owner_conv = (LDKCResult_TxAbortDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxAbortDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKAnnouncementSignatures CResult_AnnouncementSignaturesDecodeErrorZ_get_ok(LDKCResult_AnnouncementSignaturesDecodeErrorZ *NONNULL_PTR owner){
+       LDKAnnouncementSignatures ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_AnnouncementSignaturesDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* owner_conv = (LDKCResult_AnnouncementSignaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKAnnouncementSignatures ret_var = CResult_AnnouncementSignaturesDecodeErrorZ_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_AnnouncementSignaturesDecodeErrorZ_get_err(LDKCResult_AnnouncementSignaturesDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_AnnouncementSignaturesDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* owner_conv = (LDKCResult_AnnouncementSignaturesDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_AnnouncementSignaturesDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelReestablish CResult_ChannelReestablishDecodeErrorZ_get_ok(LDKCResult_ChannelReestablishDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelReestablish ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelReestablishDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelReestablishDecodeErrorZ* owner_conv = (LDKCResult_ChannelReestablishDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelReestablish ret_var = CResult_ChannelReestablishDecodeErrorZ_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_ChannelReestablishDecodeErrorZ_get_err(LDKCResult_ChannelReestablishDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelReestablishDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelReestablishDecodeErrorZ* owner_conv = (LDKCResult_ChannelReestablishDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelReestablishDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKClosingSigned CResult_ClosingSignedDecodeErrorZ_get_ok(LDKCResult_ClosingSignedDecodeErrorZ *NONNULL_PTR owner){
+       LDKClosingSigned ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ClosingSignedDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ClosingSignedDecodeErrorZ* owner_conv = (LDKCResult_ClosingSignedDecodeErrorZ*)untag_ptr(owner);
+       LDKClosingSigned ret_var = CResult_ClosingSignedDecodeErrorZ_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_ClosingSignedDecodeErrorZ_get_err(LDKCResult_ClosingSignedDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ClosingSignedDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ClosingSignedDecodeErrorZ* owner_conv = (LDKCResult_ClosingSignedDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ClosingSignedDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKClosingSignedFeeRange CResult_ClosingSignedFeeRangeDecodeErrorZ_get_ok(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ *NONNULL_PTR owner){
+       LDKClosingSignedFeeRange ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ClosingSignedFeeRangeDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* owner_conv = (LDKCResult_ClosingSignedFeeRangeDecodeErrorZ*)untag_ptr(owner);
+       LDKClosingSignedFeeRange ret_var = CResult_ClosingSignedFeeRangeDecodeErrorZ_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_ClosingSignedFeeRangeDecodeErrorZ_get_err(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ClosingSignedFeeRangeDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* owner_conv = (LDKCResult_ClosingSignedFeeRangeDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ClosingSignedFeeRangeDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKCommitmentSigned CResult_CommitmentSignedDecodeErrorZ_get_ok(LDKCResult_CommitmentSignedDecodeErrorZ *NONNULL_PTR owner){
+       LDKCommitmentSigned ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_CommitmentSignedDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CommitmentSignedDecodeErrorZ* owner_conv = (LDKCResult_CommitmentSignedDecodeErrorZ*)untag_ptr(owner);
+       LDKCommitmentSigned ret_var = CResult_CommitmentSignedDecodeErrorZ_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_CommitmentSignedDecodeErrorZ_get_err(LDKCResult_CommitmentSignedDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_CommitmentSignedDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_CommitmentSignedDecodeErrorZ* owner_conv = (LDKCResult_CommitmentSignedDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_CommitmentSignedDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKFundingCreated CResult_FundingCreatedDecodeErrorZ_get_ok(LDKCResult_FundingCreatedDecodeErrorZ *NONNULL_PTR owner){
+       LDKFundingCreated ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_FundingCreatedDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_FundingCreatedDecodeErrorZ* owner_conv = (LDKCResult_FundingCreatedDecodeErrorZ*)untag_ptr(owner);
+       LDKFundingCreated ret_var = CResult_FundingCreatedDecodeErrorZ_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_FundingCreatedDecodeErrorZ_get_err(LDKCResult_FundingCreatedDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_FundingCreatedDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_FundingCreatedDecodeErrorZ* owner_conv = (LDKCResult_FundingCreatedDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_FundingCreatedDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKFundingSigned CResult_FundingSignedDecodeErrorZ_get_ok(LDKCResult_FundingSignedDecodeErrorZ *NONNULL_PTR owner){
+       LDKFundingSigned ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_FundingSignedDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_FundingSignedDecodeErrorZ* owner_conv = (LDKCResult_FundingSignedDecodeErrorZ*)untag_ptr(owner);
+       LDKFundingSigned ret_var = CResult_FundingSignedDecodeErrorZ_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_FundingSignedDecodeErrorZ_get_err(LDKCResult_FundingSignedDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_FundingSignedDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_FundingSignedDecodeErrorZ* owner_conv = (LDKCResult_FundingSignedDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_FundingSignedDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelReady CResult_ChannelReadyDecodeErrorZ_get_ok(LDKCResult_ChannelReadyDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelReady ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelReadyDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelReadyDecodeErrorZ* owner_conv = (LDKCResult_ChannelReadyDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelReady ret_var = CResult_ChannelReadyDecodeErrorZ_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_ChannelReadyDecodeErrorZ_get_err(LDKCResult_ChannelReadyDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelReadyDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelReadyDecodeErrorZ* owner_conv = (LDKCResult_ChannelReadyDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelReadyDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKInit CResult_InitDecodeErrorZ_get_ok(LDKCResult_InitDecodeErrorZ *NONNULL_PTR owner){
+       LDKInit ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_InitDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_InitDecodeErrorZ* owner_conv = (LDKCResult_InitDecodeErrorZ*)untag_ptr(owner);
+       LDKInit ret_var = CResult_InitDecodeErrorZ_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_InitDecodeErrorZ_get_err(LDKCResult_InitDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_InitDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_InitDecodeErrorZ* owner_conv = (LDKCResult_InitDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_InitDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKOpenChannel CResult_OpenChannelDecodeErrorZ_get_ok(LDKCResult_OpenChannelDecodeErrorZ *NONNULL_PTR owner){
+       LDKOpenChannel ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_OpenChannelDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_OpenChannelDecodeErrorZ* owner_conv = (LDKCResult_OpenChannelDecodeErrorZ*)untag_ptr(owner);
+       LDKOpenChannel ret_var = CResult_OpenChannelDecodeErrorZ_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_OpenChannelDecodeErrorZ_get_err(LDKCResult_OpenChannelDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_OpenChannelDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_OpenChannelDecodeErrorZ* owner_conv = (LDKCResult_OpenChannelDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_OpenChannelDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKOpenChannelV2 CResult_OpenChannelV2DecodeErrorZ_get_ok(LDKCResult_OpenChannelV2DecodeErrorZ *NONNULL_PTR owner){
+       LDKOpenChannelV2 ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_OpenChannelV2DecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_OpenChannelV2DecodeErrorZ* owner_conv = (LDKCResult_OpenChannelV2DecodeErrorZ*)untag_ptr(owner);
+       LDKOpenChannelV2 ret_var = CResult_OpenChannelV2DecodeErrorZ_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_OpenChannelV2DecodeErrorZ_get_err(LDKCResult_OpenChannelV2DecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_OpenChannelV2DecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_OpenChannelV2DecodeErrorZ* owner_conv = (LDKCResult_OpenChannelV2DecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_OpenChannelV2DecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKRevokeAndACK CResult_RevokeAndACKDecodeErrorZ_get_ok(LDKCResult_RevokeAndACKDecodeErrorZ *NONNULL_PTR owner){
+       LDKRevokeAndACK ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RevokeAndACKDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RevokeAndACKDecodeErrorZ* owner_conv = (LDKCResult_RevokeAndACKDecodeErrorZ*)untag_ptr(owner);
+       LDKRevokeAndACK ret_var = CResult_RevokeAndACKDecodeErrorZ_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_RevokeAndACKDecodeErrorZ_get_err(LDKCResult_RevokeAndACKDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RevokeAndACKDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RevokeAndACKDecodeErrorZ* owner_conv = (LDKCResult_RevokeAndACKDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RevokeAndACKDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKShutdown CResult_ShutdownDecodeErrorZ_get_ok(LDKCResult_ShutdownDecodeErrorZ *NONNULL_PTR owner){
+       LDKShutdown ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ShutdownDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ShutdownDecodeErrorZ* owner_conv = (LDKCResult_ShutdownDecodeErrorZ*)untag_ptr(owner);
+       LDKShutdown ret_var = CResult_ShutdownDecodeErrorZ_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_ShutdownDecodeErrorZ_get_err(LDKCResult_ShutdownDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ShutdownDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ShutdownDecodeErrorZ* owner_conv = (LDKCResult_ShutdownDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ShutdownDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKUpdateFailHTLC CResult_UpdateFailHTLCDecodeErrorZ_get_ok(LDKCResult_UpdateFailHTLCDecodeErrorZ *NONNULL_PTR owner){
+       LDKUpdateFailHTLC ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UpdateFailHTLCDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* owner_conv = (LDKCResult_UpdateFailHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKUpdateFailHTLC ret_var = CResult_UpdateFailHTLCDecodeErrorZ_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_UpdateFailHTLCDecodeErrorZ_get_err(LDKCResult_UpdateFailHTLCDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UpdateFailHTLCDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* owner_conv = (LDKCResult_UpdateFailHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UpdateFailHTLCDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKUpdateFailMalformedHTLC CResult_UpdateFailMalformedHTLCDecodeErrorZ_get_ok(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ *NONNULL_PTR owner){
+       LDKUpdateFailMalformedHTLC ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UpdateFailMalformedHTLCDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* owner_conv = (LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKUpdateFailMalformedHTLC ret_var = CResult_UpdateFailMalformedHTLCDecodeErrorZ_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_UpdateFailMalformedHTLCDecodeErrorZ_get_err(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UpdateFailMalformedHTLCDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* owner_conv = (LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UpdateFailMalformedHTLCDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKUpdateFee CResult_UpdateFeeDecodeErrorZ_get_ok(LDKCResult_UpdateFeeDecodeErrorZ *NONNULL_PTR owner){
+       LDKUpdateFee ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UpdateFeeDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UpdateFeeDecodeErrorZ* owner_conv = (LDKCResult_UpdateFeeDecodeErrorZ*)untag_ptr(owner);
+       LDKUpdateFee ret_var = CResult_UpdateFeeDecodeErrorZ_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_UpdateFeeDecodeErrorZ_get_err(LDKCResult_UpdateFeeDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UpdateFeeDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UpdateFeeDecodeErrorZ* owner_conv = (LDKCResult_UpdateFeeDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UpdateFeeDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKUpdateFulfillHTLC CResult_UpdateFulfillHTLCDecodeErrorZ_get_ok(LDKCResult_UpdateFulfillHTLCDecodeErrorZ *NONNULL_PTR owner){
+       LDKUpdateFulfillHTLC ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* owner_conv = (LDKCResult_UpdateFulfillHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKUpdateFulfillHTLC ret_var = CResult_UpdateFulfillHTLCDecodeErrorZ_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_UpdateFulfillHTLCDecodeErrorZ_get_err(LDKCResult_UpdateFulfillHTLCDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* owner_conv = (LDKCResult_UpdateFulfillHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UpdateFulfillHTLCDecodeErrorZ_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;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* owner_conv = (LDKCResult_UpdateAddHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKUpdateAddHTLC ret_var = CResult_UpdateAddHTLCDecodeErrorZ_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_UpdateAddHTLCDecodeErrorZ_get_err(LDKCResult_UpdateAddHTLCDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* owner_conv = (LDKCResult_UpdateAddHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UpdateAddHTLCDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKOnionMessage CResult_OnionMessageDecodeErrorZ_get_ok(LDKCResult_OnionMessageDecodeErrorZ *NONNULL_PTR owner){
+       LDKOnionMessage ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_OnionMessageDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_OnionMessageDecodeErrorZ* owner_conv = (LDKCResult_OnionMessageDecodeErrorZ*)untag_ptr(owner);
+       LDKOnionMessage ret_var = CResult_OnionMessageDecodeErrorZ_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_OnionMessageDecodeErrorZ_get_err(LDKCResult_OnionMessageDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_OnionMessageDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_OnionMessageDecodeErrorZ* owner_conv = (LDKCResult_OnionMessageDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_OnionMessageDecodeErrorZ_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;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PingDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PingDecodeErrorZ* owner_conv = (LDKCResult_PingDecodeErrorZ*)untag_ptr(owner);
+       LDKPing ret_var = CResult_PingDecodeErrorZ_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_PingDecodeErrorZ_get_err(LDKCResult_PingDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PingDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PingDecodeErrorZ* owner_conv = (LDKCResult_PingDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PingDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKPong CResult_PongDecodeErrorZ_get_ok(LDKCResult_PongDecodeErrorZ *NONNULL_PTR owner){
+       LDKPong ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PongDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PongDecodeErrorZ* owner_conv = (LDKCResult_PongDecodeErrorZ*)untag_ptr(owner);
+       LDKPong ret_var = CResult_PongDecodeErrorZ_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_PongDecodeErrorZ_get_err(LDKCResult_PongDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PongDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PongDecodeErrorZ* owner_conv = (LDKCResult_PongDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PongDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKUnsignedChannelAnnouncement CResult_UnsignedChannelAnnouncementDecodeErrorZ_get_ok(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ *NONNULL_PTR owner){
+       LDKUnsignedChannelAnnouncement ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UnsignedChannelAnnouncementDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* owner_conv = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)untag_ptr(owner);
+       LDKUnsignedChannelAnnouncement ret_var = CResult_UnsignedChannelAnnouncementDecodeErrorZ_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_UnsignedChannelAnnouncementDecodeErrorZ_get_err(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UnsignedChannelAnnouncementDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* owner_conv = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UnsignedChannelAnnouncementDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelAnnouncement CResult_ChannelAnnouncementDecodeErrorZ_get_ok(LDKCResult_ChannelAnnouncementDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelAnnouncement ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelAnnouncementDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* owner_conv = (LDKCResult_ChannelAnnouncementDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelAnnouncement ret_var = CResult_ChannelAnnouncementDecodeErrorZ_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_ChannelAnnouncementDecodeErrorZ_get_err(LDKCResult_ChannelAnnouncementDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelAnnouncementDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* owner_conv = (LDKCResult_ChannelAnnouncementDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelAnnouncementDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKUnsignedChannelUpdate CResult_UnsignedChannelUpdateDecodeErrorZ_get_ok(LDKCResult_UnsignedChannelUpdateDecodeErrorZ *NONNULL_PTR owner){
+       LDKUnsignedChannelUpdate ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UnsignedChannelUpdateDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* owner_conv = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)untag_ptr(owner);
+       LDKUnsignedChannelUpdate ret_var = CResult_UnsignedChannelUpdateDecodeErrorZ_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_UnsignedChannelUpdateDecodeErrorZ_get_err(LDKCResult_UnsignedChannelUpdateDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UnsignedChannelUpdateDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* owner_conv = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UnsignedChannelUpdateDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelUpdate CResult_ChannelUpdateDecodeErrorZ_get_ok(LDKCResult_ChannelUpdateDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelUpdate ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelUpdateDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelUpdateDecodeErrorZ* owner_conv = (LDKCResult_ChannelUpdateDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelUpdate ret_var = CResult_ChannelUpdateDecodeErrorZ_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_ChannelUpdateDecodeErrorZ_get_err(LDKCResult_ChannelUpdateDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelUpdateDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelUpdateDecodeErrorZ* owner_conv = (LDKCResult_ChannelUpdateDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelUpdateDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKErrorMessage CResult_ErrorMessageDecodeErrorZ_get_ok(LDKCResult_ErrorMessageDecodeErrorZ *NONNULL_PTR owner){
+       LDKErrorMessage ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ErrorMessageDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ErrorMessageDecodeErrorZ* owner_conv = (LDKCResult_ErrorMessageDecodeErrorZ*)untag_ptr(owner);
+       LDKErrorMessage ret_var = CResult_ErrorMessageDecodeErrorZ_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_ErrorMessageDecodeErrorZ_get_err(LDKCResult_ErrorMessageDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ErrorMessageDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ErrorMessageDecodeErrorZ* owner_conv = (LDKCResult_ErrorMessageDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ErrorMessageDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKWarningMessage CResult_WarningMessageDecodeErrorZ_get_ok(LDKCResult_WarningMessageDecodeErrorZ *NONNULL_PTR owner){
+       LDKWarningMessage ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_WarningMessageDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_WarningMessageDecodeErrorZ* owner_conv = (LDKCResult_WarningMessageDecodeErrorZ*)untag_ptr(owner);
+       LDKWarningMessage ret_var = CResult_WarningMessageDecodeErrorZ_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_WarningMessageDecodeErrorZ_get_err(LDKCResult_WarningMessageDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_WarningMessageDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_WarningMessageDecodeErrorZ* owner_conv = (LDKCResult_WarningMessageDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_WarningMessageDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKUnsignedNodeAnnouncement CResult_UnsignedNodeAnnouncementDecodeErrorZ_get_ok(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ *NONNULL_PTR owner){
+       LDKUnsignedNodeAnnouncement ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UnsignedNodeAnnouncementDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* owner_conv = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)untag_ptr(owner);
+       LDKUnsignedNodeAnnouncement ret_var = CResult_UnsignedNodeAnnouncementDecodeErrorZ_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_UnsignedNodeAnnouncementDecodeErrorZ_get_err(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UnsignedNodeAnnouncementDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* owner_conv = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UnsignedNodeAnnouncementDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKNodeAnnouncement CResult_NodeAnnouncementDecodeErrorZ_get_ok(LDKCResult_NodeAnnouncementDecodeErrorZ *NONNULL_PTR owner){
+       LDKNodeAnnouncement ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_NodeAnnouncementDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NodeAnnouncementDecodeErrorZ* owner_conv = (LDKCResult_NodeAnnouncementDecodeErrorZ*)untag_ptr(owner);
+       LDKNodeAnnouncement ret_var = CResult_NodeAnnouncementDecodeErrorZ_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_NodeAnnouncementDecodeErrorZ_get_err(LDKCResult_NodeAnnouncementDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_NodeAnnouncementDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_NodeAnnouncementDecodeErrorZ* owner_conv = (LDKCResult_NodeAnnouncementDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_NodeAnnouncementDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKQueryShortChannelIds CResult_QueryShortChannelIdsDecodeErrorZ_get_ok(LDKCResult_QueryShortChannelIdsDecodeErrorZ *NONNULL_PTR owner){
+       LDKQueryShortChannelIds ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_QueryShortChannelIdsDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* owner_conv = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)untag_ptr(owner);
+       LDKQueryShortChannelIds ret_var = CResult_QueryShortChannelIdsDecodeErrorZ_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_QueryShortChannelIdsDecodeErrorZ_get_err(LDKCResult_QueryShortChannelIdsDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_QueryShortChannelIdsDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* owner_conv = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_QueryShortChannelIdsDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKReplyShortChannelIdsEnd CResult_ReplyShortChannelIdsEndDecodeErrorZ_get_ok(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ *NONNULL_PTR owner){
+       LDKReplyShortChannelIdsEnd ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ReplyShortChannelIdsEndDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* owner_conv = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)untag_ptr(owner);
+       LDKReplyShortChannelIdsEnd ret_var = CResult_ReplyShortChannelIdsEndDecodeErrorZ_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_ReplyShortChannelIdsEndDecodeErrorZ_get_err(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ReplyShortChannelIdsEndDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* owner_conv = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ReplyShortChannelIdsEndDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKQueryChannelRange CResult_QueryChannelRangeDecodeErrorZ_get_ok(LDKCResult_QueryChannelRangeDecodeErrorZ *NONNULL_PTR owner){
+       LDKQueryChannelRange ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_QueryChannelRangeDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_QueryChannelRangeDecodeErrorZ* owner_conv = (LDKCResult_QueryChannelRangeDecodeErrorZ*)untag_ptr(owner);
+       LDKQueryChannelRange ret_var = CResult_QueryChannelRangeDecodeErrorZ_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_QueryChannelRangeDecodeErrorZ_get_err(LDKCResult_QueryChannelRangeDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_QueryChannelRangeDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_QueryChannelRangeDecodeErrorZ* owner_conv = (LDKCResult_QueryChannelRangeDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_QueryChannelRangeDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKReplyChannelRange CResult_ReplyChannelRangeDecodeErrorZ_get_ok(LDKCResult_ReplyChannelRangeDecodeErrorZ *NONNULL_PTR owner){
+       LDKReplyChannelRange ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ReplyChannelRangeDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* owner_conv = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)untag_ptr(owner);
+       LDKReplyChannelRange ret_var = CResult_ReplyChannelRangeDecodeErrorZ_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_ReplyChannelRangeDecodeErrorZ_get_err(LDKCResult_ReplyChannelRangeDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ReplyChannelRangeDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* owner_conv = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ReplyChannelRangeDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKGossipTimestampFilter CResult_GossipTimestampFilterDecodeErrorZ_get_ok(LDKCResult_GossipTimestampFilterDecodeErrorZ *NONNULL_PTR owner){
+       LDKGossipTimestampFilter ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* owner_conv = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)untag_ptr(owner);
+       LDKGossipTimestampFilter ret_var = CResult_GossipTimestampFilterDecodeErrorZ_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_GossipTimestampFilterDecodeErrorZ_get_err(LDKCResult_GossipTimestampFilterDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* owner_conv = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_GossipTimestampFilterDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_PhantomRouteHintsZ CVec_PhantomRouteHintsZ_clone(const LDKCVec_PhantomRouteHintsZ *orig) {
+       LDKCVec_PhantomRouteHintsZ ret = { .data = MALLOC(sizeof(LDKPhantomRouteHints) * orig->datalen, "LDKCVec_PhantomRouteHintsZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = PhantomRouteHints_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKSignOrCreationError_ty_from_ptr(int64_t ptr) {
+       LDKSignOrCreationError *obj = (LDKSignOrCreationError*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKSignOrCreationError_SignError: return 0;
+               case LDKSignOrCreationError_CreationError: return 1;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKSignOrCreationError_CreationError_get_creation_error(int64_t ptr) {
+       LDKSignOrCreationError *obj = (LDKSignOrCreationError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSignOrCreationError_CreationError);
+       int32_t creation_error_conv = LDKCreationError_to_cs(obj->creation_error);
+       return creation_error_conv;
+}
+static inline struct LDKBolt11Invoice CResult_Bolt11InvoiceSignOrCreationErrorZ_get_ok(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ *NONNULL_PTR owner){
+       LDKBolt11Invoice ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_get_ok(int64_t owner) {
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* owner_conv = (LDKCResult_Bolt11InvoiceSignOrCreationErrorZ*)untag_ptr(owner);
+       LDKBolt11Invoice ret_var = CResult_Bolt11InvoiceSignOrCreationErrorZ_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 LDKSignOrCreationError CResult_Bolt11InvoiceSignOrCreationErrorZ_get_err(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return SignOrCreationError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_get_err(int64_t owner) {
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* owner_conv = (LDKCResult_Bolt11InvoiceSignOrCreationErrorZ*)untag_ptr(owner);
+       LDKSignOrCreationError *ret_copy = MALLOC(sizeof(LDKSignOrCreationError), "LDKSignOrCreationError");
+       *ret_copy = CResult_Bolt11InvoiceSignOrCreationErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline LDKCVec_FutureZ CVec_FutureZ_clone(const LDKCVec_FutureZ *orig) {
+       LDKCVec_FutureZ ret = { .data = MALLOC(sizeof(LDKFuture) * orig->datalen, "LDKCVec_FutureZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = Future_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKOffersMessage CResult_OffersMessageDecodeErrorZ_get_ok(LDKCResult_OffersMessageDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return OffersMessage_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_OffersMessageDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_OffersMessageDecodeErrorZ* owner_conv = (LDKCResult_OffersMessageDecodeErrorZ*)untag_ptr(owner);
+       LDKOffersMessage *ret_copy = MALLOC(sizeof(LDKOffersMessage), "LDKOffersMessage");
+       *ret_copy = CResult_OffersMessageDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_OffersMessageDecodeErrorZ_get_err(LDKCResult_OffersMessageDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_OffersMessageDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_OffersMessageDecodeErrorZ* owner_conv = (LDKCResult_OffersMessageDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_OffersMessageDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKCOption_HTLCClaimZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_HTLCClaimZ *obj = (LDKCOption_HTLCClaimZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_HTLCClaimZ_Some: return 0;
+               case LDKCOption_HTLCClaimZ_None: return 1;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKCOption_HTLCClaimZ_Some_get_some(int64_t ptr) {
+       LDKCOption_HTLCClaimZ *obj = (LDKCOption_HTLCClaimZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_HTLCClaimZ_Some);
+       int32_t some_conv = LDKHTLCClaim_to_cs(obj->some);
+       return some_conv;
+}
+static inline struct LDKCounterpartyCommitmentSecrets CResult_CounterpartyCommitmentSecretsDecodeErrorZ_get_ok(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ *NONNULL_PTR owner){
+       LDKCounterpartyCommitmentSecrets ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_CounterpartyCommitmentSecretsDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* owner_conv = (LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ*)untag_ptr(owner);
+       LDKCounterpartyCommitmentSecrets ret_var = CResult_CounterpartyCommitmentSecretsDecodeErrorZ_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_CounterpartyCommitmentSecretsDecodeErrorZ_get_err(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_CounterpartyCommitmentSecretsDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* owner_conv = (LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_CounterpartyCommitmentSecretsDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTxCreationKeys CResult_TxCreationKeysDecodeErrorZ_get_ok(LDKCResult_TxCreationKeysDecodeErrorZ *NONNULL_PTR owner){
+       LDKTxCreationKeys ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TxCreationKeysDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TxCreationKeysDecodeErrorZ* owner_conv = (LDKCResult_TxCreationKeysDecodeErrorZ*)untag_ptr(owner);
+       LDKTxCreationKeys ret_var = CResult_TxCreationKeysDecodeErrorZ_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_TxCreationKeysDecodeErrorZ_get_err(LDKCResult_TxCreationKeysDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TxCreationKeysDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TxCreationKeysDecodeErrorZ* owner_conv = (LDKCResult_TxCreationKeysDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TxCreationKeysDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelPublicKeys CResult_ChannelPublicKeysDecodeErrorZ_get_ok(LDKCResult_ChannelPublicKeysDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelPublicKeys ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelPublicKeysDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* owner_conv = (LDKCResult_ChannelPublicKeysDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelPublicKeys ret_var = CResult_ChannelPublicKeysDecodeErrorZ_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_ChannelPublicKeysDecodeErrorZ_get_err(LDKCResult_ChannelPublicKeysDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelPublicKeysDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* owner_conv = (LDKCResult_ChannelPublicKeysDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelPublicKeysDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKHTLCOutputInCommitment CResult_HTLCOutputInCommitmentDecodeErrorZ_get_ok(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ *NONNULL_PTR owner){
+       LDKHTLCOutputInCommitment ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_HTLCOutputInCommitmentDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* owner_conv = (LDKCResult_HTLCOutputInCommitmentDecodeErrorZ*)untag_ptr(owner);
+       LDKHTLCOutputInCommitment ret_var = CResult_HTLCOutputInCommitmentDecodeErrorZ_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_HTLCOutputInCommitmentDecodeErrorZ_get_err(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_HTLCOutputInCommitmentDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* owner_conv = (LDKCResult_HTLCOutputInCommitmentDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_HTLCOutputInCommitmentDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKCounterpartyChannelTransactionParameters CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_get_ok(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ *NONNULL_PTR owner){
+       LDKCounterpartyChannelTransactionParameters ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* owner_conv = (LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKCounterpartyChannelTransactionParameters ret_var = CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_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_CounterpartyChannelTransactionParametersDecodeErrorZ_get_err(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* owner_conv = (LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKChannelTransactionParameters CResult_ChannelTransactionParametersDecodeErrorZ_get_ok(LDKCResult_ChannelTransactionParametersDecodeErrorZ *NONNULL_PTR owner){
+       LDKChannelTransactionParameters ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ChannelTransactionParametersDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* owner_conv = (LDKCResult_ChannelTransactionParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKChannelTransactionParameters ret_var = CResult_ChannelTransactionParametersDecodeErrorZ_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_ChannelTransactionParametersDecodeErrorZ_get_err(LDKCResult_ChannelTransactionParametersDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ChannelTransactionParametersDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* owner_conv = (LDKCResult_ChannelTransactionParametersDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ChannelTransactionParametersDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKHolderCommitmentTransaction CResult_HolderCommitmentTransactionDecodeErrorZ_get_ok(LDKCResult_HolderCommitmentTransactionDecodeErrorZ *NONNULL_PTR owner){
+       LDKHolderCommitmentTransaction ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_HolderCommitmentTransactionDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* owner_conv = (LDKCResult_HolderCommitmentTransactionDecodeErrorZ*)untag_ptr(owner);
+       LDKHolderCommitmentTransaction ret_var = CResult_HolderCommitmentTransactionDecodeErrorZ_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_HolderCommitmentTransactionDecodeErrorZ_get_err(LDKCResult_HolderCommitmentTransactionDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_HolderCommitmentTransactionDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* owner_conv = (LDKCResult_HolderCommitmentTransactionDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_HolderCommitmentTransactionDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBuiltCommitmentTransaction CResult_BuiltCommitmentTransactionDecodeErrorZ_get_ok(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ *NONNULL_PTR owner){
+       LDKBuiltCommitmentTransaction ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BuiltCommitmentTransactionDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* owner_conv = (LDKCResult_BuiltCommitmentTransactionDecodeErrorZ*)untag_ptr(owner);
+       LDKBuiltCommitmentTransaction ret_var = CResult_BuiltCommitmentTransactionDecodeErrorZ_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_BuiltCommitmentTransactionDecodeErrorZ_get_err(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BuiltCommitmentTransactionDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* owner_conv = (LDKCResult_BuiltCommitmentTransactionDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BuiltCommitmentTransactionDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTrustedClosingTransaction CResult_TrustedClosingTransactionNoneZ_get_ok(LDKCResult_TrustedClosingTransactionNoneZ *NONNULL_PTR owner){
+       LDKTrustedClosingTransaction ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TrustedClosingTransactionNoneZ_get_ok(int64_t owner) {
+       LDKCResult_TrustedClosingTransactionNoneZ* owner_conv = (LDKCResult_TrustedClosingTransactionNoneZ*)untag_ptr(owner);
+       LDKTrustedClosingTransaction ret_var = CResult_TrustedClosingTransactionNoneZ_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_TrustedClosingTransactionNoneZ_get_err(LDKCResult_TrustedClosingTransactionNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_TrustedClosingTransactionNoneZ_get_err(int64_t owner) {
+       LDKCResult_TrustedClosingTransactionNoneZ* owner_conv = (LDKCResult_TrustedClosingTransactionNoneZ*)untag_ptr(owner);
+       CResult_TrustedClosingTransactionNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKCommitmentTransaction CResult_CommitmentTransactionDecodeErrorZ_get_ok(LDKCResult_CommitmentTransactionDecodeErrorZ *NONNULL_PTR owner){
+       LDKCommitmentTransaction ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_CommitmentTransactionDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_CommitmentTransactionDecodeErrorZ* owner_conv = (LDKCResult_CommitmentTransactionDecodeErrorZ*)untag_ptr(owner);
+       LDKCommitmentTransaction ret_var = CResult_CommitmentTransactionDecodeErrorZ_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_CommitmentTransactionDecodeErrorZ_get_err(LDKCResult_CommitmentTransactionDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_CommitmentTransactionDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_CommitmentTransactionDecodeErrorZ* owner_conv = (LDKCResult_CommitmentTransactionDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_CommitmentTransactionDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTrustedCommitmentTransaction CResult_TrustedCommitmentTransactionNoneZ_get_ok(LDKCResult_TrustedCommitmentTransactionNoneZ *NONNULL_PTR owner){
+       LDKTrustedCommitmentTransaction ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TrustedCommitmentTransactionNoneZ_get_ok(int64_t owner) {
+       LDKCResult_TrustedCommitmentTransactionNoneZ* owner_conv = (LDKCResult_TrustedCommitmentTransactionNoneZ*)untag_ptr(owner);
+       LDKTrustedCommitmentTransaction ret_var = CResult_TrustedCommitmentTransactionNoneZ_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_TrustedCommitmentTransactionNoneZ_get_err(LDKCResult_TrustedCommitmentTransactionNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_TrustedCommitmentTransactionNoneZ_get_err(int64_t owner) {
+       LDKCResult_TrustedCommitmentTransactionNoneZ* owner_conv = (LDKCResult_TrustedCommitmentTransactionNoneZ*)untag_ptr(owner);
+       CResult_TrustedCommitmentTransactionNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKCVec_ECDSASignatureZ CResult_CVec_ECDSASignatureZNoneZ_get_ok(LDKCResult_CVec_ECDSASignatureZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+ptrArray  CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_ECDSASignatureZNoneZ* owner_conv = (LDKCResult_CVec_ECDSASignatureZNoneZ*)untag_ptr(owner);
+       LDKCVec_ECDSASignatureZ ret_var = CResult_CVec_ECDSASignatureZNoneZ_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++) {
+               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 void CResult_CVec_ECDSASignatureZNoneZ_get_err(LDKCResult_CVec_ECDSASignatureZNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_get_err(int64_t owner) {
+       LDKCResult_CVec_ECDSASignatureZNoneZ* owner_conv = (LDKCResult_CVec_ECDSASignatureZNoneZ*)untag_ptr(owner);
+       CResult_CVec_ECDSASignatureZNoneZ_get_err(owner_conv);
+}
+
+uint32_t CS_LDK_LDKCOption_usizeZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_usizeZ *obj = (LDKCOption_usizeZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_usizeZ_Some: return 0;
+               case LDKCOption_usizeZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_usizeZ_Some_get_some(int64_t ptr) {
+       LDKCOption_usizeZ *obj = (LDKCOption_usizeZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_usizeZ_Some);
+       int64_t some_conv = obj->some;
+       return some_conv;
+}
+static inline struct LDKShutdownScript CResult_ShutdownScriptDecodeErrorZ_get_ok(LDKCResult_ShutdownScriptDecodeErrorZ *NONNULL_PTR owner){
+       LDKShutdownScript ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ShutdownScriptDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ShutdownScriptDecodeErrorZ* owner_conv = (LDKCResult_ShutdownScriptDecodeErrorZ*)untag_ptr(owner);
+       LDKShutdownScript ret_var = CResult_ShutdownScriptDecodeErrorZ_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_ShutdownScriptDecodeErrorZ_get_err(LDKCResult_ShutdownScriptDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ShutdownScriptDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ShutdownScriptDecodeErrorZ* owner_conv = (LDKCResult_ShutdownScriptDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ShutdownScriptDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKShutdownScript CResult_ShutdownScriptInvalidShutdownScriptZ_get_ok(LDKCResult_ShutdownScriptInvalidShutdownScriptZ *NONNULL_PTR owner){
+       LDKShutdownScript ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_get_ok(int64_t owner) {
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* owner_conv = (LDKCResult_ShutdownScriptInvalidShutdownScriptZ*)untag_ptr(owner);
+       LDKShutdownScript ret_var = CResult_ShutdownScriptInvalidShutdownScriptZ_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 LDKInvalidShutdownScript CResult_ShutdownScriptInvalidShutdownScriptZ_get_err(LDKCResult_ShutdownScriptInvalidShutdownScriptZ *NONNULL_PTR owner){
+       LDKInvalidShutdownScript ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_get_err(int64_t owner) {
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* owner_conv = (LDKCResult_ShutdownScriptInvalidShutdownScriptZ*)untag_ptr(owner);
+       LDKInvalidShutdownScript ret_var = CResult_ShutdownScriptInvalidShutdownScriptZ_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;
+}
+
+uint32_t CS_LDK_LDKPaymentPurpose_ty_from_ptr(int64_t ptr) {
+       LDKPaymentPurpose *obj = (LDKPaymentPurpose*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKPaymentPurpose_InvoicePayment: return 0;
+               case LDKPaymentPurpose_SpontaneousPayment: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKPaymentPurpose_InvoicePayment_get_payment_preimage(int64_t ptr) {
+       LDKPaymentPurpose *obj = (LDKPaymentPurpose*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentPurpose_InvoicePayment);
+       int64_t payment_preimage_ref = tag_ptr(&obj->invoice_payment.payment_preimage, false);
+       return payment_preimage_ref;
+}
+int8_tArray CS_LDK_LDKPaymentPurpose_InvoicePayment_get_payment_secret(int64_t ptr) {
+       LDKPaymentPurpose *obj = (LDKPaymentPurpose*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentPurpose_InvoicePayment);
+       int8_tArray payment_secret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_secret_arr->elems, obj->invoice_payment.payment_secret.data, 32);
+       return payment_secret_arr;
+}
+int8_tArray CS_LDK_LDKPaymentPurpose_SpontaneousPayment_get_spontaneous_payment(int64_t ptr) {
+       LDKPaymentPurpose *obj = (LDKPaymentPurpose*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPaymentPurpose_SpontaneousPayment);
+       int8_tArray spontaneous_payment_arr = init_int8_tArray(32, __LINE__);
+       memcpy(spontaneous_payment_arr->elems, obj->spontaneous_payment.data, 32);
+       return spontaneous_payment_arr;
+}
+static inline struct LDKPaymentPurpose CResult_PaymentPurposeDecodeErrorZ_get_ok(LDKCResult_PaymentPurposeDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return PaymentPurpose_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_PaymentPurposeDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PaymentPurposeDecodeErrorZ* owner_conv = (LDKCResult_PaymentPurposeDecodeErrorZ*)untag_ptr(owner);
+       LDKPaymentPurpose *ret_copy = MALLOC(sizeof(LDKPaymentPurpose), "LDKPaymentPurpose");
+       *ret_copy = CResult_PaymentPurposeDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_PaymentPurposeDecodeErrorZ_get_err(LDKCResult_PaymentPurposeDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PaymentPurposeDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PaymentPurposeDecodeErrorZ* owner_conv = (LDKCResult_PaymentPurposeDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PaymentPurposeDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKClaimedHTLC CResult_ClaimedHTLCDecodeErrorZ_get_ok(LDKCResult_ClaimedHTLCDecodeErrorZ *NONNULL_PTR owner){
+       LDKClaimedHTLC ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ClaimedHTLCDecodeErrorZ* owner_conv = (LDKCResult_ClaimedHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKClaimedHTLC ret_var = CResult_ClaimedHTLCDecodeErrorZ_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_ClaimedHTLCDecodeErrorZ_get_err(LDKCResult_ClaimedHTLCDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_ClaimedHTLCDecodeErrorZ* owner_conv = (LDKCResult_ClaimedHTLCDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_ClaimedHTLCDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKPathFailure_ty_from_ptr(int64_t ptr) {
+       LDKPathFailure *obj = (LDKPathFailure*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKPathFailure_InitialSend: return 0;
+               case LDKPathFailure_OnPath: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKPathFailure_InitialSend_get_err(int64_t ptr) {
+       LDKPathFailure *obj = (LDKPathFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPathFailure_InitialSend);
+       int64_t err_ref = tag_ptr(&obj->initial_send.err, false);
+       return err_ref;
+}
+int64_t CS_LDK_LDKPathFailure_OnPath_get_network_update(int64_t ptr) {
+       LDKPathFailure *obj = (LDKPathFailure*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPathFailure_OnPath);
+       int64_t network_update_ref = tag_ptr(&obj->on_path.network_update, false);
+       return network_update_ref;
+}
+uint32_t CS_LDK_LDKCOption_PathFailureZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_PathFailureZ *obj = (LDKCOption_PathFailureZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_PathFailureZ_Some: return 0;
+               case LDKCOption_PathFailureZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_PathFailureZ_Some_get_some(int64_t ptr) {
+       LDKCOption_PathFailureZ *obj = (LDKCOption_PathFailureZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_PathFailureZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+static inline struct LDKCOption_PathFailureZ CResult_COption_PathFailureZDecodeErrorZ_get_ok(LDKCResult_COption_PathFailureZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_PathFailureZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_PathFailureZDecodeErrorZ* owner_conv = (LDKCResult_COption_PathFailureZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_PathFailureZ *ret_copy = MALLOC(sizeof(LDKCOption_PathFailureZ), "LDKCOption_PathFailureZ");
+       *ret_copy = CResult_COption_PathFailureZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_PathFailureZDecodeErrorZ_get_err(LDKCResult_COption_PathFailureZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_PathFailureZDecodeErrorZ* owner_conv = (LDKCResult_COption_PathFailureZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_PathFailureZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKClosureReason_ty_from_ptr(int64_t ptr) {
+       LDKClosureReason *obj = (LDKClosureReason*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKClosureReason_CounterpartyForceClosed: return 0;
+               case LDKClosureReason_HolderForceClosed: return 1;
+               case LDKClosureReason_CooperativeClosure: return 2;
+               case LDKClosureReason_CommitmentTxConfirmed: return 3;
+               case LDKClosureReason_FundingTimedOut: return 4;
+               case LDKClosureReason_ProcessingError: return 5;
+               case LDKClosureReason_DisconnectedPeer: return 6;
+               case LDKClosureReason_OutdatedChannelManager: return 7;
+               case LDKClosureReason_CounterpartyCoopClosedUnfundedChannel: return 8;
+               case LDKClosureReason_FundingBatchClosure: return 9;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKClosureReason_CounterpartyForceClosed_get_peer_msg(int64_t ptr) {
+       LDKClosureReason *obj = (LDKClosureReason*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKClosureReason_CounterpartyForceClosed);
+       LDKUntrustedString peer_msg_var = obj->counterparty_force_closed.peer_msg;
+                       int64_t peer_msg_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(peer_msg_var);
+                       peer_msg_ref = tag_ptr(peer_msg_var.inner, false);
+       return peer_msg_ref;
+}
+jstring CS_LDK_LDKClosureReason_ProcessingError_get_err(int64_t ptr) {
+       LDKClosureReason *obj = (LDKClosureReason*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKClosureReason_ProcessingError);
+       LDKStr err_str = obj->processing_error.err;
+                       jstring err_conv = str_ref_to_cs(err_str.chars, err_str.len);
+       return err_conv;
+}
+uint32_t CS_LDK_LDKCOption_ClosureReasonZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_ClosureReasonZ *obj = (LDKCOption_ClosureReasonZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_ClosureReasonZ_Some: return 0;
+               case LDKCOption_ClosureReasonZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_ClosureReasonZ_Some_get_some(int64_t ptr) {
+       LDKCOption_ClosureReasonZ *obj = (LDKCOption_ClosureReasonZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_ClosureReasonZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+static inline struct LDKCOption_ClosureReasonZ CResult_COption_ClosureReasonZDecodeErrorZ_get_ok(LDKCResult_COption_ClosureReasonZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_ClosureReasonZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* owner_conv = (LDKCResult_COption_ClosureReasonZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_ClosureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_ClosureReasonZ), "LDKCOption_ClosureReasonZ");
+       *ret_copy = CResult_COption_ClosureReasonZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_ClosureReasonZDecodeErrorZ_get_err(LDKCResult_COption_ClosureReasonZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* owner_conv = (LDKCResult_COption_ClosureReasonZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_ClosureReasonZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKHTLCDestination_ty_from_ptr(int64_t ptr) {
+       LDKHTLCDestination *obj = (LDKHTLCDestination*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKHTLCDestination_NextHopChannel: return 0;
+               case LDKHTLCDestination_UnknownNextHop: return 1;
+               case LDKHTLCDestination_InvalidForward: return 2;
+               case LDKHTLCDestination_FailedPayment: return 3;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKHTLCDestination_NextHopChannel_get_node_id(int64_t ptr) {
+       LDKHTLCDestination *obj = (LDKHTLCDestination*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKHTLCDestination_NextHopChannel);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->next_hop_channel.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int8_tArray CS_LDK_LDKHTLCDestination_NextHopChannel_get_channel_id(int64_t ptr) {
+       LDKHTLCDestination *obj = (LDKHTLCDestination*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKHTLCDestination_NextHopChannel);
+       int8_tArray channel_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(channel_id_arr->elems, obj->next_hop_channel.channel_id.data, 32);
+       return channel_id_arr;
+}
+int64_t CS_LDK_LDKHTLCDestination_UnknownNextHop_get_requested_forward_scid(int64_t ptr) {
+       LDKHTLCDestination *obj = (LDKHTLCDestination*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKHTLCDestination_UnknownNextHop);
+       int64_t requested_forward_scid_conv = obj->unknown_next_hop.requested_forward_scid;
+       return requested_forward_scid_conv;
+}
+int64_t CS_LDK_LDKHTLCDestination_InvalidForward_get_requested_forward_scid(int64_t ptr) {
+       LDKHTLCDestination *obj = (LDKHTLCDestination*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKHTLCDestination_InvalidForward);
+       int64_t requested_forward_scid_conv = obj->invalid_forward.requested_forward_scid;
+       return requested_forward_scid_conv;
+}
+int8_tArray CS_LDK_LDKHTLCDestination_FailedPayment_get_payment_hash(int64_t ptr) {
+       LDKHTLCDestination *obj = (LDKHTLCDestination*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKHTLCDestination_FailedPayment);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->failed_payment.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+uint32_t CS_LDK_LDKCOption_HTLCDestinationZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_HTLCDestinationZ *obj = (LDKCOption_HTLCDestinationZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_HTLCDestinationZ_Some: return 0;
+               case LDKCOption_HTLCDestinationZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_HTLCDestinationZ_Some_get_some(int64_t ptr) {
+       LDKCOption_HTLCDestinationZ *obj = (LDKCOption_HTLCDestinationZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_HTLCDestinationZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+static inline struct LDKCOption_HTLCDestinationZ CResult_COption_HTLCDestinationZDecodeErrorZ_get_ok(LDKCResult_COption_HTLCDestinationZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_HTLCDestinationZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_HTLCDestinationZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* owner_conv = (LDKCResult_COption_HTLCDestinationZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_HTLCDestinationZ *ret_copy = MALLOC(sizeof(LDKCOption_HTLCDestinationZ), "LDKCOption_HTLCDestinationZ");
+       *ret_copy = CResult_COption_HTLCDestinationZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_HTLCDestinationZDecodeErrorZ_get_err(LDKCResult_COption_HTLCDestinationZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_HTLCDestinationZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* owner_conv = (LDKCResult_COption_HTLCDestinationZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_HTLCDestinationZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline enum LDKPaymentFailureReason CResult_PaymentFailureReasonDecodeErrorZ_get_ok(LDKCResult_PaymentFailureReasonDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return PaymentFailureReason_clone(&*owner->contents.result);
+}
+int32_t  CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* owner_conv = (LDKCResult_PaymentFailureReasonDecodeErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKPaymentFailureReason_to_cs(CResult_PaymentFailureReasonDecodeErrorZ_get_ok(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKDecodeError CResult_PaymentFailureReasonDecodeErrorZ_get_err(LDKCResult_PaymentFailureReasonDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* owner_conv = (LDKCResult_PaymentFailureReasonDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PaymentFailureReasonDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKCOption_U128Z_ty_from_ptr(int64_t ptr) {
+       LDKCOption_U128Z *obj = (LDKCOption_U128Z*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_U128Z_Some: return 0;
+               case LDKCOption_U128Z_None: return 1;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKCOption_U128Z_Some_get_some(int64_t ptr) {
+       LDKCOption_U128Z *obj = (LDKCOption_U128Z*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_U128Z_Some);
+       int8_tArray some_arr = init_int8_tArray(16, __LINE__);
+       memcpy(some_arr->elems, obj->some.le_bytes, 16);
+       return some_arr;
+}
+static inline LDKCVec_ClaimedHTLCZ CVec_ClaimedHTLCZ_clone(const LDKCVec_ClaimedHTLCZ *orig) {
+       LDKCVec_ClaimedHTLCZ ret = { .data = MALLOC(sizeof(LDKClaimedHTLC) * orig->datalen, "LDKCVec_ClaimedHTLCZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = ClaimedHTLC_clone(&orig->data[i]);
+       }
+       return ret;
+}
+uint32_t CS_LDK_LDKCOption_PaymentFailureReasonZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_PaymentFailureReasonZ *obj = (LDKCOption_PaymentFailureReasonZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_PaymentFailureReasonZ_Some: return 0;
+               case LDKCOption_PaymentFailureReasonZ_None: return 1;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKCOption_PaymentFailureReasonZ_Some_get_some(int64_t ptr) {
+       LDKCOption_PaymentFailureReasonZ *obj = (LDKCOption_PaymentFailureReasonZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_PaymentFailureReasonZ_Some);
+       int32_t some_conv = LDKPaymentFailureReason_to_cs(obj->some);
+       return some_conv;
+}
+uint32_t CS_LDK_LDKBumpTransactionEvent_ty_from_ptr(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKBumpTransactionEvent_ChannelClose: return 0;
+               case LDKBumpTransactionEvent_HTLCResolution: return 1;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_claim_id(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_ChannelClose);
+       int8_tArray claim_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(claim_id_arr->elems, obj->channel_close.claim_id.data, 32);
+       return claim_id_arr;
+}
+int32_t CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_package_target_feerate_sat_per_1000_weight(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_ChannelClose);
+       int32_t package_target_feerate_sat_per_1000_weight_conv = obj->channel_close.package_target_feerate_sat_per_1000_weight;
+       return package_target_feerate_sat_per_1000_weight_conv;
+}
+int8_tArray CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_commitment_tx(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_ChannelClose);
+       LDKTransaction commitment_tx_var = obj->channel_close.commitment_tx;
+                       int8_tArray commitment_tx_arr = init_int8_tArray(commitment_tx_var.datalen, __LINE__);
+                       memcpy(commitment_tx_arr->elems, commitment_tx_var.data, commitment_tx_var.datalen);
+       return commitment_tx_arr;
+}
+int64_t CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_commitment_tx_fee_satoshis(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_ChannelClose);
+       int64_t commitment_tx_fee_satoshis_conv = obj->channel_close.commitment_tx_fee_satoshis;
+       return commitment_tx_fee_satoshis_conv;
+}
+int64_t CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_anchor_descriptor(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_ChannelClose);
+       LDKAnchorDescriptor anchor_descriptor_var = obj->channel_close.anchor_descriptor;
+                       int64_t anchor_descriptor_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(anchor_descriptor_var);
+                       anchor_descriptor_ref = tag_ptr(anchor_descriptor_var.inner, false);
+       return anchor_descriptor_ref;
+}
+int64_tArray CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_pending_htlcs(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_ChannelClose);
+       LDKCVec_HTLCOutputInCommitmentZ pending_htlcs_var = obj->channel_close.pending_htlcs;
+                       int64_tArray pending_htlcs_arr = NULL;
+                       pending_htlcs_arr = init_int64_tArray(pending_htlcs_var.datalen, __LINE__);
+                       int64_t *pending_htlcs_arr_ptr = (int64_t*)(((uint8_t*)pending_htlcs_arr) + 8);
+                       for (size_t y = 0; y < pending_htlcs_var.datalen; y++) {
+                               LDKHTLCOutputInCommitment pending_htlcs_conv_24_var = pending_htlcs_var.data[y];
+                               int64_t pending_htlcs_conv_24_ref = 0;
+                               CHECK_INNER_FIELD_ACCESS_OR_NULL(pending_htlcs_conv_24_var);
+                               pending_htlcs_conv_24_ref = tag_ptr(pending_htlcs_conv_24_var.inner, false);
+                               pending_htlcs_arr_ptr[y] = pending_htlcs_conv_24_ref;
+                       }
+                       
+       return pending_htlcs_arr;
+}
+int8_tArray CS_LDK_LDKBumpTransactionEvent_HTLCResolution_get_claim_id(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_HTLCResolution);
+       int8_tArray claim_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(claim_id_arr->elems, obj->htlc_resolution.claim_id.data, 32);
+       return claim_id_arr;
+}
+int32_t CS_LDK_LDKBumpTransactionEvent_HTLCResolution_get_target_feerate_sat_per_1000_weight(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_HTLCResolution);
+       int32_t target_feerate_sat_per_1000_weight_conv = obj->htlc_resolution.target_feerate_sat_per_1000_weight;
+       return target_feerate_sat_per_1000_weight_conv;
+}
+int64_tArray CS_LDK_LDKBumpTransactionEvent_HTLCResolution_get_htlc_descriptors(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_HTLCResolution);
+       LDKCVec_HTLCDescriptorZ htlc_descriptors_var = obj->htlc_resolution.htlc_descriptors;
+                       int64_tArray htlc_descriptors_arr = NULL;
+                       htlc_descriptors_arr = init_int64_tArray(htlc_descriptors_var.datalen, __LINE__);
+                       int64_t *htlc_descriptors_arr_ptr = (int64_t*)(((uint8_t*)htlc_descriptors_arr) + 8);
+                       for (size_t q = 0; q < htlc_descriptors_var.datalen; q++) {
+                               LDKHTLCDescriptor htlc_descriptors_conv_16_var = htlc_descriptors_var.data[q];
+                               int64_t htlc_descriptors_conv_16_ref = 0;
+                               CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_descriptors_conv_16_var);
+                               htlc_descriptors_conv_16_ref = tag_ptr(htlc_descriptors_conv_16_var.inner, false);
+                               htlc_descriptors_arr_ptr[q] = htlc_descriptors_conv_16_ref;
+                       }
+                       
+       return htlc_descriptors_arr;
+}
+int32_t CS_LDK_LDKBumpTransactionEvent_HTLCResolution_get_tx_lock_time(int64_t ptr) {
+       LDKBumpTransactionEvent *obj = (LDKBumpTransactionEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBumpTransactionEvent_HTLCResolution);
+       int32_t tx_lock_time_conv = obj->htlc_resolution.tx_lock_time;
+       return tx_lock_time_conv;
+}
+uint32_t CS_LDK_LDKEvent_ty_from_ptr(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       switch(obj->tag) {
+               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;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKEvent_FundingGenerationReady_get_temporary_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_FundingGenerationReady);
+       int8_tArray temporary_channel_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(temporary_channel_id_arr->elems, obj->funding_generation_ready.temporary_channel_id.data, 32);
+       return temporary_channel_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_FundingGenerationReady_get_counterparty_node_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_FundingGenerationReady);
+       int8_tArray counterparty_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(counterparty_node_id_arr->elems, obj->funding_generation_ready.counterparty_node_id.compressed_form, 33);
+       return counterparty_node_id_arr;
+}
+int64_t CS_LDK_LDKEvent_FundingGenerationReady_get_channel_value_satoshis(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_FundingGenerationReady);
+       int64_t channel_value_satoshis_conv = obj->funding_generation_ready.channel_value_satoshis;
+       return channel_value_satoshis_conv;
+}
+int8_tArray CS_LDK_LDKEvent_FundingGenerationReady_get_output_script(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_FundingGenerationReady);
+       LDKCVec_u8Z output_script_var = obj->funding_generation_ready.output_script;
+                       int8_tArray output_script_arr = init_int8_tArray(output_script_var.datalen, __LINE__);
+                       memcpy(output_script_arr->elems, output_script_var.data, output_script_var.datalen);
+       return output_script_arr;
+}
+int8_tArray CS_LDK_LDKEvent_FundingGenerationReady_get_user_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_FundingGenerationReady);
+       int8_tArray user_channel_id_arr = init_int8_tArray(16, __LINE__);
+       memcpy(user_channel_id_arr->elems, obj->funding_generation_ready.user_channel_id.le_bytes, 16);
+       return user_channel_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentClaimable_get_receiver_node_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       int8_tArray receiver_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(receiver_node_id_arr->elems, obj->payment_claimable.receiver_node_id.compressed_form, 33);
+       return receiver_node_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentClaimable_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->payment_claimable.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimable_get_onion_fields(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       LDKRecipientOnionFields onion_fields_var = obj->payment_claimable.onion_fields;
+                       int64_t onion_fields_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(onion_fields_var);
+                       onion_fields_ref = tag_ptr(onion_fields_var.inner, false);
+       return onion_fields_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimable_get_amount_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       int64_t amount_msat_conv = obj->payment_claimable.amount_msat;
+       return amount_msat_conv;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimable_get_counterparty_skimmed_fee_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       int64_t counterparty_skimmed_fee_msat_conv = obj->payment_claimable.counterparty_skimmed_fee_msat;
+       return counterparty_skimmed_fee_msat_conv;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimable_get_purpose(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       int64_t purpose_ref = tag_ptr(&obj->payment_claimable.purpose, false);
+       return purpose_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimable_get_via_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       int64_t via_channel_id_ref = tag_ptr(&obj->payment_claimable.via_channel_id, false);
+       return via_channel_id_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimable_get_via_user_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       int64_t via_user_channel_id_ref = tag_ptr(&obj->payment_claimable.via_user_channel_id, false);
+       return via_user_channel_id_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimable_get_claim_deadline(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimable);
+       int64_t claim_deadline_ref = tag_ptr(&obj->payment_claimable.claim_deadline, false);
+       return claim_deadline_ref;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentClaimed_get_receiver_node_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimed);
+       int8_tArray receiver_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(receiver_node_id_arr->elems, obj->payment_claimed.receiver_node_id.compressed_form, 33);
+       return receiver_node_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentClaimed_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimed);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->payment_claimed.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimed_get_amount_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimed);
+       int64_t amount_msat_conv = obj->payment_claimed.amount_msat;
+       return amount_msat_conv;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimed_get_purpose(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimed);
+       int64_t purpose_ref = tag_ptr(&obj->payment_claimed.purpose, false);
+       return purpose_ref;
+}
+int64_tArray CS_LDK_LDKEvent_PaymentClaimed_get_htlcs(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimed);
+       LDKCVec_ClaimedHTLCZ htlcs_var = obj->payment_claimed.htlcs;
+                       int64_tArray htlcs_arr = NULL;
+                       htlcs_arr = init_int64_tArray(htlcs_var.datalen, __LINE__);
+                       int64_t *htlcs_arr_ptr = (int64_t*)(((uint8_t*)htlcs_arr) + 8);
+                       for (size_t n = 0; n < htlcs_var.datalen; n++) {
+                               LDKClaimedHTLC htlcs_conv_13_var = htlcs_var.data[n];
+                               int64_t htlcs_conv_13_ref = 0;
+                               CHECK_INNER_FIELD_ACCESS_OR_NULL(htlcs_conv_13_var);
+                               htlcs_conv_13_ref = tag_ptr(htlcs_conv_13_var.inner, false);
+                               htlcs_arr_ptr[n] = htlcs_conv_13_ref;
+                       }
+                       
+       return htlcs_arr;
+}
+int64_t CS_LDK_LDKEvent_PaymentClaimed_get_sender_intended_total_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentClaimed);
+       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_InvoiceRequestFailed_get_payment_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_InvoiceRequestFailed);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->invoice_request_failed.payment_id.data, 32);
+       return payment_id_arr;
+}
+int64_t CS_LDK_LDKEvent_PaymentSent_get_payment_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentSent);
+       int64_t payment_id_ref = tag_ptr(&obj->payment_sent.payment_id, false);
+       return payment_id_ref;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentSent_get_payment_preimage(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentSent);
+       int8_tArray payment_preimage_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_preimage_arr->elems, obj->payment_sent.payment_preimage.data, 32);
+       return payment_preimage_arr;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentSent_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentSent);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->payment_sent.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKEvent_PaymentSent_get_fee_paid_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentSent);
+       int64_t fee_paid_msat_ref = tag_ptr(&obj->payment_sent.fee_paid_msat, false);
+       return fee_paid_msat_ref;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentFailed_get_payment_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentFailed);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->payment_failed.payment_id.data, 32);
+       return payment_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentFailed_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentFailed);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->payment_failed.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKEvent_PaymentFailed_get_reason(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentFailed);
+       int64_t reason_ref = tag_ptr(&obj->payment_failed.reason, false);
+       return reason_ref;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentPathSuccessful_get_payment_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathSuccessful);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->payment_path_successful.payment_id.data, 32);
+       return payment_id_arr;
+}
+int64_t CS_LDK_LDKEvent_PaymentPathSuccessful_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathSuccessful);
+       int64_t payment_hash_ref = tag_ptr(&obj->payment_path_successful.payment_hash, false);
+       return payment_hash_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentPathSuccessful_get_path(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathSuccessful);
+       LDKPath path_var = obj->payment_path_successful.path;
+                       int64_t path_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(path_var);
+                       path_ref = tag_ptr(path_var.inner, false);
+       return path_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentPathFailed_get_payment_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathFailed);
+       int64_t payment_id_ref = tag_ptr(&obj->payment_path_failed.payment_id, false);
+       return payment_id_ref;
+}
+int8_tArray CS_LDK_LDKEvent_PaymentPathFailed_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathFailed);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->payment_path_failed.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+jboolean CS_LDK_LDKEvent_PaymentPathFailed_get_payment_failed_permanently(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathFailed);
+       jboolean payment_failed_permanently_conv = obj->payment_path_failed.payment_failed_permanently;
+       return payment_failed_permanently_conv;
+}
+int64_t CS_LDK_LDKEvent_PaymentPathFailed_get_failure(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathFailed);
+       int64_t failure_ref = tag_ptr(&obj->payment_path_failed.failure, false);
+       return failure_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentPathFailed_get_path(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathFailed);
+       LDKPath path_var = obj->payment_path_failed.path;
+                       int64_t path_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(path_var);
+                       path_ref = tag_ptr(path_var.inner, false);
+       return path_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentPathFailed_get_short_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentPathFailed);
+       int64_t short_channel_id_ref = tag_ptr(&obj->payment_path_failed.short_channel_id, false);
+       return short_channel_id_ref;
+}
+int8_tArray CS_LDK_LDKEvent_ProbeSuccessful_get_payment_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ProbeSuccessful);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->probe_successful.payment_id.data, 32);
+       return payment_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_ProbeSuccessful_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ProbeSuccessful);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->probe_successful.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKEvent_ProbeSuccessful_get_path(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ProbeSuccessful);
+       LDKPath path_var = obj->probe_successful.path;
+                       int64_t path_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(path_var);
+                       path_ref = tag_ptr(path_var.inner, false);
+       return path_ref;
+}
+int8_tArray CS_LDK_LDKEvent_ProbeFailed_get_payment_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ProbeFailed);
+       int8_tArray payment_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_id_arr->elems, obj->probe_failed.payment_id.data, 32);
+       return payment_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_ProbeFailed_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ProbeFailed);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->probe_failed.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKEvent_ProbeFailed_get_path(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ProbeFailed);
+       LDKPath path_var = obj->probe_failed.path;
+                       int64_t path_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(path_var);
+                       path_ref = tag_ptr(path_var.inner, false);
+       return path_ref;
+}
+int64_t CS_LDK_LDKEvent_ProbeFailed_get_short_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ProbeFailed);
+       int64_t short_channel_id_ref = tag_ptr(&obj->probe_failed.short_channel_id, false);
+       return short_channel_id_ref;
+}
+int64_t CS_LDK_LDKEvent_PendingHTLCsForwardable_get_time_forwardable(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PendingHTLCsForwardable);
+       int64_t time_forwardable_conv = obj->pending_htl_cs_forwardable.time_forwardable;
+       return time_forwardable_conv;
+}
+int8_tArray CS_LDK_LDKEvent_HTLCIntercepted_get_intercept_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_HTLCIntercepted);
+       int8_tArray intercept_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(intercept_id_arr->elems, obj->htlc_intercepted.intercept_id.data, 32);
+       return intercept_id_arr;
+}
+int64_t CS_LDK_LDKEvent_HTLCIntercepted_get_requested_next_hop_scid(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_HTLCIntercepted);
+       int64_t requested_next_hop_scid_conv = obj->htlc_intercepted.requested_next_hop_scid;
+       return requested_next_hop_scid_conv;
+}
+int8_tArray CS_LDK_LDKEvent_HTLCIntercepted_get_payment_hash(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_HTLCIntercepted);
+       int8_tArray payment_hash_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_hash_arr->elems, obj->htlc_intercepted.payment_hash.data, 32);
+       return payment_hash_arr;
+}
+int64_t CS_LDK_LDKEvent_HTLCIntercepted_get_inbound_amount_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_HTLCIntercepted);
+       int64_t inbound_amount_msat_conv = obj->htlc_intercepted.inbound_amount_msat;
+       return inbound_amount_msat_conv;
+}
+int64_t CS_LDK_LDKEvent_HTLCIntercepted_get_expected_outbound_amount_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_HTLCIntercepted);
+       int64_t expected_outbound_amount_msat_conv = obj->htlc_intercepted.expected_outbound_amount_msat;
+       return expected_outbound_amount_msat_conv;
+}
+int64_tArray CS_LDK_LDKEvent_SpendableOutputs_get_outputs(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_SpendableOutputs);
+       LDKCVec_SpendableOutputDescriptorZ outputs_var = obj->spendable_outputs.outputs;
+                       int64_tArray outputs_arr = NULL;
+                       outputs_arr = init_int64_tArray(outputs_var.datalen, __LINE__);
+                       int64_t *outputs_arr_ptr = (int64_t*)(((uint8_t*)outputs_arr) + 8);
+                       for (size_t b = 0; b < outputs_var.datalen; b++) {
+                               int64_t outputs_conv_27_ref = tag_ptr(&outputs_var.data[b], false);
+                               outputs_arr_ptr[b] = outputs_conv_27_ref;
+                       }
+                       
+       return outputs_arr;
+}
+int64_t CS_LDK_LDKEvent_SpendableOutputs_get_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_SpendableOutputs);
+       int64_t channel_id_ref = tag_ptr(&obj->spendable_outputs.channel_id, false);
+       return channel_id_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentForwarded_get_prev_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentForwarded);
+       int64_t prev_channel_id_ref = tag_ptr(&obj->payment_forwarded.prev_channel_id, false);
+       return prev_channel_id_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentForwarded_get_next_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentForwarded);
+       int64_t next_channel_id_ref = tag_ptr(&obj->payment_forwarded.next_channel_id, false);
+       return next_channel_id_ref;
+}
+int64_t CS_LDK_LDKEvent_PaymentForwarded_get_fee_earned_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentForwarded);
+       int64_t fee_earned_msat_ref = tag_ptr(&obj->payment_forwarded.fee_earned_msat, false);
+       return fee_earned_msat_ref;
+}
+jboolean CS_LDK_LDKEvent_PaymentForwarded_get_claim_from_onchain_tx(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentForwarded);
+       jboolean claim_from_onchain_tx_conv = obj->payment_forwarded.claim_from_onchain_tx;
+       return claim_from_onchain_tx_conv;
+}
+int64_t CS_LDK_LDKEvent_PaymentForwarded_get_outbound_amount_forwarded_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_PaymentForwarded);
+       int64_t outbound_amount_forwarded_msat_ref = tag_ptr(&obj->payment_forwarded.outbound_amount_forwarded_msat, false);
+       return outbound_amount_forwarded_msat_ref;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelPending_get_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelPending);
+       int8_tArray channel_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(channel_id_arr->elems, obj->channel_pending.channel_id.data, 32);
+       return channel_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelPending_get_user_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelPending);
+       int8_tArray user_channel_id_arr = init_int8_tArray(16, __LINE__);
+       memcpy(user_channel_id_arr->elems, obj->channel_pending.user_channel_id.le_bytes, 16);
+       return user_channel_id_arr;
+}
+int64_t CS_LDK_LDKEvent_ChannelPending_get_former_temporary_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelPending);
+       int64_t former_temporary_channel_id_ref = tag_ptr(&obj->channel_pending.former_temporary_channel_id, false);
+       return former_temporary_channel_id_ref;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelPending_get_counterparty_node_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelPending);
+       int8_tArray counterparty_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(counterparty_node_id_arr->elems, obj->channel_pending.counterparty_node_id.compressed_form, 33);
+       return counterparty_node_id_arr;
+}
+int64_t CS_LDK_LDKEvent_ChannelPending_get_funding_txo(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelPending);
+       LDKOutPoint funding_txo_var = obj->channel_pending.funding_txo;
+                       int64_t funding_txo_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_var);
+                       funding_txo_ref = tag_ptr(funding_txo_var.inner, false);
+       return funding_txo_ref;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelReady_get_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelReady);
+       int8_tArray channel_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(channel_id_arr->elems, obj->channel_ready.channel_id.data, 32);
+       return channel_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelReady_get_user_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelReady);
+       int8_tArray user_channel_id_arr = init_int8_tArray(16, __LINE__);
+       memcpy(user_channel_id_arr->elems, obj->channel_ready.user_channel_id.le_bytes, 16);
+       return user_channel_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelReady_get_counterparty_node_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelReady);
+       int8_tArray counterparty_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(counterparty_node_id_arr->elems, obj->channel_ready.counterparty_node_id.compressed_form, 33);
+       return counterparty_node_id_arr;
+}
+int64_t CS_LDK_LDKEvent_ChannelReady_get_channel_type(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelReady);
+       LDKChannelTypeFeatures channel_type_var = obj->channel_ready.channel_type;
+                       int64_t channel_type_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_var);
+                       channel_type_ref = tag_ptr(channel_type_var.inner, false);
+       return channel_type_ref;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelClosed_get_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelClosed);
+       int8_tArray channel_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(channel_id_arr->elems, obj->channel_closed.channel_id.data, 32);
+       return channel_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelClosed_get_user_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelClosed);
+       int8_tArray user_channel_id_arr = init_int8_tArray(16, __LINE__);
+       memcpy(user_channel_id_arr->elems, obj->channel_closed.user_channel_id.le_bytes, 16);
+       return user_channel_id_arr;
+}
+int64_t CS_LDK_LDKEvent_ChannelClosed_get_reason(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelClosed);
+       int64_t reason_ref = tag_ptr(&obj->channel_closed.reason, false);
+       return reason_ref;
+}
+int8_tArray CS_LDK_LDKEvent_ChannelClosed_get_counterparty_node_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelClosed);
+       int8_tArray counterparty_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(counterparty_node_id_arr->elems, obj->channel_closed.counterparty_node_id.compressed_form, 33);
+       return counterparty_node_id_arr;
+}
+int64_t CS_LDK_LDKEvent_ChannelClosed_get_channel_capacity_sats(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelClosed);
+       int64_t channel_capacity_sats_ref = tag_ptr(&obj->channel_closed.channel_capacity_sats, false);
+       return channel_capacity_sats_ref;
+}
+int8_tArray CS_LDK_LDKEvent_DiscardFunding_get_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_DiscardFunding);
+       int8_tArray channel_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(channel_id_arr->elems, obj->discard_funding.channel_id.data, 32);
+       return channel_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_DiscardFunding_get_transaction(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_DiscardFunding);
+       LDKTransaction transaction_var = obj->discard_funding.transaction;
+                       int8_tArray transaction_arr = init_int8_tArray(transaction_var.datalen, __LINE__);
+                       memcpy(transaction_arr->elems, transaction_var.data, transaction_var.datalen);
+       return transaction_arr;
+}
+int8_tArray CS_LDK_LDKEvent_OpenChannelRequest_get_temporary_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_OpenChannelRequest);
+       int8_tArray temporary_channel_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(temporary_channel_id_arr->elems, obj->open_channel_request.temporary_channel_id.data, 32);
+       return temporary_channel_id_arr;
+}
+int8_tArray CS_LDK_LDKEvent_OpenChannelRequest_get_counterparty_node_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_OpenChannelRequest);
+       int8_tArray counterparty_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(counterparty_node_id_arr->elems, obj->open_channel_request.counterparty_node_id.compressed_form, 33);
+       return counterparty_node_id_arr;
+}
+int64_t CS_LDK_LDKEvent_OpenChannelRequest_get_funding_satoshis(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_OpenChannelRequest);
+       int64_t funding_satoshis_conv = obj->open_channel_request.funding_satoshis;
+       return funding_satoshis_conv;
+}
+int64_t CS_LDK_LDKEvent_OpenChannelRequest_get_push_msat(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_OpenChannelRequest);
+       int64_t push_msat_conv = obj->open_channel_request.push_msat;
+       return push_msat_conv;
+}
+int64_t CS_LDK_LDKEvent_OpenChannelRequest_get_channel_type(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_OpenChannelRequest);
+       LDKChannelTypeFeatures channel_type_var = obj->open_channel_request.channel_type;
+                       int64_t channel_type_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_var);
+                       channel_type_ref = tag_ptr(channel_type_var.inner, false);
+       return channel_type_ref;
+}
+int8_tArray CS_LDK_LDKEvent_HTLCHandlingFailed_get_prev_channel_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_HTLCHandlingFailed);
+       int8_tArray prev_channel_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(prev_channel_id_arr->elems, obj->htlc_handling_failed.prev_channel_id.data, 32);
+       return prev_channel_id_arr;
+}
+int64_t CS_LDK_LDKEvent_HTLCHandlingFailed_get_failed_next_destination(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_HTLCHandlingFailed);
+       int64_t failed_next_destination_ref = tag_ptr(&obj->htlc_handling_failed.failed_next_destination, false);
+       return failed_next_destination_ref;
+}
+int64_t CS_LDK_LDKEvent_BumpTransaction_get_bump_transaction(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_BumpTransaction);
+       int64_t bump_transaction_ref = tag_ptr(&obj->bump_transaction, false);
+       return bump_transaction_ref;
+}
+uint32_t CS_LDK_LDKCOption_EventZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_EventZ *obj = (LDKCOption_EventZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_EventZ_Some: return 0;
+               case LDKCOption_EventZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_EventZ_Some_get_some(int64_t ptr) {
+       LDKCOption_EventZ *obj = (LDKCOption_EventZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_EventZ_Some);
+       int64_t some_ref = tag_ptr(&obj->some, false);
+       return some_ref;
+}
+static inline struct LDKCOption_EventZ CResult_COption_EventZDecodeErrorZ_get_ok(LDKCResult_COption_EventZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return COption_EventZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_COption_EventZDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_COption_EventZDecodeErrorZ* owner_conv = (LDKCResult_COption_EventZDecodeErrorZ*)untag_ptr(owner);
+       LDKCOption_EventZ *ret_copy = MALLOC(sizeof(LDKCOption_EventZ), "LDKCOption_EventZ");
+       *ret_copy = CResult_COption_EventZDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_COption_EventZDecodeErrorZ_get_err(LDKCResult_COption_EventZDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_COption_EventZDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_COption_EventZDecodeErrorZ* owner_conv = (LDKCResult_COption_EventZDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_COption_EventZDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKBolt11ParseError_ty_from_ptr(int64_t ptr) {
+       LDKBolt11ParseError *obj = (LDKBolt11ParseError*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKBolt11ParseError_Bech32Error: return 0;
+               case LDKBolt11ParseError_ParseAmountError: return 1;
+               case LDKBolt11ParseError_MalformedSignature: return 2;
+               case LDKBolt11ParseError_BadPrefix: return 3;
+               case LDKBolt11ParseError_UnknownCurrency: return 4;
+               case LDKBolt11ParseError_UnknownSiPrefix: return 5;
+               case LDKBolt11ParseError_MalformedHRP: return 6;
+               case LDKBolt11ParseError_TooShortDataPart: return 7;
+               case LDKBolt11ParseError_UnexpectedEndOfTaggedFields: return 8;
+               case LDKBolt11ParseError_DescriptionDecodeError: return 9;
+               case LDKBolt11ParseError_PaddingError: return 10;
+               case LDKBolt11ParseError_IntegerOverflowError: return 11;
+               case LDKBolt11ParseError_InvalidSegWitProgramLength: return 12;
+               case LDKBolt11ParseError_InvalidPubKeyHashLength: return 13;
+               case LDKBolt11ParseError_InvalidScriptHashLength: return 14;
+               case LDKBolt11ParseError_InvalidRecoveryId: return 15;
+               case LDKBolt11ParseError_InvalidSliceLength: return 16;
+               case LDKBolt11ParseError_Skip: return 17;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKBolt11ParseError_Bech32Error_get_bech32_error(int64_t ptr) {
+       LDKBolt11ParseError *obj = (LDKBolt11ParseError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBolt11ParseError_Bech32Error);
+       int64_t bech32_error_ref = tag_ptr(&obj->bech32_error, false);
+       return bech32_error_ref;
+}
+int32_t CS_LDK_LDKBolt11ParseError_ParseAmountError_get_parse_amount_error(int64_t ptr) {
+       LDKBolt11ParseError *obj = (LDKBolt11ParseError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBolt11ParseError_ParseAmountError);
+       /*obj->parse_amount_error*/
+       return 0;
+}
+int32_t CS_LDK_LDKBolt11ParseError_MalformedSignature_get_malformed_signature(int64_t ptr) {
+       LDKBolt11ParseError *obj = (LDKBolt11ParseError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBolt11ParseError_MalformedSignature);
+       int32_t malformed_signature_conv = LDKSecp256k1Error_to_cs(obj->malformed_signature);
+       return malformed_signature_conv;
+}
+int32_t CS_LDK_LDKBolt11ParseError_DescriptionDecodeError_get_description_decode_error(int64_t ptr) {
+       LDKBolt11ParseError *obj = (LDKBolt11ParseError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBolt11ParseError_DescriptionDecodeError);
+       /*obj->description_decode_error*/
+       return 0;
+}
+jstring CS_LDK_LDKBolt11ParseError_InvalidSliceLength_get_invalid_slice_length(int64_t ptr) {
+       LDKBolt11ParseError *obj = (LDKBolt11ParseError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKBolt11ParseError_InvalidSliceLength);
+       LDKStr invalid_slice_length_str = obj->invalid_slice_length;
+                       jstring invalid_slice_length_conv = str_ref_to_cs(invalid_slice_length_str.chars, invalid_slice_length_str.len);
+       return invalid_slice_length_conv;
+}
+static inline enum LDKSiPrefix CResult_SiPrefixBolt11ParseErrorZ_get_ok(LDKCResult_SiPrefixBolt11ParseErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return SiPrefix_clone(&*owner->contents.result);
+}
+int32_t  CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SiPrefixBolt11ParseErrorZ* owner_conv = (LDKCResult_SiPrefixBolt11ParseErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKSiPrefix_to_cs(CResult_SiPrefixBolt11ParseErrorZ_get_ok(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKBolt11ParseError CResult_SiPrefixBolt11ParseErrorZ_get_err(LDKCResult_SiPrefixBolt11ParseErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return Bolt11ParseError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_get_err(int64_t owner) {
+       LDKCResult_SiPrefixBolt11ParseErrorZ* owner_conv = (LDKCResult_SiPrefixBolt11ParseErrorZ*)untag_ptr(owner);
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = CResult_SiPrefixBolt11ParseErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKParseOrSemanticError_ty_from_ptr(int64_t ptr) {
+       LDKParseOrSemanticError *obj = (LDKParseOrSemanticError*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKParseOrSemanticError_ParseError: return 0;
+               case LDKParseOrSemanticError_SemanticError: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKParseOrSemanticError_ParseError_get_parse_error(int64_t ptr) {
+       LDKParseOrSemanticError *obj = (LDKParseOrSemanticError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKParseOrSemanticError_ParseError);
+       int64_t parse_error_ref = tag_ptr(&obj->parse_error, false);
+       return parse_error_ref;
+}
+int32_t CS_LDK_LDKParseOrSemanticError_SemanticError_get_semantic_error(int64_t ptr) {
+       LDKParseOrSemanticError *obj = (LDKParseOrSemanticError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKParseOrSemanticError_SemanticError);
+       int32_t semantic_error_conv = LDKBolt11SemanticError_to_cs(obj->semantic_error);
+       return semantic_error_conv;
+}
+static inline struct LDKBolt11Invoice CResult_Bolt11InvoiceParseOrSemanticErrorZ_get_ok(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ *NONNULL_PTR owner){
+       LDKBolt11Invoice ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceParseOrSemanticErrorZ_get_ok(int64_t owner) {
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* owner_conv = (LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ*)untag_ptr(owner);
+       LDKBolt11Invoice ret_var = CResult_Bolt11InvoiceParseOrSemanticErrorZ_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 LDKParseOrSemanticError CResult_Bolt11InvoiceParseOrSemanticErrorZ_get_err(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return ParseOrSemanticError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceParseOrSemanticErrorZ_get_err(int64_t owner) {
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* owner_conv = (LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ*)untag_ptr(owner);
+       LDKParseOrSemanticError *ret_copy = MALLOC(sizeof(LDKParseOrSemanticError), "LDKParseOrSemanticError");
+       *ret_copy = CResult_Bolt11InvoiceParseOrSemanticErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKSignedRawBolt11Invoice CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_get_ok(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ *NONNULL_PTR owner){
+       LDKSignedRawBolt11Invoice ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* owner_conv = (LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ*)untag_ptr(owner);
+       LDKSignedRawBolt11Invoice ret_var = CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_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 LDKBolt11ParseError CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_get_err(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return Bolt11ParseError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_get_err(int64_t owner) {
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* owner_conv = (LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ*)untag_ptr(owner);
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKRawBolt11Invoice C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_a(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ *NONNULL_PTR owner){
+       LDKRawBolt11Invoice ret = owner->a;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_a(int64_t owner) {
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* owner_conv = (LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ*)untag_ptr(owner);
+       LDKRawBolt11Invoice ret_var = C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_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 LDKThirtyTwoBytes C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_b(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->b);
+}
+int8_tArray  CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_b(int64_t owner) {
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* owner_conv = (LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_b(owner_conv).data, 32);
+       return ret_arr;
+}
+
+static inline struct LDKBolt11InvoiceSignature C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_c(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ *NONNULL_PTR owner){
+       LDKBolt11InvoiceSignature ret = owner->c;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_c(int64_t owner) {
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* owner_conv = (LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ*)untag_ptr(owner);
+       LDKBolt11InvoiceSignature ret_var = C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_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;
+}
+
+static inline struct LDKPayeePubKey CResult_PayeePubKeySecp256k1ErrorZ_get_ok(LDKCResult_PayeePubKeySecp256k1ErrorZ *NONNULL_PTR owner){
+       LDKPayeePubKey ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* owner_conv = (LDKCResult_PayeePubKeySecp256k1ErrorZ*)untag_ptr(owner);
+       LDKPayeePubKey ret_var = CResult_PayeePubKeySecp256k1ErrorZ_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 enum LDKSecp256k1Error CResult_PayeePubKeySecp256k1ErrorZ_get_err(LDKCResult_PayeePubKeySecp256k1ErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+int32_t  CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_get_err(int64_t owner) {
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* owner_conv = (LDKCResult_PayeePubKeySecp256k1ErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKSecp256k1Error_to_cs(CResult_PayeePubKeySecp256k1ErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline LDKCVec_PrivateRouteZ CVec_PrivateRouteZ_clone(const LDKCVec_PrivateRouteZ *orig) {
+       LDKCVec_PrivateRouteZ ret = { .data = MALLOC(sizeof(LDKPrivateRoute) * orig->datalen, "LDKCVec_PrivateRouteZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = PrivateRoute_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKPositiveTimestamp CResult_PositiveTimestampCreationErrorZ_get_ok(LDKCResult_PositiveTimestampCreationErrorZ *NONNULL_PTR owner){
+       LDKPositiveTimestamp ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PositiveTimestampCreationErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PositiveTimestampCreationErrorZ* owner_conv = (LDKCResult_PositiveTimestampCreationErrorZ*)untag_ptr(owner);
+       LDKPositiveTimestamp ret_var = CResult_PositiveTimestampCreationErrorZ_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 enum LDKCreationError CResult_PositiveTimestampCreationErrorZ_get_err(LDKCResult_PositiveTimestampCreationErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return CreationError_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_PositiveTimestampCreationErrorZ_get_err(int64_t owner) {
+       LDKCResult_PositiveTimestampCreationErrorZ* owner_conv = (LDKCResult_PositiveTimestampCreationErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKCreationError_to_cs(CResult_PositiveTimestampCreationErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline void CResult_NoneBolt11SemanticErrorZ_get_ok(LDKCResult_NoneBolt11SemanticErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+void  CS_LDK_CResult_NoneBolt11SemanticErrorZ_get_ok(int64_t owner) {
+       LDKCResult_NoneBolt11SemanticErrorZ* owner_conv = (LDKCResult_NoneBolt11SemanticErrorZ*)untag_ptr(owner);
+       CResult_NoneBolt11SemanticErrorZ_get_ok(owner_conv);
+}
+
+static inline enum LDKBolt11SemanticError CResult_NoneBolt11SemanticErrorZ_get_err(LDKCResult_NoneBolt11SemanticErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return Bolt11SemanticError_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_NoneBolt11SemanticErrorZ_get_err(int64_t owner) {
+       LDKCResult_NoneBolt11SemanticErrorZ* owner_conv = (LDKCResult_NoneBolt11SemanticErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(CResult_NoneBolt11SemanticErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKBolt11Invoice CResult_Bolt11InvoiceBolt11SemanticErrorZ_get_ok(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ *NONNULL_PTR owner){
+       LDKBolt11Invoice ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_get_ok(int64_t owner) {
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* owner_conv = (LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ*)untag_ptr(owner);
+       LDKBolt11Invoice ret_var = CResult_Bolt11InvoiceBolt11SemanticErrorZ_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 enum LDKBolt11SemanticError CResult_Bolt11InvoiceBolt11SemanticErrorZ_get_err(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return Bolt11SemanticError_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_get_err(int64_t owner) {
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* owner_conv = (LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(CResult_Bolt11InvoiceBolt11SemanticErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKDescription CResult_DescriptionCreationErrorZ_get_ok(LDKCResult_DescriptionCreationErrorZ *NONNULL_PTR owner){
+       LDKDescription ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_DescriptionCreationErrorZ_get_ok(int64_t owner) {
+       LDKCResult_DescriptionCreationErrorZ* owner_conv = (LDKCResult_DescriptionCreationErrorZ*)untag_ptr(owner);
+       LDKDescription ret_var = CResult_DescriptionCreationErrorZ_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 enum LDKCreationError CResult_DescriptionCreationErrorZ_get_err(LDKCResult_DescriptionCreationErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return CreationError_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_DescriptionCreationErrorZ_get_err(int64_t owner) {
+       LDKCResult_DescriptionCreationErrorZ* owner_conv = (LDKCResult_DescriptionCreationErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKCreationError_to_cs(CResult_DescriptionCreationErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKPrivateRoute CResult_PrivateRouteCreationErrorZ_get_ok(LDKCResult_PrivateRouteCreationErrorZ *NONNULL_PTR owner){
+       LDKPrivateRoute ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PrivateRouteCreationErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PrivateRouteCreationErrorZ* owner_conv = (LDKCResult_PrivateRouteCreationErrorZ*)untag_ptr(owner);
+       LDKPrivateRoute ret_var = CResult_PrivateRouteCreationErrorZ_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 enum LDKCreationError CResult_PrivateRouteCreationErrorZ_get_err(LDKCResult_PrivateRouteCreationErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return CreationError_clone(&*owner->contents.err);
+}
+int32_t  CS_LDK_CResult_PrivateRouteCreationErrorZ_get_err(int64_t owner) {
+       LDKCResult_PrivateRouteCreationErrorZ* owner_conv = (LDKCResult_PrivateRouteCreationErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKCreationError_to_cs(CResult_PrivateRouteCreationErrorZ_get_err(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKOutPoint CResult_OutPointDecodeErrorZ_get_ok(LDKCResult_OutPointDecodeErrorZ *NONNULL_PTR owner){
+       LDKOutPoint ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_OutPointDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_OutPointDecodeErrorZ* owner_conv = (LDKCResult_OutPointDecodeErrorZ*)untag_ptr(owner);
+       LDKOutPoint ret_var = CResult_OutPointDecodeErrorZ_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_OutPointDecodeErrorZ_get_err(LDKCResult_OutPointDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_OutPointDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_OutPointDecodeErrorZ* owner_conv = (LDKCResult_OutPointDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_OutPointDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBigSize CResult_BigSizeDecodeErrorZ_get_ok(LDKCResult_BigSizeDecodeErrorZ *NONNULL_PTR owner){
+       LDKBigSize ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BigSizeDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BigSizeDecodeErrorZ* owner_conv = (LDKCResult_BigSizeDecodeErrorZ*)untag_ptr(owner);
+       LDKBigSize ret_var = CResult_BigSizeDecodeErrorZ_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_BigSizeDecodeErrorZ_get_err(LDKCResult_BigSizeDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BigSizeDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BigSizeDecodeErrorZ* owner_conv = (LDKCResult_BigSizeDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BigSizeDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKHostname CResult_HostnameDecodeErrorZ_get_ok(LDKCResult_HostnameDecodeErrorZ *NONNULL_PTR owner){
+       LDKHostname ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_HostnameDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_HostnameDecodeErrorZ* owner_conv = (LDKCResult_HostnameDecodeErrorZ*)untag_ptr(owner);
+       LDKHostname ret_var = CResult_HostnameDecodeErrorZ_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_HostnameDecodeErrorZ_get_err(LDKCResult_HostnameDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_HostnameDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_HostnameDecodeErrorZ* owner_conv = (LDKCResult_HostnameDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_HostnameDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKTransactionU16LenLimited CResult_TransactionU16LenLimitedNoneZ_get_ok(LDKCResult_TransactionU16LenLimitedNoneZ *NONNULL_PTR owner){
+       LDKTransactionU16LenLimited ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedNoneZ_get_ok(int64_t owner) {
+       LDKCResult_TransactionU16LenLimitedNoneZ* owner_conv = (LDKCResult_TransactionU16LenLimitedNoneZ*)untag_ptr(owner);
+       LDKTransactionU16LenLimited ret_var = CResult_TransactionU16LenLimitedNoneZ_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_TransactionU16LenLimitedNoneZ_get_err(LDKCResult_TransactionU16LenLimitedNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_TransactionU16LenLimitedNoneZ_get_err(int64_t owner) {
+       LDKCResult_TransactionU16LenLimitedNoneZ* owner_conv = (LDKCResult_TransactionU16LenLimitedNoneZ*)untag_ptr(owner);
+       CResult_TransactionU16LenLimitedNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKTransactionU16LenLimited CResult_TransactionU16LenLimitedDecodeErrorZ_get_ok(LDKCResult_TransactionU16LenLimitedDecodeErrorZ *NONNULL_PTR owner){
+       LDKTransactionU16LenLimited ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* owner_conv = (LDKCResult_TransactionU16LenLimitedDecodeErrorZ*)untag_ptr(owner);
+       LDKTransactionU16LenLimited ret_var = CResult_TransactionU16LenLimitedDecodeErrorZ_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_TransactionU16LenLimitedDecodeErrorZ_get_err(LDKCResult_TransactionU16LenLimitedDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* owner_conv = (LDKCResult_TransactionU16LenLimitedDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_TransactionU16LenLimitedDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKUntrustedString CResult_UntrustedStringDecodeErrorZ_get_ok(LDKCResult_UntrustedStringDecodeErrorZ *NONNULL_PTR owner){
+       LDKUntrustedString ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_UntrustedStringDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_UntrustedStringDecodeErrorZ* owner_conv = (LDKCResult_UntrustedStringDecodeErrorZ*)untag_ptr(owner);
+       LDKUntrustedString ret_var = CResult_UntrustedStringDecodeErrorZ_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_UntrustedStringDecodeErrorZ_get_err(LDKCResult_UntrustedStringDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_UntrustedStringDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_UntrustedStringDecodeErrorZ* owner_conv = (LDKCResult_UntrustedStringDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_UntrustedStringDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       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;
+}
+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;
+}
+
+static inline struct LDKDecodeError CResult_ReceiveTlvsDecodeErrorZ_get_err(LDKCResult_ReceiveTlvsDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+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;
+}
+
+static inline struct LDKPaymentRelay CResult_PaymentRelayDecodeErrorZ_get_ok(LDKCResult_PaymentRelayDecodeErrorZ *NONNULL_PTR owner){
+       LDKPaymentRelay ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PaymentRelayDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PaymentRelayDecodeErrorZ* owner_conv = (LDKCResult_PaymentRelayDecodeErrorZ*)untag_ptr(owner);
+       LDKPaymentRelay ret_var = CResult_PaymentRelayDecodeErrorZ_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_PaymentRelayDecodeErrorZ_get_err(LDKCResult_PaymentRelayDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PaymentRelayDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PaymentRelayDecodeErrorZ* owner_conv = (LDKCResult_PaymentRelayDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PaymentRelayDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKPaymentConstraints CResult_PaymentConstraintsDecodeErrorZ_get_ok(LDKCResult_PaymentConstraintsDecodeErrorZ *NONNULL_PTR owner){
+       LDKPaymentConstraints ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PaymentConstraintsDecodeErrorZ* owner_conv = (LDKCResult_PaymentConstraintsDecodeErrorZ*)untag_ptr(owner);
+       LDKPaymentConstraints ret_var = CResult_PaymentConstraintsDecodeErrorZ_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_PaymentConstraintsDecodeErrorZ_get_err(LDKCResult_PaymentConstraintsDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PaymentConstraintsDecodeErrorZ* owner_conv = (LDKCResult_PaymentConstraintsDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PaymentConstraintsDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       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);
+}
+int8_tArray  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_get_ok(int64_t owner) {
+       LDKCResult_ThirtyTwoBytesPaymentErrorZ* owner_conv = (LDKCResult_ThirtyTwoBytesPaymentErrorZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, CResult_ThirtyTwoBytesPaymentErrorZ_get_ok(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);
+}
+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);
+       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);
+}
+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);
+       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){
+CHECK(owner->result_ok);
+       return CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ_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;
+}
+
+static inline struct LDKProbingError CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_err(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return ProbingError_clone(&*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;
+}
+
+static inline struct LDKStr CResult_StrSecp256k1ErrorZ_get_ok(LDKCResult_StrSecp256k1ErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+jstring  CS_LDK_CResult_StrSecp256k1ErrorZ_get_ok(int64_t owner) {
+       LDKCResult_StrSecp256k1ErrorZ* owner_conv = (LDKCResult_StrSecp256k1ErrorZ*)untag_ptr(owner);
+       LDKStr ret_str = CResult_StrSecp256k1ErrorZ_get_ok(owner_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       return ret_conv;
+}
+
+static inline enum LDKSecp256k1Error CResult_StrSecp256k1ErrorZ_get_err(LDKCResult_StrSecp256k1ErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+int32_t  CS_LDK_CResult_StrSecp256k1ErrorZ_get_err(int64_t owner) {
+       LDKCResult_StrSecp256k1ErrorZ* owner_conv = (LDKCResult_StrSecp256k1ErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKSecp256k1Error_to_cs(CResult_StrSecp256k1ErrorZ_get_err(owner_conv));
+       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){
+       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 ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_PublicKeyOnionMessageZ_get_a(owner_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+static inline struct LDKOnionMessage C2Tuple_PublicKeyOnionMessageZ_get_b(LDKC2Tuple_PublicKeyOnionMessageZ *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 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_LDKSendError_ty_from_ptr(int64_t ptr) {
+       LDKSendError *obj = (LDKSendError*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKSendError_Secp256k1: return 0;
+               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;
+               default: abort();
+       }
+}
+int32_t CS_LDK_LDKSendError_Secp256k1_get_secp256k1(int64_t ptr) {
+       LDKSendError *obj = (LDKSendError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSendError_Secp256k1);
+       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){
+CHECK(owner->result_ok);
+       return C2Tuple_PublicKeyOnionMessageZ_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);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline struct LDKSendError CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_err(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ *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);
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKParsedOnionMessageContents_ty_from_ptr(int64_t ptr) {
+       LDKParsedOnionMessageContents *obj = (LDKParsedOnionMessageContents*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKParsedOnionMessageContents_Offers: return 0;
+               case LDKParsedOnionMessageContents_Custom: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKParsedOnionMessageContents_Offers_get_offers(int64_t ptr) {
+       LDKParsedOnionMessageContents *obj = (LDKParsedOnionMessageContents*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKParsedOnionMessageContents_Offers);
+       int64_t offers_ref = tag_ptr(&obj->offers, false);
+       return offers_ref;
+}
+int64_t CS_LDK_LDKParsedOnionMessageContents_Custom_get_custom(int64_t ptr) {
+       LDKParsedOnionMessageContents *obj = (LDKParsedOnionMessageContents*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKParsedOnionMessageContents_Custom);
+       LDKOnionMessageContents* custom_ret = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
+       *custom_ret = OnionMessageContents_clone(&obj->custom);
+       return tag_ptr(custom_ret, true);
+}
+uint32_t CS_LDK_LDKPeeledOnion_ty_from_ptr(int64_t ptr) {
+       LDKPeeledOnion *obj = (LDKPeeledOnion*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKPeeledOnion_Forward: return 0;
+               case LDKPeeledOnion_Receive: return 1;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKPeeledOnion_Forward_get__0(int64_t ptr) {
+       LDKPeeledOnion *obj = (LDKPeeledOnion*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPeeledOnion_Forward);
+       int8_tArray _0_arr = init_int8_tArray(33, __LINE__);
+       memcpy(_0_arr->elems, obj->forward._0.compressed_form, 33);
+       return _0_arr;
+}
+int64_t CS_LDK_LDKPeeledOnion_Forward_get__1(int64_t ptr) {
+       LDKPeeledOnion *obj = (LDKPeeledOnion*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPeeledOnion_Forward);
+       LDKOnionMessage _1_var = obj->forward._1;
+                       int64_t _1_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(_1_var);
+                       _1_ref = tag_ptr(_1_var.inner, false);
+       return _1_ref;
+}
+int64_t CS_LDK_LDKPeeledOnion_Receive_get__0(int64_t ptr) {
+       LDKPeeledOnion *obj = (LDKPeeledOnion*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPeeledOnion_Receive);
+       int64_t _0_ref = tag_ptr(&obj->receive._0, false);
+       return _0_ref;
+}
+int8_tArray CS_LDK_LDKPeeledOnion_Receive_get__1(int64_t ptr) {
+       LDKPeeledOnion *obj = (LDKPeeledOnion*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPeeledOnion_Receive);
+       int8_tArray _1_arr = init_int8_tArray(32, __LINE__);
+       memcpy(_1_arr->elems, obj->receive._1.data, 32);
+       return _1_arr;
+}
+int64_t CS_LDK_LDKPeeledOnion_Receive_get__2(int64_t ptr) {
+       LDKPeeledOnion *obj = (LDKPeeledOnion*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPeeledOnion_Receive);
+       LDKBlindedPath _2_var = obj->receive._2;
+                       int64_t _2_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(_2_var);
+                       _2_ref = tag_ptr(_2_var.inner, false);
+       return _2_ref;
+}
+static inline struct LDKPeeledOnion CResult_PeeledOnionNoneZ_get_ok(LDKCResult_PeeledOnionNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return PeeledOnion_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_PeeledOnionNoneZ_get_ok(int64_t owner) {
+       LDKCResult_PeeledOnionNoneZ* owner_conv = (LDKCResult_PeeledOnionNoneZ*)untag_ptr(owner);
+       LDKPeeledOnion *ret_copy = MALLOC(sizeof(LDKPeeledOnion), "LDKPeeledOnion");
+       *ret_copy = CResult_PeeledOnionNoneZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline void CResult_PeeledOnionNoneZ_get_err(LDKCResult_PeeledOnionNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_PeeledOnionNoneZ_get_err(int64_t owner) {
+       LDKCResult_PeeledOnionNoneZ* owner_conv = (LDKCResult_PeeledOnionNoneZ*)untag_ptr(owner);
+       CResult_PeeledOnionNoneZ_get_err(owner_conv);
+}
+
+static inline void CResult_NoneSendErrorZ_get_ok(LDKCResult_NoneSendErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *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);
+}
+
+static inline struct LDKSendError CResult_NoneSendErrorZ_get_err(LDKCResult_NoneSendErrorZ *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);
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = CResult_NoneSendErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBlindedPath CResult_BlindedPathNoneZ_get_ok(LDKCResult_BlindedPathNoneZ *NONNULL_PTR owner){
+       LDKBlindedPath ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BlindedPathNoneZ_get_ok(int64_t owner) {
+       LDKCResult_BlindedPathNoneZ* owner_conv = (LDKCResult_BlindedPathNoneZ*)untag_ptr(owner);
+       LDKBlindedPath ret_var = CResult_BlindedPathNoneZ_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_BlindedPathNoneZ_get_err(LDKCResult_BlindedPathNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_BlindedPathNoneZ_get_err(int64_t owner) {
+       LDKCResult_BlindedPathNoneZ* owner_conv = (LDKCResult_BlindedPathNoneZ*)untag_ptr(owner);
+       CResult_BlindedPathNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKC2Tuple_BlindedPayInfoBlindedPathZ CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_ok(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return C2Tuple_BlindedPayInfoBlindedPathZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* owner_conv = (LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ*)untag_ptr(owner);
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
+       *ret_conv = CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_ok(owner_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline void CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_err(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_err(int64_t owner) {
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* owner_conv = (LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ*)untag_ptr(owner);
+       CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKBlindedPath CResult_BlindedPathDecodeErrorZ_get_ok(LDKCResult_BlindedPathDecodeErrorZ *NONNULL_PTR owner){
+       LDKBlindedPath ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BlindedPathDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BlindedPathDecodeErrorZ* owner_conv = (LDKCResult_BlindedPathDecodeErrorZ*)untag_ptr(owner);
+       LDKBlindedPath ret_var = CResult_BlindedPathDecodeErrorZ_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_BlindedPathDecodeErrorZ_get_err(LDKCResult_BlindedPathDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BlindedPathDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BlindedPathDecodeErrorZ* owner_conv = (LDKCResult_BlindedPathDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BlindedPathDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKBlindedHop CResult_BlindedHopDecodeErrorZ_get_ok(LDKCResult_BlindedHopDecodeErrorZ *NONNULL_PTR owner){
+       LDKBlindedHop ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BlindedHopDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BlindedHopDecodeErrorZ* owner_conv = (LDKCResult_BlindedHopDecodeErrorZ*)untag_ptr(owner);
+       LDKBlindedHop ret_var = CResult_BlindedHopDecodeErrorZ_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_BlindedHopDecodeErrorZ_get_err(LDKCResult_BlindedHopDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BlindedHopDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BlindedHopDecodeErrorZ* owner_conv = (LDKCResult_BlindedHopDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BlindedHopDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKInvoiceError CResult_InvoiceErrorDecodeErrorZ_get_ok(LDKCResult_InvoiceErrorDecodeErrorZ *NONNULL_PTR owner){
+       LDKInvoiceError ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_InvoiceErrorDecodeErrorZ* owner_conv = (LDKCResult_InvoiceErrorDecodeErrorZ*)untag_ptr(owner);
+       LDKInvoiceError ret_var = CResult_InvoiceErrorDecodeErrorZ_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_InvoiceErrorDecodeErrorZ_get_err(LDKCResult_InvoiceErrorDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_InvoiceErrorDecodeErrorZ* owner_conv = (LDKCResult_InvoiceErrorDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_InvoiceErrorDecodeErrorZ_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;
+} LDKFilter_JCalls;
+static void LDKFilter_JCalls_free(void* this_arg) {
+       LDKFilter_JCalls *j_calls = (LDKFilter_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void register_tx_LDKFilter_jcall(const void* this_arg, const uint8_t (* txid)[32], LDKu8slice script_pubkey) {
+       LDKFilter_JCalls *j_calls = (LDKFilter_JCalls*) this_arg;
+       int8_tArray txid_arr = init_int8_tArray(32, __LINE__);
+       memcpy(txid_arr->elems, *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);
+}
+void register_output_LDKFilter_jcall(const void* this_arg, LDKWatchedOutput output) {
+       LDKFilter_JCalls *j_calls = (LDKFilter_JCalls*) this_arg;
+       LDKWatchedOutput output_var = output;
+       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);
+}
+static void LDKFilter_JCalls_cloned(LDKFilter* new_obj) {
+       LDKFilter_JCalls *j_calls = (LDKFilter_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKFilter LDKFilter_init (int64_t o) {
+       LDKFilter_JCalls *calls = MALLOC(sizeof(LDKFilter_JCalls), "LDKFilter_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKFilter ret = {
+               .this_arg = (void*) calls,
+               .register_tx = register_tx_LDKFilter_jcall,
+               .register_output = register_output_LDKFilter_jcall,
+               .free = LDKFilter_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKFilter_new(int32_t o) {
+       LDKFilter *res_ptr = MALLOC(sizeof(LDKFilter), "LDKFilter");
+       *res_ptr = LDKFilter_init(o);
+       return tag_ptr(res_ptr, true);
+}
+void  CS_LDK_Filter_register_tx(int64_t this_arg, int8_tArray txid, int8_tArray script_pubkey) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKFilter* this_arg_conv = (LDKFilter*)this_arg_ptr;
+       uint8_t txid_arr[32];
+       CHECK(txid->arr_len == 32);
+       memcpy(txid_arr, txid->elems, 32); FREE(txid);
+       uint8_t (*txid_ref)[32] = &txid_arr;
+       LDKu8slice script_pubkey_ref;
+       script_pubkey_ref.datalen = script_pubkey->arr_len;
+       script_pubkey_ref.data = script_pubkey->elems;
+       (this_arg_conv->register_tx)(this_arg_conv->this_arg, txid_ref, script_pubkey_ref);
+       FREE(script_pubkey);
+}
+
+void  CS_LDK_Filter_register_output(int64_t this_arg, int64_t output) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKFilter* this_arg_conv = (LDKFilter*)this_arg_ptr;
+       LDKWatchedOutput output_conv;
+       output_conv.inner = untag_ptr(output);
+       output_conv.is_owned = ptr_is_owned(output);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(output_conv);
+       output_conv = WatchedOutput_clone(&output_conv);
+       (this_arg_conv->register_output)(this_arg_conv->this_arg, output_conv);
+}
+
+uint32_t CS_LDK_LDKCOption_FilterZ_ty_from_ptr(int64_t ptr) {
+       LDKCOption_FilterZ *obj = (LDKCOption_FilterZ*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCOption_FilterZ_Some: return 0;
+               case LDKCOption_FilterZ_None: return 1;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCOption_FilterZ_Some_get_some(int64_t ptr) {
+       LDKCOption_FilterZ *obj = (LDKCOption_FilterZ*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCOption_FilterZ_Some);
+       LDKFilter* some_ret = MALLOC(sizeof(LDKFilter), "LDKFilter");
+       *some_ret = obj->some;
+                       // WARNING: We likely need to clone here, but no clone is available, so we just do it for Java instances
+                       if ((*some_ret).free == LDKFilter_JCalls_free) {
+                               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                               LDKFilter_JCalls_cloned(&(*some_ret));
+                       }
+       return tag_ptr(some_ret, true);
+}
+static inline struct LDKLockedChannelMonitor CResult_LockedChannelMonitorNoneZ_get_ok(LDKCResult_LockedChannelMonitorNoneZ *NONNULL_PTR owner){
+       LDKLockedChannelMonitor ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_LockedChannelMonitorNoneZ_get_ok(int64_t owner) {
+       LDKCResult_LockedChannelMonitorNoneZ* owner_conv = (LDKCResult_LockedChannelMonitorNoneZ*)untag_ptr(owner);
+       LDKLockedChannelMonitor ret_var = CResult_LockedChannelMonitorNoneZ_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_LockedChannelMonitorNoneZ_get_err(LDKCResult_LockedChannelMonitorNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_LockedChannelMonitorNoneZ_get_err(int64_t owner) {
+       LDKCResult_LockedChannelMonitorNoneZ* owner_conv = (LDKCResult_LockedChannelMonitorNoneZ*)untag_ptr(owner);
+       CResult_LockedChannelMonitorNoneZ_get_err(owner_conv);
+}
+
+static inline LDKCVec_OutPointZ CVec_OutPointZ_clone(const LDKCVec_OutPointZ *orig) {
+       LDKCVec_OutPointZ ret = { .data = MALLOC(sizeof(LDKOutPoint) * orig->datalen, "LDKCVec_OutPointZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = OutPoint_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline LDKCVec_MonitorUpdateIdZ CVec_MonitorUpdateIdZ_clone(const LDKCVec_MonitorUpdateIdZ *orig) {
+       LDKCVec_MonitorUpdateIdZ ret = { .data = MALLOC(sizeof(LDKMonitorUpdateId) * orig->datalen, "LDKCVec_MonitorUpdateIdZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = MonitorUpdateId_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKOutPoint C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_a(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ *NONNULL_PTR owner){
+       LDKOutPoint ret = owner->a;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_a(int64_t owner) {
+       LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ* owner_conv = (LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ*)untag_ptr(owner);
+       LDKOutPoint ret_var = C2Tuple_OutPointCVec_MonitorUpdateIdZZ_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 LDKCVec_MonitorUpdateIdZ C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_b(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ *NONNULL_PTR owner){
+       return CVec_MonitorUpdateIdZ_clone(&owner->b);
+}
+int64_tArray  CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_b(int64_t owner) {
+       LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ* owner_conv = (LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ*)untag_ptr(owner);
+       LDKCVec_MonitorUpdateIdZ ret_var = C2Tuple_OutPointCVec_MonitorUpdateIdZZ_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 r = 0; r < ret_var.datalen; r++) {
+               LDKMonitorUpdateId ret_conv_17_var = ret_var.data[r];
+               int64_t ret_conv_17_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_17_var);
+               ret_conv_17_ref = tag_ptr(ret_conv_17_var.inner, ret_conv_17_var.is_owned);
+               ret_arr_ptr[r] = ret_conv_17_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+static inline LDKCVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ CVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ_clone(const LDKCVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ *orig) {
+       LDKCVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ) * orig->datalen, "LDKCVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+typedef struct LDKKVStore_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKKVStore_JCalls;
+static void LDKKVStore_JCalls_free(void* this_arg) {
+       LDKKVStore_JCalls *j_calls = (LDKKVStore_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_CVec_u8ZIOErrorZ read_LDKKVStore_jcall(const void* this_arg, LDKStr primary_namespace, LDKStr secondary_namespace, LDKStr key) {
+       LDKKVStore_JCalls *j_calls = (LDKKVStore_JCalls*) this_arg;
+       LDKStr primary_namespace_str = primary_namespace;
+       jstring primary_namespace_conv = str_ref_to_cs(primary_namespace_str.chars, primary_namespace_str.len);
+       Str_free(primary_namespace_str);
+       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);
+       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, primary_namespace_conv, secondary_namespace_conv, key_conv);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_CVec_u8ZIOErrorZ ret_conv = *(LDKCResult_CVec_u8ZIOErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_NoneIOErrorZ write_LDKKVStore_jcall(const void* this_arg, LDKStr primary_namespace, LDKStr secondary_namespace, LDKStr key, LDKu8slice buf) {
+       LDKKVStore_JCalls *j_calls = (LDKKVStore_JCalls*) this_arg;
+       LDKStr primary_namespace_str = primary_namespace;
+       jstring primary_namespace_conv = str_ref_to_cs(primary_namespace_str.chars, primary_namespace_str.len);
+       Str_free(primary_namespace_str);
+       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);
+       LDKStr key_str = key;
+       jstring key_conv = str_ref_to_cs(key_str.chars, key_str.len);
+       Str_free(key_str);
+       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, primary_namespace_conv, secondary_namespace_conv, key_conv, (int64_t)buf_arr);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_NoneIOErrorZ remove_LDKKVStore_jcall(const void* this_arg, LDKStr primary_namespace, LDKStr secondary_namespace, LDKStr key, bool lazy) {
+       LDKKVStore_JCalls *j_calls = (LDKKVStore_JCalls*) this_arg;
+       LDKStr primary_namespace_str = primary_namespace;
+       jstring primary_namespace_conv = str_ref_to_cs(primary_namespace_str.chars, primary_namespace_str.len);
+       Str_free(primary_namespace_str);
+       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);
+       LDKStr key_str = key;
+       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, primary_namespace_conv, secondary_namespace_conv, key_conv, lazy_conv);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_CVec_StrZIOErrorZ list_LDKKVStore_jcall(const void* this_arg, LDKStr primary_namespace, LDKStr secondary_namespace) {
+       LDKKVStore_JCalls *j_calls = (LDKKVStore_JCalls*) this_arg;
+       LDKStr primary_namespace_str = primary_namespace;
+       jstring primary_namespace_conv = str_ref_to_cs(primary_namespace_str.chars, primary_namespace_str.len);
+       Str_free(primary_namespace_str);
+       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, primary_namespace_conv, secondary_namespace_conv);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_CVec_StrZIOErrorZ ret_conv = *(LDKCResult_CVec_StrZIOErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKKVStore_JCalls_cloned(LDKKVStore* new_obj) {
+       LDKKVStore_JCalls *j_calls = (LDKKVStore_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKKVStore LDKKVStore_init (int64_t o) {
+       LDKKVStore_JCalls *calls = MALLOC(sizeof(LDKKVStore_JCalls), "LDKKVStore_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKKVStore ret = {
+               .this_arg = (void*) calls,
+               .read = read_LDKKVStore_jcall,
+               .write = write_LDKKVStore_jcall,
+               .remove = remove_LDKKVStore_jcall,
+               .list = list_LDKKVStore_jcall,
+               .free = LDKKVStore_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKKVStore_new(int32_t o) {
+       LDKKVStore *res_ptr = MALLOC(sizeof(LDKKVStore), "LDKKVStore");
+       *res_ptr = LDKKVStore_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_KVStore_read(int64_t this_arg, jstring primary_namespace, jstring secondary_namespace, jstring key) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKKVStore* this_arg_conv = (LDKKVStore*)this_arg_ptr;
+       LDKStr primary_namespace_conv = str_ref_to_owned_c(primary_namespace);
+       LDKStr secondary_namespace_conv = str_ref_to_owned_c(secondary_namespace);
+       LDKStr key_conv = str_ref_to_owned_c(key);
+       LDKCResult_CVec_u8ZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZIOErrorZ), "LDKCResult_CVec_u8ZIOErrorZ");
+       *ret_conv = (this_arg_conv->read)(this_arg_conv->this_arg, primary_namespace_conv, secondary_namespace_conv, key_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_KVStore_write(int64_t this_arg, jstring primary_namespace, jstring secondary_namespace, jstring key, int8_tArray buf) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKKVStore* this_arg_conv = (LDKKVStore*)this_arg_ptr;
+       LDKStr primary_namespace_conv = str_ref_to_owned_c(primary_namespace);
+       LDKStr secondary_namespace_conv = str_ref_to_owned_c(secondary_namespace);
+       LDKStr key_conv = str_ref_to_owned_c(key);
+       LDKu8slice buf_ref;
+       buf_ref.datalen = buf->arr_len;
+       buf_ref.data = buf->elems;
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = (this_arg_conv->write)(this_arg_conv->this_arg, primary_namespace_conv, secondary_namespace_conv, key_conv, buf_ref);
+       FREE(buf);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_KVStore_remove(int64_t this_arg, jstring primary_namespace, jstring secondary_namespace, jstring key, jboolean lazy) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKKVStore* this_arg_conv = (LDKKVStore*)this_arg_ptr;
+       LDKStr primary_namespace_conv = str_ref_to_owned_c(primary_namespace);
+       LDKStr secondary_namespace_conv = str_ref_to_owned_c(secondary_namespace);
+       LDKStr key_conv = str_ref_to_owned_c(key);
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = (this_arg_conv->remove)(this_arg_conv->this_arg, primary_namespace_conv, secondary_namespace_conv, key_conv, lazy);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_KVStore_list(int64_t this_arg, jstring primary_namespace, jstring secondary_namespace) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKKVStore* this_arg_conv = (LDKKVStore*)this_arg_ptr;
+       LDKStr primary_namespace_conv = str_ref_to_owned_c(primary_namespace);
+       LDKStr secondary_namespace_conv = str_ref_to_owned_c(secondary_namespace);
+       LDKCResult_CVec_StrZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_StrZIOErrorZ), "LDKCResult_CVec_StrZIOErrorZ");
+       *ret_conv = (this_arg_conv->list)(this_arg_conv->this_arg, primary_namespace_conv, secondary_namespace_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+typedef struct LDKPersister_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKPersister_JCalls;
+static void LDKPersister_JCalls_free(void* this_arg) {
+       LDKPersister_JCalls *j_calls = (LDKPersister_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_NoneIOErrorZ persist_manager_LDKPersister_jcall(const void* this_arg, const LDKChannelManager * channel_manager) {
+       LDKPersister_JCalls *j_calls = (LDKPersister_JCalls*) this_arg;
+       LDKChannelManager channel_manager_var = *channel_manager;
+       int64_t channel_manager_ref = 0;
+       // 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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_NoneIOErrorZ persist_graph_LDKPersister_jcall(const void* this_arg, const LDKNetworkGraph * network_graph) {
+       LDKPersister_JCalls *j_calls = (LDKPersister_JCalls*) this_arg;
+       LDKNetworkGraph network_graph_var = *network_graph;
+       int64_t network_graph_ref = 0;
+       // 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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_NoneIOErrorZ persist_scorer_LDKPersister_jcall(const void* this_arg, const LDKWriteableScore * scorer) {
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKPersister_JCalls_cloned(LDKPersister* new_obj) {
+       LDKPersister_JCalls *j_calls = (LDKPersister_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKPersister LDKPersister_init (int64_t o) {
+       LDKPersister_JCalls *calls = MALLOC(sizeof(LDKPersister_JCalls), "LDKPersister_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKPersister ret = {
+               .this_arg = (void*) calls,
+               .persist_manager = persist_manager_LDKPersister_jcall,
+               .persist_graph = persist_graph_LDKPersister_jcall,
+               .persist_scorer = persist_scorer_LDKPersister_jcall,
+               .free = LDKPersister_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKPersister_new(int32_t o) {
+       LDKPersister *res_ptr = MALLOC(sizeof(LDKPersister), "LDKPersister");
+       *res_ptr = LDKPersister_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_Persister_persist_manager(int64_t this_arg, int64_t channel_manager) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKPersister* this_arg_conv = (LDKPersister*)this_arg_ptr;
+       LDKChannelManager channel_manager_conv;
+       channel_manager_conv.inner = untag_ptr(channel_manager);
+       channel_manager_conv.is_owned = ptr_is_owned(channel_manager);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_manager_conv);
+       channel_manager_conv.is_owned = false;
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = (this_arg_conv->persist_manager)(this_arg_conv->this_arg, &channel_manager_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Persister_persist_graph(int64_t this_arg, int64_t network_graph) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKPersister* this_arg_conv = (LDKPersister*)this_arg_ptr;
+       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;
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = (this_arg_conv->persist_graph)(this_arg_conv->this_arg, &network_graph_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Persister_persist_scorer(int64_t this_arg, int64_t scorer) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKPersister* this_arg_conv = (LDKPersister*)this_arg_ptr;
+       void* scorer_ptr = untag_ptr(scorer);
+       if (ptr_is_owned(scorer)) { CHECK_ACCESS(scorer_ptr); }
+       LDKWriteableScore* scorer_conv = (LDKWriteableScore*)scorer_ptr;
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = (this_arg_conv->persist_scorer)(this_arg_conv->this_arg, scorer_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+typedef struct LDKPersist_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKPersist_JCalls;
+static void LDKPersist_JCalls_free(void* this_arg) {
+       LDKPersist_JCalls *j_calls = (LDKPersist_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKChannelMonitorUpdateStatus persist_new_channel_LDKPersist_jcall(const void* this_arg, LDKOutPoint channel_id, const LDKChannelMonitor * data, LDKMonitorUpdateId update_id) {
+       LDKPersist_JCalls *j_calls = (LDKPersist_JCalls*) this_arg;
+       LDKOutPoint channel_id_var = channel_id;
+       int64_t channel_id_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_id_var);
+       channel_id_ref = tag_ptr(channel_id_var.inner, channel_id_var.is_owned);
+       LDKChannelMonitor data_var = *data;
+       int64_t data_ref = 0;
+       data_var = ChannelMonitor_clone(&data_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(data_var);
+       data_ref = tag_ptr(data_var.inner, data_var.is_owned);
+       LDKMonitorUpdateId update_id_var = update_id;
+       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);
+       LDKChannelMonitorUpdateStatus ret_conv = LDKChannelMonitorUpdateStatus_from_cs(ret);
+       return ret_conv;
+}
+LDKChannelMonitorUpdateStatus update_persisted_channel_LDKPersist_jcall(const void* this_arg, LDKOutPoint channel_id, LDKChannelMonitorUpdate update, const LDKChannelMonitor * data, LDKMonitorUpdateId update_id) {
+       LDKPersist_JCalls *j_calls = (LDKPersist_JCalls*) this_arg;
+       LDKOutPoint channel_id_var = channel_id;
+       int64_t channel_id_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_id_var);
+       channel_id_ref = tag_ptr(channel_id_var.inner, channel_id_var.is_owned);
+       LDKChannelMonitorUpdate update_var = update;
+       int64_t update_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_var);
+       update_ref = tag_ptr(update_var.inner, update_var.is_owned);
+       LDKChannelMonitor data_var = *data;
+       int64_t data_ref = 0;
+       data_var = ChannelMonitor_clone(&data_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(data_var);
+       data_ref = tag_ptr(data_var.inner, data_var.is_owned);
+       LDKMonitorUpdateId update_id_var = update_id;
+       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);
+       LDKChannelMonitorUpdateStatus ret_conv = LDKChannelMonitorUpdateStatus_from_cs(ret);
+       return ret_conv;
+}
+static void LDKPersist_JCalls_cloned(LDKPersist* new_obj) {
+       LDKPersist_JCalls *j_calls = (LDKPersist_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKPersist LDKPersist_init (int64_t o) {
+       LDKPersist_JCalls *calls = MALLOC(sizeof(LDKPersist_JCalls), "LDKPersist_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKPersist ret = {
+               .this_arg = (void*) calls,
+               .persist_new_channel = persist_new_channel_LDKPersist_jcall,
+               .update_persisted_channel = update_persisted_channel_LDKPersist_jcall,
+               .free = LDKPersist_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKPersist_new(int32_t o) {
+       LDKPersist *res_ptr = MALLOC(sizeof(LDKPersist), "LDKPersist");
+       *res_ptr = LDKPersist_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int32_t  CS_LDK_Persist_persist_new_channel(int64_t this_arg, int64_t channel_id, int64_t data, int64_t update_id) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKPersist* this_arg_conv = (LDKPersist*)this_arg_ptr;
+       LDKOutPoint channel_id_conv;
+       channel_id_conv.inner = untag_ptr(channel_id);
+       channel_id_conv.is_owned = ptr_is_owned(channel_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_id_conv);
+       channel_id_conv = OutPoint_clone(&channel_id_conv);
+       LDKChannelMonitor data_conv;
+       data_conv.inner = untag_ptr(data);
+       data_conv.is_owned = ptr_is_owned(data);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(data_conv);
+       data_conv.is_owned = false;
+       LDKMonitorUpdateId update_id_conv;
+       update_id_conv.inner = untag_ptr(update_id);
+       update_id_conv.is_owned = ptr_is_owned(update_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_id_conv);
+       update_id_conv = MonitorUpdateId_clone(&update_id_conv);
+       int32_t ret_conv = LDKChannelMonitorUpdateStatus_to_cs((this_arg_conv->persist_new_channel)(this_arg_conv->this_arg, channel_id_conv, &data_conv, update_id_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Persist_update_persisted_channel(int64_t this_arg, int64_t channel_id, int64_t update, int64_t data, int64_t update_id) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKPersist* this_arg_conv = (LDKPersist*)this_arg_ptr;
+       LDKOutPoint channel_id_conv;
+       channel_id_conv.inner = untag_ptr(channel_id);
+       channel_id_conv.is_owned = ptr_is_owned(channel_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_id_conv);
+       channel_id_conv = OutPoint_clone(&channel_id_conv);
+       LDKChannelMonitorUpdate update_conv;
+       update_conv.inner = untag_ptr(update);
+       update_conv.is_owned = ptr_is_owned(update);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_conv);
+       update_conv = ChannelMonitorUpdate_clone(&update_conv);
+       LDKChannelMonitor data_conv;
+       data_conv.inner = untag_ptr(data);
+       data_conv.is_owned = ptr_is_owned(data);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(data_conv);
+       data_conv.is_owned = false;
+       LDKMonitorUpdateId update_id_conv;
+       update_id_conv.inner = untag_ptr(update_id);
+       update_id_conv.is_owned = ptr_is_owned(update_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_id_conv);
+       update_id_conv = MonitorUpdateId_clone(&update_id_conv);
+       int32_t ret_conv = LDKChannelMonitorUpdateStatus_to_cs((this_arg_conv->update_persisted_channel)(this_arg_conv->this_arg, channel_id_conv, update_conv, &data_conv, update_id_conv));
+       return ret_conv;
+}
+
+typedef struct LDKFutureCallback_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKFutureCallback_JCalls;
+static void LDKFutureCallback_JCalls_free(void* this_arg) {
+       LDKFutureCallback_JCalls *j_calls = (LDKFutureCallback_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+}
+static void LDKFutureCallback_JCalls_cloned(LDKFutureCallback* new_obj) {
+       LDKFutureCallback_JCalls *j_calls = (LDKFutureCallback_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKFutureCallback LDKFutureCallback_init (int64_t o) {
+       LDKFutureCallback_JCalls *calls = MALLOC(sizeof(LDKFutureCallback_JCalls), "LDKFutureCallback_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKFutureCallback ret = {
+               .this_arg = (void*) calls,
+               .call = call_LDKFutureCallback_jcall,
+               .free = LDKFutureCallback_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKFutureCallback_new(int32_t o) {
+       LDKFutureCallback *res_ptr = MALLOC(sizeof(LDKFutureCallback), "LDKFutureCallback");
+       *res_ptr = LDKFutureCallback_init(o);
+       return tag_ptr(res_ptr, true);
+}
+void  CS_LDK_FutureCallback_call(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKFutureCallback* this_arg_conv = (LDKFutureCallback*)this_arg_ptr;
+       (this_arg_conv->call)(this_arg_conv->this_arg);
+}
+
+typedef struct LDKListen_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKListen_JCalls;
+static void LDKListen_JCalls_free(void* this_arg) {
+       LDKListen_JCalls *j_calls = (LDKListen_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void filtered_block_connected_LDKListen_jcall(const void* this_arg, const uint8_t (* header)[80], LDKCVec_C2Tuple_usizeTransactionZZ txdata, 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);
+       LDKCVec_C2Tuple_usizeTransactionZZ txdata_var = txdata;
+       int64_tArray txdata_arr = NULL;
+       txdata_arr = init_int64_tArray(txdata_var.datalen, __LINE__);
+       int64_t *txdata_arr_ptr = (int64_t*)(((uint8_t*)txdata_arr) + 8);
+       for (size_t c = 0; c < txdata_var.datalen; c++) {
+               LDKC2Tuple_usizeTransactionZ* txdata_conv_28_conv = MALLOC(sizeof(LDKC2Tuple_usizeTransactionZ), "LDKC2Tuple_usizeTransactionZ");
+               *txdata_conv_28_conv = txdata_var.data[c];
+               txdata_arr_ptr[c] = tag_ptr(txdata_conv_28_conv, true);
+       }
+       
+       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);
+}
+void block_connected_LDKListen_jcall(const void* this_arg, LDKu8slice block, uint32_t height) {
+       LDKListen_JCalls *j_calls = (LDKListen_JCalls*) this_arg;
+       LDKu8slice block_var = block;
+       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);
+}
+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);
+}
+static void LDKListen_JCalls_cloned(LDKListen* new_obj) {
+       LDKListen_JCalls *j_calls = (LDKListen_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKListen LDKListen_init (int64_t o) {
+       LDKListen_JCalls *calls = MALLOC(sizeof(LDKListen_JCalls), "LDKListen_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKListen ret = {
+               .this_arg = (void*) calls,
+               .filtered_block_connected = filtered_block_connected_LDKListen_jcall,
+               .block_connected = block_connected_LDKListen_jcall,
+               .block_disconnected = block_disconnected_LDKListen_jcall,
+               .free = LDKListen_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKListen_new(int32_t o) {
+       LDKListen *res_ptr = MALLOC(sizeof(LDKListen), "LDKListen");
+       *res_ptr = LDKListen_init(o);
+       return tag_ptr(res_ptr, true);
+}
+void  CS_LDK_Listen_filtered_block_connected(int64_t this_arg, int8_tArray header, int64_tArray txdata, int32_t height) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKListen* this_arg_conv = (LDKListen*)this_arg_ptr;
+       uint8_t header_arr[80];
+       CHECK(header->arr_len == 80);
+       memcpy(header_arr, header->elems, 80); FREE(header);
+       uint8_t (*header_ref)[80] = &header_arr;
+       LDKCVec_C2Tuple_usizeTransactionZZ txdata_constr;
+       txdata_constr.datalen = txdata->arr_len;
+       if (txdata_constr.datalen > 0)
+               txdata_constr.data = MALLOC(txdata_constr.datalen * sizeof(LDKC2Tuple_usizeTransactionZ), "LDKCVec_C2Tuple_usizeTransactionZZ Elements");
+       else
+               txdata_constr.data = NULL;
+       int64_t* txdata_vals = txdata->elems;
+       for (size_t c = 0; c < txdata_constr.datalen; c++) {
+               int64_t txdata_conv_28 = txdata_vals[c];
+               void* txdata_conv_28_ptr = untag_ptr(txdata_conv_28);
+               CHECK_ACCESS(txdata_conv_28_ptr);
+               LDKC2Tuple_usizeTransactionZ txdata_conv_28_conv = *(LDKC2Tuple_usizeTransactionZ*)(txdata_conv_28_ptr);
+               txdata_conv_28_conv = C2Tuple_usizeTransactionZ_clone((LDKC2Tuple_usizeTransactionZ*)untag_ptr(txdata_conv_28));
+               txdata_constr.data[c] = txdata_conv_28_conv;
+       }
+       FREE(txdata);
+       (this_arg_conv->filtered_block_connected)(this_arg_conv->this_arg, header_ref, txdata_constr, height);
+}
+
+void  CS_LDK_Listen_block_connected(int64_t this_arg, int8_tArray block, int32_t height) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKListen* this_arg_conv = (LDKListen*)this_arg_ptr;
+       LDKu8slice block_ref;
+       block_ref.datalen = block->arr_len;
+       block_ref.data = block->elems;
+       (this_arg_conv->block_connected)(this_arg_conv->this_arg, block_ref, height);
+       FREE(block);
+}
+
+void  CS_LDK_Listen_block_disconnected(int64_t this_arg, int8_tArray header, int32_t height) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKListen* this_arg_conv = (LDKListen*)this_arg_ptr;
+       uint8_t header_arr[80];
+       CHECK(header->arr_len == 80);
+       memcpy(header_arr, header->elems, 80); FREE(header);
+       uint8_t (*header_ref)[80] = &header_arr;
+       (this_arg_conv->block_disconnected)(this_arg_conv->this_arg, header_ref, height);
+}
+
+typedef struct LDKConfirm_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKConfirm_JCalls;
+static void LDKConfirm_JCalls_free(void* this_arg) {
+       LDKConfirm_JCalls *j_calls = (LDKConfirm_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void transactions_confirmed_LDKConfirm_jcall(const void* this_arg, const uint8_t (* header)[80], LDKCVec_C2Tuple_usizeTransactionZZ txdata, 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);
+       LDKCVec_C2Tuple_usizeTransactionZZ txdata_var = txdata;
+       int64_tArray txdata_arr = NULL;
+       txdata_arr = init_int64_tArray(txdata_var.datalen, __LINE__);
+       int64_t *txdata_arr_ptr = (int64_t*)(((uint8_t*)txdata_arr) + 8);
+       for (size_t c = 0; c < txdata_var.datalen; c++) {
+               LDKC2Tuple_usizeTransactionZ* txdata_conv_28_conv = MALLOC(sizeof(LDKC2Tuple_usizeTransactionZ), "LDKC2Tuple_usizeTransactionZ");
+               *txdata_conv_28_conv = txdata_var.data[c];
+               txdata_arr_ptr[c] = tag_ptr(txdata_conv_28_conv, true);
+       }
+       
+       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);
+}
+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);
+}
+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);
+}
+LDKCVec_C2Tuple_ThirtyTwoBytesCOption_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;
+       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");
+       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;
+       }
+       FREE(ret);
+       return ret_constr;
+}
+static void LDKConfirm_JCalls_cloned(LDKConfirm* new_obj) {
+       LDKConfirm_JCalls *j_calls = (LDKConfirm_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKConfirm LDKConfirm_init (int64_t o) {
+       LDKConfirm_JCalls *calls = MALLOC(sizeof(LDKConfirm_JCalls), "LDKConfirm_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKConfirm ret = {
+               .this_arg = (void*) calls,
+               .transactions_confirmed = transactions_confirmed_LDKConfirm_jcall,
+               .transaction_unconfirmed = transaction_unconfirmed_LDKConfirm_jcall,
+               .best_block_updated = best_block_updated_LDKConfirm_jcall,
+               .get_relevant_txids = get_relevant_txids_LDKConfirm_jcall,
+               .free = LDKConfirm_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKConfirm_new(int32_t o) {
+       LDKConfirm *res_ptr = MALLOC(sizeof(LDKConfirm), "LDKConfirm");
+       *res_ptr = LDKConfirm_init(o);
+       return tag_ptr(res_ptr, true);
+}
+void  CS_LDK_Confirm_transactions_confirmed(int64_t this_arg, int8_tArray header, int64_tArray txdata, int32_t height) {
+       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;
+       uint8_t header_arr[80];
+       CHECK(header->arr_len == 80);
+       memcpy(header_arr, header->elems, 80); FREE(header);
+       uint8_t (*header_ref)[80] = &header_arr;
+       LDKCVec_C2Tuple_usizeTransactionZZ txdata_constr;
+       txdata_constr.datalen = txdata->arr_len;
+       if (txdata_constr.datalen > 0)
+               txdata_constr.data = MALLOC(txdata_constr.datalen * sizeof(LDKC2Tuple_usizeTransactionZ), "LDKCVec_C2Tuple_usizeTransactionZZ Elements");
+       else
+               txdata_constr.data = NULL;
+       int64_t* txdata_vals = txdata->elems;
+       for (size_t c = 0; c < txdata_constr.datalen; c++) {
+               int64_t txdata_conv_28 = txdata_vals[c];
+               void* txdata_conv_28_ptr = untag_ptr(txdata_conv_28);
+               CHECK_ACCESS(txdata_conv_28_ptr);
+               LDKC2Tuple_usizeTransactionZ txdata_conv_28_conv = *(LDKC2Tuple_usizeTransactionZ*)(txdata_conv_28_ptr);
+               txdata_conv_28_conv = C2Tuple_usizeTransactionZ_clone((LDKC2Tuple_usizeTransactionZ*)untag_ptr(txdata_conv_28));
+               txdata_constr.data[c] = txdata_conv_28_conv;
+       }
+       FREE(txdata);
+       (this_arg_conv->transactions_confirmed)(this_arg_conv->this_arg, header_ref, txdata_constr, height);
+}
+
+void  CS_LDK_Confirm_transaction_unconfirmed(int64_t this_arg, int8_tArray txid) {
+       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;
+       uint8_t txid_arr[32];
+       CHECK(txid->arr_len == 32);
+       memcpy(txid_arr, txid->elems, 32); FREE(txid);
+       uint8_t (*txid_ref)[32] = &txid_arr;
+       (this_arg_conv->transaction_unconfirmed)(this_arg_conv->this_arg, txid_ref);
+}
+
+void  CS_LDK_Confirm_best_block_updated(int64_t this_arg, int8_tArray header, int32_t height) {
+       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;
+       uint8_t header_arr[80];
+       CHECK(header->arr_len == 80);
+       memcpy(header_arr, header->elems, 80); FREE(header);
+       uint8_t (*header_ref)[80] = &header_arr;
+       (this_arg_conv->best_block_updated)(this_arg_conv->this_arg, header_ref, height);
+}
+
+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);
+       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);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+typedef struct LDKEventHandler_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKEventHandler_JCalls;
+static void LDKEventHandler_JCalls_free(void* this_arg) {
+       LDKEventHandler_JCalls *j_calls = (LDKEventHandler_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void handle_event_LDKEventHandler_jcall(const void* this_arg, LDKEvent event) {
+       LDKEventHandler_JCalls *j_calls = (LDKEventHandler_JCalls*) this_arg;
+       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);
+}
+static void LDKEventHandler_JCalls_cloned(LDKEventHandler* new_obj) {
+       LDKEventHandler_JCalls *j_calls = (LDKEventHandler_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKEventHandler LDKEventHandler_init (int64_t o) {
+       LDKEventHandler_JCalls *calls = MALLOC(sizeof(LDKEventHandler_JCalls), "LDKEventHandler_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKEventHandler ret = {
+               .this_arg = (void*) calls,
+               .handle_event = handle_event_LDKEventHandler_jcall,
+               .free = LDKEventHandler_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKEventHandler_new(int32_t o) {
+       LDKEventHandler *res_ptr = MALLOC(sizeof(LDKEventHandler), "LDKEventHandler");
+       *res_ptr = LDKEventHandler_init(o);
+       return tag_ptr(res_ptr, true);
+}
+void  CS_LDK_EventHandler_handle_event(int64_t this_arg, int64_t event) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKEventHandler* this_arg_conv = (LDKEventHandler*)this_arg_ptr;
+       void* event_ptr = untag_ptr(event);
+       CHECK_ACCESS(event_ptr);
+       LDKEvent event_conv = *(LDKEvent*)(event_ptr);
+       event_conv = Event_clone((LDKEvent*)untag_ptr(event));
+       (this_arg_conv->handle_event)(this_arg_conv->this_arg, event_conv);
+}
+
+typedef struct LDKEventsProvider_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKEventsProvider_JCalls;
+static void LDKEventsProvider_JCalls_free(void* this_arg) {
+       LDKEventsProvider_JCalls *j_calls = (LDKEventsProvider_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void process_pending_events_LDKEventsProvider_jcall(const void* this_arg, LDKEventHandler handler) {
+       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));
+}
+static void LDKEventsProvider_JCalls_cloned(LDKEventsProvider* new_obj) {
+       LDKEventsProvider_JCalls *j_calls = (LDKEventsProvider_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKEventsProvider LDKEventsProvider_init (int64_t o) {
+       LDKEventsProvider_JCalls *calls = MALLOC(sizeof(LDKEventsProvider_JCalls), "LDKEventsProvider_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKEventsProvider ret = {
+               .this_arg = (void*) calls,
+               .process_pending_events = process_pending_events_LDKEventsProvider_jcall,
+               .free = LDKEventsProvider_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKEventsProvider_new(int32_t o) {
+       LDKEventsProvider *res_ptr = MALLOC(sizeof(LDKEventsProvider), "LDKEventsProvider");
+       *res_ptr = LDKEventsProvider_init(o);
+       return tag_ptr(res_ptr, true);
+}
+void  CS_LDK_EventsProvider_process_pending_events(int64_t this_arg, int64_t handler) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKEventsProvider* this_arg_conv = (LDKEventsProvider*)this_arg_ptr;
+       void* handler_ptr = untag_ptr(handler);
+       CHECK_ACCESS(handler_ptr);
+       LDKEventHandler handler_conv = *(LDKEventHandler*)(handler_ptr);
+       if (handler_conv.free == LDKEventHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKEventHandler_JCalls_cloned(&handler_conv);
+       }
+       (this_arg_conv->process_pending_events)(this_arg_conv->this_arg, handler_conv);
+}
+
+uint32_t CS_LDK_LDKFailureCode_ty_from_ptr(int64_t ptr) {
+       LDKFailureCode *obj = (LDKFailureCode*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKFailureCode_TemporaryNodeFailure: return 0;
+               case LDKFailureCode_RequiredNodeFeatureMissing: return 1;
+               case LDKFailureCode_IncorrectOrUnknownPaymentDetails: return 2;
+               case LDKFailureCode_InvalidOnionPayload: return 3;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKFailureCode_InvalidOnionPayload_get_invalid_onion_payload(int64_t ptr) {
+       LDKFailureCode *obj = (LDKFailureCode*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKFailureCode_InvalidOnionPayload);
+       int64_t invalid_onion_payload_ref = tag_ptr(&obj->invalid_onion_payload, false);
+       return invalid_onion_payload_ref;
+}
+typedef struct LDKMessageSendEventsProvider_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKMessageSendEventsProvider_JCalls;
+static void LDKMessageSendEventsProvider_JCalls_free(void* this_arg) {
+       LDKMessageSendEventsProvider_JCalls *j_calls = (LDKMessageSendEventsProvider_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+       LDKCVec_MessageSendEventZ ret_constr;
+       ret_constr.datalen = ret->arr_len;
+       if (ret_constr.datalen > 0)
+               ret_constr.data = MALLOC(ret_constr.datalen * sizeof(LDKMessageSendEvent), "LDKCVec_MessageSendEventZ Elements");
+       else
+               ret_constr.data = NULL;
+       int64_t* ret_vals = ret->elems;
+       for (size_t s = 0; s < ret_constr.datalen; s++) {
+               int64_t ret_conv_18 = ret_vals[s];
+               void* ret_conv_18_ptr = untag_ptr(ret_conv_18);
+               CHECK_ACCESS(ret_conv_18_ptr);
+               LDKMessageSendEvent ret_conv_18_conv = *(LDKMessageSendEvent*)(ret_conv_18_ptr);
+               FREE(untag_ptr(ret_conv_18));
+               ret_constr.data[s] = ret_conv_18_conv;
+       }
+       FREE(ret);
+       return ret_constr;
+}
+static void LDKMessageSendEventsProvider_JCalls_cloned(LDKMessageSendEventsProvider* new_obj) {
+       LDKMessageSendEventsProvider_JCalls *j_calls = (LDKMessageSendEventsProvider_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKMessageSendEventsProvider LDKMessageSendEventsProvider_init (int64_t o) {
+       LDKMessageSendEventsProvider_JCalls *calls = MALLOC(sizeof(LDKMessageSendEventsProvider_JCalls), "LDKMessageSendEventsProvider_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKMessageSendEventsProvider ret = {
+               .this_arg = (void*) calls,
+               .get_and_clear_pending_msg_events = get_and_clear_pending_msg_events_LDKMessageSendEventsProvider_jcall,
+               .free = LDKMessageSendEventsProvider_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKMessageSendEventsProvider_new(int32_t o) {
+       LDKMessageSendEventsProvider *res_ptr = MALLOC(sizeof(LDKMessageSendEventsProvider), "LDKMessageSendEventsProvider");
+       *res_ptr = LDKMessageSendEventsProvider_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_tArray  CS_LDK_MessageSendEventsProvider_get_and_clear_pending_msg_events(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKMessageSendEventsProvider* this_arg_conv = (LDKMessageSendEventsProvider*)this_arg_ptr;
+       LDKCVec_MessageSendEventZ ret_var = (this_arg_conv->get_and_clear_pending_msg_events)(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 s = 0; s < ret_var.datalen; s++) {
+               LDKMessageSendEvent *ret_conv_18_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+               *ret_conv_18_copy = ret_var.data[s];
+               int64_t ret_conv_18_ref = tag_ptr(ret_conv_18_copy, true);
+               ret_arr_ptr[s] = ret_conv_18_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+typedef struct LDKChannelMessageHandler_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+       LDKMessageSendEventsProvider_JCalls* MessageSendEventsProvider;
+} LDKChannelMessageHandler_JCalls;
+static void LDKChannelMessageHandler_JCalls_free(void* this_arg) {
+       LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+void handle_open_channel_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKOpenChannel * 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);
+       LDKOpenChannel msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKOpenChannelV2 msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKAcceptChannel msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKAcceptChannelV2 msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKFundingCreated msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKFundingSigned msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKChannelReady msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+void handle_shutdown_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKShutdown * 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);
+       LDKShutdown msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKClosingSigned msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxAddInput msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxAddOutput msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxRemoveInput msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxRemoveOutput msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxComplete msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxSignatures msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxInitRbf msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxAckRbf msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKTxAbort msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKUpdateAddHTLC msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKUpdateFulfillHTLC msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKUpdateFailHTLC msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKUpdateFailMalformedHTLC msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKCommitmentSigned msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKRevokeAndACK msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKUpdateFee msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKAnnouncementSignatures msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKInit msg_var = *msg;
+       int64_t msg_ref = 0;
+       msg_var = Init_clone(&msg_var);
+       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);
+       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;
+}
+void handle_channel_reestablish_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKChannelReestablish * 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);
+       LDKChannelReestablish msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKChannelUpdate msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+void handle_error_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKErrorMessage * 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);
+       LDKErrorMessage msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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);
+       LDKNodeFeatures ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+LDKInitFeatures provided_init_features_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);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 105, (int64_t)their_node_id_arr);
+       LDKInitFeatures ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCOption_CVec_ThirtyTwoBytesZZ ret_conv = *(LDKCOption_CVec_ThirtyTwoBytesZZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKChannelMessageHandler_JCalls_cloned(LDKChannelMessageHandler* new_obj) {
+       LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->MessageSendEventsProvider->refcnt, 1, memory_order_release);
+}
+static inline LDKChannelMessageHandler LDKChannelMessageHandler_init (int64_t o, int64_t MessageSendEventsProvider) {
+       LDKChannelMessageHandler_JCalls *calls = MALLOC(sizeof(LDKChannelMessageHandler_JCalls), "LDKChannelMessageHandler_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKChannelMessageHandler ret = {
+               .this_arg = (void*) calls,
+               .handle_open_channel = handle_open_channel_LDKChannelMessageHandler_jcall,
+               .handle_open_channel_v2 = handle_open_channel_v2_LDKChannelMessageHandler_jcall,
+               .handle_accept_channel = handle_accept_channel_LDKChannelMessageHandler_jcall,
+               .handle_accept_channel_v2 = handle_accept_channel_v2_LDKChannelMessageHandler_jcall,
+               .handle_funding_created = handle_funding_created_LDKChannelMessageHandler_jcall,
+               .handle_funding_signed = handle_funding_signed_LDKChannelMessageHandler_jcall,
+               .handle_channel_ready = handle_channel_ready_LDKChannelMessageHandler_jcall,
+               .handle_shutdown = handle_shutdown_LDKChannelMessageHandler_jcall,
+               .handle_closing_signed = handle_closing_signed_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,
+               .handle_tx_remove_output = handle_tx_remove_output_LDKChannelMessageHandler_jcall,
+               .handle_tx_complete = handle_tx_complete_LDKChannelMessageHandler_jcall,
+               .handle_tx_signatures = handle_tx_signatures_LDKChannelMessageHandler_jcall,
+               .handle_tx_init_rbf = handle_tx_init_rbf_LDKChannelMessageHandler_jcall,
+               .handle_tx_ack_rbf = handle_tx_ack_rbf_LDKChannelMessageHandler_jcall,
+               .handle_tx_abort = handle_tx_abort_LDKChannelMessageHandler_jcall,
+               .handle_update_add_htlc = handle_update_add_htlc_LDKChannelMessageHandler_jcall,
+               .handle_update_fulfill_htlc = handle_update_fulfill_htlc_LDKChannelMessageHandler_jcall,
+               .handle_update_fail_htlc = handle_update_fail_htlc_LDKChannelMessageHandler_jcall,
+               .handle_update_fail_malformed_htlc = handle_update_fail_malformed_htlc_LDKChannelMessageHandler_jcall,
+               .handle_commitment_signed = handle_commitment_signed_LDKChannelMessageHandler_jcall,
+               .handle_revoke_and_ack = handle_revoke_and_ack_LDKChannelMessageHandler_jcall,
+               .handle_update_fee = handle_update_fee_LDKChannelMessageHandler_jcall,
+               .handle_announcement_signatures = handle_announcement_signatures_LDKChannelMessageHandler_jcall,
+               .peer_disconnected = peer_disconnected_LDKChannelMessageHandler_jcall,
+               .peer_connected = peer_connected_LDKChannelMessageHandler_jcall,
+               .handle_channel_reestablish = handle_channel_reestablish_LDKChannelMessageHandler_jcall,
+               .handle_channel_update = handle_channel_update_LDKChannelMessageHandler_jcall,
+               .handle_error = handle_error_LDKChannelMessageHandler_jcall,
+               .provided_node_features = provided_node_features_LDKChannelMessageHandler_jcall,
+               .provided_init_features = provided_init_features_LDKChannelMessageHandler_jcall,
+               .get_chain_hashes = get_chain_hashes_LDKChannelMessageHandler_jcall,
+               .free = LDKChannelMessageHandler_JCalls_free,
+               .MessageSendEventsProvider = LDKMessageSendEventsProvider_init(MessageSendEventsProvider),
+       };
+       calls->MessageSendEventsProvider = ret.MessageSendEventsProvider.this_arg;
+       return ret;
+}
+uint64_t  CS_LDK_LDKChannelMessageHandler_new(int32_t o, int32_t MessageSendEventsProvider) {
+       LDKChannelMessageHandler *res_ptr = MALLOC(sizeof(LDKChannelMessageHandler), "LDKChannelMessageHandler");
+       *res_ptr = LDKChannelMessageHandler_init(o, MessageSendEventsProvider);
+       return tag_ptr(res_ptr, true);
+}
+void  CS_LDK_ChannelMessageHandler_handle_open_channel(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);
+       LDKOpenChannel 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_open_channel)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_open_channel_v2(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);
+       LDKOpenChannelV2 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_open_channel_v2)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_accept_channel(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);
+       LDKAcceptChannel 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_accept_channel)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_accept_channel_v2(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);
+       LDKAcceptChannelV2 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_accept_channel_v2)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_funding_created(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);
+       LDKFundingCreated 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_funding_created)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_funding_signed(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);
+       LDKFundingSigned 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_funding_signed)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_channel_ready(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);
+       LDKChannelReady 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_channel_ready)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_shutdown(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);
+       LDKShutdown 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_shutdown)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_closing_signed(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);
+       LDKClosingSigned 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_closing_signed)(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); }
+       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);
+       LDKTxAddInput 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_tx_add_input)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_tx_add_output(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);
+       LDKTxAddOutput 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_tx_add_output)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_tx_remove_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); }
+       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);
+       LDKTxRemoveInput 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_tx_remove_input)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_tx_remove_output(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);
+       LDKTxRemoveOutput 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_tx_remove_output)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_tx_complete(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);
+       LDKTxComplete 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_tx_complete)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_tx_signatures(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);
+       LDKTxSignatures 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_tx_signatures)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_tx_init_rbf(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);
+       LDKTxInitRbf 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_tx_init_rbf)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_tx_ack_rbf(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);
+       LDKTxAckRbf 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_tx_ack_rbf)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_tx_abort(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);
+       LDKTxAbort 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_tx_abort)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_update_add_htlc(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);
+       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;
+       (this_arg_conv->handle_update_add_htlc)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_update_fulfill_htlc(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);
+       LDKUpdateFulfillHTLC 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_update_fulfill_htlc)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_update_fail_htlc(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);
+       LDKUpdateFailHTLC 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_update_fail_htlc)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_update_fail_malformed_htlc(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);
+       LDKUpdateFailMalformedHTLC 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_update_fail_malformed_htlc)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_commitment_signed(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);
+       LDKCommitmentSigned 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_commitment_signed)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_revoke_and_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);
+       LDKRevokeAndACK 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_revoke_and_ack)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_update_fee(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);
+       LDKUpdateFee 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_update_fee)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_announcement_signatures(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);
+       LDKAnnouncementSignatures 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_announcement_signatures)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_peer_disconnected(int64_t this_arg, int8_tArray their_node_id) {
+       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);
+       (this_arg_conv->peer_disconnected)(this_arg_conv->this_arg, their_node_id_ref);
+}
+
+int64_t  CS_LDK_ChannelMessageHandler_peer_connected(int64_t this_arg, int8_tArray their_node_id, int64_t msg, jboolean inbound) {
+       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);
+       LDKInit 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = (this_arg_conv->peer_connected)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv, inbound);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_channel_reestablish(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);
+       LDKChannelReestablish 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_channel_reestablish)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_channel_update(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);
+       LDKChannelUpdate 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_channel_update)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_error(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);
+       LDKErrorMessage 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_error)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+int64_t  CS_LDK_ChannelMessageHandler_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); }
+       LDKChannelMessageHandler* this_arg_conv = (LDKChannelMessageHandler*)this_arg_ptr;
+       LDKNodeFeatures ret_var = (this_arg_conv->provided_node_features)(this_arg_conv->this_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_ChannelMessageHandler_provided_init_features(int64_t this_arg, int8_tArray their_node_id) {
+       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);
+       LDKInitFeatures ret_var = (this_arg_conv->provided_init_features)(this_arg_conv->this_arg, their_node_id_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_ChannelMessageHandler_get_chain_hashes(int64_t this_arg) {
+       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;
+       LDKCOption_CVec_ThirtyTwoBytesZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_ThirtyTwoBytesZZ), "LDKCOption_CVec_ThirtyTwoBytesZZ");
+       *ret_copy = (this_arg_conv->get_chain_hashes)(this_arg_conv->this_arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+typedef struct LDKOffersMessageHandler_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKOffersMessageHandler_JCalls;
+static void LDKOffersMessageHandler_JCalls_free(void* this_arg) {
+       LDKOffersMessageHandler_JCalls *j_calls = (LDKOffersMessageHandler_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCOption_OffersMessageZ handle_message_LDKOffersMessageHandler_jcall(const void* this_arg, LDKOffersMessage message) {
+       LDKOffersMessageHandler_JCalls *j_calls = (LDKOffersMessageHandler_JCalls*) this_arg;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCOption_OffersMessageZ ret_conv = *(LDKCOption_OffersMessageZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+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);
+       LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ ret_constr;
+       ret_constr.datalen = ret->arr_len;
+       if (ret_constr.datalen > 0)
+               ret_constr.data = MALLOC(ret_constr.datalen * sizeof(LDKC3Tuple_OffersMessageDestinationBlindedPathZ), "LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ 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);
+               LDKC3Tuple_OffersMessageDestinationBlindedPathZ ret_conv_49_conv = *(LDKC3Tuple_OffersMessageDestinationBlindedPathZ*)(ret_conv_49_ptr);
+               FREE(untag_ptr(ret_conv_49));
+               ret_constr.data[x] = ret_conv_49_conv;
+       }
+       FREE(ret);
+       return ret_constr;
+}
+static void LDKOffersMessageHandler_JCalls_cloned(LDKOffersMessageHandler* new_obj) {
+       LDKOffersMessageHandler_JCalls *j_calls = (LDKOffersMessageHandler_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKOffersMessageHandler LDKOffersMessageHandler_init (int64_t o) {
+       LDKOffersMessageHandler_JCalls *calls = MALLOC(sizeof(LDKOffersMessageHandler_JCalls), "LDKOffersMessageHandler_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKOffersMessageHandler ret = {
+               .this_arg = (void*) calls,
+               .handle_message = handle_message_LDKOffersMessageHandler_jcall,
+               .release_pending_messages = release_pending_messages_LDKOffersMessageHandler_jcall,
+               .free = LDKOffersMessageHandler_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKOffersMessageHandler_new(int32_t o) {
+       LDKOffersMessageHandler *res_ptr = MALLOC(sizeof(LDKOffersMessageHandler), "LDKOffersMessageHandler");
+       *res_ptr = LDKOffersMessageHandler_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_OffersMessageHandler_handle_message(int64_t this_arg, int64_t message) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKOffersMessageHandler* this_arg_conv = (LDKOffersMessageHandler*)this_arg_ptr;
+       void* message_ptr = untag_ptr(message);
+       CHECK_ACCESS(message_ptr);
+       LDKOffersMessage message_conv = *(LDKOffersMessage*)(message_ptr);
+       message_conv = OffersMessage_clone((LDKOffersMessage*)untag_ptr(message));
+       LDKCOption_OffersMessageZ *ret_copy = MALLOC(sizeof(LDKCOption_OffersMessageZ), "LDKCOption_OffersMessageZ");
+       *ret_copy = (this_arg_conv->handle_message)(this_arg_conv->this_arg, message_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_tArray  CS_LDK_OffersMessageHandler_release_pending_messages(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKOffersMessageHandler* this_arg_conv = (LDKOffersMessageHandler*)this_arg_ptr;
+       LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ ret_var = (this_arg_conv->release_pending_messages)(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++) {
+               LDKC3Tuple_OffersMessageDestinationBlindedPathZ* ret_conv_49_conv = MALLOC(sizeof(LDKC3Tuple_OffersMessageDestinationBlindedPathZ), "LDKC3Tuple_OffersMessageDestinationBlindedPathZ");
+               *ret_conv_49_conv = ret_var.data[x];
+               ret_arr_ptr[x] = tag_ptr(ret_conv_49_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+typedef struct LDKRoutingMessageHandler_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+       LDKMessageSendEventsProvider_JCalls* MessageSendEventsProvider;
+} LDKRoutingMessageHandler_JCalls;
+static void LDKRoutingMessageHandler_JCalls_free(void* this_arg) {
+       LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_boolLightningErrorZ handle_node_announcement_LDKRoutingMessageHandler_jcall(const void* this_arg, const LDKNodeAnnouncement * msg) {
+       LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
+       LDKNodeAnnouncement msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_boolLightningErrorZ handle_channel_announcement_LDKRoutingMessageHandler_jcall(const void* this_arg, const LDKChannelAnnouncement * msg) {
+       LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
+       LDKChannelAnnouncement msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_boolLightningErrorZ handle_channel_update_LDKRoutingMessageHandler_jcall(const void* this_arg, const LDKChannelUpdate * msg) {
+       LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
+       LDKChannelUpdate msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ ret_conv = *(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKNodeAnnouncement get_next_node_announcement_LDKRoutingMessageHandler_jcall(const void* this_arg, LDKNodeId starting_point) {
+       LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
+       LDKNodeId starting_point_var = starting_point;
+       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);
+       LDKNodeAnnouncement ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+LDKCResult_NoneNoneZ peer_connected_LDKRoutingMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKInit * init, bool inbound) {
+       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);
+       LDKInit init_var = *init;
+       int64_t init_ref = 0;
+       init_var = Init_clone(&init_var);
+       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);
+       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_NoneLightningErrorZ handle_reply_channel_range_LDKRoutingMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, LDKReplyChannelRange msg) {
+       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);
+       LDKReplyChannelRange msg_var = msg;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_NoneLightningErrorZ handle_reply_short_channel_ids_end_LDKRoutingMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, LDKReplyShortChannelIdsEnd msg) {
+       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);
+       LDKReplyShortChannelIdsEnd msg_var = msg;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_NoneLightningErrorZ handle_query_channel_range_LDKRoutingMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, LDKQueryChannelRange msg) {
+       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);
+       LDKQueryChannelRange msg_var = msg;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_NoneLightningErrorZ handle_query_short_channel_ids_LDKRoutingMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, LDKQueryShortChannelIds msg) {
+       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);
+       LDKQueryShortChannelIds msg_var = msg;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+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);
+}
+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);
+       LDKNodeFeatures ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+LDKInitFeatures provided_init_features_LDKRoutingMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id) {
+       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);
+       LDKInitFeatures ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+static void LDKRoutingMessageHandler_JCalls_cloned(LDKRoutingMessageHandler* new_obj) {
+       LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->MessageSendEventsProvider->refcnt, 1, memory_order_release);
+}
+static inline LDKRoutingMessageHandler LDKRoutingMessageHandler_init (int64_t o, int64_t MessageSendEventsProvider) {
+       LDKRoutingMessageHandler_JCalls *calls = MALLOC(sizeof(LDKRoutingMessageHandler_JCalls), "LDKRoutingMessageHandler_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKRoutingMessageHandler ret = {
+               .this_arg = (void*) calls,
+               .handle_node_announcement = handle_node_announcement_LDKRoutingMessageHandler_jcall,
+               .handle_channel_announcement = handle_channel_announcement_LDKRoutingMessageHandler_jcall,
+               .handle_channel_update = handle_channel_update_LDKRoutingMessageHandler_jcall,
+               .get_next_channel_announcement = get_next_channel_announcement_LDKRoutingMessageHandler_jcall,
+               .get_next_node_announcement = get_next_node_announcement_LDKRoutingMessageHandler_jcall,
+               .peer_connected = peer_connected_LDKRoutingMessageHandler_jcall,
+               .handle_reply_channel_range = handle_reply_channel_range_LDKRoutingMessageHandler_jcall,
+               .handle_reply_short_channel_ids_end = handle_reply_short_channel_ids_end_LDKRoutingMessageHandler_jcall,
+               .handle_query_channel_range = handle_query_channel_range_LDKRoutingMessageHandler_jcall,
+               .handle_query_short_channel_ids = handle_query_short_channel_ids_LDKRoutingMessageHandler_jcall,
+               .processing_queue_high = processing_queue_high_LDKRoutingMessageHandler_jcall,
+               .provided_node_features = provided_node_features_LDKRoutingMessageHandler_jcall,
+               .provided_init_features = provided_init_features_LDKRoutingMessageHandler_jcall,
+               .free = LDKRoutingMessageHandler_JCalls_free,
+               .MessageSendEventsProvider = LDKMessageSendEventsProvider_init(MessageSendEventsProvider),
+       };
+       calls->MessageSendEventsProvider = ret.MessageSendEventsProvider.this_arg;
+       return ret;
+}
+uint64_t  CS_LDK_LDKRoutingMessageHandler_new(int32_t o, int32_t MessageSendEventsProvider) {
+       LDKRoutingMessageHandler *res_ptr = MALLOC(sizeof(LDKRoutingMessageHandler), "LDKRoutingMessageHandler");
+       *res_ptr = LDKRoutingMessageHandler_init(o, MessageSendEventsProvider);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_RoutingMessageHandler_handle_node_announcement(int64_t this_arg, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)this_arg_ptr;
+       LDKNodeAnnouncement 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;
+       LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
+       *ret_conv = (this_arg_conv->handle_node_announcement)(this_arg_conv->this_arg, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_handle_channel_announcement(int64_t this_arg, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)this_arg_ptr;
+       LDKChannelAnnouncement 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;
+       LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
+       *ret_conv = (this_arg_conv->handle_channel_announcement)(this_arg_conv->this_arg, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_handle_channel_update(int64_t this_arg, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)this_arg_ptr;
+       LDKChannelUpdate 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;
+       LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
+       *ret_conv = (this_arg_conv->handle_channel_update)(this_arg_conv->this_arg, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_get_next_channel_announcement(int64_t this_arg, int64_t starting_point) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)this_arg_ptr;
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *ret_copy = MALLOC(sizeof(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ), "LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ");
+       *ret_copy = (this_arg_conv->get_next_channel_announcement)(this_arg_conv->this_arg, starting_point);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_get_next_node_announcement(int64_t this_arg, int64_t starting_point) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)this_arg_ptr;
+       LDKNodeId starting_point_conv;
+       starting_point_conv.inner = untag_ptr(starting_point);
+       starting_point_conv.is_owned = ptr_is_owned(starting_point);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(starting_point_conv);
+       starting_point_conv = NodeId_clone(&starting_point_conv);
+       LDKNodeAnnouncement ret_var = (this_arg_conv->get_next_node_announcement)(this_arg_conv->this_arg, starting_point_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_RoutingMessageHandler_peer_connected(int64_t this_arg, int8_tArray their_node_id, int64_t init, jboolean inbound) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)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);
+       LDKInit init_conv;
+       init_conv.inner = untag_ptr(init);
+       init_conv.is_owned = ptr_is_owned(init);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(init_conv);
+       init_conv.is_owned = false;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = (this_arg_conv->peer_connected)(this_arg_conv->this_arg, their_node_id_ref, &init_conv, inbound);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_handle_reply_channel_range(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); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)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);
+       LDKReplyChannelRange 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 = ReplyChannelRange_clone(&msg_conv);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = (this_arg_conv->handle_reply_channel_range)(this_arg_conv->this_arg, their_node_id_ref, msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_handle_reply_short_channel_ids_end(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); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)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);
+       LDKReplyShortChannelIdsEnd 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 = ReplyShortChannelIdsEnd_clone(&msg_conv);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = (this_arg_conv->handle_reply_short_channel_ids_end)(this_arg_conv->this_arg, their_node_id_ref, msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_handle_query_channel_range(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); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)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);
+       LDKQueryChannelRange 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 = QueryChannelRange_clone(&msg_conv);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = (this_arg_conv->handle_query_channel_range)(this_arg_conv->this_arg, their_node_id_ref, msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_handle_query_short_channel_ids(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); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)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);
+       LDKQueryShortChannelIds 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 = QueryShortChannelIds_clone(&msg_conv);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = (this_arg_conv->handle_query_short_channel_ids)(this_arg_conv->this_arg, their_node_id_ref, msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_RoutingMessageHandler_processing_queue_high(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)this_arg_ptr;
+       jboolean ret_conv = (this_arg_conv->processing_queue_high)(this_arg_conv->this_arg);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RoutingMessageHandler_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); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)this_arg_ptr;
+       LDKNodeFeatures ret_var = (this_arg_conv->provided_node_features)(this_arg_conv->this_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_RoutingMessageHandler_provided_init_features(int64_t this_arg, int8_tArray their_node_id) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRoutingMessageHandler* this_arg_conv = (LDKRoutingMessageHandler*)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);
+       LDKInitFeatures ret_var = (this_arg_conv->provided_init_features)(this_arg_conv->this_arg, their_node_id_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;
+}
+
+typedef struct LDKOnionMessageHandler_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKOnionMessageHandler_JCalls;
+static void LDKOnionMessageHandler_JCalls_free(void* this_arg) {
+       LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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__);
+       memcpy(peer_node_id_arr->elems, peer_node_id.compressed_form, 33);
+       LDKOnionMessage msg_var = *msg;
+       int64_t msg_ref = 0;
+       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);
+}
+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);
+       LDKOnionMessage ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+LDKCResult_NoneNoneZ peer_connected_LDKOnionMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKInit * init, bool inbound) {
+       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);
+       LDKInit init_var = *init;
+       int64_t init_ref = 0;
+       init_var = Init_clone(&init_var);
+       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);
+       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;
+}
+void peer_disconnected_LDKOnionMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id) {
+       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);
+}
+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);
+       LDKNodeFeatures ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+LDKInitFeatures provided_init_features_LDKOnionMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id) {
+       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);
+       LDKInitFeatures ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+static void LDKOnionMessageHandler_JCalls_cloned(LDKOnionMessageHandler* new_obj) {
+       LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKOnionMessageHandler LDKOnionMessageHandler_init (int64_t o) {
+       LDKOnionMessageHandler_JCalls *calls = MALLOC(sizeof(LDKOnionMessageHandler_JCalls), "LDKOnionMessageHandler_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKOnionMessageHandler ret = {
+               .this_arg = (void*) calls,
+               .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,
+               .provided_node_features = provided_node_features_LDKOnionMessageHandler_jcall,
+               .provided_init_features = provided_init_features_LDKOnionMessageHandler_jcall,
+               .free = LDKOnionMessageHandler_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKOnionMessageHandler_new(int32_t o) {
+       LDKOnionMessageHandler *res_ptr = MALLOC(sizeof(LDKOnionMessageHandler), "LDKOnionMessageHandler");
+       *res_ptr = LDKOnionMessageHandler_init(o);
+       return tag_ptr(res_ptr, true);
+}
+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); }
+       LDKOnionMessageHandler* this_arg_conv = (LDKOnionMessageHandler*)this_arg_ptr;
+       LDKPublicKey peer_node_id_ref;
+       CHECK(peer_node_id->arr_len == 33);
+       memcpy(peer_node_id_ref.compressed_form, peer_node_id->elems, 33); FREE(peer_node_id);
+       LDKOnionMessage 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_onion_message)(this_arg_conv->this_arg, peer_node_id_ref, &msg_conv);
+}
+
+int64_t  CS_LDK_OnionMessageHandler_next_onion_message_for_peer(int64_t this_arg, int8_tArray peer_node_id) {
+       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;
+       LDKPublicKey peer_node_id_ref;
+       CHECK(peer_node_id->arr_len == 33);
+       memcpy(peer_node_id_ref.compressed_form, peer_node_id->elems, 33); FREE(peer_node_id);
+       LDKOnionMessage ret_var = (this_arg_conv->next_onion_message_for_peer)(this_arg_conv->this_arg, peer_node_id_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_OnionMessageHandler_peer_connected(int64_t this_arg, int8_tArray their_node_id, int64_t init, jboolean inbound) {
+       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;
+       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);
+       LDKInit init_conv;
+       init_conv.inner = untag_ptr(init);
+       init_conv.is_owned = ptr_is_owned(init);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(init_conv);
+       init_conv.is_owned = false;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = (this_arg_conv->peer_connected)(this_arg_conv->this_arg, their_node_id_ref, &init_conv, inbound);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_OnionMessageHandler_peer_disconnected(int64_t this_arg, int8_tArray their_node_id) {
+       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;
+       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);
+       (this_arg_conv->peer_disconnected)(this_arg_conv->this_arg, their_node_id_ref);
+}
+
+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); }
+       LDKOnionMessageHandler* this_arg_conv = (LDKOnionMessageHandler*)this_arg_ptr;
+       LDKNodeFeatures ret_var = (this_arg_conv->provided_node_features)(this_arg_conv->this_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_OnionMessageHandler_provided_init_features(int64_t this_arg, int8_tArray their_node_id) {
+       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;
+       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);
+       LDKInitFeatures ret_var = (this_arg_conv->provided_init_features)(this_arg_conv->this_arg, their_node_id_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;
+}
+
+typedef struct LDKCustomMessageReader_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKCustomMessageReader_JCalls;
+static void LDKCustomMessageReader_JCalls_free(void* this_arg) {
+       LDKCustomMessageReader_JCalls *j_calls = (LDKCustomMessageReader_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_COption_TypeZDecodeErrorZ read_LDKCustomMessageReader_jcall(const void* this_arg, uint16_t message_type, LDKu8slice buffer) {
+       LDKCustomMessageReader_JCalls *j_calls = (LDKCustomMessageReader_JCalls*) this_arg;
+       int16_t message_type_conv = message_type;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_COption_TypeZDecodeErrorZ ret_conv = *(LDKCResult_COption_TypeZDecodeErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKCustomMessageReader_JCalls_cloned(LDKCustomMessageReader* new_obj) {
+       LDKCustomMessageReader_JCalls *j_calls = (LDKCustomMessageReader_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKCustomMessageReader LDKCustomMessageReader_init (int64_t o) {
+       LDKCustomMessageReader_JCalls *calls = MALLOC(sizeof(LDKCustomMessageReader_JCalls), "LDKCustomMessageReader_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKCustomMessageReader ret = {
+               .this_arg = (void*) calls,
+               .read = read_LDKCustomMessageReader_jcall,
+               .free = LDKCustomMessageReader_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKCustomMessageReader_new(int32_t o) {
+       LDKCustomMessageReader *res_ptr = MALLOC(sizeof(LDKCustomMessageReader), "LDKCustomMessageReader");
+       *res_ptr = LDKCustomMessageReader_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_CustomMessageReader_read(int64_t this_arg, int16_t message_type, int8_tArray buffer) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKCustomMessageReader* this_arg_conv = (LDKCustomMessageReader*)this_arg_ptr;
+       LDKu8slice buffer_ref;
+       buffer_ref.datalen = buffer->arr_len;
+       buffer_ref.data = buffer->elems;
+       LDKCResult_COption_TypeZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_TypeZDecodeErrorZ), "LDKCResult_COption_TypeZDecodeErrorZ");
+       *ret_conv = (this_arg_conv->read)(this_arg_conv->this_arg, message_type, buffer_ref);
+       FREE(buffer);
+       return tag_ptr(ret_conv, true);
+}
+
+typedef struct LDKCustomMessageHandler_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+       LDKCustomMessageReader_JCalls* CustomMessageReader;
+} LDKCustomMessageHandler_JCalls;
+static void LDKCustomMessageHandler_JCalls_free(void* this_arg) {
+       LDKCustomMessageHandler_JCalls *j_calls = (LDKCustomMessageHandler_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_NoneLightningErrorZ handle_custom_message_LDKCustomMessageHandler_jcall(const void* this_arg, LDKType msg, LDKPublicKey sender_node_id) {
+       LDKCustomMessageHandler_JCalls *j_calls = (LDKCustomMessageHandler_JCalls*) this_arg;
+       LDKType* msg_ret = MALLOC(sizeof(LDKType), "LDKType");
+       *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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+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);
+       LDKCVec_C2Tuple_PublicKeyTypeZZ ret_constr;
+       ret_constr.datalen = ret->arr_len;
+       if (ret_constr.datalen > 0)
+               ret_constr.data = MALLOC(ret_constr.datalen * sizeof(LDKC2Tuple_PublicKeyTypeZ), "LDKCVec_C2Tuple_PublicKeyTypeZZ Elements");
+       else
+               ret_constr.data = NULL;
+       int64_t* ret_vals = ret->elems;
+       for (size_t z = 0; z < ret_constr.datalen; z++) {
+               int64_t ret_conv_25 = ret_vals[z];
+               void* ret_conv_25_ptr = untag_ptr(ret_conv_25);
+               CHECK_ACCESS(ret_conv_25_ptr);
+               LDKC2Tuple_PublicKeyTypeZ ret_conv_25_conv = *(LDKC2Tuple_PublicKeyTypeZ*)(ret_conv_25_ptr);
+               FREE(untag_ptr(ret_conv_25));
+               ret_constr.data[z] = ret_conv_25_conv;
+       }
+       FREE(ret);
+       return ret_constr;
+}
+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);
+       LDKNodeFeatures ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+LDKInitFeatures provided_init_features_LDKCustomMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id) {
+       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);
+       LDKInitFeatures ret_conv;
+       ret_conv.inner = untag_ptr(ret);
+       ret_conv.is_owned = ptr_is_owned(ret);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv);
+       return ret_conv;
+}
+static void LDKCustomMessageHandler_JCalls_cloned(LDKCustomMessageHandler* new_obj) {
+       LDKCustomMessageHandler_JCalls *j_calls = (LDKCustomMessageHandler_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->CustomMessageReader->refcnt, 1, memory_order_release);
+}
+static inline LDKCustomMessageHandler LDKCustomMessageHandler_init (int64_t o, int64_t CustomMessageReader) {
+       LDKCustomMessageHandler_JCalls *calls = MALLOC(sizeof(LDKCustomMessageHandler_JCalls), "LDKCustomMessageHandler_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKCustomMessageHandler ret = {
+               .this_arg = (void*) calls,
+               .handle_custom_message = handle_custom_message_LDKCustomMessageHandler_jcall,
+               .get_and_clear_pending_msg = get_and_clear_pending_msg_LDKCustomMessageHandler_jcall,
+               .provided_node_features = provided_node_features_LDKCustomMessageHandler_jcall,
+               .provided_init_features = provided_init_features_LDKCustomMessageHandler_jcall,
+               .free = LDKCustomMessageHandler_JCalls_free,
+               .CustomMessageReader = LDKCustomMessageReader_init(CustomMessageReader),
+       };
+       calls->CustomMessageReader = ret.CustomMessageReader.this_arg;
+       return ret;
+}
+uint64_t  CS_LDK_LDKCustomMessageHandler_new(int32_t o, int32_t CustomMessageReader) {
+       LDKCustomMessageHandler *res_ptr = MALLOC(sizeof(LDKCustomMessageHandler), "LDKCustomMessageHandler");
+       *res_ptr = LDKCustomMessageHandler_init(o, CustomMessageReader);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_CustomMessageHandler_handle_custom_message(int64_t this_arg, int64_t msg, int8_tArray sender_node_id) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKCustomMessageHandler* this_arg_conv = (LDKCustomMessageHandler*)this_arg_ptr;
+       void* msg_ptr = untag_ptr(msg);
+       CHECK_ACCESS(msg_ptr);
+       LDKType msg_conv = *(LDKType*)(msg_ptr);
+       if (msg_conv.free == LDKType_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKType_JCalls_cloned(&msg_conv);
+       }
+       LDKPublicKey sender_node_id_ref;
+       CHECK(sender_node_id->arr_len == 33);
+       memcpy(sender_node_id_ref.compressed_form, sender_node_id->elems, 33); FREE(sender_node_id);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = (this_arg_conv->handle_custom_message)(this_arg_conv->this_arg, msg_conv, sender_node_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_tArray  CS_LDK_CustomMessageHandler_get_and_clear_pending_msg(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKCustomMessageHandler* this_arg_conv = (LDKCustomMessageHandler*)this_arg_ptr;
+       LDKCVec_C2Tuple_PublicKeyTypeZZ ret_var = (this_arg_conv->get_and_clear_pending_msg)(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 z = 0; z < ret_var.datalen; z++) {
+               LDKC2Tuple_PublicKeyTypeZ* ret_conv_25_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyTypeZ), "LDKC2Tuple_PublicKeyTypeZ");
+               *ret_conv_25_conv = ret_var.data[z];
+               ret_arr_ptr[z] = tag_ptr(ret_conv_25_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_CustomMessageHandler_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); }
+       LDKCustomMessageHandler* this_arg_conv = (LDKCustomMessageHandler*)this_arg_ptr;
+       LDKNodeFeatures ret_var = (this_arg_conv->provided_node_features)(this_arg_conv->this_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_CustomMessageHandler_provided_init_features(int64_t this_arg, int8_tArray their_node_id) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKCustomMessageHandler* this_arg_conv = (LDKCustomMessageHandler*)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);
+       LDKInitFeatures ret_var = (this_arg_conv->provided_init_features)(this_arg_conv->this_arg, their_node_id_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;
+}
+
+typedef struct LDKCustomOnionMessageHandler_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKCustomOnionMessageHandler_JCalls;
+static void LDKCustomOnionMessageHandler_JCalls_free(void* this_arg) {
+       LDKCustomOnionMessageHandler_JCalls *j_calls = (LDKCustomOnionMessageHandler_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCOption_OnionMessageContentsZ handle_custom_message_LDKCustomOnionMessageHandler_jcall(const void* this_arg, LDKOnionMessageContents msg) {
+       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));
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCOption_OnionMessageContentsZ ret_conv = *(LDKCOption_OnionMessageContentsZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_COption_OnionMessageContentsZDecodeErrorZ read_custom_message_LDKCustomOnionMessageHandler_jcall(const void* this_arg, uint64_t message_type, LDKu8slice buffer) {
+       LDKCustomOnionMessageHandler_JCalls *j_calls = (LDKCustomOnionMessageHandler_JCalls*) this_arg;
+       int64_t message_type_conv = message_type;
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ ret_conv = *(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+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);
+       LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ ret_constr;
+       ret_constr.datalen = ret->arr_len;
+       if (ret_constr.datalen > 0)
+               ret_constr.data = MALLOC(ret_constr.datalen * sizeof(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ), "LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ Elements");
+       else
+               ret_constr.data = NULL;
+       int64_t* ret_vals = ret->elems;
+       for (size_t e = 0; e < ret_constr.datalen; e++) {
+               int64_t ret_conv_56 = ret_vals[e];
+               void* ret_conv_56_ptr = untag_ptr(ret_conv_56);
+               CHECK_ACCESS(ret_conv_56_ptr);
+               LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ ret_conv_56_conv = *(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ*)(ret_conv_56_ptr);
+               FREE(untag_ptr(ret_conv_56));
+               ret_constr.data[e] = ret_conv_56_conv;
+       }
+       FREE(ret);
+       return ret_constr;
+}
+static void LDKCustomOnionMessageHandler_JCalls_cloned(LDKCustomOnionMessageHandler* new_obj) {
+       LDKCustomOnionMessageHandler_JCalls *j_calls = (LDKCustomOnionMessageHandler_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKCustomOnionMessageHandler LDKCustomOnionMessageHandler_init (int64_t o) {
+       LDKCustomOnionMessageHandler_JCalls *calls = MALLOC(sizeof(LDKCustomOnionMessageHandler_JCalls), "LDKCustomOnionMessageHandler_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKCustomOnionMessageHandler ret = {
+               .this_arg = (void*) calls,
+               .handle_custom_message = handle_custom_message_LDKCustomOnionMessageHandler_jcall,
+               .read_custom_message = read_custom_message_LDKCustomOnionMessageHandler_jcall,
+               .release_pending_custom_messages = release_pending_custom_messages_LDKCustomOnionMessageHandler_jcall,
+               .free = LDKCustomOnionMessageHandler_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKCustomOnionMessageHandler_new(int32_t o) {
+       LDKCustomOnionMessageHandler *res_ptr = MALLOC(sizeof(LDKCustomOnionMessageHandler), "LDKCustomOnionMessageHandler");
+       *res_ptr = LDKCustomOnionMessageHandler_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_CustomOnionMessageHandler_handle_custom_message(int64_t this_arg, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKCustomOnionMessageHandler* this_arg_conv = (LDKCustomOnionMessageHandler*)this_arg_ptr;
+       void* msg_ptr = untag_ptr(msg);
+       CHECK_ACCESS(msg_ptr);
+       LDKOnionMessageContents msg_conv = *(LDKOnionMessageContents*)(msg_ptr);
+       if (msg_conv.free == LDKOnionMessageContents_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOnionMessageContents_JCalls_cloned(&msg_conv);
+       }
+       LDKCOption_OnionMessageContentsZ *ret_copy = MALLOC(sizeof(LDKCOption_OnionMessageContentsZ), "LDKCOption_OnionMessageContentsZ");
+       *ret_copy = (this_arg_conv->handle_custom_message)(this_arg_conv->this_arg, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CustomOnionMessageHandler_read_custom_message(int64_t this_arg, int64_t message_type, int8_tArray buffer) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKCustomOnionMessageHandler* this_arg_conv = (LDKCustomOnionMessageHandler*)this_arg_ptr;
+       LDKu8slice buffer_ref;
+       buffer_ref.datalen = buffer->arr_len;
+       buffer_ref.data = buffer->elems;
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ), "LDKCResult_COption_OnionMessageContentsZDecodeErrorZ");
+       *ret_conv = (this_arg_conv->read_custom_message)(this_arg_conv->this_arg, message_type, buffer_ref);
+       FREE(buffer);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_tArray  CS_LDK_CustomOnionMessageHandler_release_pending_custom_messages(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKCustomOnionMessageHandler* this_arg_conv = (LDKCustomOnionMessageHandler*)this_arg_ptr;
+       LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ ret_var = (this_arg_conv->release_pending_custom_messages)(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 e = 0; e < ret_var.datalen; e++) {
+               LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* ret_conv_56_conv = MALLOC(sizeof(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ), "LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ");
+               *ret_conv_56_conv = ret_var.data[e];
+               ret_arr_ptr[e] = tag_ptr(ret_conv_56_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+typedef struct LDKSocketDescriptor_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKSocketDescriptor_JCalls;
+static void LDKSocketDescriptor_JCalls_free(void* this_arg) {
+       LDKSocketDescriptor_JCalls *j_calls = (LDKSocketDescriptor_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+uintptr_t send_data_LDKSocketDescriptor_jcall(void* this_arg, LDKu8slice data, bool resume_read) {
+       LDKSocketDescriptor_JCalls *j_calls = (LDKSocketDescriptor_JCalls*) this_arg;
+       LDKu8slice data_var = data;
+       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);
+}
+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);
+}
+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));
+}
+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);
+}
+static void LDKSocketDescriptor_JCalls_cloned(LDKSocketDescriptor* new_obj) {
+       LDKSocketDescriptor_JCalls *j_calls = (LDKSocketDescriptor_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKSocketDescriptor LDKSocketDescriptor_init (int64_t o) {
+       LDKSocketDescriptor_JCalls *calls = MALLOC(sizeof(LDKSocketDescriptor_JCalls), "LDKSocketDescriptor_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKSocketDescriptor ret = {
+               .this_arg = (void*) calls,
+               .send_data = send_data_LDKSocketDescriptor_jcall,
+               .disconnect_socket = disconnect_socket_LDKSocketDescriptor_jcall,
+               .eq = eq_LDKSocketDescriptor_jcall,
+               .hash = hash_LDKSocketDescriptor_jcall,
+               .cloned = LDKSocketDescriptor_JCalls_cloned,
+               .free = LDKSocketDescriptor_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKSocketDescriptor_new(int32_t o) {
+       LDKSocketDescriptor *res_ptr = MALLOC(sizeof(LDKSocketDescriptor), "LDKSocketDescriptor");
+       *res_ptr = LDKSocketDescriptor_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_SocketDescriptor_send_data(int64_t this_arg, int8_tArray data, jboolean resume_read) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKSocketDescriptor* this_arg_conv = (LDKSocketDescriptor*)this_arg_ptr;
+       LDKu8slice data_ref;
+       data_ref.datalen = data->arr_len;
+       data_ref.data = data->elems;
+       int64_t ret_conv = (this_arg_conv->send_data)(this_arg_conv->this_arg, data_ref, resume_read);
+       FREE(data);
+       return ret_conv;
+}
+
+void  CS_LDK_SocketDescriptor_disconnect_socket(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKSocketDescriptor* this_arg_conv = (LDKSocketDescriptor*)this_arg_ptr;
+       (this_arg_conv->disconnect_socket)(this_arg_conv->this_arg);
+}
+
+int64_t  CS_LDK_SocketDescriptor_hash(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKSocketDescriptor* this_arg_conv = (LDKSocketDescriptor*)this_arg_ptr;
+       int64_t ret_conv = (this_arg_conv->hash)(this_arg_conv->this_arg);
+       return ret_conv;
+}
+
+uint32_t CS_LDK_LDKEffectiveCapacity_ty_from_ptr(int64_t ptr) {
+       LDKEffectiveCapacity *obj = (LDKEffectiveCapacity*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKEffectiveCapacity_ExactLiquidity: return 0;
+               case LDKEffectiveCapacity_AdvertisedMaxHTLC: return 1;
+               case LDKEffectiveCapacity_Total: return 2;
+               case LDKEffectiveCapacity_Infinite: return 3;
+               case LDKEffectiveCapacity_HintMaxHTLC: return 4;
+               case LDKEffectiveCapacity_Unknown: return 5;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKEffectiveCapacity_ExactLiquidity_get_liquidity_msat(int64_t ptr) {
+       LDKEffectiveCapacity *obj = (LDKEffectiveCapacity*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEffectiveCapacity_ExactLiquidity);
+       int64_t liquidity_msat_conv = obj->exact_liquidity.liquidity_msat;
+       return liquidity_msat_conv;
+}
+int64_t CS_LDK_LDKEffectiveCapacity_AdvertisedMaxHTLC_get_amount_msat(int64_t ptr) {
+       LDKEffectiveCapacity *obj = (LDKEffectiveCapacity*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEffectiveCapacity_AdvertisedMaxHTLC);
+       int64_t amount_msat_conv = obj->advertised_max_htlc.amount_msat;
+       return amount_msat_conv;
+}
+int64_t CS_LDK_LDKEffectiveCapacity_Total_get_capacity_msat(int64_t ptr) {
+       LDKEffectiveCapacity *obj = (LDKEffectiveCapacity*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEffectiveCapacity_Total);
+       int64_t capacity_msat_conv = obj->total.capacity_msat;
+       return capacity_msat_conv;
+}
+int64_t CS_LDK_LDKEffectiveCapacity_Total_get_htlc_maximum_msat(int64_t ptr) {
+       LDKEffectiveCapacity *obj = (LDKEffectiveCapacity*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEffectiveCapacity_Total);
+       int64_t htlc_maximum_msat_conv = obj->total.htlc_maximum_msat;
+       return htlc_maximum_msat_conv;
+}
+int64_t CS_LDK_LDKEffectiveCapacity_HintMaxHTLC_get_amount_msat(int64_t ptr) {
+       LDKEffectiveCapacity *obj = (LDKEffectiveCapacity*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEffectiveCapacity_HintMaxHTLC);
+       int64_t amount_msat_conv = obj->hint_max_htlc.amount_msat;
+       return amount_msat_conv;
+}
+uint32_t CS_LDK_LDKPayee_ty_from_ptr(int64_t ptr) {
+       LDKPayee *obj = (LDKPayee*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKPayee_Blinded: return 0;
+               case LDKPayee_Clear: return 1;
+               default: abort();
+       }
+}
+int64_tArray CS_LDK_LDKPayee_Blinded_get_route_hints(int64_t ptr) {
+       LDKPayee *obj = (LDKPayee*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPayee_Blinded);
+       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ route_hints_var = obj->blinded.route_hints;
+                       int64_tArray route_hints_arr = NULL;
+                       route_hints_arr = init_int64_tArray(route_hints_var.datalen, __LINE__);
+                       int64_t *route_hints_arr_ptr = (int64_t*)(((uint8_t*)route_hints_arr) + 8);
+                       for (size_t l = 0; l < route_hints_var.datalen; l++) {
+                               LDKC2Tuple_BlindedPayInfoBlindedPathZ* route_hints_conv_37_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
+                               *route_hints_conv_37_conv = route_hints_var.data[l];
+                               *route_hints_conv_37_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone(route_hints_conv_37_conv);
+                               route_hints_arr_ptr[l] = tag_ptr(route_hints_conv_37_conv, true);
+                       }
+                       
+       return route_hints_arr;
+}
+int64_t CS_LDK_LDKPayee_Blinded_get_features(int64_t ptr) {
+       LDKPayee *obj = (LDKPayee*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPayee_Blinded);
+       LDKBolt12InvoiceFeatures features_var = obj->blinded.features;
+                       int64_t features_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_var);
+                       features_ref = tag_ptr(features_var.inner, false);
+       return features_ref;
+}
+int8_tArray CS_LDK_LDKPayee_Clear_get_node_id(int64_t ptr) {
+       LDKPayee *obj = (LDKPayee*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPayee_Clear);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->clear.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_tArray CS_LDK_LDKPayee_Clear_get_route_hints(int64_t ptr) {
+       LDKPayee *obj = (LDKPayee*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPayee_Clear);
+       LDKCVec_RouteHintZ route_hints_var = obj->clear.route_hints;
+                       int64_tArray route_hints_arr = NULL;
+                       route_hints_arr = init_int64_tArray(route_hints_var.datalen, __LINE__);
+                       int64_t *route_hints_arr_ptr = (int64_t*)(((uint8_t*)route_hints_arr) + 8);
+                       for (size_t l = 0; l < route_hints_var.datalen; l++) {
+                               LDKRouteHint route_hints_conv_11_var = route_hints_var.data[l];
+                               int64_t route_hints_conv_11_ref = 0;
+                               CHECK_INNER_FIELD_ACCESS_OR_NULL(route_hints_conv_11_var);
+                               route_hints_conv_11_ref = tag_ptr(route_hints_conv_11_var.inner, false);
+                               route_hints_arr_ptr[l] = route_hints_conv_11_ref;
+                       }
+                       
+       return route_hints_arr;
+}
+int64_t CS_LDK_LDKPayee_Clear_get_features(int64_t ptr) {
+       LDKPayee *obj = (LDKPayee*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPayee_Clear);
+       LDKBolt11InvoiceFeatures features_var = obj->clear.features;
+                       int64_t features_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_var);
+                       features_ref = tag_ptr(features_var.inner, false);
+       return features_ref;
+}
+int32_t CS_LDK_LDKPayee_Clear_get_final_cltv_expiry_delta(int64_t ptr) {
+       LDKPayee *obj = (LDKPayee*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPayee_Clear);
+       int32_t final_cltv_expiry_delta_conv = obj->clear.final_cltv_expiry_delta;
+       return final_cltv_expiry_delta_conv;
+}
+typedef struct LDKScore_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+       LDKScoreLookUp_JCalls* ScoreLookUp;
+       LDKScoreUpdate_JCalls* ScoreUpdate;
+} LDKScore_JCalls;
+static void LDKScore_JCalls_free(void* this_arg) {
+       LDKScore_JCalls *j_calls = (LDKScore_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+       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;
+}
+static void LDKScore_JCalls_cloned(LDKScore* new_obj) {
+       LDKScore_JCalls *j_calls = (LDKScore_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->ScoreLookUp->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->ScoreUpdate->refcnt, 1, memory_order_release);
+}
+static inline LDKScore LDKScore_init (int64_t o, int64_t ScoreLookUp, int64_t ScoreUpdate) {
+       LDKScore_JCalls *calls = MALLOC(sizeof(LDKScore_JCalls), "LDKScore_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKScore ret = {
+               .this_arg = (void*) calls,
+               .write = write_LDKScore_jcall,
+               .free = LDKScore_JCalls_free,
+               .ScoreLookUp = LDKScoreLookUp_init(ScoreLookUp),
+               .ScoreUpdate = LDKScoreUpdate_init(ScoreUpdate),
+       };
+       calls->ScoreLookUp = ret.ScoreLookUp.this_arg;
+       calls->ScoreUpdate = ret.ScoreUpdate.this_arg;
+       return ret;
+}
+uint64_t  CS_LDK_LDKScore_new(int32_t o, int32_t ScoreLookUp, int32_t ScoreUpdate) {
+       LDKScore *res_ptr = MALLOC(sizeof(LDKScore), "LDKScore");
+       *res_ptr = LDKScore_init(o, ScoreLookUp, ScoreUpdate);
+       return tag_ptr(res_ptr, true);
+}
+int8_tArray  CS_LDK_Score_write(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKScore* this_arg_conv = (LDKScore*)this_arg_ptr;
+       LDKCVec_u8Z ret_var = (this_arg_conv->write)(this_arg_conv->this_arg);
+       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;
+}
+
+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;
+} LDKCoinSelectionSource_JCalls;
+static void LDKCoinSelectionSource_JCalls_free(void* this_arg) {
+       LDKCoinSelectionSource_JCalls *j_calls = (LDKCoinSelectionSource_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_CoinSelectionNoneZ select_confirmed_utxos_LDKCoinSelectionSource_jcall(const void* this_arg, LDKThirtyTwoBytes claim_id, LDKCVec_InputZ must_spend, LDKCVec_TxOutZ must_pay_to, uint32_t target_feerate_sat_per_1000_weight) {
+       LDKCoinSelectionSource_JCalls *j_calls = (LDKCoinSelectionSource_JCalls*) this_arg;
+       int8_tArray claim_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(claim_id_arr->elems, claim_id.data, 32);
+       LDKCVec_InputZ must_spend_var = must_spend;
+       int64_tArray must_spend_arr = NULL;
+       must_spend_arr = init_int64_tArray(must_spend_var.datalen, __LINE__);
+       int64_t *must_spend_arr_ptr = (int64_t*)(((uint8_t*)must_spend_arr) + 8);
+       for (size_t h = 0; h < must_spend_var.datalen; h++) {
+               LDKInput must_spend_conv_7_var = must_spend_var.data[h];
+               int64_t must_spend_conv_7_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(must_spend_conv_7_var);
+               must_spend_conv_7_ref = tag_ptr(must_spend_conv_7_var.inner, must_spend_conv_7_var.is_owned);
+               must_spend_arr_ptr[h] = must_spend_conv_7_ref;
+       }
+       
+       FREE(must_spend_var.data);
+       LDKCVec_TxOutZ must_pay_to_var = must_pay_to;
+       int64_tArray must_pay_to_arr = NULL;
+       must_pay_to_arr = init_int64_tArray(must_pay_to_var.datalen, __LINE__);
+       int64_t *must_pay_to_arr_ptr = (int64_t*)(((uint8_t*)must_pay_to_arr) + 8);
+       for (size_t h = 0; h < must_pay_to_var.datalen; h++) {
+               LDKTxOut* must_pay_to_conv_7_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+               *must_pay_to_conv_7_ref = must_pay_to_var.data[h];
+               must_pay_to_arr_ptr[h] = tag_ptr(must_pay_to_conv_7_ref, true);
+       }
+       
+       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);
+       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) {
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_TransactionNoneZ ret_conv = *(LDKCResult_TransactionNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKCoinSelectionSource_JCalls_cloned(LDKCoinSelectionSource* new_obj) {
+       LDKCoinSelectionSource_JCalls *j_calls = (LDKCoinSelectionSource_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKCoinSelectionSource LDKCoinSelectionSource_init (int64_t o) {
+       LDKCoinSelectionSource_JCalls *calls = MALLOC(sizeof(LDKCoinSelectionSource_JCalls), "LDKCoinSelectionSource_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKCoinSelectionSource ret = {
+               .this_arg = (void*) calls,
+               .select_confirmed_utxos = select_confirmed_utxos_LDKCoinSelectionSource_jcall,
+               .sign_tx = sign_tx_LDKCoinSelectionSource_jcall,
+               .free = LDKCoinSelectionSource_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKCoinSelectionSource_new(int32_t o) {
+       LDKCoinSelectionSource *res_ptr = MALLOC(sizeof(LDKCoinSelectionSource), "LDKCoinSelectionSource");
+       *res_ptr = LDKCoinSelectionSource_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_CoinSelectionSource_select_confirmed_utxos(int64_t this_arg, int8_tArray claim_id, int64_tArray must_spend, int64_tArray must_pay_to, int32_t target_feerate_sat_per_1000_weight) {
+       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;
+       LDKThirtyTwoBytes claim_id_ref;
+       CHECK(claim_id->arr_len == 32);
+       memcpy(claim_id_ref.data, claim_id->elems, 32); FREE(claim_id);
+       LDKCVec_InputZ must_spend_constr;
+       must_spend_constr.datalen = must_spend->arr_len;
+       if (must_spend_constr.datalen > 0)
+               must_spend_constr.data = MALLOC(must_spend_constr.datalen * sizeof(LDKInput), "LDKCVec_InputZ Elements");
+       else
+               must_spend_constr.data = NULL;
+       int64_t* must_spend_vals = must_spend->elems;
+       for (size_t h = 0; h < must_spend_constr.datalen; h++) {
+               int64_t must_spend_conv_7 = must_spend_vals[h];
+               LDKInput must_spend_conv_7_conv;
+               must_spend_conv_7_conv.inner = untag_ptr(must_spend_conv_7);
+               must_spend_conv_7_conv.is_owned = ptr_is_owned(must_spend_conv_7);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(must_spend_conv_7_conv);
+               must_spend_conv_7_conv = Input_clone(&must_spend_conv_7_conv);
+               must_spend_constr.data[h] = must_spend_conv_7_conv;
+       }
+       FREE(must_spend);
+       LDKCVec_TxOutZ must_pay_to_constr;
+       must_pay_to_constr.datalen = must_pay_to->arr_len;
+       if (must_pay_to_constr.datalen > 0)
+               must_pay_to_constr.data = MALLOC(must_pay_to_constr.datalen * sizeof(LDKTxOut), "LDKCVec_TxOutZ Elements");
+       else
+               must_pay_to_constr.data = NULL;
+       int64_t* must_pay_to_vals = must_pay_to->elems;
+       for (size_t h = 0; h < must_pay_to_constr.datalen; h++) {
+               int64_t must_pay_to_conv_7 = must_pay_to_vals[h];
+               void* must_pay_to_conv_7_ptr = untag_ptr(must_pay_to_conv_7);
+               CHECK_ACCESS(must_pay_to_conv_7_ptr);
+               LDKTxOut must_pay_to_conv_7_conv = *(LDKTxOut*)(must_pay_to_conv_7_ptr);
+               must_pay_to_conv_7_conv = TxOut_clone((LDKTxOut*)untag_ptr(must_pay_to_conv_7));
+               must_pay_to_constr.data[h] = must_pay_to_conv_7_conv;
+       }
+       FREE(must_pay_to);
+       LDKCResult_CoinSelectionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CoinSelectionNoneZ), "LDKCResult_CoinSelectionNoneZ");
+       *ret_conv = (this_arg_conv->select_confirmed_utxos)(this_arg_conv->this_arg, claim_id_ref, must_spend_constr, must_pay_to_constr, target_feerate_sat_per_1000_weight);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CoinSelectionSource_sign_tx(int64_t this_arg, int8_tArray tx) {
+       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;
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = (this_arg_conv->sign_tx)(this_arg_conv->this_arg, tx_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+typedef struct LDKWalletSource_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKWalletSource_JCalls;
+static void LDKWalletSource_JCalls_free(void* this_arg) {
+       LDKWalletSource_JCalls *j_calls = (LDKWalletSource_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_CVec_UtxoZNoneZ ret_conv = *(LDKCResult_CVec_UtxoZNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+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);
+       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) {
+       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);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_TransactionNoneZ ret_conv = *(LDKCResult_TransactionNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKWalletSource_JCalls_cloned(LDKWalletSource* new_obj) {
+       LDKWalletSource_JCalls *j_calls = (LDKWalletSource_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKWalletSource LDKWalletSource_init (int64_t o) {
+       LDKWalletSource_JCalls *calls = MALLOC(sizeof(LDKWalletSource_JCalls), "LDKWalletSource_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKWalletSource ret = {
+               .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,
+               .free = LDKWalletSource_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKWalletSource_new(int32_t o) {
+       LDKWalletSource *res_ptr = MALLOC(sizeof(LDKWalletSource), "LDKWalletSource");
+       *res_ptr = LDKWalletSource_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_WalletSource_list_confirmed_utxos(int64_t this_arg) {
+       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;
+       LDKCResult_CVec_UtxoZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_UtxoZNoneZ), "LDKCResult_CVec_UtxoZNoneZ");
+       *ret_conv = (this_arg_conv->list_confirmed_utxos)(this_arg_conv->this_arg);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_WalletSource_get_change_script(int64_t this_arg) {
+       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;
+       LDKCResult_CVec_u8ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZNoneZ), "LDKCResult_CVec_u8ZNoneZ");
+       *ret_conv = (this_arg_conv->get_change_script)(this_arg_conv->this_arg);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_WalletSource_sign_tx(int64_t this_arg, int8_tArray tx) {
+       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;
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = (this_arg_conv->sign_tx)(this_arg_conv->this_arg, tx_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+uint32_t CS_LDK_LDKGossipSync_ty_from_ptr(int64_t ptr) {
+       LDKGossipSync *obj = (LDKGossipSync*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKGossipSync_P2P: return 0;
+               case LDKGossipSync_Rapid: return 1;
+               case LDKGossipSync_None: return 2;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKGossipSync_P2P_get_p2p(int64_t ptr) {
+       LDKGossipSync *obj = (LDKGossipSync*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKGossipSync_P2P);
+       LDKP2PGossipSync p2p_var = obj->p2p;
+                       int64_t p2p_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(p2p_var);
+                       p2p_ref = tag_ptr(p2p_var.inner, false);
+       return p2p_ref;
+}
+int64_t CS_LDK_LDKGossipSync_Rapid_get_rapid(int64_t ptr) {
+       LDKGossipSync *obj = (LDKGossipSync*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKGossipSync_Rapid);
+       LDKRapidGossipSync rapid_var = obj->rapid;
+                       int64_t rapid_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(rapid_var);
+                       rapid_ref = tag_ptr(rapid_var.inner, false);
+       return rapid_ref;
+}
+uint32_t CS_LDK_LDKFallback_ty_from_ptr(int64_t ptr) {
+       LDKFallback *obj = (LDKFallback*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKFallback_SegWitProgram: return 0;
+               case LDKFallback_PubKeyHash: return 1;
+               case LDKFallback_ScriptHash: return 2;
+               default: abort();
+       }
+}
+int8_t CS_LDK_LDKFallback_SegWitProgram_get_version(int64_t ptr) {
+       LDKFallback *obj = (LDKFallback*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKFallback_SegWitProgram);
+       uint8_t version_val = obj->seg_wit_program.version._0;
+       return version_val;
+}
+int8_tArray CS_LDK_LDKFallback_SegWitProgram_get_program(int64_t ptr) {
+       LDKFallback *obj = (LDKFallback*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKFallback_SegWitProgram);
+       LDKCVec_u8Z program_var = obj->seg_wit_program.program;
+                       int8_tArray program_arr = init_int8_tArray(program_var.datalen, __LINE__);
+                       memcpy(program_arr->elems, program_var.data, program_var.datalen);
+       return program_arr;
+}
+int8_tArray CS_LDK_LDKFallback_PubKeyHash_get_pub_key_hash(int64_t ptr) {
+       LDKFallback *obj = (LDKFallback*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKFallback_PubKeyHash);
+       int8_tArray pub_key_hash_arr = init_int8_tArray(20, __LINE__);
+       memcpy(pub_key_hash_arr->elems, obj->pub_key_hash.data, 20);
+       return pub_key_hash_arr;
+}
+int8_tArray CS_LDK_LDKFallback_ScriptHash_get_script_hash(int64_t ptr) {
+       LDKFallback *obj = (LDKFallback*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKFallback_ScriptHash);
+       int8_tArray script_hash_arr = init_int8_tArray(20, __LINE__);
+       memcpy(script_hash_arr->elems, obj->script_hash.data, 20);
+       return script_hash_arr;
+}
+jstring  CS_LDK__ldk_get_compiled_version() {
+       LDKStr ret_str = _ldk_get_compiled_version();
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+jstring  CS_LDK__ldk_c_bindings_get_compiled_version() {
+       LDKStr ret_str = _ldk_c_bindings_get_compiled_version();
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_U128_le_bytes(int8_tArray val) {
+       LDKU128 val_ref;
+       CHECK(val->arr_len == 16);
+       memcpy(val_ref.le_bytes, val->elems, 16); FREE(val);
+       int8_tArray ret_arr = init_int8_tArray(16, __LINE__);
+       memcpy(ret_arr->elems, U128_le_bytes(val_ref).data, 16);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_U128_new(int8_tArray le_bytes) {
+       LDKSixteenBytes le_bytes_ref;
+       CHECK(le_bytes->arr_len == 16);
+       memcpy(le_bytes_ref.data, le_bytes->elems, 16); FREE(le_bytes);
+       int8_tArray ret_arr = init_int8_tArray(16, __LINE__);
+       memcpy(ret_arr->elems, U128_new(le_bytes_ref).le_bytes, 16);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_BigEndianScalar_new(int8_tArray big_endian_bytes) {
+       LDKThirtyTwoBytes big_endian_bytes_ref;
+       CHECK(big_endian_bytes->arr_len == 32);
+       memcpy(big_endian_bytes_ref.data, big_endian_bytes->elems, 32); FREE(big_endian_bytes);
+       LDKBigEndianScalar* ret_ref = MALLOC(sizeof(LDKBigEndianScalar), "LDKBigEndianScalar");
+       *ret_ref = BigEndianScalar_new(big_endian_bytes_ref);
+       return tag_ptr(ret_ref, true);
+}
+
+static inline uint64_t Bech32Error_clone_ptr(LDKBech32Error *NONNULL_PTR arg) {
+       LDKBech32Error *ret_copy = MALLOC(sizeof(LDKBech32Error), "LDKBech32Error");
+       *ret_copy = Bech32Error_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_Bech32Error_clone_ptr(int64_t arg) {
+       LDKBech32Error* arg_conv = (LDKBech32Error*)untag_ptr(arg);
+       int64_t ret_conv = Bech32Error_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bech32Error_clone(int64_t orig) {
+       LDKBech32Error* orig_conv = (LDKBech32Error*)untag_ptr(orig);
+       LDKBech32Error *ret_copy = MALLOC(sizeof(LDKBech32Error), "LDKBech32Error");
+       *ret_copy = Bech32Error_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_Bech32Error_free(int64_t o) {
+       if (!ptr_is_owned(o)) return;
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKBech32Error o_conv = *(LDKBech32Error*)(o_ptr);
+       FREE(untag_ptr(o));
+       Bech32Error_free(o_conv);
+}
+
+void  CS_LDK_Transaction_free(int8_tArray _res) {
+       LDKTransaction _res_ref;
+       _res_ref.datalen = _res->arr_len;
+       _res_ref.data = MALLOC(_res_ref.datalen, "LDKTransaction Bytes");
+       memcpy(_res_ref.data, _res->elems, _res_ref.datalen); FREE(_res);
+       _res_ref.data_is_owned = true;
+       Transaction_free(_res_ref);
+}
+
+void  CS_LDK_Witness_free(int8_tArray _res) {
+       LDKWitness _res_ref;
+       _res_ref.datalen = _res->arr_len;
+       _res_ref.data = MALLOC(_res_ref.datalen, "LDKWitness Bytes");
+       memcpy(_res_ref.data, _res->elems, _res_ref.datalen); FREE(_res);
+       _res_ref.data_is_owned = true;
+       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;
+       witness_ref.data = MALLOC(witness_ref.datalen, "LDKWitness Bytes");
+       memcpy(witness_ref.data, witness->elems, witness_ref.datalen); FREE(witness);
+       witness_ref.data_is_owned = true;
+       LDKCVec_u8Z script_sig_ref;
+       script_sig_ref.datalen = script_sig->arr_len;
+       script_sig_ref.data = MALLOC(script_sig_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(script_sig_ref.data, script_sig->elems, script_sig_ref.datalen); FREE(script_sig);
+       LDKThirtyTwoBytes previous_txid_ref;
+       CHECK(previous_txid->arr_len == 32);
+       memcpy(previous_txid_ref.data, previous_txid->elems, 32); FREE(previous_txid);
+       LDKTxIn* ret_ref = MALLOC(sizeof(LDKTxIn), "LDKTxIn");
+       *ret_ref = TxIn_new(witness_ref, script_sig_ref, sequence, previous_txid_ref, previous_vout);
+       return tag_ptr(ret_ref, true);
+}
+
+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;
+       script_pubkey_ref.data = MALLOC(script_pubkey_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(script_pubkey_ref.data, script_pubkey->elems, script_pubkey_ref.datalen); FREE(script_pubkey);
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = TxOut_new(script_pubkey_ref, value);
+       return tag_ptr(ret_ref, true);
+}
+
+void  CS_LDK_TxOut_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKTxOut _res_conv = *(LDKTxOut*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       TxOut_free(_res_conv);
+}
+
+static inline uint64_t TxOut_clone_ptr(LDKTxOut *NONNULL_PTR arg) {
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = TxOut_clone(arg);
+       return tag_ptr(ret_ref, true);
+}
+int64_t  CS_LDK_TxOut_clone_ptr(int64_t arg) {
+       LDKTxOut* arg_conv = (LDKTxOut*)untag_ptr(arg);
+       int64_t ret_conv = TxOut_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxOut_clone(int64_t orig) {
+       LDKTxOut* orig_conv = (LDKTxOut*)untag_ptr(orig);
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = TxOut_clone(orig_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+void  CS_LDK_Str_free(jstring _res) {
+       LDKStr dummy = { .chars = NULL, .len = 0, .chars_is_owned = false };
+       Str_free(dummy);
+}
+
+int64_t  CS_LDK_COption_u64Z_some(int64_t o) {
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = COption_u64Z_some(o);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_u64Z_none() {
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = COption_u64Z_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_u64Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_u64Z _res_conv = *(LDKCOption_u64Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_u64Z_free(_res_conv);
+}
+
+static inline uint64_t COption_u64Z_clone_ptr(LDKCOption_u64Z *NONNULL_PTR arg) {
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = COption_u64Z_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_u64Z_clone_ptr(int64_t arg) {
+       LDKCOption_u64Z* arg_conv = (LDKCOption_u64Z*)untag_ptr(arg);
+       int64_t ret_conv = COption_u64Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_u64Z_clone(int64_t orig) {
+       LDKCOption_u64Z* orig_conv = (LDKCOption_u64Z*)untag_ptr(orig);
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = COption_u64Z_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CVec_BlindedPathZ_free(int64_tArray _res) {
+       LDKCVec_BlindedPathZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKBlindedPath), "LDKCVec_BlindedPathZ 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];
+               LDKBlindedPath _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_BlindedPathZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_RefundBolt12ParseErrorZ_ok(int64_t o) {
+       LDKRefund 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 = Refund_clone(&o_conv);
+       LDKCResult_RefundBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RefundBolt12ParseErrorZ), "LDKCResult_RefundBolt12ParseErrorZ");
+       *ret_conv = CResult_RefundBolt12ParseErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RefundBolt12ParseErrorZ_err(int64_t e) {
+       LDKBolt12ParseError e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = Bolt12ParseError_clone(&e_conv);
+       LDKCResult_RefundBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RefundBolt12ParseErrorZ), "LDKCResult_RefundBolt12ParseErrorZ");
+       *ret_conv = CResult_RefundBolt12ParseErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RefundBolt12ParseErrorZ_is_ok(int64_t o) {
+       LDKCResult_RefundBolt12ParseErrorZ* o_conv = (LDKCResult_RefundBolt12ParseErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RefundBolt12ParseErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RefundBolt12ParseErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RefundBolt12ParseErrorZ _res_conv = *(LDKCResult_RefundBolt12ParseErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RefundBolt12ParseErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RefundBolt12ParseErrorZ_clone_ptr(LDKCResult_RefundBolt12ParseErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RefundBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RefundBolt12ParseErrorZ), "LDKCResult_RefundBolt12ParseErrorZ");
+       *ret_conv = CResult_RefundBolt12ParseErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RefundBolt12ParseErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RefundBolt12ParseErrorZ* arg_conv = (LDKCResult_RefundBolt12ParseErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RefundBolt12ParseErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RefundBolt12ParseErrorZ_clone(int64_t orig) {
+       LDKCResult_RefundBolt12ParseErrorZ* orig_conv = (LDKCResult_RefundBolt12ParseErrorZ*)untag_ptr(orig);
+       LDKCResult_RefundBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RefundBolt12ParseErrorZ), "LDKCResult_RefundBolt12ParseErrorZ");
+       *ret_conv = CResult_RefundBolt12ParseErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RetryDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKRetry o_conv = *(LDKRetry*)(o_ptr);
+       o_conv = Retry_clone((LDKRetry*)untag_ptr(o));
+       LDKCResult_RetryDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RetryDecodeErrorZ), "LDKCResult_RetryDecodeErrorZ");
+       *ret_conv = CResult_RetryDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RetryDecodeErrorZ_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_RetryDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RetryDecodeErrorZ), "LDKCResult_RetryDecodeErrorZ");
+       *ret_conv = CResult_RetryDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RetryDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RetryDecodeErrorZ* o_conv = (LDKCResult_RetryDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RetryDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RetryDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RetryDecodeErrorZ _res_conv = *(LDKCResult_RetryDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RetryDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RetryDecodeErrorZ_clone_ptr(LDKCResult_RetryDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RetryDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RetryDecodeErrorZ), "LDKCResult_RetryDecodeErrorZ");
+       *ret_conv = CResult_RetryDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RetryDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RetryDecodeErrorZ* arg_conv = (LDKCResult_RetryDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RetryDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RetryDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RetryDecodeErrorZ* orig_conv = (LDKCResult_RetryDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RetryDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RetryDecodeErrorZ), "LDKCResult_RetryDecodeErrorZ");
+       *ret_conv = CResult_RetryDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneAPIErrorZ_ok() {
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = CResult_NoneAPIErrorZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneAPIErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKAPIError e_conv = *(LDKAPIError*)(e_ptr);
+       e_conv = APIError_clone((LDKAPIError*)untag_ptr(e));
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = CResult_NoneAPIErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NoneAPIErrorZ_is_ok(int64_t o) {
+       LDKCResult_NoneAPIErrorZ* o_conv = (LDKCResult_NoneAPIErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NoneAPIErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NoneAPIErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NoneAPIErrorZ _res_conv = *(LDKCResult_NoneAPIErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NoneAPIErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NoneAPIErrorZ_clone_ptr(LDKCResult_NoneAPIErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = CResult_NoneAPIErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NoneAPIErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NoneAPIErrorZ* arg_conv = (LDKCResult_NoneAPIErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NoneAPIErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NoneAPIErrorZ_clone(int64_t orig) {
+       LDKCResult_NoneAPIErrorZ* orig_conv = (LDKCResult_NoneAPIErrorZ*)untag_ptr(orig);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = CResult_NoneAPIErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_CResult_NoneAPIErrorZZ_free(int64_tArray _res) {
+       LDKCVec_CResult_NoneAPIErrorZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKCResult_NoneAPIErrorZ), "LDKCVec_CResult_NoneAPIErrorZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t w = 0; w < _res_constr.datalen; w++) {
+               int64_t _res_conv_22 = _res_vals[w];
+               void* _res_conv_22_ptr = untag_ptr(_res_conv_22);
+               CHECK_ACCESS(_res_conv_22_ptr);
+               LDKCResult_NoneAPIErrorZ _res_conv_22_conv = *(LDKCResult_NoneAPIErrorZ*)(_res_conv_22_ptr);
+               FREE(untag_ptr(_res_conv_22));
+               _res_constr.data[w] = _res_conv_22_conv;
+       }
+       FREE(_res);
+       CVec_CResult_NoneAPIErrorZZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_APIErrorZ_free(int64_tArray _res) {
+       LDKCVec_APIErrorZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKAPIError), "LDKCVec_APIErrorZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t k = 0; k < _res_constr.datalen; k++) {
+               int64_t _res_conv_10 = _res_vals[k];
+               void* _res_conv_10_ptr = untag_ptr(_res_conv_10);
+               CHECK_ACCESS(_res_conv_10_ptr);
+               LDKAPIError _res_conv_10_conv = *(LDKAPIError*)(_res_conv_10_ptr);
+               FREE(untag_ptr(_res_conv_10));
+               _res_constr.data[k] = _res_conv_10_conv;
+       }
+       FREE(_res);
+       CVec_APIErrorZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_ThirtyTwoBytesZ_some(int8_tArray o) {
+       LDKThirtyTwoBytes o_ref;
+       CHECK(o->arr_len == 32);
+       memcpy(o_ref.data, o->elems, 32); FREE(o);
+       LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
+       *ret_copy = COption_ThirtyTwoBytesZ_some(o_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_ThirtyTwoBytesZ_none() {
+       LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
+       *ret_copy = COption_ThirtyTwoBytesZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_ThirtyTwoBytesZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_ThirtyTwoBytesZ _res_conv = *(LDKCOption_ThirtyTwoBytesZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_ThirtyTwoBytesZ_free(_res_conv);
+}
+
+static inline uint64_t COption_ThirtyTwoBytesZ_clone_ptr(LDKCOption_ThirtyTwoBytesZ *NONNULL_PTR arg) {
+       LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
+       *ret_copy = COption_ThirtyTwoBytesZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_ThirtyTwoBytesZ_clone_ptr(int64_t arg) {
+       LDKCOption_ThirtyTwoBytesZ* arg_conv = (LDKCOption_ThirtyTwoBytesZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_ThirtyTwoBytesZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_ThirtyTwoBytesZ_clone(int64_t orig) {
+       LDKCOption_ThirtyTwoBytesZ* orig_conv = (LDKCOption_ThirtyTwoBytesZ*)untag_ptr(orig);
+       LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
+       *ret_copy = COption_ThirtyTwoBytesZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CVec_u8Z_free(int8_tArray _res) {
+       LDKCVec_u8Z _res_ref;
+       _res_ref.datalen = _res->arr_len;
+       _res_ref.data = MALLOC(_res_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(_res_ref.data, _res->elems, _res_ref.datalen); FREE(_res);
+       CVec_u8Z_free(_res_ref);
+}
+
+int64_t  CS_LDK_COption_CVec_u8ZZ_some(int8_tArray o) {
+       LDKCVec_u8Z o_ref;
+       o_ref.datalen = o->arr_len;
+       o_ref.data = MALLOC(o_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(o_ref.data, o->elems, o_ref.datalen); FREE(o);
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = COption_CVec_u8ZZ_some(o_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_CVec_u8ZZ_none() {
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = COption_CVec_u8ZZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_CVec_u8ZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_CVec_u8ZZ _res_conv = *(LDKCOption_CVec_u8ZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_CVec_u8ZZ_free(_res_conv);
+}
+
+static inline uint64_t COption_CVec_u8ZZ_clone_ptr(LDKCOption_CVec_u8ZZ *NONNULL_PTR arg) {
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = COption_CVec_u8ZZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_CVec_u8ZZ_clone_ptr(int64_t arg) {
+       LDKCOption_CVec_u8ZZ* arg_conv = (LDKCOption_CVec_u8ZZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_CVec_u8ZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_CVec_u8ZZ_clone(int64_t orig) {
+       LDKCOption_CVec_u8ZZ* orig_conv = (LDKCOption_CVec_u8ZZ*)untag_ptr(orig);
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = COption_CVec_u8ZZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_ok(int64_t o) {
+       LDKRecipientOnionFields 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 = RecipientOnionFields_clone(&o_conv);
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsDecodeErrorZ), "LDKCResult_RecipientOnionFieldsDecodeErrorZ");
+       *ret_conv = CResult_RecipientOnionFieldsDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_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_RecipientOnionFieldsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsDecodeErrorZ), "LDKCResult_RecipientOnionFieldsDecodeErrorZ");
+       *ret_conv = CResult_RecipientOnionFieldsDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* o_conv = (LDKCResult_RecipientOnionFieldsDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RecipientOnionFieldsDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ _res_conv = *(LDKCResult_RecipientOnionFieldsDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RecipientOnionFieldsDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RecipientOnionFieldsDecodeErrorZ_clone_ptr(LDKCResult_RecipientOnionFieldsDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsDecodeErrorZ), "LDKCResult_RecipientOnionFieldsDecodeErrorZ");
+       *ret_conv = CResult_RecipientOnionFieldsDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* arg_conv = (LDKCResult_RecipientOnionFieldsDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RecipientOnionFieldsDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* orig_conv = (LDKCResult_RecipientOnionFieldsDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsDecodeErrorZ), "LDKCResult_RecipientOnionFieldsDecodeErrorZ");
+       *ret_conv = CResult_RecipientOnionFieldsDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C2Tuple_u64CVec_u8ZZ_clone_ptr(LDKC2Tuple_u64CVec_u8ZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_u64CVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKC2Tuple_u64CVec_u8ZZ");
+       *ret_conv = C2Tuple_u64CVec_u8ZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_u64CVec_u8ZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_u64CVec_u8ZZ* arg_conv = (LDKC2Tuple_u64CVec_u8ZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_u64CVec_u8ZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_u64CVec_u8ZZ_clone(int64_t orig) {
+       LDKC2Tuple_u64CVec_u8ZZ* orig_conv = (LDKC2Tuple_u64CVec_u8ZZ*)untag_ptr(orig);
+       LDKC2Tuple_u64CVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKC2Tuple_u64CVec_u8ZZ");
+       *ret_conv = C2Tuple_u64CVec_u8ZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_u64CVec_u8ZZ_new(int64_t a, int8_tArray b) {
+       LDKCVec_u8Z b_ref;
+       b_ref.datalen = b->arr_len;
+       b_ref.data = MALLOC(b_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(b_ref.data, b->elems, b_ref.datalen); FREE(b);
+       LDKC2Tuple_u64CVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKC2Tuple_u64CVec_u8ZZ");
+       *ret_conv = C2Tuple_u64CVec_u8ZZ_new(a, b_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_u64CVec_u8ZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_u64CVec_u8ZZ _res_conv = *(LDKC2Tuple_u64CVec_u8ZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_u64CVec_u8ZZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_u64CVec_u8ZZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_u64CVec_u8ZZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKCVec_C2Tuple_u64CVec_u8ZZZ 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_23 = _res_vals[x];
+               void* _res_conv_23_ptr = untag_ptr(_res_conv_23);
+               CHECK_ACCESS(_res_conv_23_ptr);
+               LDKC2Tuple_u64CVec_u8ZZ _res_conv_23_conv = *(LDKC2Tuple_u64CVec_u8ZZ*)(_res_conv_23_ptr);
+               FREE(untag_ptr(_res_conv_23));
+               _res_constr.data[x] = _res_conv_23_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_u64CVec_u8ZZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_RecipientOnionFieldsNoneZ_ok(int64_t o) {
+       LDKRecipientOnionFields 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 = RecipientOnionFields_clone(&o_conv);
+       LDKCResult_RecipientOnionFieldsNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsNoneZ), "LDKCResult_RecipientOnionFieldsNoneZ");
+       *ret_conv = CResult_RecipientOnionFieldsNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RecipientOnionFieldsNoneZ_err() {
+       LDKCResult_RecipientOnionFieldsNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsNoneZ), "LDKCResult_RecipientOnionFieldsNoneZ");
+       *ret_conv = CResult_RecipientOnionFieldsNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RecipientOnionFieldsNoneZ_is_ok(int64_t o) {
+       LDKCResult_RecipientOnionFieldsNoneZ* o_conv = (LDKCResult_RecipientOnionFieldsNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RecipientOnionFieldsNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RecipientOnionFieldsNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RecipientOnionFieldsNoneZ _res_conv = *(LDKCResult_RecipientOnionFieldsNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RecipientOnionFieldsNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RecipientOnionFieldsNoneZ_clone_ptr(LDKCResult_RecipientOnionFieldsNoneZ *NONNULL_PTR arg) {
+       LDKCResult_RecipientOnionFieldsNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsNoneZ), "LDKCResult_RecipientOnionFieldsNoneZ");
+       *ret_conv = CResult_RecipientOnionFieldsNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RecipientOnionFieldsNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_RecipientOnionFieldsNoneZ* arg_conv = (LDKCResult_RecipientOnionFieldsNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RecipientOnionFieldsNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RecipientOnionFieldsNoneZ_clone(int64_t orig) {
+       LDKCResult_RecipientOnionFieldsNoneZ* orig_conv = (LDKCResult_RecipientOnionFieldsNoneZ*)untag_ptr(orig);
+       LDKCResult_RecipientOnionFieldsNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsNoneZ), "LDKCResult_RecipientOnionFieldsNoneZ");
+       *ret_conv = CResult_RecipientOnionFieldsNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_ThirtyTwoBytesZ_free(ptrArray _res) {
+       LDKCVec_ThirtyTwoBytesZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ 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];
+               LDKThirtyTwoBytes _res_conv_8_ref;
+               CHECK(_res_conv_8->arr_len == 32);
+               memcpy(_res_conv_8_ref.data, _res_conv_8->elems, 32); FREE(_res_conv_8);
+               _res_constr.data[i] = _res_conv_8_ref;
+       }
+       FREE(_res);
+       CVec_ThirtyTwoBytesZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_CVec_ThirtyTwoBytesZZ_some(ptrArray o) {
+       LDKCVec_ThirtyTwoBytesZ o_constr;
+       o_constr.datalen = o->arr_len;
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ 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];
+               LDKThirtyTwoBytes o_conv_8_ref;
+               CHECK(o_conv_8->arr_len == 32);
+               memcpy(o_conv_8_ref.data, o_conv_8->elems, 32); FREE(o_conv_8);
+               o_constr.data[i] = o_conv_8_ref;
+       }
+       FREE(o);
+       LDKCOption_CVec_ThirtyTwoBytesZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_ThirtyTwoBytesZZ), "LDKCOption_CVec_ThirtyTwoBytesZZ");
+       *ret_copy = COption_CVec_ThirtyTwoBytesZZ_some(o_constr);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_CVec_ThirtyTwoBytesZZ_none() {
+       LDKCOption_CVec_ThirtyTwoBytesZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_ThirtyTwoBytesZZ), "LDKCOption_CVec_ThirtyTwoBytesZZ");
+       *ret_copy = COption_CVec_ThirtyTwoBytesZZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_CVec_ThirtyTwoBytesZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_CVec_ThirtyTwoBytesZZ _res_conv = *(LDKCOption_CVec_ThirtyTwoBytesZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_CVec_ThirtyTwoBytesZZ_free(_res_conv);
+}
+
+static inline uint64_t COption_CVec_ThirtyTwoBytesZZ_clone_ptr(LDKCOption_CVec_ThirtyTwoBytesZZ *NONNULL_PTR arg) {
+       LDKCOption_CVec_ThirtyTwoBytesZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_ThirtyTwoBytesZZ), "LDKCOption_CVec_ThirtyTwoBytesZZ");
+       *ret_copy = COption_CVec_ThirtyTwoBytesZZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_CVec_ThirtyTwoBytesZZ_clone_ptr(int64_t arg) {
+       LDKCOption_CVec_ThirtyTwoBytesZZ* arg_conv = (LDKCOption_CVec_ThirtyTwoBytesZZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_CVec_ThirtyTwoBytesZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_CVec_ThirtyTwoBytesZZ_clone(int64_t orig) {
+       LDKCOption_CVec_ThirtyTwoBytesZZ* orig_conv = (LDKCOption_CVec_ThirtyTwoBytesZZ*)untag_ptr(orig);
+       LDKCOption_CVec_ThirtyTwoBytesZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_ThirtyTwoBytesZZ), "LDKCOption_CVec_ThirtyTwoBytesZZ");
+       *ret_copy = COption_CVec_ThirtyTwoBytesZZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesNoneZ_ok(int8_tArray o) {
+       LDKThirtyTwoBytes o_ref;
+       CHECK(o->arr_len == 32);
+       memcpy(o_ref.data, o->elems, 32); FREE(o);
+       LDKCResult_ThirtyTwoBytesNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesNoneZ), "LDKCResult_ThirtyTwoBytesNoneZ");
+       *ret_conv = CResult_ThirtyTwoBytesNoneZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesNoneZ_err() {
+       LDKCResult_ThirtyTwoBytesNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesNoneZ), "LDKCResult_ThirtyTwoBytesNoneZ");
+       *ret_conv = CResult_ThirtyTwoBytesNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ThirtyTwoBytesNoneZ_is_ok(int64_t o) {
+       LDKCResult_ThirtyTwoBytesNoneZ* o_conv = (LDKCResult_ThirtyTwoBytesNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ThirtyTwoBytesNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ThirtyTwoBytesNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ThirtyTwoBytesNoneZ _res_conv = *(LDKCResult_ThirtyTwoBytesNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ThirtyTwoBytesNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ThirtyTwoBytesNoneZ_clone_ptr(LDKCResult_ThirtyTwoBytesNoneZ *NONNULL_PTR arg) {
+       LDKCResult_ThirtyTwoBytesNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesNoneZ), "LDKCResult_ThirtyTwoBytesNoneZ");
+       *ret_conv = CResult_ThirtyTwoBytesNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ThirtyTwoBytesNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_ThirtyTwoBytesNoneZ* arg_conv = (LDKCResult_ThirtyTwoBytesNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ThirtyTwoBytesNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesNoneZ_clone(int64_t orig) {
+       LDKCResult_ThirtyTwoBytesNoneZ* orig_conv = (LDKCResult_ThirtyTwoBytesNoneZ*)untag_ptr(orig);
+       LDKCResult_ThirtyTwoBytesNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesNoneZ), "LDKCResult_ThirtyTwoBytesNoneZ");
+       *ret_conv = CResult_ThirtyTwoBytesNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_ok(int64_t o) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_clone(&o_conv);
+       LDKCResult_BlindedPayInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPayInfoDecodeErrorZ), "LDKCResult_BlindedPayInfoDecodeErrorZ");
+       *ret_conv = CResult_BlindedPayInfoDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_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_BlindedPayInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPayInfoDecodeErrorZ), "LDKCResult_BlindedPayInfoDecodeErrorZ");
+       *ret_conv = CResult_BlindedPayInfoDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BlindedPayInfoDecodeErrorZ* o_conv = (LDKCResult_BlindedPayInfoDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BlindedPayInfoDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BlindedPayInfoDecodeErrorZ _res_conv = *(LDKCResult_BlindedPayInfoDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BlindedPayInfoDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BlindedPayInfoDecodeErrorZ_clone_ptr(LDKCResult_BlindedPayInfoDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BlindedPayInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPayInfoDecodeErrorZ), "LDKCResult_BlindedPayInfoDecodeErrorZ");
+       *ret_conv = CResult_BlindedPayInfoDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BlindedPayInfoDecodeErrorZ* arg_conv = (LDKCResult_BlindedPayInfoDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BlindedPayInfoDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BlindedPayInfoDecodeErrorZ* orig_conv = (LDKCResult_BlindedPayInfoDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BlindedPayInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPayInfoDecodeErrorZ), "LDKCResult_BlindedPayInfoDecodeErrorZ");
+       *ret_conv = CResult_BlindedPayInfoDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_ok(int64_t o) {
+       LDKDelayedPaymentOutputDescriptor 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 = DelayedPaymentOutputDescriptor_clone(&o_conv);
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_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_DelayedPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* o_conv = (LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ _res_conv = *(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_clone_ptr(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* arg_conv = (LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* orig_conv = (LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentOutputDescriptorDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_StaticPaymentOutputDescriptorDecodeErrorZ_ok(int64_t o) {
+       LDKStaticPaymentOutputDescriptor 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 = StaticPaymentOutputDescriptor_clone(&o_conv);
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_StaticPaymentOutputDescriptorDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_StaticPaymentOutputDescriptorDecodeErrorZ_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_StaticPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_StaticPaymentOutputDescriptorDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_StaticPaymentOutputDescriptorDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* o_conv = (LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_StaticPaymentOutputDescriptorDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_StaticPaymentOutputDescriptorDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ _res_conv = *(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_StaticPaymentOutputDescriptorDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_StaticPaymentOutputDescriptorDecodeErrorZ_clone_ptr(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_StaticPaymentOutputDescriptorDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_StaticPaymentOutputDescriptorDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* arg_conv = (LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_StaticPaymentOutputDescriptorDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_StaticPaymentOutputDescriptorDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* orig_conv = (LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_StaticPaymentOutputDescriptorDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKSpendableOutputDescriptor o_conv = *(LDKSpendableOutputDescriptor*)(o_ptr);
+       o_conv = SpendableOutputDescriptor_clone((LDKSpendableOutputDescriptor*)untag_ptr(o));
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpendableOutputDescriptorDecodeErrorZ), "LDKCResult_SpendableOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_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_SpendableOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpendableOutputDescriptorDecodeErrorZ), "LDKCResult_SpendableOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* o_conv = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ _res_conv = *(LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SpendableOutputDescriptorDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SpendableOutputDescriptorDecodeErrorZ_clone_ptr(LDKCResult_SpendableOutputDescriptorDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpendableOutputDescriptorDecodeErrorZ), "LDKCResult_SpendableOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* arg_conv = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* orig_conv = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpendableOutputDescriptorDecodeErrorZ), "LDKCResult_SpendableOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_SpendableOutputDescriptorZ_free(int64_tArray _res) {
+       LDKCVec_SpendableOutputDescriptorZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKSpendableOutputDescriptor), "LDKCVec_SpendableOutputDescriptorZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t b = 0; b < _res_constr.datalen; b++) {
+               int64_t _res_conv_27 = _res_vals[b];
+               void* _res_conv_27_ptr = untag_ptr(_res_conv_27);
+               CHECK_ACCESS(_res_conv_27_ptr);
+               LDKSpendableOutputDescriptor _res_conv_27_conv = *(LDKSpendableOutputDescriptor*)(_res_conv_27_ptr);
+               FREE(untag_ptr(_res_conv_27));
+               _res_constr.data[b] = _res_conv_27_conv;
+       }
+       FREE(_res);
+       CVec_SpendableOutputDescriptorZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_TxOutZ_free(int64_tArray _res) {
+       LDKCVec_TxOutZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKTxOut), "LDKCVec_TxOutZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t h = 0; h < _res_constr.datalen; h++) {
+               int64_t _res_conv_7 = _res_vals[h];
+               void* _res_conv_7_ptr = untag_ptr(_res_conv_7);
+               CHECK_ACCESS(_res_conv_7_ptr);
+               LDKTxOut _res_conv_7_conv = *(LDKTxOut*)(_res_conv_7_ptr);
+               FREE(untag_ptr(_res_conv_7));
+               _res_constr.data[h] = _res_conv_7_conv;
+       }
+       FREE(_res);
+       CVec_TxOutZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_u32Z_some(int32_t o) {
+       LDKCOption_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = COption_u32Z_some(o);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_u32Z_none() {
+       LDKCOption_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = COption_u32Z_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_u32Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_u32Z _res_conv = *(LDKCOption_u32Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_u32Z_free(_res_conv);
+}
+
+static inline uint64_t COption_u32Z_clone_ptr(LDKCOption_u32Z *NONNULL_PTR arg) {
+       LDKCOption_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = COption_u32Z_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_u32Z_clone_ptr(int64_t arg) {
+       LDKCOption_u32Z* arg_conv = (LDKCOption_u32Z*)untag_ptr(arg);
+       int64_t ret_conv = COption_u32Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_u32Z_clone(int64_t orig) {
+       LDKCOption_u32Z* orig_conv = (LDKCOption_u32Z*)untag_ptr(orig);
+       LDKCOption_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = COption_u32Z_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       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);
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_CVec_u8ZusizeZ_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);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_CVec_u8ZusizeZ_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);
+       FREE(untag_ptr(_res));
+       C2Tuple_CVec_u8ZusizeZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_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);
+       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();
+       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);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_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);
+       FREE(untag_ptr(_res));
+       CResult_C2Tuple_CVec_u8ZusizeZNoneZ_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);
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_ok(int64_t o) {
+       LDKChannelDerivationParameters 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 = ChannelDerivationParameters_clone(&o_conv);
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDerivationParametersDecodeErrorZ), "LDKCResult_ChannelDerivationParametersDecodeErrorZ");
+       *ret_conv = CResult_ChannelDerivationParametersDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_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_ChannelDerivationParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDerivationParametersDecodeErrorZ), "LDKCResult_ChannelDerivationParametersDecodeErrorZ");
+       *ret_conv = CResult_ChannelDerivationParametersDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* o_conv = (LDKCResult_ChannelDerivationParametersDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelDerivationParametersDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ _res_conv = *(LDKCResult_ChannelDerivationParametersDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelDerivationParametersDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelDerivationParametersDecodeErrorZ_clone_ptr(LDKCResult_ChannelDerivationParametersDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDerivationParametersDecodeErrorZ), "LDKCResult_ChannelDerivationParametersDecodeErrorZ");
+       *ret_conv = CResult_ChannelDerivationParametersDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* arg_conv = (LDKCResult_ChannelDerivationParametersDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelDerivationParametersDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* orig_conv = (LDKCResult_ChannelDerivationParametersDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDerivationParametersDecodeErrorZ), "LDKCResult_ChannelDerivationParametersDecodeErrorZ");
+       *ret_conv = CResult_ChannelDerivationParametersDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_ok(int64_t o) {
+       LDKHTLCDescriptor 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 = HTLCDescriptor_clone(&o_conv);
+       LDKCResult_HTLCDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCDescriptorDecodeErrorZ), "LDKCResult_HTLCDescriptorDecodeErrorZ");
+       *ret_conv = CResult_HTLCDescriptorDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_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_HTLCDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCDescriptorDecodeErrorZ), "LDKCResult_HTLCDescriptorDecodeErrorZ");
+       *ret_conv = CResult_HTLCDescriptorDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_HTLCDescriptorDecodeErrorZ* o_conv = (LDKCResult_HTLCDescriptorDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_HTLCDescriptorDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_HTLCDescriptorDecodeErrorZ _res_conv = *(LDKCResult_HTLCDescriptorDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_HTLCDescriptorDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_HTLCDescriptorDecodeErrorZ_clone_ptr(LDKCResult_HTLCDescriptorDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_HTLCDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCDescriptorDecodeErrorZ), "LDKCResult_HTLCDescriptorDecodeErrorZ");
+       *ret_conv = CResult_HTLCDescriptorDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_HTLCDescriptorDecodeErrorZ* arg_conv = (LDKCResult_HTLCDescriptorDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_HTLCDescriptorDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_HTLCDescriptorDecodeErrorZ* orig_conv = (LDKCResult_HTLCDescriptorDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_HTLCDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCDescriptorDecodeErrorZ), "LDKCResult_HTLCDescriptorDecodeErrorZ");
+       *ret_conv = CResult_HTLCDescriptorDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneNoneZ_ok() {
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = CResult_NoneNoneZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneNoneZ_err() {
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = CResult_NoneNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NoneNoneZ_is_ok(int64_t o) {
+       LDKCResult_NoneNoneZ* o_conv = (LDKCResult_NoneNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NoneNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NoneNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NoneNoneZ _res_conv = *(LDKCResult_NoneNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NoneNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NoneNoneZ_clone_ptr(LDKCResult_NoneNoneZ *NONNULL_PTR arg) {
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = CResult_NoneNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NoneNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_NoneNoneZ* arg_conv = (LDKCResult_NoneNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NoneNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NoneNoneZ_clone(int64_t orig) {
+       LDKCResult_NoneNoneZ* orig_conv = (LDKCResult_NoneNoneZ*)untag_ptr(orig);
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = CResult_NoneNoneZ_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(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);
+       memcpy(o_ref.compressed_form, o->elems, 33); FREE(o);
+       LDKCResult_PublicKeyNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeyNoneZ), "LDKCResult_PublicKeyNoneZ");
+       *ret_conv = CResult_PublicKeyNoneZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PublicKeyNoneZ_err() {
+       LDKCResult_PublicKeyNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeyNoneZ), "LDKCResult_PublicKeyNoneZ");
+       *ret_conv = CResult_PublicKeyNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PublicKeyNoneZ_is_ok(int64_t o) {
+       LDKCResult_PublicKeyNoneZ* o_conv = (LDKCResult_PublicKeyNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PublicKeyNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PublicKeyNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PublicKeyNoneZ _res_conv = *(LDKCResult_PublicKeyNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PublicKeyNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PublicKeyNoneZ_clone_ptr(LDKCResult_PublicKeyNoneZ *NONNULL_PTR arg) {
+       LDKCResult_PublicKeyNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeyNoneZ), "LDKCResult_PublicKeyNoneZ");
+       *ret_conv = CResult_PublicKeyNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PublicKeyNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_PublicKeyNoneZ* arg_conv = (LDKCResult_PublicKeyNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PublicKeyNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PublicKeyNoneZ_clone(int64_t orig) {
+       LDKCResult_PublicKeyNoneZ* orig_conv = (LDKCResult_PublicKeyNoneZ*)untag_ptr(orig);
+       LDKCResult_PublicKeyNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeyNoneZ), "LDKCResult_PublicKeyNoneZ");
+       *ret_conv = CResult_PublicKeyNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_BigEndianScalarZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKBigEndianScalar o_conv = *(LDKBigEndianScalar*)(o_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKBigEndianScalar
+       LDKCOption_BigEndianScalarZ *ret_copy = MALLOC(sizeof(LDKCOption_BigEndianScalarZ), "LDKCOption_BigEndianScalarZ");
+       *ret_copy = COption_BigEndianScalarZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_BigEndianScalarZ_none() {
+       LDKCOption_BigEndianScalarZ *ret_copy = MALLOC(sizeof(LDKCOption_BigEndianScalarZ), "LDKCOption_BigEndianScalarZ");
+       *ret_copy = COption_BigEndianScalarZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_BigEndianScalarZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_BigEndianScalarZ _res_conv = *(LDKCOption_BigEndianScalarZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_BigEndianScalarZ_free(_res_conv);
+}
+
+static inline uint64_t COption_BigEndianScalarZ_clone_ptr(LDKCOption_BigEndianScalarZ *NONNULL_PTR arg) {
+       LDKCOption_BigEndianScalarZ *ret_copy = MALLOC(sizeof(LDKCOption_BigEndianScalarZ), "LDKCOption_BigEndianScalarZ");
+       *ret_copy = COption_BigEndianScalarZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_BigEndianScalarZ_clone_ptr(int64_t arg) {
+       LDKCOption_BigEndianScalarZ* arg_conv = (LDKCOption_BigEndianScalarZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_BigEndianScalarZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_BigEndianScalarZ_clone(int64_t orig) {
+       LDKCOption_BigEndianScalarZ* orig_conv = (LDKCOption_BigEndianScalarZ*)untag_ptr(orig);
+       LDKCOption_BigEndianScalarZ *ret_copy = MALLOC(sizeof(LDKCOption_BigEndianScalarZ), "LDKCOption_BigEndianScalarZ");
+       *ret_copy = COption_BigEndianScalarZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CVec_U5Z_free(ptrArray _res) {
+       LDKCVec_U5Z _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKU5), "LDKCVec_U5Z Elements");
+       else
+               _res_constr.data = NULL;
+       int8_t* _res_vals = (void*) _res->elems;
+       for (size_t h = 0; h < _res_constr.datalen; h++) {
+               int8_t _res_conv_7 = _res_vals[h];
+               
+               _res_constr.data[h] = (LDKU5){ ._0 = _res_conv_7 };
+       }
+       FREE(_res);
+       CVec_U5Z_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_RecoverableSignatureNoneZ_ok(int8_tArray o) {
+       LDKRecoverableSignature o_ref;
+       CHECK(o->arr_len == 68);
+       memcpy(o_ref.serialized_form, o->elems, 68); FREE(o);
+       LDKCResult_RecoverableSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecoverableSignatureNoneZ), "LDKCResult_RecoverableSignatureNoneZ");
+       *ret_conv = CResult_RecoverableSignatureNoneZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RecoverableSignatureNoneZ_err() {
+       LDKCResult_RecoverableSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecoverableSignatureNoneZ), "LDKCResult_RecoverableSignatureNoneZ");
+       *ret_conv = CResult_RecoverableSignatureNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RecoverableSignatureNoneZ_is_ok(int64_t o) {
+       LDKCResult_RecoverableSignatureNoneZ* o_conv = (LDKCResult_RecoverableSignatureNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RecoverableSignatureNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RecoverableSignatureNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RecoverableSignatureNoneZ _res_conv = *(LDKCResult_RecoverableSignatureNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RecoverableSignatureNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RecoverableSignatureNoneZ_clone_ptr(LDKCResult_RecoverableSignatureNoneZ *NONNULL_PTR arg) {
+       LDKCResult_RecoverableSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecoverableSignatureNoneZ), "LDKCResult_RecoverableSignatureNoneZ");
+       *ret_conv = CResult_RecoverableSignatureNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RecoverableSignatureNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_RecoverableSignatureNoneZ* arg_conv = (LDKCResult_RecoverableSignatureNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RecoverableSignatureNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RecoverableSignatureNoneZ_clone(int64_t orig) {
+       LDKCResult_RecoverableSignatureNoneZ* orig_conv = (LDKCResult_RecoverableSignatureNoneZ*)untag_ptr(orig);
+       LDKCResult_RecoverableSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecoverableSignatureNoneZ), "LDKCResult_RecoverableSignatureNoneZ");
+       *ret_conv = CResult_RecoverableSignatureNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SchnorrSignatureNoneZ_ok(int8_tArray o) {
+       LDKSchnorrSignature o_ref;
+       CHECK(o->arr_len == 64);
+       memcpy(o_ref.compact_form, o->elems, 64); FREE(o);
+       LDKCResult_SchnorrSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_SchnorrSignatureNoneZ), "LDKCResult_SchnorrSignatureNoneZ");
+       *ret_conv = CResult_SchnorrSignatureNoneZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SchnorrSignatureNoneZ_err() {
+       LDKCResult_SchnorrSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_SchnorrSignatureNoneZ), "LDKCResult_SchnorrSignatureNoneZ");
+       *ret_conv = CResult_SchnorrSignatureNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SchnorrSignatureNoneZ_is_ok(int64_t o) {
+       LDKCResult_SchnorrSignatureNoneZ* o_conv = (LDKCResult_SchnorrSignatureNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SchnorrSignatureNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SchnorrSignatureNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SchnorrSignatureNoneZ _res_conv = *(LDKCResult_SchnorrSignatureNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SchnorrSignatureNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SchnorrSignatureNoneZ_clone_ptr(LDKCResult_SchnorrSignatureNoneZ *NONNULL_PTR arg) {
+       LDKCResult_SchnorrSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_SchnorrSignatureNoneZ), "LDKCResult_SchnorrSignatureNoneZ");
+       *ret_conv = CResult_SchnorrSignatureNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SchnorrSignatureNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_SchnorrSignatureNoneZ* arg_conv = (LDKCResult_SchnorrSignatureNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SchnorrSignatureNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SchnorrSignatureNoneZ_clone(int64_t orig) {
+       LDKCResult_SchnorrSignatureNoneZ* orig_conv = (LDKCResult_SchnorrSignatureNoneZ*)untag_ptr(orig);
+       LDKCResult_SchnorrSignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_SchnorrSignatureNoneZ), "LDKCResult_SchnorrSignatureNoneZ");
+       *ret_conv = CResult_SchnorrSignatureNoneZ_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);
+       LDKWriteableEcdsaChannelSigner o_conv = *(LDKWriteableEcdsaChannelSigner*)(o_ptr);
+       if (o_conv.free == LDKWriteableEcdsaChannelSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKWriteableEcdsaChannelSigner_JCalls_cloned(&o_conv);
+       }
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ), "LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ");
+       *ret_conv = CResult_WriteableEcdsaChannelSignerDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_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_WriteableEcdsaChannelSignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ), "LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ");
+       *ret_conv = CResult_WriteableEcdsaChannelSignerDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* o_conv = (LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_WriteableEcdsaChannelSignerDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ _res_conv = *(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_WriteableEcdsaChannelSignerDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone_ptr(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ), "LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ");
+       *ret_conv = CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* arg_conv = (LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* orig_conv = (LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ), "LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ");
+       *ret_conv = CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZNoneZ_ok(int8_tArray o) {
+       LDKCVec_u8Z o_ref;
+       o_ref.datalen = o->arr_len;
+       o_ref.data = MALLOC(o_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(o_ref.data, o->elems, o_ref.datalen); FREE(o);
+       LDKCResult_CVec_u8ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZNoneZ), "LDKCResult_CVec_u8ZNoneZ");
+       *ret_conv = CResult_CVec_u8ZNoneZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZNoneZ_err() {
+       LDKCResult_CVec_u8ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZNoneZ), "LDKCResult_CVec_u8ZNoneZ");
+       *ret_conv = CResult_CVec_u8ZNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_u8ZNoneZ_is_ok(int64_t o) {
+       LDKCResult_CVec_u8ZNoneZ* o_conv = (LDKCResult_CVec_u8ZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_u8ZNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_u8ZNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_u8ZNoneZ _res_conv = *(LDKCResult_CVec_u8ZNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_u8ZNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_u8ZNoneZ_clone_ptr(LDKCResult_CVec_u8ZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_u8ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZNoneZ), "LDKCResult_CVec_u8ZNoneZ");
+       *ret_conv = CResult_CVec_u8ZNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_u8ZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_u8ZNoneZ* arg_conv = (LDKCResult_CVec_u8ZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_u8ZNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZNoneZ_clone(int64_t orig) {
+       LDKCResult_CVec_u8ZNoneZ* orig_conv = (LDKCResult_CVec_u8ZNoneZ*)untag_ptr(orig);
+       LDKCResult_CVec_u8ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZNoneZ), "LDKCResult_CVec_u8ZNoneZ");
+       *ret_conv = CResult_CVec_u8ZNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptNoneZ_ok(int64_t o) {
+       LDKShutdownScript 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 = ShutdownScript_clone(&o_conv);
+       LDKCResult_ShutdownScriptNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptNoneZ), "LDKCResult_ShutdownScriptNoneZ");
+       *ret_conv = CResult_ShutdownScriptNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptNoneZ_err() {
+       LDKCResult_ShutdownScriptNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptNoneZ), "LDKCResult_ShutdownScriptNoneZ");
+       *ret_conv = CResult_ShutdownScriptNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ShutdownScriptNoneZ_is_ok(int64_t o) {
+       LDKCResult_ShutdownScriptNoneZ* o_conv = (LDKCResult_ShutdownScriptNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ShutdownScriptNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ShutdownScriptNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ShutdownScriptNoneZ _res_conv = *(LDKCResult_ShutdownScriptNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ShutdownScriptNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ShutdownScriptNoneZ_clone_ptr(LDKCResult_ShutdownScriptNoneZ *NONNULL_PTR arg) {
+       LDKCResult_ShutdownScriptNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptNoneZ), "LDKCResult_ShutdownScriptNoneZ");
+       *ret_conv = CResult_ShutdownScriptNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ShutdownScriptNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_ShutdownScriptNoneZ* arg_conv = (LDKCResult_ShutdownScriptNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ShutdownScriptNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptNoneZ_clone(int64_t orig) {
+       LDKCResult_ShutdownScriptNoneZ* orig_conv = (LDKCResult_ShutdownScriptNoneZ*)untag_ptr(orig);
+       LDKCResult_ShutdownScriptNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptNoneZ), "LDKCResult_ShutdownScriptNoneZ");
+       *ret_conv = CResult_ShutdownScriptNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_u16Z_some(int16_t o) {
+       LDKCOption_u16Z *ret_copy = MALLOC(sizeof(LDKCOption_u16Z), "LDKCOption_u16Z");
+       *ret_copy = COption_u16Z_some(o);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_u16Z_none() {
+       LDKCOption_u16Z *ret_copy = MALLOC(sizeof(LDKCOption_u16Z), "LDKCOption_u16Z");
+       *ret_copy = COption_u16Z_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_u16Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_u16Z _res_conv = *(LDKCOption_u16Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_u16Z_free(_res_conv);
+}
+
+static inline uint64_t COption_u16Z_clone_ptr(LDKCOption_u16Z *NONNULL_PTR arg) {
+       LDKCOption_u16Z *ret_copy = MALLOC(sizeof(LDKCOption_u16Z), "LDKCOption_u16Z");
+       *ret_copy = COption_u16Z_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_u16Z_clone_ptr(int64_t arg) {
+       LDKCOption_u16Z* arg_conv = (LDKCOption_u16Z*)untag_ptr(arg);
+       int64_t ret_conv = COption_u16Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_u16Z_clone(int64_t orig) {
+       LDKCOption_u16Z* orig_conv = (LDKCOption_u16Z*)untag_ptr(orig);
+       LDKCOption_u16Z *ret_copy = MALLOC(sizeof(LDKCOption_u16Z), "LDKCOption_u16Z");
+       *ret_copy = COption_u16Z_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_boolZ_some(jboolean o) {
+       LDKCOption_boolZ *ret_copy = MALLOC(sizeof(LDKCOption_boolZ), "LDKCOption_boolZ");
+       *ret_copy = COption_boolZ_some(o);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_boolZ_none() {
+       LDKCOption_boolZ *ret_copy = MALLOC(sizeof(LDKCOption_boolZ), "LDKCOption_boolZ");
+       *ret_copy = COption_boolZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_boolZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_boolZ _res_conv = *(LDKCOption_boolZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_boolZ_free(_res_conv);
+}
+
+static inline uint64_t COption_boolZ_clone_ptr(LDKCOption_boolZ *NONNULL_PTR arg) {
+       LDKCOption_boolZ *ret_copy = MALLOC(sizeof(LDKCOption_boolZ), "LDKCOption_boolZ");
+       *ret_copy = COption_boolZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_boolZ_clone_ptr(int64_t arg) {
+       LDKCOption_boolZ* arg_conv = (LDKCOption_boolZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_boolZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_boolZ_clone(int64_t orig) {
+       LDKCOption_boolZ* orig_conv = (LDKCOption_boolZ*)untag_ptr(orig);
+       LDKCOption_boolZ *ret_copy = MALLOC(sizeof(LDKCOption_boolZ), "LDKCOption_boolZ");
+       *ret_copy = COption_boolZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CVec_CVec_u8ZZ_free(ptrArray _res) {
+       LDKCVec_CVec_u8ZZ _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");
+       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);
+               _res_constr.data[i] = _res_conv_8_ref;
+       }
+       FREE(_res);
+       CVec_CVec_u8ZZ_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");
+       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;
+       }
+       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);
+       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();
+       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);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_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);
+       FREE(untag_ptr(_res));
+       CResult_CVec_CVec_u8ZZNoneZ_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);
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_InMemorySignerDecodeErrorZ_ok(int64_t o) {
+       LDKInMemorySigner 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 = InMemorySigner_clone(&o_conv);
+       LDKCResult_InMemorySignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InMemorySignerDecodeErrorZ), "LDKCResult_InMemorySignerDecodeErrorZ");
+       *ret_conv = CResult_InMemorySignerDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_InMemorySignerDecodeErrorZ_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_InMemorySignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InMemorySignerDecodeErrorZ), "LDKCResult_InMemorySignerDecodeErrorZ");
+       *ret_conv = CResult_InMemorySignerDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_InMemorySignerDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_InMemorySignerDecodeErrorZ* o_conv = (LDKCResult_InMemorySignerDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_InMemorySignerDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_InMemorySignerDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_InMemorySignerDecodeErrorZ _res_conv = *(LDKCResult_InMemorySignerDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_InMemorySignerDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_InMemorySignerDecodeErrorZ_clone_ptr(LDKCResult_InMemorySignerDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_InMemorySignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InMemorySignerDecodeErrorZ), "LDKCResult_InMemorySignerDecodeErrorZ");
+       *ret_conv = CResult_InMemorySignerDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_InMemorySignerDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_InMemorySignerDecodeErrorZ* arg_conv = (LDKCResult_InMemorySignerDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_InMemorySignerDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_InMemorySignerDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_InMemorySignerDecodeErrorZ* orig_conv = (LDKCResult_InMemorySignerDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_InMemorySignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InMemorySignerDecodeErrorZ), "LDKCResult_InMemorySignerDecodeErrorZ");
+       *ret_conv = CResult_InMemorySignerDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TransactionNoneZ_ok(int8_tArray o) {
+       LDKTransaction o_ref;
+       o_ref.datalen = o->arr_len;
+       o_ref.data = MALLOC(o_ref.datalen, "LDKTransaction Bytes");
+       memcpy(o_ref.data, o->elems, o_ref.datalen); FREE(o);
+       o_ref.data_is_owned = true;
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = CResult_TransactionNoneZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TransactionNoneZ_err() {
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = CResult_TransactionNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TransactionNoneZ_is_ok(int64_t o) {
+       LDKCResult_TransactionNoneZ* o_conv = (LDKCResult_TransactionNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TransactionNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TransactionNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TransactionNoneZ _res_conv = *(LDKCResult_TransactionNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TransactionNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TransactionNoneZ_clone_ptr(LDKCResult_TransactionNoneZ *NONNULL_PTR arg) {
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = CResult_TransactionNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TransactionNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_TransactionNoneZ* arg_conv = (LDKCResult_TransactionNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TransactionNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TransactionNoneZ_clone(int64_t orig) {
+       LDKCResult_TransactionNoneZ* orig_conv = (LDKCResult_TransactionNoneZ*)untag_ptr(orig);
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = CResult_TransactionNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_WriteableScoreZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKWriteableScore o_conv = *(LDKWriteableScore*)(o_ptr);
+       if (o_conv.free == LDKWriteableScore_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKWriteableScore_JCalls_cloned(&o_conv);
+       }
+       LDKCOption_WriteableScoreZ *ret_copy = MALLOC(sizeof(LDKCOption_WriteableScoreZ), "LDKCOption_WriteableScoreZ");
+       *ret_copy = COption_WriteableScoreZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_WriteableScoreZ_none() {
+       LDKCOption_WriteableScoreZ *ret_copy = MALLOC(sizeof(LDKCOption_WriteableScoreZ), "LDKCOption_WriteableScoreZ");
+       *ret_copy = COption_WriteableScoreZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_WriteableScoreZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_WriteableScoreZ _res_conv = *(LDKCOption_WriteableScoreZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_WriteableScoreZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_NoneIOErrorZ_ok() {
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = CResult_NoneIOErrorZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneIOErrorZ_err(int32_t e) {
+       LDKIOError e_conv = LDKIOError_from_cs(e);
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = CResult_NoneIOErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NoneIOErrorZ_is_ok(int64_t o) {
+       LDKCResult_NoneIOErrorZ* o_conv = (LDKCResult_NoneIOErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NoneIOErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NoneIOErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NoneIOErrorZ _res_conv = *(LDKCResult_NoneIOErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NoneIOErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NoneIOErrorZ_clone_ptr(LDKCResult_NoneIOErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = CResult_NoneIOErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NoneIOErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NoneIOErrorZ* arg_conv = (LDKCResult_NoneIOErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NoneIOErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NoneIOErrorZ_clone(int64_t orig) {
+       LDKCResult_NoneIOErrorZ* orig_conv = (LDKCResult_NoneIOErrorZ*)untag_ptr(orig);
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = CResult_NoneIOErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_ChannelDetailsZ_free(int64_tArray _res) {
+       LDKCVec_ChannelDetailsZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKChannelDetails), "LDKCVec_ChannelDetailsZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t q = 0; q < _res_constr.datalen; q++) {
+               int64_t _res_conv_16 = _res_vals[q];
+               LDKChannelDetails _res_conv_16_conv;
+               _res_conv_16_conv.inner = untag_ptr(_res_conv_16);
+               _res_conv_16_conv.is_owned = ptr_is_owned(_res_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_16_conv);
+               _res_constr.data[q] = _res_conv_16_conv;
+       }
+       FREE(_res);
+       CVec_ChannelDetailsZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_RouteLightningErrorZ_ok(int64_t o) {
+       LDKRoute 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 = Route_clone(&o_conv);
+       LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
+       *ret_conv = CResult_RouteLightningErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteLightningErrorZ_err(int64_t e) {
+       LDKLightningError e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = LightningError_clone(&e_conv);
+       LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
+       *ret_conv = CResult_RouteLightningErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RouteLightningErrorZ_is_ok(int64_t o) {
+       LDKCResult_RouteLightningErrorZ* o_conv = (LDKCResult_RouteLightningErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RouteLightningErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RouteLightningErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RouteLightningErrorZ _res_conv = *(LDKCResult_RouteLightningErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RouteLightningErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RouteLightningErrorZ_clone_ptr(LDKCResult_RouteLightningErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
+       *ret_conv = CResult_RouteLightningErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RouteLightningErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RouteLightningErrorZ* arg_conv = (LDKCResult_RouteLightningErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RouteLightningErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RouteLightningErrorZ_clone(int64_t orig) {
+       LDKCResult_RouteLightningErrorZ* orig_conv = (LDKCResult_RouteLightningErrorZ*)untag_ptr(orig);
+       LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
+       *ret_conv = CResult_RouteLightningErrorZ_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);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = InFlightHtlcs_clone(&o_conv);
+       LDKCResult_InFlightHtlcsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InFlightHtlcsDecodeErrorZ), "LDKCResult_InFlightHtlcsDecodeErrorZ");
+       *ret_conv = CResult_InFlightHtlcsDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_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_InFlightHtlcsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InFlightHtlcsDecodeErrorZ), "LDKCResult_InFlightHtlcsDecodeErrorZ");
+       *ret_conv = CResult_InFlightHtlcsDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_InFlightHtlcsDecodeErrorZ* o_conv = (LDKCResult_InFlightHtlcsDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_InFlightHtlcsDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_InFlightHtlcsDecodeErrorZ _res_conv = *(LDKCResult_InFlightHtlcsDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_InFlightHtlcsDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_InFlightHtlcsDecodeErrorZ_clone_ptr(LDKCResult_InFlightHtlcsDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_InFlightHtlcsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InFlightHtlcsDecodeErrorZ), "LDKCResult_InFlightHtlcsDecodeErrorZ");
+       *ret_conv = CResult_InFlightHtlcsDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_InFlightHtlcsDecodeErrorZ* arg_conv = (LDKCResult_InFlightHtlcsDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_InFlightHtlcsDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_InFlightHtlcsDecodeErrorZ* orig_conv = (LDKCResult_InFlightHtlcsDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_InFlightHtlcsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InFlightHtlcsDecodeErrorZ), "LDKCResult_InFlightHtlcsDecodeErrorZ");
+       *ret_conv = CResult_InFlightHtlcsDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteHopDecodeErrorZ_ok(int64_t o) {
+       LDKRouteHop 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 = RouteHop_clone(&o_conv);
+       LDKCResult_RouteHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHopDecodeErrorZ), "LDKCResult_RouteHopDecodeErrorZ");
+       *ret_conv = CResult_RouteHopDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteHopDecodeErrorZ_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_RouteHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHopDecodeErrorZ), "LDKCResult_RouteHopDecodeErrorZ");
+       *ret_conv = CResult_RouteHopDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RouteHopDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RouteHopDecodeErrorZ* o_conv = (LDKCResult_RouteHopDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RouteHopDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RouteHopDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RouteHopDecodeErrorZ _res_conv = *(LDKCResult_RouteHopDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RouteHopDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RouteHopDecodeErrorZ_clone_ptr(LDKCResult_RouteHopDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RouteHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHopDecodeErrorZ), "LDKCResult_RouteHopDecodeErrorZ");
+       *ret_conv = CResult_RouteHopDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RouteHopDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RouteHopDecodeErrorZ* arg_conv = (LDKCResult_RouteHopDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RouteHopDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RouteHopDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RouteHopDecodeErrorZ* orig_conv = (LDKCResult_RouteHopDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RouteHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHopDecodeErrorZ), "LDKCResult_RouteHopDecodeErrorZ");
+       *ret_conv = CResult_RouteHopDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_BlindedHopZ_free(int64_tArray _res) {
+       LDKCVec_BlindedHopZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKBlindedHop), "LDKCVec_BlindedHopZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t m = 0; m < _res_constr.datalen; m++) {
+               int64_t _res_conv_12 = _res_vals[m];
+               LDKBlindedHop _res_conv_12_conv;
+               _res_conv_12_conv.inner = untag_ptr(_res_conv_12);
+               _res_conv_12_conv.is_owned = ptr_is_owned(_res_conv_12);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_12_conv);
+               _res_constr.data[m] = _res_conv_12_conv;
+       }
+       FREE(_res);
+       CVec_BlindedHopZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_BlindedTailDecodeErrorZ_ok(int64_t o) {
+       LDKBlindedTail 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 = BlindedTail_clone(&o_conv);
+       LDKCResult_BlindedTailDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedTailDecodeErrorZ), "LDKCResult_BlindedTailDecodeErrorZ");
+       *ret_conv = CResult_BlindedTailDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedTailDecodeErrorZ_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_BlindedTailDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedTailDecodeErrorZ), "LDKCResult_BlindedTailDecodeErrorZ");
+       *ret_conv = CResult_BlindedTailDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BlindedTailDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BlindedTailDecodeErrorZ* o_conv = (LDKCResult_BlindedTailDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BlindedTailDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BlindedTailDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BlindedTailDecodeErrorZ _res_conv = *(LDKCResult_BlindedTailDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BlindedTailDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BlindedTailDecodeErrorZ_clone_ptr(LDKCResult_BlindedTailDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BlindedTailDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedTailDecodeErrorZ), "LDKCResult_BlindedTailDecodeErrorZ");
+       *ret_conv = CResult_BlindedTailDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BlindedTailDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BlindedTailDecodeErrorZ* arg_conv = (LDKCResult_BlindedTailDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BlindedTailDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BlindedTailDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BlindedTailDecodeErrorZ* orig_conv = (LDKCResult_BlindedTailDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BlindedTailDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedTailDecodeErrorZ), "LDKCResult_BlindedTailDecodeErrorZ");
+       *ret_conv = CResult_BlindedTailDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_RouteHopZ_free(int64_tArray _res) {
+       LDKCVec_RouteHopZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKRouteHop), "LDKCVec_RouteHopZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t k = 0; k < _res_constr.datalen; k++) {
+               int64_t _res_conv_10 = _res_vals[k];
+               LDKRouteHop _res_conv_10_conv;
+               _res_conv_10_conv.inner = untag_ptr(_res_conv_10);
+               _res_conv_10_conv.is_owned = ptr_is_owned(_res_conv_10);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_10_conv);
+               _res_constr.data[k] = _res_conv_10_conv;
+       }
+       FREE(_res);
+       CVec_RouteHopZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_PathZ_free(int64_tArray _res) {
+       LDKCVec_PathZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKPath), "LDKCVec_PathZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t g = 0; g < _res_constr.datalen; g++) {
+               int64_t _res_conv_6 = _res_vals[g];
+               LDKPath _res_conv_6_conv;
+               _res_conv_6_conv.inner = untag_ptr(_res_conv_6);
+               _res_conv_6_conv.is_owned = ptr_is_owned(_res_conv_6);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_6_conv);
+               _res_constr.data[g] = _res_conv_6_conv;
+       }
+       FREE(_res);
+       CVec_PathZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_RouteDecodeErrorZ_ok(int64_t o) {
+       LDKRoute 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 = Route_clone(&o_conv);
+       LDKCResult_RouteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteDecodeErrorZ), "LDKCResult_RouteDecodeErrorZ");
+       *ret_conv = CResult_RouteDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteDecodeErrorZ_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_RouteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteDecodeErrorZ), "LDKCResult_RouteDecodeErrorZ");
+       *ret_conv = CResult_RouteDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RouteDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RouteDecodeErrorZ* o_conv = (LDKCResult_RouteDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RouteDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RouteDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RouteDecodeErrorZ _res_conv = *(LDKCResult_RouteDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RouteDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RouteDecodeErrorZ_clone_ptr(LDKCResult_RouteDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RouteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteDecodeErrorZ), "LDKCResult_RouteDecodeErrorZ");
+       *ret_conv = CResult_RouteDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RouteDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RouteDecodeErrorZ* arg_conv = (LDKCResult_RouteDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RouteDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RouteDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RouteDecodeErrorZ* orig_conv = (LDKCResult_RouteDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RouteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteDecodeErrorZ), "LDKCResult_RouteDecodeErrorZ");
+       *ret_conv = CResult_RouteDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteParametersDecodeErrorZ_ok(int64_t o) {
+       LDKRouteParameters 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 = RouteParameters_clone(&o_conv);
+       LDKCResult_RouteParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteParametersDecodeErrorZ), "LDKCResult_RouteParametersDecodeErrorZ");
+       *ret_conv = CResult_RouteParametersDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteParametersDecodeErrorZ_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_RouteParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteParametersDecodeErrorZ), "LDKCResult_RouteParametersDecodeErrorZ");
+       *ret_conv = CResult_RouteParametersDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RouteParametersDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RouteParametersDecodeErrorZ* o_conv = (LDKCResult_RouteParametersDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RouteParametersDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RouteParametersDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RouteParametersDecodeErrorZ _res_conv = *(LDKCResult_RouteParametersDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RouteParametersDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RouteParametersDecodeErrorZ_clone_ptr(LDKCResult_RouteParametersDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RouteParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteParametersDecodeErrorZ), "LDKCResult_RouteParametersDecodeErrorZ");
+       *ret_conv = CResult_RouteParametersDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RouteParametersDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RouteParametersDecodeErrorZ* arg_conv = (LDKCResult_RouteParametersDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RouteParametersDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RouteParametersDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RouteParametersDecodeErrorZ* orig_conv = (LDKCResult_RouteParametersDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RouteParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteParametersDecodeErrorZ), "LDKCResult_RouteParametersDecodeErrorZ");
+       *ret_conv = CResult_RouteParametersDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_u64Z_free(int64_tArray _res) {
+       LDKCVec_u64Z _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(int64_t), "LDKCVec_u64Z Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t g = 0; g < _res_constr.datalen; g++) {
+               int64_t _res_conv_6 = _res_vals[g];
+               _res_constr.data[g] = _res_conv_6;
+       }
+       FREE(_res);
+       CVec_u64Z_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_PaymentParametersDecodeErrorZ_ok(int64_t o) {
+       LDKPaymentParameters 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 = PaymentParameters_clone(&o_conv);
+       LDKCResult_PaymentParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentParametersDecodeErrorZ), "LDKCResult_PaymentParametersDecodeErrorZ");
+       *ret_conv = CResult_PaymentParametersDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PaymentParametersDecodeErrorZ_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_PaymentParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentParametersDecodeErrorZ), "LDKCResult_PaymentParametersDecodeErrorZ");
+       *ret_conv = CResult_PaymentParametersDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PaymentParametersDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PaymentParametersDecodeErrorZ* o_conv = (LDKCResult_PaymentParametersDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PaymentParametersDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PaymentParametersDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PaymentParametersDecodeErrorZ _res_conv = *(LDKCResult_PaymentParametersDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PaymentParametersDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PaymentParametersDecodeErrorZ_clone_ptr(LDKCResult_PaymentParametersDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PaymentParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentParametersDecodeErrorZ), "LDKCResult_PaymentParametersDecodeErrorZ");
+       *ret_conv = CResult_PaymentParametersDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PaymentParametersDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PaymentParametersDecodeErrorZ* arg_conv = (LDKCResult_PaymentParametersDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PaymentParametersDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PaymentParametersDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PaymentParametersDecodeErrorZ* orig_conv = (LDKCResult_PaymentParametersDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PaymentParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentParametersDecodeErrorZ), "LDKCResult_PaymentParametersDecodeErrorZ");
+       *ret_conv = CResult_PaymentParametersDecodeErrorZ_clone(orig_conv);
+       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;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKRouteHint), "LDKCVec_RouteHintZ 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_11 = _res_vals[l];
+               LDKRouteHint _res_conv_11_conv;
+               _res_conv_11_conv.inner = untag_ptr(_res_conv_11);
+               _res_conv_11_conv.is_owned = ptr_is_owned(_res_conv_11);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_11_conv);
+               _res_constr.data[l] = _res_conv_11_conv;
+       }
+       FREE(_res);
+       CVec_RouteHintZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_RouteHintHopZ_free(int64_tArray _res) {
+       LDKCVec_RouteHintHopZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKRouteHintHop), "LDKCVec_RouteHintHopZ 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_14 = _res_vals[o];
+               LDKRouteHintHop _res_conv_14_conv;
+               _res_conv_14_conv.inner = untag_ptr(_res_conv_14);
+               _res_conv_14_conv.is_owned = ptr_is_owned(_res_conv_14);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_14_conv);
+               _res_constr.data[o] = _res_conv_14_conv;
+       }
+       FREE(_res);
+       CVec_RouteHintHopZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_RouteHintDecodeErrorZ_ok(int64_t o) {
+       LDKRouteHint 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 = RouteHint_clone(&o_conv);
+       LDKCResult_RouteHintDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintDecodeErrorZ), "LDKCResult_RouteHintDecodeErrorZ");
+       *ret_conv = CResult_RouteHintDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteHintDecodeErrorZ_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_RouteHintDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintDecodeErrorZ), "LDKCResult_RouteHintDecodeErrorZ");
+       *ret_conv = CResult_RouteHintDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RouteHintDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RouteHintDecodeErrorZ* o_conv = (LDKCResult_RouteHintDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RouteHintDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RouteHintDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RouteHintDecodeErrorZ _res_conv = *(LDKCResult_RouteHintDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RouteHintDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RouteHintDecodeErrorZ_clone_ptr(LDKCResult_RouteHintDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RouteHintDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintDecodeErrorZ), "LDKCResult_RouteHintDecodeErrorZ");
+       *ret_conv = CResult_RouteHintDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RouteHintDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RouteHintDecodeErrorZ* arg_conv = (LDKCResult_RouteHintDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RouteHintDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RouteHintDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RouteHintDecodeErrorZ* orig_conv = (LDKCResult_RouteHintDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RouteHintDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintDecodeErrorZ), "LDKCResult_RouteHintDecodeErrorZ");
+       *ret_conv = CResult_RouteHintDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteHintHopDecodeErrorZ_ok(int64_t o) {
+       LDKRouteHintHop 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 = RouteHintHop_clone(&o_conv);
+       LDKCResult_RouteHintHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintHopDecodeErrorZ), "LDKCResult_RouteHintHopDecodeErrorZ");
+       *ret_conv = CResult_RouteHintHopDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RouteHintHopDecodeErrorZ_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_RouteHintHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintHopDecodeErrorZ), "LDKCResult_RouteHintHopDecodeErrorZ");
+       *ret_conv = CResult_RouteHintHopDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RouteHintHopDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RouteHintHopDecodeErrorZ* o_conv = (LDKCResult_RouteHintHopDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RouteHintHopDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RouteHintHopDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RouteHintHopDecodeErrorZ _res_conv = *(LDKCResult_RouteHintHopDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RouteHintHopDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RouteHintHopDecodeErrorZ_clone_ptr(LDKCResult_RouteHintHopDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RouteHintHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintHopDecodeErrorZ), "LDKCResult_RouteHintHopDecodeErrorZ");
+       *ret_conv = CResult_RouteHintHopDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RouteHintHopDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RouteHintHopDecodeErrorZ* arg_conv = (LDKCResult_RouteHintHopDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RouteHintHopDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RouteHintHopDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RouteHintHopDecodeErrorZ* orig_conv = (LDKCResult_RouteHintHopDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RouteHintHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintHopDecodeErrorZ), "LDKCResult_RouteHintHopDecodeErrorZ");
+       *ret_conv = CResult_RouteHintHopDecodeErrorZ_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_FixedPenaltyScorerDecodeErrorZ_ok(int64_t o) {
+       LDKFixedPenaltyScorer 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 = FixedPenaltyScorer_clone(&o_conv);
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FixedPenaltyScorerDecodeErrorZ), "LDKCResult_FixedPenaltyScorerDecodeErrorZ");
+       *ret_conv = CResult_FixedPenaltyScorerDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_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_FixedPenaltyScorerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FixedPenaltyScorerDecodeErrorZ), "LDKCResult_FixedPenaltyScorerDecodeErrorZ");
+       *ret_conv = CResult_FixedPenaltyScorerDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* o_conv = (LDKCResult_FixedPenaltyScorerDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_FixedPenaltyScorerDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ _res_conv = *(LDKCResult_FixedPenaltyScorerDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_FixedPenaltyScorerDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_FixedPenaltyScorerDecodeErrorZ_clone_ptr(LDKCResult_FixedPenaltyScorerDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FixedPenaltyScorerDecodeErrorZ), "LDKCResult_FixedPenaltyScorerDecodeErrorZ");
+       *ret_conv = CResult_FixedPenaltyScorerDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* arg_conv = (LDKCResult_FixedPenaltyScorerDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_FixedPenaltyScorerDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* orig_conv = (LDKCResult_FixedPenaltyScorerDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FixedPenaltyScorerDecodeErrorZ), "LDKCResult_FixedPenaltyScorerDecodeErrorZ");
+       *ret_conv = CResult_FixedPenaltyScorerDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_NodeIdZ_free(int64_tArray _res) {
+       LDKCVec_NodeIdZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKNodeId), "LDKCVec_NodeIdZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t i = 0; i < _res_constr.datalen; i++) {
+               int64_t _res_conv_8 = _res_vals[i];
+               LDKNodeId _res_conv_8_conv;
+               _res_conv_8_conv.inner = untag_ptr(_res_conv_8);
+               _res_conv_8_conv.is_owned = ptr_is_owned(_res_conv_8);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_8_conv);
+               _res_constr.data[i] = _res_conv_8_conv;
+       }
+       FREE(_res);
+       CVec_NodeIdZ_free(_res_constr);
+}
+
+static inline uint64_t C2Tuple_u64u64Z_clone_ptr(LDKC2Tuple_u64u64Z *NONNULL_PTR arg) {
+       LDKC2Tuple_u64u64Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64u64Z), "LDKC2Tuple_u64u64Z");
+       *ret_conv = C2Tuple_u64u64Z_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_u64u64Z_clone_ptr(int64_t arg) {
+       LDKC2Tuple_u64u64Z* arg_conv = (LDKC2Tuple_u64u64Z*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_u64u64Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_u64u64Z_clone(int64_t orig) {
+       LDKC2Tuple_u64u64Z* orig_conv = (LDKC2Tuple_u64u64Z*)untag_ptr(orig);
+       LDKC2Tuple_u64u64Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64u64Z), "LDKC2Tuple_u64u64Z");
+       *ret_conv = C2Tuple_u64u64Z_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_u64u64Z_new(int64_t a, int64_t b) {
+       LDKC2Tuple_u64u64Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64u64Z), "LDKC2Tuple_u64u64Z");
+       *ret_conv = C2Tuple_u64u64Z_new(a, b);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_u64u64Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_u64u64Z _res_conv = *(LDKC2Tuple_u64u64Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_u64u64Z_free(_res_conv);
+}
+
+int64_t  CS_LDK_COption_C2Tuple_u64u64ZZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_u64u64Z o_conv = *(LDKC2Tuple_u64u64Z*)(o_ptr);
+       o_conv = C2Tuple_u64u64Z_clone((LDKC2Tuple_u64u64Z*)untag_ptr(o));
+       LDKCOption_C2Tuple_u64u64ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u64ZZ), "LDKCOption_C2Tuple_u64u64ZZ");
+       *ret_copy = COption_C2Tuple_u64u64ZZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_C2Tuple_u64u64ZZ_none() {
+       LDKCOption_C2Tuple_u64u64ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u64ZZ), "LDKCOption_C2Tuple_u64u64ZZ");
+       *ret_copy = COption_C2Tuple_u64u64ZZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_C2Tuple_u64u64ZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_C2Tuple_u64u64ZZ _res_conv = *(LDKCOption_C2Tuple_u64u64ZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_C2Tuple_u64u64ZZ_free(_res_conv);
+}
+
+static inline uint64_t COption_C2Tuple_u64u64ZZ_clone_ptr(LDKCOption_C2Tuple_u64u64ZZ *NONNULL_PTR arg) {
+       LDKCOption_C2Tuple_u64u64ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u64ZZ), "LDKCOption_C2Tuple_u64u64ZZ");
+       *ret_copy = COption_C2Tuple_u64u64ZZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_C2Tuple_u64u64ZZ_clone_ptr(int64_t arg) {
+       LDKCOption_C2Tuple_u64u64ZZ* arg_conv = (LDKCOption_C2Tuple_u64u64ZZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_C2Tuple_u64u64ZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_C2Tuple_u64u64ZZ_clone(int64_t orig) {
+       LDKCOption_C2Tuple_u64u64ZZ* orig_conv = (LDKCOption_C2Tuple_u64u64ZZ*)untag_ptr(orig);
+       LDKCOption_C2Tuple_u64u64ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u64ZZ), "LDKCOption_C2Tuple_u64u64ZZ");
+       *ret_copy = COption_C2Tuple_u64u64ZZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_C2Tuple_Z_new(int16_tArray a, int16_tArray b) {
+       LDKThirtyTwoU16s a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32 * 2); FREE(a);
+       LDKThirtyTwoU16s b_ref;
+       CHECK(b->arr_len == 32);
+       memcpy(b_ref.data, b->elems, 32 * 2); FREE(b);
+       LDKC2Tuple_Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_Z), "LDKC2Tuple_Z");
+       *ret_conv = C2Tuple_Z_new(a_ref, b_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_Z _res_conv = *(LDKC2Tuple_Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_Z_free(_res_conv);
+}
+
+int64_t  CS_LDK_C2Tuple__u1632_u1632Z_new(int16_tArray a, int16_tArray b) {
+       LDKThirtyTwoU16s a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32 * 2); FREE(a);
+       LDKThirtyTwoU16s b_ref;
+       CHECK(b->arr_len == 32);
+       memcpy(b_ref.data, b->elems, 32 * 2); FREE(b);
+       LDKC2Tuple__u1632_u1632Z* ret_conv = MALLOC(sizeof(LDKC2Tuple__u1632_u1632Z), "LDKC2Tuple__u1632_u1632Z");
+       *ret_conv = C2Tuple__u1632_u1632Z_new(a_ref, b_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple__u1632_u1632Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple__u1632_u1632Z _res_conv = *(LDKC2Tuple__u1632_u1632Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple__u1632_u1632Z_free(_res_conv);
+}
+
+int64_t  CS_LDK_COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple__u1632_u1632Z o_conv = *(LDKC2Tuple__u1632_u1632Z*)(o_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKC2Tuple__u1632_u1632Z
+       LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ), "LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ");
+       *ret_copy = COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_none() {
+       LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ), "LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ");
+       *ret_copy = COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ _res_conv = *(LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_COption_f64Z_some(double o) {
+       LDKCOption_f64Z *ret_copy = MALLOC(sizeof(LDKCOption_f64Z), "LDKCOption_f64Z");
+       *ret_copy = COption_f64Z_some(o);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_f64Z_none() {
+       LDKCOption_f64Z *ret_copy = MALLOC(sizeof(LDKCOption_f64Z), "LDKCOption_f64Z");
+       *ret_copy = COption_f64Z_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_f64Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_f64Z _res_conv = *(LDKCOption_f64Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_f64Z_free(_res_conv);
+}
+
+static inline uint64_t COption_f64Z_clone_ptr(LDKCOption_f64Z *NONNULL_PTR arg) {
+       LDKCOption_f64Z *ret_copy = MALLOC(sizeof(LDKCOption_f64Z), "LDKCOption_f64Z");
+       *ret_copy = COption_f64Z_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_f64Z_clone_ptr(int64_t arg) {
+       LDKCOption_f64Z* arg_conv = (LDKCOption_f64Z*)untag_ptr(arg);
+       int64_t ret_conv = COption_f64Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_f64Z_clone(int64_t orig) {
+       LDKCOption_f64Z* orig_conv = (LDKCOption_f64Z*)untag_ptr(orig);
+       LDKCOption_f64Z *ret_copy = MALLOC(sizeof(LDKCOption_f64Z), "LDKCOption_f64Z");
+       *ret_copy = COption_f64Z_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_ProbabilisticScorerDecodeErrorZ_ok(int64_t o) {
+       LDKProbabilisticScorer o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       // WARNING: we need a move here but no clone is available for LDKProbabilisticScorer
+       
+       LDKCResult_ProbabilisticScorerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ProbabilisticScorerDecodeErrorZ), "LDKCResult_ProbabilisticScorerDecodeErrorZ");
+       *ret_conv = CResult_ProbabilisticScorerDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ProbabilisticScorerDecodeErrorZ_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_ProbabilisticScorerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ProbabilisticScorerDecodeErrorZ), "LDKCResult_ProbabilisticScorerDecodeErrorZ");
+       *ret_conv = CResult_ProbabilisticScorerDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ProbabilisticScorerDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ProbabilisticScorerDecodeErrorZ* o_conv = (LDKCResult_ProbabilisticScorerDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ProbabilisticScorerDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ProbabilisticScorerDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ProbabilisticScorerDecodeErrorZ _res_conv = *(LDKCResult_ProbabilisticScorerDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ProbabilisticScorerDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t C2Tuple_usizeTransactionZ_clone_ptr(LDKC2Tuple_usizeTransactionZ *NONNULL_PTR arg) {
+       LDKC2Tuple_usizeTransactionZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_usizeTransactionZ), "LDKC2Tuple_usizeTransactionZ");
+       *ret_conv = C2Tuple_usizeTransactionZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_usizeTransactionZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_usizeTransactionZ* arg_conv = (LDKC2Tuple_usizeTransactionZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_usizeTransactionZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_usizeTransactionZ_clone(int64_t orig) {
+       LDKC2Tuple_usizeTransactionZ* orig_conv = (LDKC2Tuple_usizeTransactionZ*)untag_ptr(orig);
+       LDKC2Tuple_usizeTransactionZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_usizeTransactionZ), "LDKC2Tuple_usizeTransactionZ");
+       *ret_conv = C2Tuple_usizeTransactionZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_usizeTransactionZ_new(int64_t a, int8_tArray b) {
+       LDKTransaction b_ref;
+       b_ref.datalen = b->arr_len;
+       b_ref.data = MALLOC(b_ref.datalen, "LDKTransaction Bytes");
+       memcpy(b_ref.data, b->elems, b_ref.datalen); FREE(b);
+       b_ref.data_is_owned = true;
+       LDKC2Tuple_usizeTransactionZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_usizeTransactionZ), "LDKC2Tuple_usizeTransactionZ");
+       *ret_conv = C2Tuple_usizeTransactionZ_new(a, b_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_usizeTransactionZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_usizeTransactionZ _res_conv = *(LDKC2Tuple_usizeTransactionZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_usizeTransactionZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_usizeTransactionZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_usizeTransactionZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_usizeTransactionZ), "LDKCVec_C2Tuple_usizeTransactionZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t c = 0; c < _res_constr.datalen; c++) {
+               int64_t _res_conv_28 = _res_vals[c];
+               void* _res_conv_28_ptr = untag_ptr(_res_conv_28);
+               CHECK_ACCESS(_res_conv_28_ptr);
+               LDKC2Tuple_usizeTransactionZ _res_conv_28_conv = *(LDKC2Tuple_usizeTransactionZ*)(_res_conv_28_ptr);
+               FREE(untag_ptr(_res_conv_28));
+               _res_constr.data[c] = _res_conv_28_conv;
+       }
+       FREE(_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);
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_new(int8_tArray a, int64_t b) {
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_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);
+       FREE(untag_ptr(_res));
+       C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesCOption_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");
+       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;
+       }
+       FREE(_res);
+       CVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_ok(int32_t o) {
+       LDKChannelMonitorUpdateStatus o_conv = LDKChannelMonitorUpdateStatus_from_cs(o);
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateStatusNoneZ), "LDKCResult_ChannelMonitorUpdateStatusNoneZ");
+       *ret_conv = CResult_ChannelMonitorUpdateStatusNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_err() {
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateStatusNoneZ), "LDKCResult_ChannelMonitorUpdateStatusNoneZ");
+       *ret_conv = CResult_ChannelMonitorUpdateStatusNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_is_ok(int64_t o) {
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* o_conv = (LDKCResult_ChannelMonitorUpdateStatusNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelMonitorUpdateStatusNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ _res_conv = *(LDKCResult_ChannelMonitorUpdateStatusNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelMonitorUpdateStatusNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelMonitorUpdateStatusNoneZ_clone_ptr(LDKCResult_ChannelMonitorUpdateStatusNoneZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateStatusNoneZ), "LDKCResult_ChannelMonitorUpdateStatusNoneZ");
+       *ret_conv = CResult_ChannelMonitorUpdateStatusNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* arg_conv = (LDKCResult_ChannelMonitorUpdateStatusNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelMonitorUpdateStatusNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_clone(int64_t orig) {
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* orig_conv = (LDKCResult_ChannelMonitorUpdateStatusNoneZ*)untag_ptr(orig);
+       LDKCResult_ChannelMonitorUpdateStatusNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateStatusNoneZ), "LDKCResult_ChannelMonitorUpdateStatusNoneZ");
+       *ret_conv = CResult_ChannelMonitorUpdateStatusNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_MonitorEventZ_free(int64_tArray _res) {
+       LDKCVec_MonitorEventZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKMonitorEvent), "LDKCVec_MonitorEventZ 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_14 = _res_vals[o];
+               void* _res_conv_14_ptr = untag_ptr(_res_conv_14);
+               CHECK_ACCESS(_res_conv_14_ptr);
+               LDKMonitorEvent _res_conv_14_conv = *(LDKMonitorEvent*)(_res_conv_14_ptr);
+               FREE(untag_ptr(_res_conv_14));
+               _res_constr.data[o] = _res_conv_14_conv;
+       }
+       FREE(_res);
+       CVec_MonitorEventZ_free(_res_constr);
+}
+
+static inline uint64_t C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone_ptr(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ *NONNULL_PTR arg) {
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ), "LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ");
+       *ret_conv = C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone_ptr(int64_t arg) {
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* arg_conv = (LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ*)untag_ptr(arg);
+       int64_t ret_conv = C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone(int64_t orig) {
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* orig_conv = (LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ*)untag_ptr(orig);
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ), "LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ");
+       *ret_conv = C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_new(int64_t a, int64_tArray b, int8_tArray c) {
+       LDKOutPoint 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 = OutPoint_clone(&a_conv);
+       LDKCVec_MonitorEventZ b_constr;
+       b_constr.datalen = b->arr_len;
+       if (b_constr.datalen > 0)
+               b_constr.data = MALLOC(b_constr.datalen * sizeof(LDKMonitorEvent), "LDKCVec_MonitorEventZ Elements");
+       else
+               b_constr.data = NULL;
+       int64_t* b_vals = b->elems;
+       for (size_t o = 0; o < b_constr.datalen; o++) {
+               int64_t b_conv_14 = b_vals[o];
+               void* b_conv_14_ptr = untag_ptr(b_conv_14);
+               CHECK_ACCESS(b_conv_14_ptr);
+               LDKMonitorEvent b_conv_14_conv = *(LDKMonitorEvent*)(b_conv_14_ptr);
+               b_conv_14_conv = MonitorEvent_clone((LDKMonitorEvent*)untag_ptr(b_conv_14));
+               b_constr.data[o] = b_conv_14_conv;
+       }
+       FREE(b);
+       LDKPublicKey c_ref;
+       CHECK(c->arr_len == 33);
+       memcpy(c_ref.compressed_form, c->elems, 33); FREE(c);
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ), "LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ");
+       *ret_conv = C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_new(a_conv, b_constr, c_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ _res_conv = *(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ_free(int64_tArray _res) {
+       LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ), "LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ 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);
+               LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ _res_conv_49_conv = *(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ*)(_res_conv_49_ptr);
+               FREE(untag_ptr(_res_conv_49));
+               _res_constr.data[x] = _res_conv_49_conv;
+       }
+       FREE(_res);
+       CVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_InitFeaturesDecodeErrorZ_ok(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 = InitFeatures_clone(&o_conv);
+       LDKCResult_InitFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitFeaturesDecodeErrorZ), "LDKCResult_InitFeaturesDecodeErrorZ");
+       *ret_conv = CResult_InitFeaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_InitFeaturesDecodeErrorZ_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_InitFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitFeaturesDecodeErrorZ), "LDKCResult_InitFeaturesDecodeErrorZ");
+       *ret_conv = CResult_InitFeaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_InitFeaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_InitFeaturesDecodeErrorZ* o_conv = (LDKCResult_InitFeaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_InitFeaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_InitFeaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_InitFeaturesDecodeErrorZ _res_conv = *(LDKCResult_InitFeaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_InitFeaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_InitFeaturesDecodeErrorZ_clone_ptr(LDKCResult_InitFeaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_InitFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitFeaturesDecodeErrorZ), "LDKCResult_InitFeaturesDecodeErrorZ");
+       *ret_conv = CResult_InitFeaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_InitFeaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_InitFeaturesDecodeErrorZ* arg_conv = (LDKCResult_InitFeaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_InitFeaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_InitFeaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_InitFeaturesDecodeErrorZ* orig_conv = (LDKCResult_InitFeaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_InitFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitFeaturesDecodeErrorZ), "LDKCResult_InitFeaturesDecodeErrorZ");
+       *ret_conv = CResult_InitFeaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelFeaturesDecodeErrorZ_ok(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 = ChannelFeatures_clone(&o_conv);
+       LDKCResult_ChannelFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelFeaturesDecodeErrorZ), "LDKCResult_ChannelFeaturesDecodeErrorZ");
+       *ret_conv = CResult_ChannelFeaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelFeaturesDecodeErrorZ_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_ChannelFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelFeaturesDecodeErrorZ), "LDKCResult_ChannelFeaturesDecodeErrorZ");
+       *ret_conv = CResult_ChannelFeaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelFeaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelFeaturesDecodeErrorZ* o_conv = (LDKCResult_ChannelFeaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelFeaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelFeaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelFeaturesDecodeErrorZ _res_conv = *(LDKCResult_ChannelFeaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelFeaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelFeaturesDecodeErrorZ_clone_ptr(LDKCResult_ChannelFeaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelFeaturesDecodeErrorZ), "LDKCResult_ChannelFeaturesDecodeErrorZ");
+       *ret_conv = CResult_ChannelFeaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelFeaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelFeaturesDecodeErrorZ* arg_conv = (LDKCResult_ChannelFeaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelFeaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelFeaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelFeaturesDecodeErrorZ* orig_conv = (LDKCResult_ChannelFeaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelFeaturesDecodeErrorZ), "LDKCResult_ChannelFeaturesDecodeErrorZ");
+       *ret_conv = CResult_ChannelFeaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeFeaturesDecodeErrorZ_ok(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 = NodeFeatures_clone(&o_conv);
+       LDKCResult_NodeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeFeaturesDecodeErrorZ), "LDKCResult_NodeFeaturesDecodeErrorZ");
+       *ret_conv = CResult_NodeFeaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeFeaturesDecodeErrorZ_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_NodeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeFeaturesDecodeErrorZ), "LDKCResult_NodeFeaturesDecodeErrorZ");
+       *ret_conv = CResult_NodeFeaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NodeFeaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_NodeFeaturesDecodeErrorZ* o_conv = (LDKCResult_NodeFeaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NodeFeaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NodeFeaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NodeFeaturesDecodeErrorZ _res_conv = *(LDKCResult_NodeFeaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NodeFeaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NodeFeaturesDecodeErrorZ_clone_ptr(LDKCResult_NodeFeaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NodeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeFeaturesDecodeErrorZ), "LDKCResult_NodeFeaturesDecodeErrorZ");
+       *ret_conv = CResult_NodeFeaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NodeFeaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NodeFeaturesDecodeErrorZ* arg_conv = (LDKCResult_NodeFeaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NodeFeaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NodeFeaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_NodeFeaturesDecodeErrorZ* orig_conv = (LDKCResult_NodeFeaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_NodeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeFeaturesDecodeErrorZ), "LDKCResult_NodeFeaturesDecodeErrorZ");
+       *ret_conv = CResult_NodeFeaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceFeaturesDecodeErrorZ_ok(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 = Bolt11InvoiceFeatures_clone(&o_conv);
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceFeaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceFeaturesDecodeErrorZ_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_Bolt11InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceFeaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_Bolt11InvoiceFeaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* o_conv = (LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_Bolt11InvoiceFeaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_Bolt11InvoiceFeaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ _res_conv = *(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_Bolt11InvoiceFeaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_Bolt11InvoiceFeaturesDecodeErrorZ_clone_ptr(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceFeaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceFeaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* arg_conv = (LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_Bolt11InvoiceFeaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceFeaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* orig_conv = (LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceFeaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt12InvoiceFeaturesDecodeErrorZ_ok(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 = Bolt12InvoiceFeatures_clone(&o_conv);
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = CResult_Bolt12InvoiceFeaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt12InvoiceFeaturesDecodeErrorZ_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_Bolt12InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = CResult_Bolt12InvoiceFeaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_Bolt12InvoiceFeaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* o_conv = (LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_Bolt12InvoiceFeaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_Bolt12InvoiceFeaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ _res_conv = *(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_Bolt12InvoiceFeaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_Bolt12InvoiceFeaturesDecodeErrorZ_clone_ptr(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = CResult_Bolt12InvoiceFeaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_Bolt12InvoiceFeaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* arg_conv = (LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_Bolt12InvoiceFeaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_Bolt12InvoiceFeaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* orig_conv = (LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = CResult_Bolt12InvoiceFeaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedHopFeaturesDecodeErrorZ_ok(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 = BlindedHopFeatures_clone(&o_conv);
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopFeaturesDecodeErrorZ), "LDKCResult_BlindedHopFeaturesDecodeErrorZ");
+       *ret_conv = CResult_BlindedHopFeaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedHopFeaturesDecodeErrorZ_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_BlindedHopFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopFeaturesDecodeErrorZ), "LDKCResult_BlindedHopFeaturesDecodeErrorZ");
+       *ret_conv = CResult_BlindedHopFeaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BlindedHopFeaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* o_conv = (LDKCResult_BlindedHopFeaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BlindedHopFeaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BlindedHopFeaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ _res_conv = *(LDKCResult_BlindedHopFeaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BlindedHopFeaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BlindedHopFeaturesDecodeErrorZ_clone_ptr(LDKCResult_BlindedHopFeaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopFeaturesDecodeErrorZ), "LDKCResult_BlindedHopFeaturesDecodeErrorZ");
+       *ret_conv = CResult_BlindedHopFeaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BlindedHopFeaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* arg_conv = (LDKCResult_BlindedHopFeaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BlindedHopFeaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BlindedHopFeaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* orig_conv = (LDKCResult_BlindedHopFeaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopFeaturesDecodeErrorZ), "LDKCResult_BlindedHopFeaturesDecodeErrorZ");
+       *ret_conv = CResult_BlindedHopFeaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_ok(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 = ChannelTypeFeatures_clone(&o_conv);
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTypeFeaturesDecodeErrorZ), "LDKCResult_ChannelTypeFeaturesDecodeErrorZ");
+       *ret_conv = CResult_ChannelTypeFeaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_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_ChannelTypeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTypeFeaturesDecodeErrorZ), "LDKCResult_ChannelTypeFeaturesDecodeErrorZ");
+       *ret_conv = CResult_ChannelTypeFeaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* o_conv = (LDKCResult_ChannelTypeFeaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelTypeFeaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ _res_conv = *(LDKCResult_ChannelTypeFeaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelTypeFeaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelTypeFeaturesDecodeErrorZ_clone_ptr(LDKCResult_ChannelTypeFeaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTypeFeaturesDecodeErrorZ), "LDKCResult_ChannelTypeFeaturesDecodeErrorZ");
+       *ret_conv = CResult_ChannelTypeFeaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* arg_conv = (LDKCResult_ChannelTypeFeaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelTypeFeaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* orig_conv = (LDKCResult_ChannelTypeFeaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTypeFeaturesDecodeErrorZ), "LDKCResult_ChannelTypeFeaturesDecodeErrorZ");
+       *ret_conv = CResult_ChannelTypeFeaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OfferBolt12ParseErrorZ_ok(int64_t o) {
+       LDKOffer 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 = Offer_clone(&o_conv);
+       LDKCResult_OfferBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OfferBolt12ParseErrorZ), "LDKCResult_OfferBolt12ParseErrorZ");
+       *ret_conv = CResult_OfferBolt12ParseErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OfferBolt12ParseErrorZ_err(int64_t e) {
+       LDKBolt12ParseError e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = Bolt12ParseError_clone(&e_conv);
+       LDKCResult_OfferBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OfferBolt12ParseErrorZ), "LDKCResult_OfferBolt12ParseErrorZ");
+       *ret_conv = CResult_OfferBolt12ParseErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_OfferBolt12ParseErrorZ_is_ok(int64_t o) {
+       LDKCResult_OfferBolt12ParseErrorZ* o_conv = (LDKCResult_OfferBolt12ParseErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_OfferBolt12ParseErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_OfferBolt12ParseErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_OfferBolt12ParseErrorZ _res_conv = *(LDKCResult_OfferBolt12ParseErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_OfferBolt12ParseErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_OfferBolt12ParseErrorZ_clone_ptr(LDKCResult_OfferBolt12ParseErrorZ *NONNULL_PTR arg) {
+       LDKCResult_OfferBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OfferBolt12ParseErrorZ), "LDKCResult_OfferBolt12ParseErrorZ");
+       *ret_conv = CResult_OfferBolt12ParseErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_OfferBolt12ParseErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_OfferBolt12ParseErrorZ* arg_conv = (LDKCResult_OfferBolt12ParseErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_OfferBolt12ParseErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_OfferBolt12ParseErrorZ_clone(int64_t orig) {
+       LDKCResult_OfferBolt12ParseErrorZ* orig_conv = (LDKCResult_OfferBolt12ParseErrorZ*)untag_ptr(orig);
+       LDKCResult_OfferBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OfferBolt12ParseErrorZ), "LDKCResult_OfferBolt12ParseErrorZ");
+       *ret_conv = CResult_OfferBolt12ParseErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PublicKeySecp256k1ErrorZ_ok(int8_tArray o) {
+       LDKPublicKey o_ref;
+       CHECK(o->arr_len == 33);
+       memcpy(o_ref.compressed_form, o->elems, 33); FREE(o);
+       LDKCResult_PublicKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeySecp256k1ErrorZ), "LDKCResult_PublicKeySecp256k1ErrorZ");
+       *ret_conv = CResult_PublicKeySecp256k1ErrorZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PublicKeySecp256k1ErrorZ_err(int32_t e) {
+       LDKSecp256k1Error e_conv = LDKSecp256k1Error_from_cs(e);
+       LDKCResult_PublicKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeySecp256k1ErrorZ), "LDKCResult_PublicKeySecp256k1ErrorZ");
+       *ret_conv = CResult_PublicKeySecp256k1ErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PublicKeySecp256k1ErrorZ_is_ok(int64_t o) {
+       LDKCResult_PublicKeySecp256k1ErrorZ* o_conv = (LDKCResult_PublicKeySecp256k1ErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PublicKeySecp256k1ErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PublicKeySecp256k1ErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PublicKeySecp256k1ErrorZ _res_conv = *(LDKCResult_PublicKeySecp256k1ErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PublicKeySecp256k1ErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PublicKeySecp256k1ErrorZ_clone_ptr(LDKCResult_PublicKeySecp256k1ErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PublicKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeySecp256k1ErrorZ), "LDKCResult_PublicKeySecp256k1ErrorZ");
+       *ret_conv = CResult_PublicKeySecp256k1ErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PublicKeySecp256k1ErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PublicKeySecp256k1ErrorZ* arg_conv = (LDKCResult_PublicKeySecp256k1ErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PublicKeySecp256k1ErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PublicKeySecp256k1ErrorZ_clone(int64_t orig) {
+       LDKCResult_PublicKeySecp256k1ErrorZ* orig_conv = (LDKCResult_PublicKeySecp256k1ErrorZ*)untag_ptr(orig);
+       LDKCResult_PublicKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeySecp256k1ErrorZ), "LDKCResult_PublicKeySecp256k1ErrorZ");
+       *ret_conv = CResult_PublicKeySecp256k1ErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeIdDecodeErrorZ_ok(int64_t o) {
+       LDKNodeId 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 = NodeId_clone(&o_conv);
+       LDKCResult_NodeIdDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeIdDecodeErrorZ), "LDKCResult_NodeIdDecodeErrorZ");
+       *ret_conv = CResult_NodeIdDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeIdDecodeErrorZ_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_NodeIdDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeIdDecodeErrorZ), "LDKCResult_NodeIdDecodeErrorZ");
+       *ret_conv = CResult_NodeIdDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NodeIdDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_NodeIdDecodeErrorZ* o_conv = (LDKCResult_NodeIdDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NodeIdDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NodeIdDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NodeIdDecodeErrorZ _res_conv = *(LDKCResult_NodeIdDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NodeIdDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NodeIdDecodeErrorZ_clone_ptr(LDKCResult_NodeIdDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NodeIdDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeIdDecodeErrorZ), "LDKCResult_NodeIdDecodeErrorZ");
+       *ret_conv = CResult_NodeIdDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NodeIdDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NodeIdDecodeErrorZ* arg_conv = (LDKCResult_NodeIdDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NodeIdDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NodeIdDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_NodeIdDecodeErrorZ* orig_conv = (LDKCResult_NodeIdDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_NodeIdDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeIdDecodeErrorZ), "LDKCResult_NodeIdDecodeErrorZ");
+       *ret_conv = CResult_NodeIdDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_NetworkUpdateZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKNetworkUpdate o_conv = *(LDKNetworkUpdate*)(o_ptr);
+       o_conv = NetworkUpdate_clone((LDKNetworkUpdate*)untag_ptr(o));
+       LDKCOption_NetworkUpdateZ *ret_copy = MALLOC(sizeof(LDKCOption_NetworkUpdateZ), "LDKCOption_NetworkUpdateZ");
+       *ret_copy = COption_NetworkUpdateZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_NetworkUpdateZ_none() {
+       LDKCOption_NetworkUpdateZ *ret_copy = MALLOC(sizeof(LDKCOption_NetworkUpdateZ), "LDKCOption_NetworkUpdateZ");
+       *ret_copy = COption_NetworkUpdateZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_NetworkUpdateZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_NetworkUpdateZ _res_conv = *(LDKCOption_NetworkUpdateZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_NetworkUpdateZ_free(_res_conv);
+}
+
+static inline uint64_t COption_NetworkUpdateZ_clone_ptr(LDKCOption_NetworkUpdateZ *NONNULL_PTR arg) {
+       LDKCOption_NetworkUpdateZ *ret_copy = MALLOC(sizeof(LDKCOption_NetworkUpdateZ), "LDKCOption_NetworkUpdateZ");
+       *ret_copy = COption_NetworkUpdateZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_NetworkUpdateZ_clone_ptr(int64_t arg) {
+       LDKCOption_NetworkUpdateZ* arg_conv = (LDKCOption_NetworkUpdateZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_NetworkUpdateZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_NetworkUpdateZ_clone(int64_t orig) {
+       LDKCOption_NetworkUpdateZ* orig_conv = (LDKCOption_NetworkUpdateZ*)untag_ptr(orig);
+       LDKCOption_NetworkUpdateZ *ret_copy = MALLOC(sizeof(LDKCOption_NetworkUpdateZ), "LDKCOption_NetworkUpdateZ");
+       *ret_copy = COption_NetworkUpdateZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_NetworkUpdateZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_NetworkUpdateZ o_conv = *(LDKCOption_NetworkUpdateZ*)(o_ptr);
+       o_conv = COption_NetworkUpdateZ_clone((LDKCOption_NetworkUpdateZ*)untag_ptr(o));
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_NetworkUpdateZDecodeErrorZ), "LDKCResult_COption_NetworkUpdateZDecodeErrorZ");
+       *ret_conv = CResult_COption_NetworkUpdateZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_NetworkUpdateZDecodeErrorZ_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_COption_NetworkUpdateZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_NetworkUpdateZDecodeErrorZ), "LDKCResult_COption_NetworkUpdateZDecodeErrorZ");
+       *ret_conv = CResult_COption_NetworkUpdateZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_NetworkUpdateZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* o_conv = (LDKCResult_COption_NetworkUpdateZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_NetworkUpdateZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_NetworkUpdateZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ _res_conv = *(LDKCResult_COption_NetworkUpdateZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_NetworkUpdateZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_NetworkUpdateZDecodeErrorZ_clone_ptr(LDKCResult_COption_NetworkUpdateZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_NetworkUpdateZDecodeErrorZ), "LDKCResult_COption_NetworkUpdateZDecodeErrorZ");
+       *ret_conv = CResult_COption_NetworkUpdateZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_NetworkUpdateZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* arg_conv = (LDKCResult_COption_NetworkUpdateZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_NetworkUpdateZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_NetworkUpdateZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* orig_conv = (LDKCResult_COption_NetworkUpdateZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_NetworkUpdateZDecodeErrorZ), "LDKCResult_COption_NetworkUpdateZDecodeErrorZ");
+       *ret_conv = CResult_COption_NetworkUpdateZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_UtxoLookupZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKUtxoLookup o_conv = *(LDKUtxoLookup*)(o_ptr);
+       if (o_conv.free == LDKUtxoLookup_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKUtxoLookup_JCalls_cloned(&o_conv);
+       }
+       LDKCOption_UtxoLookupZ *ret_copy = MALLOC(sizeof(LDKCOption_UtxoLookupZ), "LDKCOption_UtxoLookupZ");
+       *ret_copy = COption_UtxoLookupZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_UtxoLookupZ_none() {
+       LDKCOption_UtxoLookupZ *ret_copy = MALLOC(sizeof(LDKCOption_UtxoLookupZ), "LDKCOption_UtxoLookupZ");
+       *ret_copy = COption_UtxoLookupZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_UtxoLookupZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_UtxoLookupZ _res_conv = *(LDKCOption_UtxoLookupZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_UtxoLookupZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_NoneLightningErrorZ_ok() {
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = CResult_NoneLightningErrorZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneLightningErrorZ_err(int64_t e) {
+       LDKLightningError e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = LightningError_clone(&e_conv);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = CResult_NoneLightningErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NoneLightningErrorZ_is_ok(int64_t o) {
+       LDKCResult_NoneLightningErrorZ* o_conv = (LDKCResult_NoneLightningErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NoneLightningErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NoneLightningErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NoneLightningErrorZ _res_conv = *(LDKCResult_NoneLightningErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NoneLightningErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NoneLightningErrorZ_clone_ptr(LDKCResult_NoneLightningErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = CResult_NoneLightningErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NoneLightningErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NoneLightningErrorZ* arg_conv = (LDKCResult_NoneLightningErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NoneLightningErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NoneLightningErrorZ_clone(int64_t orig) {
+       LDKCResult_NoneLightningErrorZ* orig_conv = (LDKCResult_NoneLightningErrorZ*)untag_ptr(orig);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = CResult_NoneLightningErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_boolLightningErrorZ_ok(jboolean o) {
+       LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
+       *ret_conv = CResult_boolLightningErrorZ_ok(o);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_boolLightningErrorZ_err(int64_t e) {
+       LDKLightningError e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = LightningError_clone(&e_conv);
+       LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
+       *ret_conv = CResult_boolLightningErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_boolLightningErrorZ_is_ok(int64_t o) {
+       LDKCResult_boolLightningErrorZ* o_conv = (LDKCResult_boolLightningErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_boolLightningErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_boolLightningErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_boolLightningErrorZ _res_conv = *(LDKCResult_boolLightningErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_boolLightningErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_boolLightningErrorZ_clone_ptr(LDKCResult_boolLightningErrorZ *NONNULL_PTR arg) {
+       LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
+       *ret_conv = CResult_boolLightningErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_boolLightningErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_boolLightningErrorZ* arg_conv = (LDKCResult_boolLightningErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_boolLightningErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_boolLightningErrorZ_clone(int64_t orig) {
+       LDKCResult_boolLightningErrorZ* orig_conv = (LDKCResult_boolLightningErrorZ*)untag_ptr(orig);
+       LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
+       *ret_conv = CResult_boolLightningErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone_ptr(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *NONNULL_PTR arg) {
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ), "LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ");
+       *ret_conv = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone_ptr(int64_t arg) {
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* arg_conv = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)untag_ptr(arg);
+       int64_t ret_conv = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone(int64_t orig) {
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* orig_conv = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)untag_ptr(orig);
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ), "LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ");
+       *ret_conv = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_new(int64_t a, int64_t b, int64_t c) {
+       LDKChannelAnnouncement 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 = ChannelAnnouncement_clone(&a_conv);
+       LDKChannelUpdate 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 = ChannelUpdate_clone(&b_conv);
+       LDKChannelUpdate 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 = ChannelUpdate_clone(&c_conv);
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ), "LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ");
+       *ret_conv = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_new(a_conv, b_conv, c_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ _res_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ o_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(o_ptr);
+       o_conv = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone((LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)untag_ptr(o));
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *ret_copy = MALLOC(sizeof(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ), "LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ");
+       *ret_copy = COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_none() {
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *ret_copy = MALLOC(sizeof(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ), "LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ");
+       *ret_copy = COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ _res_conv = *(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_free(_res_conv);
+}
+
+static inline uint64_t COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone_ptr(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *NONNULL_PTR arg) {
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *ret_copy = MALLOC(sizeof(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ), "LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ");
+       *ret_copy = COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone_ptr(int64_t arg) {
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ* arg_conv = (LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone(int64_t orig) {
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ* orig_conv = (LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ*)untag_ptr(orig);
+       LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *ret_copy = MALLOC(sizeof(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ), "LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ");
+       *ret_copy = COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CVec_MessageSendEventZ_free(int64_tArray _res) {
+       LDKCVec_MessageSendEventZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKMessageSendEvent), "LDKCVec_MessageSendEventZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t s = 0; s < _res_constr.datalen; s++) {
+               int64_t _res_conv_18 = _res_vals[s];
+               void* _res_conv_18_ptr = untag_ptr(_res_conv_18);
+               CHECK_ACCESS(_res_conv_18_ptr);
+               LDKMessageSendEvent _res_conv_18_conv = *(LDKMessageSendEvent*)(_res_conv_18_ptr);
+               FREE(untag_ptr(_res_conv_18));
+               _res_constr.data[s] = _res_conv_18_conv;
+       }
+       FREE(_res);
+       CVec_MessageSendEventZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_ok(int64_t o) {
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_clone(&o_conv);
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateInfoDecodeErrorZ), "LDKCResult_ChannelUpdateInfoDecodeErrorZ");
+       *ret_conv = CResult_ChannelUpdateInfoDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_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_ChannelUpdateInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateInfoDecodeErrorZ), "LDKCResult_ChannelUpdateInfoDecodeErrorZ");
+       *ret_conv = CResult_ChannelUpdateInfoDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* o_conv = (LDKCResult_ChannelUpdateInfoDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelUpdateInfoDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ _res_conv = *(LDKCResult_ChannelUpdateInfoDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelUpdateInfoDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelUpdateInfoDecodeErrorZ_clone_ptr(LDKCResult_ChannelUpdateInfoDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateInfoDecodeErrorZ), "LDKCResult_ChannelUpdateInfoDecodeErrorZ");
+       *ret_conv = CResult_ChannelUpdateInfoDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* arg_conv = (LDKCResult_ChannelUpdateInfoDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelUpdateInfoDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* orig_conv = (LDKCResult_ChannelUpdateInfoDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateInfoDecodeErrorZ), "LDKCResult_ChannelUpdateInfoDecodeErrorZ");
+       *ret_conv = CResult_ChannelUpdateInfoDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelInfoDecodeErrorZ_ok(int64_t o) {
+       LDKChannelInfo 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 = ChannelInfo_clone(&o_conv);
+       LDKCResult_ChannelInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelInfoDecodeErrorZ), "LDKCResult_ChannelInfoDecodeErrorZ");
+       *ret_conv = CResult_ChannelInfoDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelInfoDecodeErrorZ_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_ChannelInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelInfoDecodeErrorZ), "LDKCResult_ChannelInfoDecodeErrorZ");
+       *ret_conv = CResult_ChannelInfoDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelInfoDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelInfoDecodeErrorZ* o_conv = (LDKCResult_ChannelInfoDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelInfoDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelInfoDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelInfoDecodeErrorZ _res_conv = *(LDKCResult_ChannelInfoDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelInfoDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelInfoDecodeErrorZ_clone_ptr(LDKCResult_ChannelInfoDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelInfoDecodeErrorZ), "LDKCResult_ChannelInfoDecodeErrorZ");
+       *ret_conv = CResult_ChannelInfoDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelInfoDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelInfoDecodeErrorZ* arg_conv = (LDKCResult_ChannelInfoDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelInfoDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelInfoDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelInfoDecodeErrorZ* orig_conv = (LDKCResult_ChannelInfoDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelInfoDecodeErrorZ), "LDKCResult_ChannelInfoDecodeErrorZ");
+       *ret_conv = CResult_ChannelInfoDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RoutingFeesDecodeErrorZ_ok(int64_t o) {
+       LDKRoutingFees 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 = RoutingFees_clone(&o_conv);
+       LDKCResult_RoutingFeesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RoutingFeesDecodeErrorZ), "LDKCResult_RoutingFeesDecodeErrorZ");
+       *ret_conv = CResult_RoutingFeesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RoutingFeesDecodeErrorZ_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_RoutingFeesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RoutingFeesDecodeErrorZ), "LDKCResult_RoutingFeesDecodeErrorZ");
+       *ret_conv = CResult_RoutingFeesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RoutingFeesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RoutingFeesDecodeErrorZ* o_conv = (LDKCResult_RoutingFeesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RoutingFeesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RoutingFeesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RoutingFeesDecodeErrorZ _res_conv = *(LDKCResult_RoutingFeesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RoutingFeesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RoutingFeesDecodeErrorZ_clone_ptr(LDKCResult_RoutingFeesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RoutingFeesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RoutingFeesDecodeErrorZ), "LDKCResult_RoutingFeesDecodeErrorZ");
+       *ret_conv = CResult_RoutingFeesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RoutingFeesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RoutingFeesDecodeErrorZ* arg_conv = (LDKCResult_RoutingFeesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RoutingFeesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RoutingFeesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RoutingFeesDecodeErrorZ* orig_conv = (LDKCResult_RoutingFeesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RoutingFeesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RoutingFeesDecodeErrorZ), "LDKCResult_RoutingFeesDecodeErrorZ");
+       *ret_conv = CResult_RoutingFeesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_SocketAddressZ_free(int64_tArray _res) {
+       LDKCVec_SocketAddressZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKSocketAddress), "LDKCVec_SocketAddressZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t p = 0; p < _res_constr.datalen; p++) {
+               int64_t _res_conv_15 = _res_vals[p];
+               void* _res_conv_15_ptr = untag_ptr(_res_conv_15);
+               CHECK_ACCESS(_res_conv_15_ptr);
+               LDKSocketAddress _res_conv_15_conv = *(LDKSocketAddress*)(_res_conv_15_ptr);
+               FREE(untag_ptr(_res_conv_15));
+               _res_constr.data[p] = _res_conv_15_conv;
+       }
+       FREE(_res);
+       CVec_SocketAddressZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_ok(int64_t o) {
+       LDKNodeAnnouncementInfo 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 = NodeAnnouncementInfo_clone(&o_conv);
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementInfoDecodeErrorZ), "LDKCResult_NodeAnnouncementInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_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_NodeAnnouncementInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementInfoDecodeErrorZ), "LDKCResult_NodeAnnouncementInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* o_conv = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ _res_conv = *(LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NodeAnnouncementInfoDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NodeAnnouncementInfoDecodeErrorZ_clone_ptr(LDKCResult_NodeAnnouncementInfoDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementInfoDecodeErrorZ), "LDKCResult_NodeAnnouncementInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* arg_conv = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* orig_conv = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementInfoDecodeErrorZ), "LDKCResult_NodeAnnouncementInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeAliasDecodeErrorZ_ok(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 = NodeAlias_clone(&o_conv);
+       LDKCResult_NodeAliasDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAliasDecodeErrorZ), "LDKCResult_NodeAliasDecodeErrorZ");
+       *ret_conv = CResult_NodeAliasDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeAliasDecodeErrorZ_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_NodeAliasDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAliasDecodeErrorZ), "LDKCResult_NodeAliasDecodeErrorZ");
+       *ret_conv = CResult_NodeAliasDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NodeAliasDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_NodeAliasDecodeErrorZ* o_conv = (LDKCResult_NodeAliasDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NodeAliasDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NodeAliasDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NodeAliasDecodeErrorZ _res_conv = *(LDKCResult_NodeAliasDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NodeAliasDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NodeAliasDecodeErrorZ_clone_ptr(LDKCResult_NodeAliasDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NodeAliasDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAliasDecodeErrorZ), "LDKCResult_NodeAliasDecodeErrorZ");
+       *ret_conv = CResult_NodeAliasDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NodeAliasDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NodeAliasDecodeErrorZ* arg_conv = (LDKCResult_NodeAliasDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NodeAliasDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NodeAliasDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_NodeAliasDecodeErrorZ* orig_conv = (LDKCResult_NodeAliasDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_NodeAliasDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAliasDecodeErrorZ), "LDKCResult_NodeAliasDecodeErrorZ");
+       *ret_conv = CResult_NodeAliasDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeInfoDecodeErrorZ_ok(int64_t o) {
+       LDKNodeInfo 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 = NodeInfo_clone(&o_conv);
+       LDKCResult_NodeInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeInfoDecodeErrorZ), "LDKCResult_NodeInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeInfoDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeInfoDecodeErrorZ_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_NodeInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeInfoDecodeErrorZ), "LDKCResult_NodeInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeInfoDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NodeInfoDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_NodeInfoDecodeErrorZ* o_conv = (LDKCResult_NodeInfoDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NodeInfoDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NodeInfoDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NodeInfoDecodeErrorZ _res_conv = *(LDKCResult_NodeInfoDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NodeInfoDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NodeInfoDecodeErrorZ_clone_ptr(LDKCResult_NodeInfoDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NodeInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeInfoDecodeErrorZ), "LDKCResult_NodeInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeInfoDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NodeInfoDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NodeInfoDecodeErrorZ* arg_conv = (LDKCResult_NodeInfoDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NodeInfoDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NodeInfoDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_NodeInfoDecodeErrorZ* orig_conv = (LDKCResult_NodeInfoDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_NodeInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeInfoDecodeErrorZ), "LDKCResult_NodeInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeInfoDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NetworkGraphDecodeErrorZ_ok(int64_t o) {
+       LDKNetworkGraph o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       // WARNING: we need a move here but no clone is available for LDKNetworkGraph
+       
+       LDKCResult_NetworkGraphDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NetworkGraphDecodeErrorZ), "LDKCResult_NetworkGraphDecodeErrorZ");
+       *ret_conv = CResult_NetworkGraphDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NetworkGraphDecodeErrorZ_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_NetworkGraphDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NetworkGraphDecodeErrorZ), "LDKCResult_NetworkGraphDecodeErrorZ");
+       *ret_conv = CResult_NetworkGraphDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NetworkGraphDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_NetworkGraphDecodeErrorZ* o_conv = (LDKCResult_NetworkGraphDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NetworkGraphDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NetworkGraphDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NetworkGraphDecodeErrorZ _res_conv = *(LDKCResult_NetworkGraphDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NetworkGraphDecodeErrorZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_COption_CVec_SocketAddressZZ_some(int64_tArray o) {
+       LDKCVec_SocketAddressZ o_constr;
+       o_constr.datalen = o->arr_len;
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKSocketAddress), "LDKCVec_SocketAddressZ Elements");
+       else
+               o_constr.data = NULL;
+       int64_t* o_vals = o->elems;
+       for (size_t p = 0; p < o_constr.datalen; p++) {
+               int64_t o_conv_15 = o_vals[p];
+               void* o_conv_15_ptr = untag_ptr(o_conv_15);
+               CHECK_ACCESS(o_conv_15_ptr);
+               LDKSocketAddress o_conv_15_conv = *(LDKSocketAddress*)(o_conv_15_ptr);
+               o_conv_15_conv = SocketAddress_clone((LDKSocketAddress*)untag_ptr(o_conv_15));
+               o_constr.data[p] = o_conv_15_conv;
+       }
+       FREE(o);
+       LDKCOption_CVec_SocketAddressZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_SocketAddressZZ), "LDKCOption_CVec_SocketAddressZZ");
+       *ret_copy = COption_CVec_SocketAddressZZ_some(o_constr);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_CVec_SocketAddressZZ_none() {
+       LDKCOption_CVec_SocketAddressZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_SocketAddressZZ), "LDKCOption_CVec_SocketAddressZZ");
+       *ret_copy = COption_CVec_SocketAddressZZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_CVec_SocketAddressZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_CVec_SocketAddressZZ _res_conv = *(LDKCOption_CVec_SocketAddressZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_CVec_SocketAddressZZ_free(_res_conv);
+}
+
+static inline uint64_t COption_CVec_SocketAddressZZ_clone_ptr(LDKCOption_CVec_SocketAddressZZ *NONNULL_PTR arg) {
+       LDKCOption_CVec_SocketAddressZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_SocketAddressZZ), "LDKCOption_CVec_SocketAddressZZ");
+       *ret_copy = COption_CVec_SocketAddressZZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_CVec_SocketAddressZZ_clone_ptr(int64_t arg) {
+       LDKCOption_CVec_SocketAddressZZ* arg_conv = (LDKCOption_CVec_SocketAddressZZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_CVec_SocketAddressZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_CVec_SocketAddressZZ_clone(int64_t orig) {
+       LDKCOption_CVec_SocketAddressZZ* orig_conv = (LDKCOption_CVec_SocketAddressZZ*)untag_ptr(orig);
+       LDKCOption_CVec_SocketAddressZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_SocketAddressZZ), "LDKCOption_CVec_SocketAddressZZ");
+       *ret_copy = COption_CVec_SocketAddressZZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CVec_HTLCOutputInCommitmentZ_free(int64_tArray _res) {
+       LDKCVec_HTLCOutputInCommitmentZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKHTLCOutputInCommitment), "LDKCVec_HTLCOutputInCommitmentZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t y = 0; y < _res_constr.datalen; y++) {
+               int64_t _res_conv_24 = _res_vals[y];
+               LDKHTLCOutputInCommitment _res_conv_24_conv;
+               _res_conv_24_conv.inner = untag_ptr(_res_conv_24);
+               _res_conv_24_conv.is_owned = ptr_is_owned(_res_conv_24);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_24_conv);
+               _res_constr.data[y] = _res_conv_24_conv;
+       }
+       FREE(_res);
+       CVec_HTLCOutputInCommitmentZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_HTLCDescriptorZ_free(int64_tArray _res) {
+       LDKCVec_HTLCDescriptorZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKHTLCDescriptor), "LDKCVec_HTLCDescriptorZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t q = 0; q < _res_constr.datalen; q++) {
+               int64_t _res_conv_16 = _res_vals[q];
+               LDKHTLCDescriptor _res_conv_16_conv;
+               _res_conv_16_conv.inner = untag_ptr(_res_conv_16);
+               _res_conv_16_conv.is_owned = ptr_is_owned(_res_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_16_conv);
+               _res_constr.data[q] = _res_conv_16_conv;
+       }
+       FREE(_res);
+       CVec_HTLCDescriptorZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_UtxoZ_free(int64_tArray _res) {
+       LDKCVec_UtxoZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKUtxo), "LDKCVec_UtxoZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t g = 0; g < _res_constr.datalen; g++) {
+               int64_t _res_conv_6 = _res_vals[g];
+               LDKUtxo _res_conv_6_conv;
+               _res_conv_6_conv.inner = untag_ptr(_res_conv_6);
+               _res_conv_6_conv.is_owned = ptr_is_owned(_res_conv_6);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_6_conv);
+               _res_constr.data[g] = _res_conv_6_conv;
+       }
+       FREE(_res);
+       CVec_UtxoZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_TxOutZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKTxOut o_conv = *(LDKTxOut*)(o_ptr);
+       o_conv = TxOut_clone((LDKTxOut*)untag_ptr(o));
+       LDKCOption_TxOutZ *ret_copy = MALLOC(sizeof(LDKCOption_TxOutZ), "LDKCOption_TxOutZ");
+       *ret_copy = COption_TxOutZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_TxOutZ_none() {
+       LDKCOption_TxOutZ *ret_copy = MALLOC(sizeof(LDKCOption_TxOutZ), "LDKCOption_TxOutZ");
+       *ret_copy = COption_TxOutZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_TxOutZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_TxOutZ _res_conv = *(LDKCOption_TxOutZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_TxOutZ_free(_res_conv);
+}
+
+static inline uint64_t COption_TxOutZ_clone_ptr(LDKCOption_TxOutZ *NONNULL_PTR arg) {
+       LDKCOption_TxOutZ *ret_copy = MALLOC(sizeof(LDKCOption_TxOutZ), "LDKCOption_TxOutZ");
+       *ret_copy = COption_TxOutZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_TxOutZ_clone_ptr(int64_t arg) {
+       LDKCOption_TxOutZ* arg_conv = (LDKCOption_TxOutZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_TxOutZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_TxOutZ_clone(int64_t orig) {
+       LDKCOption_TxOutZ* orig_conv = (LDKCOption_TxOutZ*)untag_ptr(orig);
+       LDKCOption_TxOutZ *ret_copy = MALLOC(sizeof(LDKCOption_TxOutZ), "LDKCOption_TxOutZ");
+       *ret_copy = COption_TxOutZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CVec_InputZ_free(int64_tArray _res) {
+       LDKCVec_InputZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKInput), "LDKCVec_InputZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t h = 0; h < _res_constr.datalen; h++) {
+               int64_t _res_conv_7 = _res_vals[h];
+               LDKInput _res_conv_7_conv;
+               _res_conv_7_conv.inner = untag_ptr(_res_conv_7);
+               _res_conv_7_conv.is_owned = ptr_is_owned(_res_conv_7);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_7_conv);
+               _res_constr.data[h] = _res_conv_7_conv;
+       }
+       FREE(_res);
+       CVec_InputZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_CoinSelectionNoneZ_ok(int64_t o) {
+       LDKCoinSelection 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 = CoinSelection_clone(&o_conv);
+       LDKCResult_CoinSelectionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CoinSelectionNoneZ), "LDKCResult_CoinSelectionNoneZ");
+       *ret_conv = CResult_CoinSelectionNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CoinSelectionNoneZ_err() {
+       LDKCResult_CoinSelectionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CoinSelectionNoneZ), "LDKCResult_CoinSelectionNoneZ");
+       *ret_conv = CResult_CoinSelectionNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CoinSelectionNoneZ_is_ok(int64_t o) {
+       LDKCResult_CoinSelectionNoneZ* o_conv = (LDKCResult_CoinSelectionNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CoinSelectionNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CoinSelectionNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CoinSelectionNoneZ _res_conv = *(LDKCResult_CoinSelectionNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CoinSelectionNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CoinSelectionNoneZ_clone_ptr(LDKCResult_CoinSelectionNoneZ *NONNULL_PTR arg) {
+       LDKCResult_CoinSelectionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CoinSelectionNoneZ), "LDKCResult_CoinSelectionNoneZ");
+       *ret_conv = CResult_CoinSelectionNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CoinSelectionNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_CoinSelectionNoneZ* arg_conv = (LDKCResult_CoinSelectionNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CoinSelectionNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CoinSelectionNoneZ_clone(int64_t orig) {
+       LDKCResult_CoinSelectionNoneZ* orig_conv = (LDKCResult_CoinSelectionNoneZ*)untag_ptr(orig);
+       LDKCResult_CoinSelectionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CoinSelectionNoneZ), "LDKCResult_CoinSelectionNoneZ");
+       *ret_conv = CResult_CoinSelectionNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_UtxoZNoneZ_ok(int64_tArray o) {
+       LDKCVec_UtxoZ o_constr;
+       o_constr.datalen = o->arr_len;
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKUtxo), "LDKCVec_UtxoZ Elements");
+       else
+               o_constr.data = NULL;
+       int64_t* o_vals = o->elems;
+       for (size_t g = 0; g < o_constr.datalen; g++) {
+               int64_t o_conv_6 = o_vals[g];
+               LDKUtxo o_conv_6_conv;
+               o_conv_6_conv.inner = untag_ptr(o_conv_6);
+               o_conv_6_conv.is_owned = ptr_is_owned(o_conv_6);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv_6_conv);
+               o_conv_6_conv = Utxo_clone(&o_conv_6_conv);
+               o_constr.data[g] = o_conv_6_conv;
+       }
+       FREE(o);
+       LDKCResult_CVec_UtxoZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_UtxoZNoneZ), "LDKCResult_CVec_UtxoZNoneZ");
+       *ret_conv = CResult_CVec_UtxoZNoneZ_ok(o_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_UtxoZNoneZ_err() {
+       LDKCResult_CVec_UtxoZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_UtxoZNoneZ), "LDKCResult_CVec_UtxoZNoneZ");
+       *ret_conv = CResult_CVec_UtxoZNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_UtxoZNoneZ_is_ok(int64_t o) {
+       LDKCResult_CVec_UtxoZNoneZ* o_conv = (LDKCResult_CVec_UtxoZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_UtxoZNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_UtxoZNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_UtxoZNoneZ _res_conv = *(LDKCResult_CVec_UtxoZNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_UtxoZNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_UtxoZNoneZ_clone_ptr(LDKCResult_CVec_UtxoZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_UtxoZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_UtxoZNoneZ), "LDKCResult_CVec_UtxoZNoneZ");
+       *ret_conv = CResult_CVec_UtxoZNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_UtxoZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_UtxoZNoneZ* arg_conv = (LDKCResult_CVec_UtxoZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_UtxoZNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_UtxoZNoneZ_clone(int64_t orig) {
+       LDKCResult_CVec_UtxoZNoneZ* orig_conv = (LDKCResult_CVec_UtxoZNoneZ*)untag_ptr(orig);
+       LDKCResult_CVec_UtxoZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_UtxoZNoneZ), "LDKCResult_CVec_UtxoZNoneZ");
+       *ret_conv = CResult_CVec_UtxoZNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C2Tuple_u64u16Z_clone_ptr(LDKC2Tuple_u64u16Z *NONNULL_PTR arg) {
+       LDKC2Tuple_u64u16Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64u16Z), "LDKC2Tuple_u64u16Z");
+       *ret_conv = C2Tuple_u64u16Z_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_u64u16Z_clone_ptr(int64_t arg) {
+       LDKC2Tuple_u64u16Z* arg_conv = (LDKC2Tuple_u64u16Z*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_u64u16Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_u64u16Z_clone(int64_t orig) {
+       LDKC2Tuple_u64u16Z* orig_conv = (LDKC2Tuple_u64u16Z*)untag_ptr(orig);
+       LDKC2Tuple_u64u16Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64u16Z), "LDKC2Tuple_u64u16Z");
+       *ret_conv = C2Tuple_u64u16Z_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_u64u16Z_new(int64_t a, int16_t b) {
+       LDKC2Tuple_u64u16Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_u64u16Z), "LDKC2Tuple_u64u16Z");
+       *ret_conv = C2Tuple_u64u16Z_new(a, b);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_u64u16Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_u64u16Z _res_conv = *(LDKC2Tuple_u64u16Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_u64u16Z_free(_res_conv);
+}
+
+int64_t  CS_LDK_COption_C2Tuple_u64u16ZZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_u64u16Z o_conv = *(LDKC2Tuple_u64u16Z*)(o_ptr);
+       o_conv = C2Tuple_u64u16Z_clone((LDKC2Tuple_u64u16Z*)untag_ptr(o));
+       LDKCOption_C2Tuple_u64u16ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u16ZZ), "LDKCOption_C2Tuple_u64u16ZZ");
+       *ret_copy = COption_C2Tuple_u64u16ZZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_C2Tuple_u64u16ZZ_none() {
+       LDKCOption_C2Tuple_u64u16ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u16ZZ), "LDKCOption_C2Tuple_u64u16ZZ");
+       *ret_copy = COption_C2Tuple_u64u16ZZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_C2Tuple_u64u16ZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_C2Tuple_u64u16ZZ _res_conv = *(LDKCOption_C2Tuple_u64u16ZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_C2Tuple_u64u16ZZ_free(_res_conv);
+}
+
+static inline uint64_t COption_C2Tuple_u64u16ZZ_clone_ptr(LDKCOption_C2Tuple_u64u16ZZ *NONNULL_PTR arg) {
+       LDKCOption_C2Tuple_u64u16ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u16ZZ), "LDKCOption_C2Tuple_u64u16ZZ");
+       *ret_copy = COption_C2Tuple_u64u16ZZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_C2Tuple_u64u16ZZ_clone_ptr(int64_t arg) {
+       LDKCOption_C2Tuple_u64u16ZZ* arg_conv = (LDKCOption_C2Tuple_u64u16ZZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_C2Tuple_u64u16ZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_C2Tuple_u64u16ZZ_clone(int64_t orig) {
+       LDKCOption_C2Tuple_u64u16ZZ* orig_conv = (LDKCOption_C2Tuple_u64u16ZZ*)untag_ptr(orig);
+       LDKCOption_C2Tuple_u64u16ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u16ZZ), "LDKCOption_C2Tuple_u64u16ZZ");
+       *ret_copy = COption_C2Tuple_u64u16ZZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_ChannelShutdownStateZ_some(int32_t o) {
+       LDKChannelShutdownState o_conv = LDKChannelShutdownState_from_cs(o);
+       LDKCOption_ChannelShutdownStateZ *ret_copy = MALLOC(sizeof(LDKCOption_ChannelShutdownStateZ), "LDKCOption_ChannelShutdownStateZ");
+       *ret_copy = COption_ChannelShutdownStateZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_ChannelShutdownStateZ_none() {
+       LDKCOption_ChannelShutdownStateZ *ret_copy = MALLOC(sizeof(LDKCOption_ChannelShutdownStateZ), "LDKCOption_ChannelShutdownStateZ");
+       *ret_copy = COption_ChannelShutdownStateZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_ChannelShutdownStateZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_ChannelShutdownStateZ _res_conv = *(LDKCOption_ChannelShutdownStateZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_ChannelShutdownStateZ_free(_res_conv);
+}
+
+static inline uint64_t COption_ChannelShutdownStateZ_clone_ptr(LDKCOption_ChannelShutdownStateZ *NONNULL_PTR arg) {
+       LDKCOption_ChannelShutdownStateZ *ret_copy = MALLOC(sizeof(LDKCOption_ChannelShutdownStateZ), "LDKCOption_ChannelShutdownStateZ");
+       *ret_copy = COption_ChannelShutdownStateZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_ChannelShutdownStateZ_clone_ptr(int64_t arg) {
+       LDKCOption_ChannelShutdownStateZ* arg_conv = (LDKCOption_ChannelShutdownStateZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_ChannelShutdownStateZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_ChannelShutdownStateZ_clone(int64_t orig) {
+       LDKCOption_ChannelShutdownStateZ* orig_conv = (LDKCOption_ChannelShutdownStateZ*)untag_ptr(orig);
+       LDKCOption_ChannelShutdownStateZ *ret_copy = MALLOC(sizeof(LDKCOption_ChannelShutdownStateZ), "LDKCOption_ChannelShutdownStateZ");
+       *ret_copy = COption_ChannelShutdownStateZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_ok(int8_tArray o) {
+       LDKThirtyTwoBytes o_ref;
+       CHECK(o->arr_len == 32);
+       memcpy(o_ref.data, o->elems, 32); FREE(o);
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesAPIErrorZ), "LDKCResult_ThirtyTwoBytesAPIErrorZ");
+       *ret_conv = CResult_ThirtyTwoBytesAPIErrorZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKAPIError e_conv = *(LDKAPIError*)(e_ptr);
+       e_conv = APIError_clone((LDKAPIError*)untag_ptr(e));
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesAPIErrorZ), "LDKCResult_ThirtyTwoBytesAPIErrorZ");
+       *ret_conv = CResult_ThirtyTwoBytesAPIErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_is_ok(int64_t o) {
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* o_conv = (LDKCResult_ThirtyTwoBytesAPIErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ThirtyTwoBytesAPIErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ThirtyTwoBytesAPIErrorZ _res_conv = *(LDKCResult_ThirtyTwoBytesAPIErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ThirtyTwoBytesAPIErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ThirtyTwoBytesAPIErrorZ_clone_ptr(LDKCResult_ThirtyTwoBytesAPIErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesAPIErrorZ), "LDKCResult_ThirtyTwoBytesAPIErrorZ");
+       *ret_conv = CResult_ThirtyTwoBytesAPIErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* arg_conv = (LDKCResult_ThirtyTwoBytesAPIErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ThirtyTwoBytesAPIErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_clone(int64_t orig) {
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* orig_conv = (LDKCResult_ThirtyTwoBytesAPIErrorZ*)untag_ptr(orig);
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesAPIErrorZ), "LDKCResult_ThirtyTwoBytesAPIErrorZ");
+       *ret_conv = CResult_ThirtyTwoBytesAPIErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_RecentPaymentDetailsZ_free(int64_tArray _res) {
+       LDKCVec_RecentPaymentDetailsZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKRecentPaymentDetails), "LDKCVec_RecentPaymentDetailsZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t w = 0; w < _res_constr.datalen; w++) {
+               int64_t _res_conv_22 = _res_vals[w];
+               void* _res_conv_22_ptr = untag_ptr(_res_conv_22);
+               CHECK_ACCESS(_res_conv_22_ptr);
+               LDKRecentPaymentDetails _res_conv_22_conv = *(LDKRecentPaymentDetails*)(_res_conv_22_ptr);
+               FREE(untag_ptr(_res_conv_22));
+               _res_constr.data[w] = _res_conv_22_conv;
+       }
+       FREE(_res);
+       CVec_RecentPaymentDetailsZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_NonePaymentSendFailureZ_ok() {
+       LDKCResult_NonePaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentSendFailureZ), "LDKCResult_NonePaymentSendFailureZ");
+       *ret_conv = CResult_NonePaymentSendFailureZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NonePaymentSendFailureZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKPaymentSendFailure e_conv = *(LDKPaymentSendFailure*)(e_ptr);
+       e_conv = PaymentSendFailure_clone((LDKPaymentSendFailure*)untag_ptr(e));
+       LDKCResult_NonePaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentSendFailureZ), "LDKCResult_NonePaymentSendFailureZ");
+       *ret_conv = CResult_NonePaymentSendFailureZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NonePaymentSendFailureZ_is_ok(int64_t o) {
+       LDKCResult_NonePaymentSendFailureZ* o_conv = (LDKCResult_NonePaymentSendFailureZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NonePaymentSendFailureZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NonePaymentSendFailureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NonePaymentSendFailureZ _res_conv = *(LDKCResult_NonePaymentSendFailureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NonePaymentSendFailureZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NonePaymentSendFailureZ_clone_ptr(LDKCResult_NonePaymentSendFailureZ *NONNULL_PTR arg) {
+       LDKCResult_NonePaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentSendFailureZ), "LDKCResult_NonePaymentSendFailureZ");
+       *ret_conv = CResult_NonePaymentSendFailureZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NonePaymentSendFailureZ_clone_ptr(int64_t arg) {
+       LDKCResult_NonePaymentSendFailureZ* arg_conv = (LDKCResult_NonePaymentSendFailureZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NonePaymentSendFailureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NonePaymentSendFailureZ_clone(int64_t orig) {
+       LDKCResult_NonePaymentSendFailureZ* orig_conv = (LDKCResult_NonePaymentSendFailureZ*)untag_ptr(orig);
+       LDKCResult_NonePaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentSendFailureZ), "LDKCResult_NonePaymentSendFailureZ");
+       *ret_conv = CResult_NonePaymentSendFailureZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneRetryableSendFailureZ_ok() {
+       LDKCResult_NoneRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneRetryableSendFailureZ), "LDKCResult_NoneRetryableSendFailureZ");
+       *ret_conv = CResult_NoneRetryableSendFailureZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneRetryableSendFailureZ_err(int32_t e) {
+       LDKRetryableSendFailure e_conv = LDKRetryableSendFailure_from_cs(e);
+       LDKCResult_NoneRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneRetryableSendFailureZ), "LDKCResult_NoneRetryableSendFailureZ");
+       *ret_conv = CResult_NoneRetryableSendFailureZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NoneRetryableSendFailureZ_is_ok(int64_t o) {
+       LDKCResult_NoneRetryableSendFailureZ* o_conv = (LDKCResult_NoneRetryableSendFailureZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NoneRetryableSendFailureZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NoneRetryableSendFailureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NoneRetryableSendFailureZ _res_conv = *(LDKCResult_NoneRetryableSendFailureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NoneRetryableSendFailureZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NoneRetryableSendFailureZ_clone_ptr(LDKCResult_NoneRetryableSendFailureZ *NONNULL_PTR arg) {
+       LDKCResult_NoneRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneRetryableSendFailureZ), "LDKCResult_NoneRetryableSendFailureZ");
+       *ret_conv = CResult_NoneRetryableSendFailureZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NoneRetryableSendFailureZ_clone_ptr(int64_t arg) {
+       LDKCResult_NoneRetryableSendFailureZ* arg_conv = (LDKCResult_NoneRetryableSendFailureZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NoneRetryableSendFailureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NoneRetryableSendFailureZ_clone(int64_t orig) {
+       LDKCResult_NoneRetryableSendFailureZ* orig_conv = (LDKCResult_NoneRetryableSendFailureZ*)untag_ptr(orig);
+       LDKCResult_NoneRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneRetryableSendFailureZ), "LDKCResult_NoneRetryableSendFailureZ");
+       *ret_conv = CResult_NoneRetryableSendFailureZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_ok(int8_tArray o) {
+       LDKThirtyTwoBytes o_ref;
+       CHECK(o->arr_len == 32);
+       memcpy(o_ref.data, o->elems, 32); FREE(o);
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ), "LDKCResult_ThirtyTwoBytesPaymentSendFailureZ");
+       *ret_conv = CResult_ThirtyTwoBytesPaymentSendFailureZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKPaymentSendFailure e_conv = *(LDKPaymentSendFailure*)(e_ptr);
+       e_conv = PaymentSendFailure_clone((LDKPaymentSendFailure*)untag_ptr(e));
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ), "LDKCResult_ThirtyTwoBytesPaymentSendFailureZ");
+       *ret_conv = CResult_ThirtyTwoBytesPaymentSendFailureZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_is_ok(int64_t o) {
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* o_conv = (LDKCResult_ThirtyTwoBytesPaymentSendFailureZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ThirtyTwoBytesPaymentSendFailureZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ _res_conv = *(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ThirtyTwoBytesPaymentSendFailureZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ThirtyTwoBytesPaymentSendFailureZ_clone_ptr(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ *NONNULL_PTR arg) {
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ), "LDKCResult_ThirtyTwoBytesPaymentSendFailureZ");
+       *ret_conv = CResult_ThirtyTwoBytesPaymentSendFailureZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_clone_ptr(int64_t arg) {
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* arg_conv = (LDKCResult_ThirtyTwoBytesPaymentSendFailureZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ThirtyTwoBytesPaymentSendFailureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_clone(int64_t orig) {
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* orig_conv = (LDKCResult_ThirtyTwoBytesPaymentSendFailureZ*)untag_ptr(orig);
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ), "LDKCResult_ThirtyTwoBytesPaymentSendFailureZ");
+       *ret_conv = CResult_ThirtyTwoBytesPaymentSendFailureZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_ok(int8_tArray o) {
+       LDKThirtyTwoBytes o_ref;
+       CHECK(o->arr_len == 32);
+       memcpy(o_ref.data, o->elems, 32); FREE(o);
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ), "LDKCResult_ThirtyTwoBytesRetryableSendFailureZ");
+       *ret_conv = CResult_ThirtyTwoBytesRetryableSendFailureZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_err(int32_t e) {
+       LDKRetryableSendFailure e_conv = LDKRetryableSendFailure_from_cs(e);
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ), "LDKCResult_ThirtyTwoBytesRetryableSendFailureZ");
+       *ret_conv = CResult_ThirtyTwoBytesRetryableSendFailureZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_is_ok(int64_t o) {
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* o_conv = (LDKCResult_ThirtyTwoBytesRetryableSendFailureZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ThirtyTwoBytesRetryableSendFailureZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ _res_conv = *(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ThirtyTwoBytesRetryableSendFailureZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ThirtyTwoBytesRetryableSendFailureZ_clone_ptr(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ *NONNULL_PTR arg) {
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ), "LDKCResult_ThirtyTwoBytesRetryableSendFailureZ");
+       *ret_conv = CResult_ThirtyTwoBytesRetryableSendFailureZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_clone_ptr(int64_t arg) {
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* arg_conv = (LDKCResult_ThirtyTwoBytesRetryableSendFailureZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ThirtyTwoBytesRetryableSendFailureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_clone(int64_t orig) {
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* orig_conv = (LDKCResult_ThirtyTwoBytesRetryableSendFailureZ*)untag_ptr(orig);
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ), "LDKCResult_ThirtyTwoBytesRetryableSendFailureZ");
+       *ret_conv = CResult_ThirtyTwoBytesRetryableSendFailureZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ *NONNULL_PTR arg) {
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ), "LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* arg_conv = (LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone(int64_t orig) {
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* orig_conv = (LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)untag_ptr(orig);
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ), "LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_new(int8_tArray a, int8_tArray b) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKThirtyTwoBytes b_ref;
+       CHECK(b->arr_len == 32);
+       memcpy(b_ref.data, b->elems, 32); FREE(b);
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ), "LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_new(a_ref, b_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ _res_conv = *(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ o_conv = *(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)(o_ptr);
+       o_conv = C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone((LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)untag_ptr(o));
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKPaymentSendFailure e_conv = *(LDKPaymentSendFailure*)(e_ptr);
+       e_conv = PaymentSendFailure_clone((LDKPaymentSendFailure*)untag_ptr(e));
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_is_ok(int64_t o) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* o_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ _res_conv = *(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone_ptr(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ *NONNULL_PTR arg) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone_ptr(int64_t arg) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* arg_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone(int64_t orig) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* orig_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ*)untag_ptr(orig);
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ), "LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ 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_ThirtyTwoBytesThirtyTwoBytesZ _res_conv_40_conv = *(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)(_res_conv_40_ptr);
+               FREE(untag_ptr(_res_conv_40));
+               _res_constr.data[o] = _res_conv_40_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_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_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ");
+       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_ok(o_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKProbeSendFailure e_conv = *(LDKProbeSendFailure*)(e_ptr);
+       e_conv = ProbeSendFailure_clone((LDKProbeSendFailure*)untag_ptr(e));
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ");
+       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_is_ok(int64_t o) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* o_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ _res_conv = *(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone_ptr(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ");
+       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* arg_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone(int64_t orig) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* orig_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ*)untag_ptr(orig);
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ");
+       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C2Tuple_ThirtyTwoBytesPublicKeyZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ *NONNULL_PTR arg) {
+       LDKC2Tuple_ThirtyTwoBytesPublicKeyZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ), "LDKC2Tuple_ThirtyTwoBytesPublicKeyZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesPublicKeyZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_ThirtyTwoBytesPublicKeyZ* arg_conv = (LDKC2Tuple_ThirtyTwoBytesPublicKeyZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_ThirtyTwoBytesPublicKeyZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_clone(int64_t orig) {
+       LDKC2Tuple_ThirtyTwoBytesPublicKeyZ* orig_conv = (LDKC2Tuple_ThirtyTwoBytesPublicKeyZ*)untag_ptr(orig);
+       LDKC2Tuple_ThirtyTwoBytesPublicKeyZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ), "LDKC2Tuple_ThirtyTwoBytesPublicKeyZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesPublicKeyZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_new(int8_tArray a, int8_tArray b) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKPublicKey b_ref;
+       CHECK(b->arr_len == 33);
+       memcpy(b_ref.compressed_form, b->elems, 33); FREE(b);
+       LDKC2Tuple_ThirtyTwoBytesPublicKeyZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ), "LDKC2Tuple_ThirtyTwoBytesPublicKeyZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesPublicKeyZ_new(a_ref, b_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_ThirtyTwoBytesPublicKeyZ _res_conv = *(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_ThirtyTwoBytesPublicKeyZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ), "LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t j = 0; j < _res_constr.datalen; j++) {
+               int64_t _res_conv_35 = _res_vals[j];
+               void* _res_conv_35_ptr = untag_ptr(_res_conv_35);
+               CHECK_ACCESS(_res_conv_35_ptr);
+               LDKC2Tuple_ThirtyTwoBytesPublicKeyZ _res_conv_35_conv = *(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ*)(_res_conv_35_ptr);
+               FREE(untag_ptr(_res_conv_35));
+               _res_constr.data[j] = _res_conv_35_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_StrZ_some(jstring o) {
+       LDKStr o_conv = str_ref_to_owned_c(o);
+       LDKCOption_StrZ *ret_copy = MALLOC(sizeof(LDKCOption_StrZ), "LDKCOption_StrZ");
+       *ret_copy = COption_StrZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_StrZ_none() {
+       LDKCOption_StrZ *ret_copy = MALLOC(sizeof(LDKCOption_StrZ), "LDKCOption_StrZ");
+       *ret_copy = COption_StrZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_StrZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_StrZ _res_conv = *(LDKCOption_StrZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_StrZ_free(_res_conv);
+}
+
+static inline uint64_t COption_StrZ_clone_ptr(LDKCOption_StrZ *NONNULL_PTR arg) {
+       LDKCOption_StrZ *ret_copy = MALLOC(sizeof(LDKCOption_StrZ), "LDKCOption_StrZ");
+       *ret_copy = COption_StrZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_StrZ_clone_ptr(int64_t arg) {
+       LDKCOption_StrZ* arg_conv = (LDKCOption_StrZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_StrZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_StrZ_clone(int64_t orig) {
+       LDKCOption_StrZ* orig_conv = (LDKCOption_StrZ*)untag_ptr(orig);
+       LDKCOption_StrZ *ret_copy = MALLOC(sizeof(LDKCOption_StrZ), "LDKCOption_StrZ");
+       *ret_copy = COption_StrZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_NoneBolt12SemanticErrorZ_ok() {
+       LDKCResult_NoneBolt12SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt12SemanticErrorZ), "LDKCResult_NoneBolt12SemanticErrorZ");
+       *ret_conv = CResult_NoneBolt12SemanticErrorZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneBolt12SemanticErrorZ_err(int32_t e) {
+       LDKBolt12SemanticError e_conv = LDKBolt12SemanticError_from_cs(e);
+       LDKCResult_NoneBolt12SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt12SemanticErrorZ), "LDKCResult_NoneBolt12SemanticErrorZ");
+       *ret_conv = CResult_NoneBolt12SemanticErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NoneBolt12SemanticErrorZ_is_ok(int64_t o) {
+       LDKCResult_NoneBolt12SemanticErrorZ* o_conv = (LDKCResult_NoneBolt12SemanticErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NoneBolt12SemanticErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NoneBolt12SemanticErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NoneBolt12SemanticErrorZ _res_conv = *(LDKCResult_NoneBolt12SemanticErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NoneBolt12SemanticErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NoneBolt12SemanticErrorZ_clone_ptr(LDKCResult_NoneBolt12SemanticErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NoneBolt12SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt12SemanticErrorZ), "LDKCResult_NoneBolt12SemanticErrorZ");
+       *ret_conv = CResult_NoneBolt12SemanticErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NoneBolt12SemanticErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NoneBolt12SemanticErrorZ* arg_conv = (LDKCResult_NoneBolt12SemanticErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NoneBolt12SemanticErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NoneBolt12SemanticErrorZ_clone(int64_t orig) {
+       LDKCResult_NoneBolt12SemanticErrorZ* orig_conv = (LDKCResult_NoneBolt12SemanticErrorZ*)untag_ptr(orig);
+       LDKCResult_NoneBolt12SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt12SemanticErrorZ), "LDKCResult_NoneBolt12SemanticErrorZ");
+       *ret_conv = CResult_NoneBolt12SemanticErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ o_conv = *(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)(o_ptr);
+       o_conv = C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone((LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)untag_ptr(o));
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_err() {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_is_ok(int64_t o) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* o_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ _res_conv = *(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone_ptr(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* arg_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone(int64_t orig) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* orig_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ*)untag_ptr(orig);
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_OffersMessageZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKOffersMessage o_conv = *(LDKOffersMessage*)(o_ptr);
+       o_conv = OffersMessage_clone((LDKOffersMessage*)untag_ptr(o));
+       LDKCOption_OffersMessageZ *ret_copy = MALLOC(sizeof(LDKCOption_OffersMessageZ), "LDKCOption_OffersMessageZ");
+       *ret_copy = COption_OffersMessageZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_OffersMessageZ_none() {
+       LDKCOption_OffersMessageZ *ret_copy = MALLOC(sizeof(LDKCOption_OffersMessageZ), "LDKCOption_OffersMessageZ");
+       *ret_copy = COption_OffersMessageZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_OffersMessageZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_OffersMessageZ _res_conv = *(LDKCOption_OffersMessageZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_OffersMessageZ_free(_res_conv);
+}
+
+static inline uint64_t COption_OffersMessageZ_clone_ptr(LDKCOption_OffersMessageZ *NONNULL_PTR arg) {
+       LDKCOption_OffersMessageZ *ret_copy = MALLOC(sizeof(LDKCOption_OffersMessageZ), "LDKCOption_OffersMessageZ");
+       *ret_copy = COption_OffersMessageZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_OffersMessageZ_clone_ptr(int64_t arg) {
+       LDKCOption_OffersMessageZ* arg_conv = (LDKCOption_OffersMessageZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_OffersMessageZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_OffersMessageZ_clone(int64_t orig) {
+       LDKCOption_OffersMessageZ* orig_conv = (LDKCOption_OffersMessageZ*)untag_ptr(orig);
+       LDKCOption_OffersMessageZ *ret_copy = MALLOC(sizeof(LDKCOption_OffersMessageZ), "LDKCOption_OffersMessageZ");
+       *ret_copy = COption_OffersMessageZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline uint64_t C3Tuple_OffersMessageDestinationBlindedPathZ_clone_ptr(LDKC3Tuple_OffersMessageDestinationBlindedPathZ *NONNULL_PTR arg) {
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OffersMessageDestinationBlindedPathZ), "LDKC3Tuple_OffersMessageDestinationBlindedPathZ");
+       *ret_conv = C3Tuple_OffersMessageDestinationBlindedPathZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_clone_ptr(int64_t arg) {
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ* arg_conv = (LDKC3Tuple_OffersMessageDestinationBlindedPathZ*)untag_ptr(arg);
+       int64_t ret_conv = C3Tuple_OffersMessageDestinationBlindedPathZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_clone(int64_t orig) {
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ* orig_conv = (LDKC3Tuple_OffersMessageDestinationBlindedPathZ*)untag_ptr(orig);
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OffersMessageDestinationBlindedPathZ), "LDKC3Tuple_OffersMessageDestinationBlindedPathZ");
+       *ret_conv = C3Tuple_OffersMessageDestinationBlindedPathZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_new(int64_t a, int64_t b, int64_t c) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKOffersMessage a_conv = *(LDKOffersMessage*)(a_ptr);
+       a_conv = OffersMessage_clone((LDKOffersMessage*)untag_ptr(a));
+       void* b_ptr = untag_ptr(b);
+       CHECK_ACCESS(b_ptr);
+       LDKDestination b_conv = *(LDKDestination*)(b_ptr);
+       b_conv = Destination_clone((LDKDestination*)untag_ptr(b));
+       LDKBlindedPath 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 = BlindedPath_clone(&c_conv);
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OffersMessageDestinationBlindedPathZ), "LDKC3Tuple_OffersMessageDestinationBlindedPathZ");
+       *ret_conv = C3Tuple_OffersMessageDestinationBlindedPathZ_new(a_conv, b_conv, c_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC3Tuple_OffersMessageDestinationBlindedPathZ _res_conv = *(LDKC3Tuple_OffersMessageDestinationBlindedPathZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C3Tuple_OffersMessageDestinationBlindedPathZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C3Tuple_OffersMessageDestinationBlindedPathZZ_free(int64_tArray _res) {
+       LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC3Tuple_OffersMessageDestinationBlindedPathZ), "LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ 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);
+               LDKC3Tuple_OffersMessageDestinationBlindedPathZ _res_conv_49_conv = *(LDKC3Tuple_OffersMessageDestinationBlindedPathZ*)(_res_conv_49_ptr);
+               FREE(untag_ptr(_res_conv_49));
+               _res_constr.data[x] = _res_conv_49_conv;
+       }
+       FREE(_res);
+       CVec_C3Tuple_OffersMessageDestinationBlindedPathZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_ok(int64_t o) {
+       LDKCounterpartyForwardingInfo 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 = CounterpartyForwardingInfo_clone(&o_conv);
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ), "LDKCResult_CounterpartyForwardingInfoDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyForwardingInfoDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_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_CounterpartyForwardingInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ), "LDKCResult_CounterpartyForwardingInfoDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyForwardingInfoDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* o_conv = (LDKCResult_CounterpartyForwardingInfoDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CounterpartyForwardingInfoDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ _res_conv = *(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CounterpartyForwardingInfoDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CounterpartyForwardingInfoDecodeErrorZ_clone_ptr(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ), "LDKCResult_CounterpartyForwardingInfoDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyForwardingInfoDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* arg_conv = (LDKCResult_CounterpartyForwardingInfoDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CounterpartyForwardingInfoDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* orig_conv = (LDKCResult_CounterpartyForwardingInfoDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ), "LDKCResult_CounterpartyForwardingInfoDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyForwardingInfoDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelCounterpartyDecodeErrorZ_ok(int64_t o) {
+       LDKChannelCounterparty 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 = ChannelCounterparty_clone(&o_conv);
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelCounterpartyDecodeErrorZ), "LDKCResult_ChannelCounterpartyDecodeErrorZ");
+       *ret_conv = CResult_ChannelCounterpartyDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelCounterpartyDecodeErrorZ_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_ChannelCounterpartyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelCounterpartyDecodeErrorZ), "LDKCResult_ChannelCounterpartyDecodeErrorZ");
+       *ret_conv = CResult_ChannelCounterpartyDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelCounterpartyDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* o_conv = (LDKCResult_ChannelCounterpartyDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelCounterpartyDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelCounterpartyDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelCounterpartyDecodeErrorZ _res_conv = *(LDKCResult_ChannelCounterpartyDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelCounterpartyDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelCounterpartyDecodeErrorZ_clone_ptr(LDKCResult_ChannelCounterpartyDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelCounterpartyDecodeErrorZ), "LDKCResult_ChannelCounterpartyDecodeErrorZ");
+       *ret_conv = CResult_ChannelCounterpartyDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelCounterpartyDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* arg_conv = (LDKCResult_ChannelCounterpartyDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelCounterpartyDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelCounterpartyDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* orig_conv = (LDKCResult_ChannelCounterpartyDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelCounterpartyDecodeErrorZ), "LDKCResult_ChannelCounterpartyDecodeErrorZ");
+       *ret_conv = CResult_ChannelCounterpartyDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelDetailsDecodeErrorZ_ok(int64_t o) {
+       LDKChannelDetails 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 = ChannelDetails_clone(&o_conv);
+       LDKCResult_ChannelDetailsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDetailsDecodeErrorZ), "LDKCResult_ChannelDetailsDecodeErrorZ");
+       *ret_conv = CResult_ChannelDetailsDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelDetailsDecodeErrorZ_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_ChannelDetailsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDetailsDecodeErrorZ), "LDKCResult_ChannelDetailsDecodeErrorZ");
+       *ret_conv = CResult_ChannelDetailsDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelDetailsDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelDetailsDecodeErrorZ* o_conv = (LDKCResult_ChannelDetailsDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelDetailsDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelDetailsDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelDetailsDecodeErrorZ _res_conv = *(LDKCResult_ChannelDetailsDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelDetailsDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelDetailsDecodeErrorZ_clone_ptr(LDKCResult_ChannelDetailsDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelDetailsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDetailsDecodeErrorZ), "LDKCResult_ChannelDetailsDecodeErrorZ");
+       *ret_conv = CResult_ChannelDetailsDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelDetailsDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelDetailsDecodeErrorZ* arg_conv = (LDKCResult_ChannelDetailsDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelDetailsDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelDetailsDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelDetailsDecodeErrorZ* orig_conv = (LDKCResult_ChannelDetailsDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelDetailsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDetailsDecodeErrorZ), "LDKCResult_ChannelDetailsDecodeErrorZ");
+       *ret_conv = CResult_ChannelDetailsDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_ok(int64_t o) {
+       LDKPhantomRouteHints 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 = PhantomRouteHints_clone(&o_conv);
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PhantomRouteHintsDecodeErrorZ), "LDKCResult_PhantomRouteHintsDecodeErrorZ");
+       *ret_conv = CResult_PhantomRouteHintsDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_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_PhantomRouteHintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PhantomRouteHintsDecodeErrorZ), "LDKCResult_PhantomRouteHintsDecodeErrorZ");
+       *ret_conv = CResult_PhantomRouteHintsDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* o_conv = (LDKCResult_PhantomRouteHintsDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PhantomRouteHintsDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PhantomRouteHintsDecodeErrorZ _res_conv = *(LDKCResult_PhantomRouteHintsDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PhantomRouteHintsDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PhantomRouteHintsDecodeErrorZ_clone_ptr(LDKCResult_PhantomRouteHintsDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PhantomRouteHintsDecodeErrorZ), "LDKCResult_PhantomRouteHintsDecodeErrorZ");
+       *ret_conv = CResult_PhantomRouteHintsDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* arg_conv = (LDKCResult_PhantomRouteHintsDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PhantomRouteHintsDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* orig_conv = (LDKCResult_PhantomRouteHintsDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PhantomRouteHintsDecodeErrorZ), "LDKCResult_PhantomRouteHintsDecodeErrorZ");
+       *ret_conv = CResult_PhantomRouteHintsDecodeErrorZ_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");
+       *ret_conv = CResult_ChannelShutdownStateDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_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_ChannelShutdownStateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelShutdownStateDecodeErrorZ), "LDKCResult_ChannelShutdownStateDecodeErrorZ");
+       *ret_conv = CResult_ChannelShutdownStateDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelShutdownStateDecodeErrorZ* o_conv = (LDKCResult_ChannelShutdownStateDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelShutdownStateDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelShutdownStateDecodeErrorZ _res_conv = *(LDKCResult_ChannelShutdownStateDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelShutdownStateDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelShutdownStateDecodeErrorZ_clone_ptr(LDKCResult_ChannelShutdownStateDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelShutdownStateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelShutdownStateDecodeErrorZ), "LDKCResult_ChannelShutdownStateDecodeErrorZ");
+       *ret_conv = CResult_ChannelShutdownStateDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelShutdownStateDecodeErrorZ* arg_conv = (LDKCResult_ChannelShutdownStateDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelShutdownStateDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelShutdownStateDecodeErrorZ* orig_conv = (LDKCResult_ChannelShutdownStateDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelShutdownStateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelShutdownStateDecodeErrorZ), "LDKCResult_ChannelShutdownStateDecodeErrorZ");
+       *ret_conv = CResult_ChannelShutdownStateDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_ChannelMonitorZ_free(int64_tArray _res) {
+       LDKCVec_ChannelMonitorZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKChannelMonitor), "LDKCVec_ChannelMonitorZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t q = 0; q < _res_constr.datalen; q++) {
+               int64_t _res_conv_16 = _res_vals[q];
+               LDKChannelMonitor _res_conv_16_conv;
+               _res_conv_16_conv.inner = untag_ptr(_res_conv_16);
+               _res_conv_16_conv.is_owned = ptr_is_owned(_res_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_16_conv);
+               _res_constr.data[q] = _res_conv_16_conv;
+       }
+       FREE(_res);
+       CVec_ChannelMonitorZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_new(int8_tArray a, int64_t b) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKChannelManager b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       // WARNING: we need a move here but no clone is available for LDKChannelManager
+       
+       LDKC2Tuple_ThirtyTwoBytesChannelManagerZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesChannelManagerZ), "LDKC2Tuple_ThirtyTwoBytesChannelManagerZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesChannelManagerZ_new(a_ref, b_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_ThirtyTwoBytesChannelManagerZ _res_conv = *(LDKC2Tuple_ThirtyTwoBytesChannelManagerZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_ThirtyTwoBytesChannelManagerZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_ThirtyTwoBytesChannelManagerZ o_conv = *(LDKC2Tuple_ThirtyTwoBytesChannelManagerZ*)(o_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKC2Tuple_ThirtyTwoBytesChannelManagerZ
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_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_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ* o_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ _res_conv = *(LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKMaxDustHTLCExposure o_conv = *(LDKMaxDustHTLCExposure*)(o_ptr);
+       o_conv = MaxDustHTLCExposure_clone((LDKMaxDustHTLCExposure*)untag_ptr(o));
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_MaxDustHTLCExposureDecodeErrorZ), "LDKCResult_MaxDustHTLCExposureDecodeErrorZ");
+       *ret_conv = CResult_MaxDustHTLCExposureDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_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_MaxDustHTLCExposureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_MaxDustHTLCExposureDecodeErrorZ), "LDKCResult_MaxDustHTLCExposureDecodeErrorZ");
+       *ret_conv = CResult_MaxDustHTLCExposureDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* o_conv = (LDKCResult_MaxDustHTLCExposureDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_MaxDustHTLCExposureDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ _res_conv = *(LDKCResult_MaxDustHTLCExposureDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_MaxDustHTLCExposureDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_MaxDustHTLCExposureDecodeErrorZ_clone_ptr(LDKCResult_MaxDustHTLCExposureDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_MaxDustHTLCExposureDecodeErrorZ), "LDKCResult_MaxDustHTLCExposureDecodeErrorZ");
+       *ret_conv = CResult_MaxDustHTLCExposureDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* arg_conv = (LDKCResult_MaxDustHTLCExposureDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_MaxDustHTLCExposureDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* orig_conv = (LDKCResult_MaxDustHTLCExposureDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_MaxDustHTLCExposureDecodeErrorZ), "LDKCResult_MaxDustHTLCExposureDecodeErrorZ");
+       *ret_conv = CResult_MaxDustHTLCExposureDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelConfigDecodeErrorZ_ok(int64_t o) {
+       LDKChannelConfig 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 = ChannelConfig_clone(&o_conv);
+       LDKCResult_ChannelConfigDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelConfigDecodeErrorZ), "LDKCResult_ChannelConfigDecodeErrorZ");
+       *ret_conv = CResult_ChannelConfigDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelConfigDecodeErrorZ_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_ChannelConfigDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelConfigDecodeErrorZ), "LDKCResult_ChannelConfigDecodeErrorZ");
+       *ret_conv = CResult_ChannelConfigDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelConfigDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelConfigDecodeErrorZ* o_conv = (LDKCResult_ChannelConfigDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelConfigDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelConfigDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelConfigDecodeErrorZ _res_conv = *(LDKCResult_ChannelConfigDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelConfigDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelConfigDecodeErrorZ_clone_ptr(LDKCResult_ChannelConfigDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelConfigDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelConfigDecodeErrorZ), "LDKCResult_ChannelConfigDecodeErrorZ");
+       *ret_conv = CResult_ChannelConfigDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelConfigDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelConfigDecodeErrorZ* arg_conv = (LDKCResult_ChannelConfigDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelConfigDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelConfigDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelConfigDecodeErrorZ* orig_conv = (LDKCResult_ChannelConfigDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelConfigDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelConfigDecodeErrorZ), "LDKCResult_ChannelConfigDecodeErrorZ");
+       *ret_conv = CResult_ChannelConfigDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_MaxDustHTLCExposureZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKMaxDustHTLCExposure o_conv = *(LDKMaxDustHTLCExposure*)(o_ptr);
+       o_conv = MaxDustHTLCExposure_clone((LDKMaxDustHTLCExposure*)untag_ptr(o));
+       LDKCOption_MaxDustHTLCExposureZ *ret_copy = MALLOC(sizeof(LDKCOption_MaxDustHTLCExposureZ), "LDKCOption_MaxDustHTLCExposureZ");
+       *ret_copy = COption_MaxDustHTLCExposureZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_MaxDustHTLCExposureZ_none() {
+       LDKCOption_MaxDustHTLCExposureZ *ret_copy = MALLOC(sizeof(LDKCOption_MaxDustHTLCExposureZ), "LDKCOption_MaxDustHTLCExposureZ");
+       *ret_copy = COption_MaxDustHTLCExposureZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_MaxDustHTLCExposureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_MaxDustHTLCExposureZ _res_conv = *(LDKCOption_MaxDustHTLCExposureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_MaxDustHTLCExposureZ_free(_res_conv);
+}
+
+static inline uint64_t COption_MaxDustHTLCExposureZ_clone_ptr(LDKCOption_MaxDustHTLCExposureZ *NONNULL_PTR arg) {
+       LDKCOption_MaxDustHTLCExposureZ *ret_copy = MALLOC(sizeof(LDKCOption_MaxDustHTLCExposureZ), "LDKCOption_MaxDustHTLCExposureZ");
+       *ret_copy = COption_MaxDustHTLCExposureZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_MaxDustHTLCExposureZ_clone_ptr(int64_t arg) {
+       LDKCOption_MaxDustHTLCExposureZ* arg_conv = (LDKCOption_MaxDustHTLCExposureZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_MaxDustHTLCExposureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_MaxDustHTLCExposureZ_clone(int64_t orig) {
+       LDKCOption_MaxDustHTLCExposureZ* orig_conv = (LDKCOption_MaxDustHTLCExposureZ*)untag_ptr(orig);
+       LDKCOption_MaxDustHTLCExposureZ *ret_copy = MALLOC(sizeof(LDKCOption_MaxDustHTLCExposureZ), "LDKCOption_MaxDustHTLCExposureZ");
+       *ret_copy = COption_MaxDustHTLCExposureZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_APIErrorZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKAPIError o_conv = *(LDKAPIError*)(o_ptr);
+       o_conv = APIError_clone((LDKAPIError*)untag_ptr(o));
+       LDKCOption_APIErrorZ *ret_copy = MALLOC(sizeof(LDKCOption_APIErrorZ), "LDKCOption_APIErrorZ");
+       *ret_copy = COption_APIErrorZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_APIErrorZ_none() {
+       LDKCOption_APIErrorZ *ret_copy = MALLOC(sizeof(LDKCOption_APIErrorZ), "LDKCOption_APIErrorZ");
+       *ret_copy = COption_APIErrorZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_APIErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_APIErrorZ _res_conv = *(LDKCOption_APIErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_APIErrorZ_free(_res_conv);
+}
+
+static inline uint64_t COption_APIErrorZ_clone_ptr(LDKCOption_APIErrorZ *NONNULL_PTR arg) {
+       LDKCOption_APIErrorZ *ret_copy = MALLOC(sizeof(LDKCOption_APIErrorZ), "LDKCOption_APIErrorZ");
+       *ret_copy = COption_APIErrorZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_APIErrorZ_clone_ptr(int64_t arg) {
+       LDKCOption_APIErrorZ* arg_conv = (LDKCOption_APIErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_APIErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_APIErrorZ_clone(int64_t orig) {
+       LDKCOption_APIErrorZ* orig_conv = (LDKCOption_APIErrorZ*)untag_ptr(orig);
+       LDKCOption_APIErrorZ *ret_copy = MALLOC(sizeof(LDKCOption_APIErrorZ), "LDKCOption_APIErrorZ");
+       *ret_copy = COption_APIErrorZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_APIErrorZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_APIErrorZ o_conv = *(LDKCOption_APIErrorZ*)(o_ptr);
+       o_conv = COption_APIErrorZ_clone((LDKCOption_APIErrorZ*)untag_ptr(o));
+       LDKCResult_COption_APIErrorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_APIErrorZDecodeErrorZ), "LDKCResult_COption_APIErrorZDecodeErrorZ");
+       *ret_conv = CResult_COption_APIErrorZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_APIErrorZDecodeErrorZ_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_COption_APIErrorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_APIErrorZDecodeErrorZ), "LDKCResult_COption_APIErrorZDecodeErrorZ");
+       *ret_conv = CResult_COption_APIErrorZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_APIErrorZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_APIErrorZDecodeErrorZ* o_conv = (LDKCResult_COption_APIErrorZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_APIErrorZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_APIErrorZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_APIErrorZDecodeErrorZ _res_conv = *(LDKCResult_COption_APIErrorZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_APIErrorZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_APIErrorZDecodeErrorZ_clone_ptr(LDKCResult_COption_APIErrorZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_APIErrorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_APIErrorZDecodeErrorZ), "LDKCResult_COption_APIErrorZDecodeErrorZ");
+       *ret_conv = CResult_COption_APIErrorZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_APIErrorZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_APIErrorZDecodeErrorZ* arg_conv = (LDKCResult_COption_APIErrorZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_APIErrorZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_APIErrorZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_APIErrorZDecodeErrorZ* orig_conv = (LDKCResult_COption_APIErrorZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_APIErrorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_APIErrorZDecodeErrorZ), "LDKCResult_COption_APIErrorZDecodeErrorZ");
+       *ret_conv = CResult_COption_APIErrorZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateDecodeErrorZ_ok(int64_t o) {
+       LDKChannelMonitorUpdate 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 = ChannelMonitorUpdate_clone(&o_conv);
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateDecodeErrorZ), "LDKCResult_ChannelMonitorUpdateDecodeErrorZ");
+       *ret_conv = CResult_ChannelMonitorUpdateDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateDecodeErrorZ_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_ChannelMonitorUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateDecodeErrorZ), "LDKCResult_ChannelMonitorUpdateDecodeErrorZ");
+       *ret_conv = CResult_ChannelMonitorUpdateDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelMonitorUpdateDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* o_conv = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelMonitorUpdateDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelMonitorUpdateDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ _res_conv = *(LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelMonitorUpdateDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelMonitorUpdateDecodeErrorZ_clone_ptr(LDKCResult_ChannelMonitorUpdateDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateDecodeErrorZ), "LDKCResult_ChannelMonitorUpdateDecodeErrorZ");
+       *ret_conv = CResult_ChannelMonitorUpdateDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* arg_conv = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelMonitorUpdateDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelMonitorUpdateDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* orig_conv = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateDecodeErrorZ), "LDKCResult_ChannelMonitorUpdateDecodeErrorZ");
+       *ret_conv = CResult_ChannelMonitorUpdateDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_MonitorEventZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKMonitorEvent o_conv = *(LDKMonitorEvent*)(o_ptr);
+       o_conv = MonitorEvent_clone((LDKMonitorEvent*)untag_ptr(o));
+       LDKCOption_MonitorEventZ *ret_copy = MALLOC(sizeof(LDKCOption_MonitorEventZ), "LDKCOption_MonitorEventZ");
+       *ret_copy = COption_MonitorEventZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_MonitorEventZ_none() {
+       LDKCOption_MonitorEventZ *ret_copy = MALLOC(sizeof(LDKCOption_MonitorEventZ), "LDKCOption_MonitorEventZ");
+       *ret_copy = COption_MonitorEventZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_MonitorEventZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_MonitorEventZ _res_conv = *(LDKCOption_MonitorEventZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_MonitorEventZ_free(_res_conv);
+}
+
+static inline uint64_t COption_MonitorEventZ_clone_ptr(LDKCOption_MonitorEventZ *NONNULL_PTR arg) {
+       LDKCOption_MonitorEventZ *ret_copy = MALLOC(sizeof(LDKCOption_MonitorEventZ), "LDKCOption_MonitorEventZ");
+       *ret_copy = COption_MonitorEventZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_MonitorEventZ_clone_ptr(int64_t arg) {
+       LDKCOption_MonitorEventZ* arg_conv = (LDKCOption_MonitorEventZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_MonitorEventZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_MonitorEventZ_clone(int64_t orig) {
+       LDKCOption_MonitorEventZ* orig_conv = (LDKCOption_MonitorEventZ*)untag_ptr(orig);
+       LDKCOption_MonitorEventZ *ret_copy = MALLOC(sizeof(LDKCOption_MonitorEventZ), "LDKCOption_MonitorEventZ");
+       *ret_copy = COption_MonitorEventZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_MonitorEventZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_MonitorEventZ o_conv = *(LDKCOption_MonitorEventZ*)(o_ptr);
+       o_conv = COption_MonitorEventZ_clone((LDKCOption_MonitorEventZ*)untag_ptr(o));
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_MonitorEventZDecodeErrorZ), "LDKCResult_COption_MonitorEventZDecodeErrorZ");
+       *ret_conv = CResult_COption_MonitorEventZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_MonitorEventZDecodeErrorZ_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_COption_MonitorEventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_MonitorEventZDecodeErrorZ), "LDKCResult_COption_MonitorEventZDecodeErrorZ");
+       *ret_conv = CResult_COption_MonitorEventZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_MonitorEventZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* o_conv = (LDKCResult_COption_MonitorEventZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_MonitorEventZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_MonitorEventZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_MonitorEventZDecodeErrorZ _res_conv = *(LDKCResult_COption_MonitorEventZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_MonitorEventZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_MonitorEventZDecodeErrorZ_clone_ptr(LDKCResult_COption_MonitorEventZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_MonitorEventZDecodeErrorZ), "LDKCResult_COption_MonitorEventZDecodeErrorZ");
+       *ret_conv = CResult_COption_MonitorEventZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_MonitorEventZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* arg_conv = (LDKCResult_COption_MonitorEventZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_MonitorEventZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_MonitorEventZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* orig_conv = (LDKCResult_COption_MonitorEventZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_MonitorEventZDecodeErrorZ), "LDKCResult_COption_MonitorEventZDecodeErrorZ");
+       *ret_conv = CResult_COption_MonitorEventZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HTLCUpdateDecodeErrorZ_ok(int64_t o) {
+       LDKHTLCUpdate 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 = HTLCUpdate_clone(&o_conv);
+       LDKCResult_HTLCUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCUpdateDecodeErrorZ), "LDKCResult_HTLCUpdateDecodeErrorZ");
+       *ret_conv = CResult_HTLCUpdateDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HTLCUpdateDecodeErrorZ_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_HTLCUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCUpdateDecodeErrorZ), "LDKCResult_HTLCUpdateDecodeErrorZ");
+       *ret_conv = CResult_HTLCUpdateDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_HTLCUpdateDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_HTLCUpdateDecodeErrorZ* o_conv = (LDKCResult_HTLCUpdateDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_HTLCUpdateDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_HTLCUpdateDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_HTLCUpdateDecodeErrorZ _res_conv = *(LDKCResult_HTLCUpdateDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_HTLCUpdateDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_HTLCUpdateDecodeErrorZ_clone_ptr(LDKCResult_HTLCUpdateDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_HTLCUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCUpdateDecodeErrorZ), "LDKCResult_HTLCUpdateDecodeErrorZ");
+       *ret_conv = CResult_HTLCUpdateDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_HTLCUpdateDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_HTLCUpdateDecodeErrorZ* arg_conv = (LDKCResult_HTLCUpdateDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_HTLCUpdateDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_HTLCUpdateDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_HTLCUpdateDecodeErrorZ* orig_conv = (LDKCResult_HTLCUpdateDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_HTLCUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCUpdateDecodeErrorZ), "LDKCResult_HTLCUpdateDecodeErrorZ");
+       *ret_conv = CResult_HTLCUpdateDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C2Tuple_OutPointCVec_u8ZZ_clone_ptr(LDKC2Tuple_OutPointCVec_u8ZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_OutPointCVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_u8ZZ), "LDKC2Tuple_OutPointCVec_u8ZZ");
+       *ret_conv = C2Tuple_OutPointCVec_u8ZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_OutPointCVec_u8ZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_OutPointCVec_u8ZZ* arg_conv = (LDKC2Tuple_OutPointCVec_u8ZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_OutPointCVec_u8ZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_OutPointCVec_u8ZZ_clone(int64_t orig) {
+       LDKC2Tuple_OutPointCVec_u8ZZ* orig_conv = (LDKC2Tuple_OutPointCVec_u8ZZ*)untag_ptr(orig);
+       LDKC2Tuple_OutPointCVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_u8ZZ), "LDKC2Tuple_OutPointCVec_u8ZZ");
+       *ret_conv = C2Tuple_OutPointCVec_u8ZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_OutPointCVec_u8ZZ_new(int64_t a, int8_tArray b) {
+       LDKOutPoint 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 = OutPoint_clone(&a_conv);
+       LDKCVec_u8Z b_ref;
+       b_ref.datalen = b->arr_len;
+       b_ref.data = MALLOC(b_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(b_ref.data, b->elems, b_ref.datalen); FREE(b);
+       LDKC2Tuple_OutPointCVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_u8ZZ), "LDKC2Tuple_OutPointCVec_u8ZZ");
+       *ret_conv = C2Tuple_OutPointCVec_u8ZZ_new(a_conv, b_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_OutPointCVec_u8ZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_OutPointCVec_u8ZZ _res_conv = *(LDKC2Tuple_OutPointCVec_u8ZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_OutPointCVec_u8ZZ_free(_res_conv);
+}
+
+static inline uint64_t C2Tuple_u32CVec_u8ZZ_clone_ptr(LDKC2Tuple_u32CVec_u8ZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_u32CVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u32CVec_u8ZZ), "LDKC2Tuple_u32CVec_u8ZZ");
+       *ret_conv = C2Tuple_u32CVec_u8ZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_u32CVec_u8ZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_u32CVec_u8ZZ* arg_conv = (LDKC2Tuple_u32CVec_u8ZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_u32CVec_u8ZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_u32CVec_u8ZZ_clone(int64_t orig) {
+       LDKC2Tuple_u32CVec_u8ZZ* orig_conv = (LDKC2Tuple_u32CVec_u8ZZ*)untag_ptr(orig);
+       LDKC2Tuple_u32CVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u32CVec_u8ZZ), "LDKC2Tuple_u32CVec_u8ZZ");
+       *ret_conv = C2Tuple_u32CVec_u8ZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_u32CVec_u8ZZ_new(int32_t a, int8_tArray b) {
+       LDKCVec_u8Z b_ref;
+       b_ref.datalen = b->arr_len;
+       b_ref.data = MALLOC(b_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(b_ref.data, b->elems, b_ref.datalen); FREE(b);
+       LDKC2Tuple_u32CVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u32CVec_u8ZZ), "LDKC2Tuple_u32CVec_u8ZZ");
+       *ret_conv = C2Tuple_u32CVec_u8ZZ_new(a, b_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_u32CVec_u8ZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_u32CVec_u8ZZ _res_conv = *(LDKC2Tuple_u32CVec_u8ZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_u32CVec_u8ZZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_u32CVec_u8ZZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_u32CVec_u8ZZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_u32CVec_u8ZZ), "LDKCVec_C2Tuple_u32CVec_u8ZZZ 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_23 = _res_vals[x];
+               void* _res_conv_23_ptr = untag_ptr(_res_conv_23);
+               CHECK_ACCESS(_res_conv_23_ptr);
+               LDKC2Tuple_u32CVec_u8ZZ _res_conv_23_conv = *(LDKC2Tuple_u32CVec_u8ZZ*)(_res_conv_23_ptr);
+               FREE(untag_ptr(_res_conv_23));
+               _res_constr.data[x] = _res_conv_23_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_u32CVec_u8ZZZ_free(_res_constr);
+}
+
+static inline uint64_t C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ* arg_conv = (LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone(int64_t orig) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ* orig_conv = (LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ*)untag_ptr(orig);
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_new(int8_tArray a, int64_tArray b) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKCVec_C2Tuple_u32CVec_u8ZZZ b_constr;
+       b_constr.datalen = b->arr_len;
+       if (b_constr.datalen > 0)
+               b_constr.data = MALLOC(b_constr.datalen * sizeof(LDKC2Tuple_u32CVec_u8ZZ), "LDKCVec_C2Tuple_u32CVec_u8ZZZ Elements");
+       else
+               b_constr.data = NULL;
+       int64_t* b_vals = b->elems;
+       for (size_t x = 0; x < b_constr.datalen; x++) {
+               int64_t b_conv_23 = b_vals[x];
+               void* b_conv_23_ptr = untag_ptr(b_conv_23);
+               CHECK_ACCESS(b_conv_23_ptr);
+               LDKC2Tuple_u32CVec_u8ZZ b_conv_23_conv = *(LDKC2Tuple_u32CVec_u8ZZ*)(b_conv_23_ptr);
+               b_conv_23_conv = C2Tuple_u32CVec_u8ZZ_clone((LDKC2Tuple_u32CVec_u8ZZ*)untag_ptr(b_conv_23));
+               b_constr.data[x] = b_conv_23_conv;
+       }
+       FREE(b);
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_new(a_ref, b_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ _res_conv = *(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ), "LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t a = 0; a < _res_constr.datalen; a++) {
+               int64_t _res_conv_52 = _res_vals[a];
+               void* _res_conv_52_ptr = untag_ptr(_res_conv_52);
+               CHECK_ACCESS(_res_conv_52_ptr);
+               LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ _res_conv_52_conv = *(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ*)(_res_conv_52_ptr);
+               FREE(untag_ptr(_res_conv_52));
+               _res_constr.data[a] = _res_conv_52_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_CommitmentTransactionZ_free(int64_tArray _res) {
+       LDKCVec_CommitmentTransactionZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKCommitmentTransaction), "LDKCVec_CommitmentTransactionZ 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_23 = _res_vals[x];
+               LDKCommitmentTransaction _res_conv_23_conv;
+               _res_conv_23_conv.inner = untag_ptr(_res_conv_23);
+               _res_conv_23_conv.is_owned = ptr_is_owned(_res_conv_23);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_23_conv);
+               _res_constr.data[x] = _res_conv_23_conv;
+       }
+       FREE(_res);
+       CVec_CommitmentTransactionZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_TransactionZ_free(ptrArray _res) {
+       LDKCVec_TransactionZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKTransaction), "LDKCVec_TransactionZ 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];
+               LDKTransaction _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, "LDKTransaction Bytes");
+               memcpy(_res_conv_8_ref.data, _res_conv_8->elems, _res_conv_8_ref.datalen); FREE(_res_conv_8);
+               _res_conv_8_ref.data_is_owned = true;
+               _res_constr.data[i] = _res_conv_8_ref;
+       }
+       FREE(_res);
+       CVec_TransactionZ_free(_res_constr);
+}
+
+static inline uint64_t C2Tuple_u32TxOutZ_clone_ptr(LDKC2Tuple_u32TxOutZ *NONNULL_PTR arg) {
+       LDKC2Tuple_u32TxOutZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u32TxOutZ), "LDKC2Tuple_u32TxOutZ");
+       *ret_conv = C2Tuple_u32TxOutZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_u32TxOutZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_u32TxOutZ* arg_conv = (LDKC2Tuple_u32TxOutZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_u32TxOutZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_u32TxOutZ_clone(int64_t orig) {
+       LDKC2Tuple_u32TxOutZ* orig_conv = (LDKC2Tuple_u32TxOutZ*)untag_ptr(orig);
+       LDKC2Tuple_u32TxOutZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u32TxOutZ), "LDKC2Tuple_u32TxOutZ");
+       *ret_conv = C2Tuple_u32TxOutZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_u32TxOutZ_new(int32_t a, int64_t b) {
+       void* b_ptr = untag_ptr(b);
+       CHECK_ACCESS(b_ptr);
+       LDKTxOut b_conv = *(LDKTxOut*)(b_ptr);
+       b_conv = TxOut_clone((LDKTxOut*)untag_ptr(b));
+       LDKC2Tuple_u32TxOutZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_u32TxOutZ), "LDKC2Tuple_u32TxOutZ");
+       *ret_conv = C2Tuple_u32TxOutZ_new(a, b_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_u32TxOutZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_u32TxOutZ _res_conv = *(LDKC2Tuple_u32TxOutZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_u32TxOutZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_u32TxOutZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_u32TxOutZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_u32TxOutZ), "LDKCVec_C2Tuple_u32TxOutZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t u = 0; u < _res_constr.datalen; u++) {
+               int64_t _res_conv_20 = _res_vals[u];
+               void* _res_conv_20_ptr = untag_ptr(_res_conv_20);
+               CHECK_ACCESS(_res_conv_20_ptr);
+               LDKC2Tuple_u32TxOutZ _res_conv_20_conv = *(LDKC2Tuple_u32TxOutZ*)(_res_conv_20_ptr);
+               FREE(untag_ptr(_res_conv_20));
+               _res_constr.data[u] = _res_conv_20_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_u32TxOutZZ_free(_res_constr);
+}
+
+static inline uint64_t C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* arg_conv = (LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone(int64_t orig) {
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* orig_conv = (LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ*)untag_ptr(orig);
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_new(int8_tArray a, int64_tArray b) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKCVec_C2Tuple_u32TxOutZZ b_constr;
+       b_constr.datalen = b->arr_len;
+       if (b_constr.datalen > 0)
+               b_constr.data = MALLOC(b_constr.datalen * sizeof(LDKC2Tuple_u32TxOutZ), "LDKCVec_C2Tuple_u32TxOutZZ Elements");
+       else
+               b_constr.data = NULL;
+       int64_t* b_vals = b->elems;
+       for (size_t u = 0; u < b_constr.datalen; u++) {
+               int64_t b_conv_20 = b_vals[u];
+               void* b_conv_20_ptr = untag_ptr(b_conv_20);
+               CHECK_ACCESS(b_conv_20_ptr);
+               LDKC2Tuple_u32TxOutZ b_conv_20_conv = *(LDKC2Tuple_u32TxOutZ*)(b_conv_20_ptr);
+               b_conv_20_conv = C2Tuple_u32TxOutZ_clone((LDKC2Tuple_u32TxOutZ*)untag_ptr(b_conv_20));
+               b_constr.data[u] = b_conv_20_conv;
+       }
+       FREE(b);
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_new(a_ref, b_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ _res_conv = *(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ), "LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ 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_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ _res_conv_49_conv = *(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ*)(_res_conv_49_ptr);
+               FREE(untag_ptr(_res_conv_49));
+               _res_constr.data[x] = _res_conv_49_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_BalanceZ_free(int64_tArray _res) {
+       LDKCVec_BalanceZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKBalance), "LDKCVec_BalanceZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t j = 0; j < _res_constr.datalen; j++) {
+               int64_t _res_conv_9 = _res_vals[j];
+               void* _res_conv_9_ptr = untag_ptr(_res_conv_9);
+               CHECK_ACCESS(_res_conv_9_ptr);
+               LDKBalance _res_conv_9_conv = *(LDKBalance*)(_res_conv_9_ptr);
+               FREE(untag_ptr(_res_conv_9));
+               _res_constr.data[j] = _res_conv_9_conv;
+       }
+       FREE(_res);
+       CVec_BalanceZ_free(_res_constr);
+}
+
+static inline uint64_t C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ *NONNULL_PTR arg) {
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ), "LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* arg_conv = (LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone(int64_t orig) {
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* orig_conv = (LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)untag_ptr(orig);
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ), "LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_new(int8_tArray a, int64_t b) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKChannelMonitor 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 = ChannelMonitor_clone(&b_conv);
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ), "LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesChannelMonitorZ_new(a_ref, b_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ _res_conv = *(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_ThirtyTwoBytesChannelMonitorZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ o_conv = *(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)(o_ptr);
+       o_conv = C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone((LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)untag_ptr(o));
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_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_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* o_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ _res_conv = *(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone_ptr(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* arg_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* orig_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C2Tuple_PublicKeyTypeZ_clone_ptr(LDKC2Tuple_PublicKeyTypeZ *NONNULL_PTR arg) {
+       LDKC2Tuple_PublicKeyTypeZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyTypeZ), "LDKC2Tuple_PublicKeyTypeZ");
+       *ret_conv = C2Tuple_PublicKeyTypeZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_PublicKeyTypeZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_PublicKeyTypeZ* arg_conv = (LDKC2Tuple_PublicKeyTypeZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_PublicKeyTypeZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_PublicKeyTypeZ_clone(int64_t orig) {
+       LDKC2Tuple_PublicKeyTypeZ* orig_conv = (LDKC2Tuple_PublicKeyTypeZ*)untag_ptr(orig);
+       LDKC2Tuple_PublicKeyTypeZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyTypeZ), "LDKC2Tuple_PublicKeyTypeZ");
+       *ret_conv = C2Tuple_PublicKeyTypeZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_PublicKeyTypeZ_new(int8_tArray a, int64_t b) {
+       LDKPublicKey a_ref;
+       CHECK(a->arr_len == 33);
+       memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
+       void* b_ptr = untag_ptr(b);
+       CHECK_ACCESS(b_ptr);
+       LDKType b_conv = *(LDKType*)(b_ptr);
+       if (b_conv.free == LDKType_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKType_JCalls_cloned(&b_conv);
+       }
+       LDKC2Tuple_PublicKeyTypeZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyTypeZ), "LDKC2Tuple_PublicKeyTypeZ");
+       *ret_conv = C2Tuple_PublicKeyTypeZ_new(a_ref, b_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_PublicKeyTypeZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_PublicKeyTypeZ _res_conv = *(LDKC2Tuple_PublicKeyTypeZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_PublicKeyTypeZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_PublicKeyTypeZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_PublicKeyTypeZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_PublicKeyTypeZ), "LDKCVec_C2Tuple_PublicKeyTypeZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t z = 0; z < _res_constr.datalen; z++) {
+               int64_t _res_conv_25 = _res_vals[z];
+               void* _res_conv_25_ptr = untag_ptr(_res_conv_25);
+               CHECK_ACCESS(_res_conv_25_ptr);
+               LDKC2Tuple_PublicKeyTypeZ _res_conv_25_conv = *(LDKC2Tuple_PublicKeyTypeZ*)(_res_conv_25_ptr);
+               FREE(untag_ptr(_res_conv_25));
+               _res_constr.data[z] = _res_conv_25_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_PublicKeyTypeZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_OnionMessageContentsZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKOnionMessageContents o_conv = *(LDKOnionMessageContents*)(o_ptr);
+       if (o_conv.free == LDKOnionMessageContents_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOnionMessageContents_JCalls_cloned(&o_conv);
+       }
+       LDKCOption_OnionMessageContentsZ *ret_copy = MALLOC(sizeof(LDKCOption_OnionMessageContentsZ), "LDKCOption_OnionMessageContentsZ");
+       *ret_copy = COption_OnionMessageContentsZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_OnionMessageContentsZ_none() {
+       LDKCOption_OnionMessageContentsZ *ret_copy = MALLOC(sizeof(LDKCOption_OnionMessageContentsZ), "LDKCOption_OnionMessageContentsZ");
+       *ret_copy = COption_OnionMessageContentsZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_OnionMessageContentsZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_OnionMessageContentsZ _res_conv = *(LDKCOption_OnionMessageContentsZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_OnionMessageContentsZ_free(_res_conv);
+}
+
+static inline uint64_t COption_OnionMessageContentsZ_clone_ptr(LDKCOption_OnionMessageContentsZ *NONNULL_PTR arg) {
+       LDKCOption_OnionMessageContentsZ *ret_copy = MALLOC(sizeof(LDKCOption_OnionMessageContentsZ), "LDKCOption_OnionMessageContentsZ");
+       *ret_copy = COption_OnionMessageContentsZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_OnionMessageContentsZ_clone_ptr(int64_t arg) {
+       LDKCOption_OnionMessageContentsZ* arg_conv = (LDKCOption_OnionMessageContentsZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_OnionMessageContentsZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_OnionMessageContentsZ_clone(int64_t orig) {
+       LDKCOption_OnionMessageContentsZ* orig_conv = (LDKCOption_OnionMessageContentsZ*)untag_ptr(orig);
+       LDKCOption_OnionMessageContentsZ *ret_copy = MALLOC(sizeof(LDKCOption_OnionMessageContentsZ), "LDKCOption_OnionMessageContentsZ");
+       *ret_copy = COption_OnionMessageContentsZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_OnionMessageContentsZ o_conv = *(LDKCOption_OnionMessageContentsZ*)(o_ptr);
+       o_conv = COption_OnionMessageContentsZ_clone((LDKCOption_OnionMessageContentsZ*)untag_ptr(o));
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ), "LDKCResult_COption_OnionMessageContentsZDecodeErrorZ");
+       *ret_conv = CResult_COption_OnionMessageContentsZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_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_COption_OnionMessageContentsZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ), "LDKCResult_COption_OnionMessageContentsZDecodeErrorZ");
+       *ret_conv = CResult_COption_OnionMessageContentsZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* o_conv = (LDKCResult_COption_OnionMessageContentsZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_OnionMessageContentsZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ _res_conv = *(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_OnionMessageContentsZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_OnionMessageContentsZDecodeErrorZ_clone_ptr(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ), "LDKCResult_COption_OnionMessageContentsZDecodeErrorZ");
+       *ret_conv = CResult_COption_OnionMessageContentsZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* arg_conv = (LDKCResult_COption_OnionMessageContentsZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_OnionMessageContentsZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* orig_conv = (LDKCResult_COption_OnionMessageContentsZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_OnionMessageContentsZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ), "LDKCResult_COption_OnionMessageContentsZDecodeErrorZ");
+       *ret_conv = CResult_COption_OnionMessageContentsZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone_ptr(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ *NONNULL_PTR arg) {
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ), "LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ");
+       *ret_conv = C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone_ptr(int64_t arg) {
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* arg_conv = (LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ*)untag_ptr(arg);
+       int64_t ret_conv = C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone(int64_t orig) {
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* orig_conv = (LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ*)untag_ptr(orig);
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ), "LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ");
+       *ret_conv = C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_new(int64_t a, int64_t b, int64_t c) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKOnionMessageContents a_conv = *(LDKOnionMessageContents*)(a_ptr);
+       if (a_conv.free == LDKOnionMessageContents_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOnionMessageContents_JCalls_cloned(&a_conv);
+       }
+       void* b_ptr = untag_ptr(b);
+       CHECK_ACCESS(b_ptr);
+       LDKDestination b_conv = *(LDKDestination*)(b_ptr);
+       b_conv = Destination_clone((LDKDestination*)untag_ptr(b));
+       LDKBlindedPath 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 = BlindedPath_clone(&c_conv);
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ), "LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ");
+       *ret_conv = C3Tuple_OnionMessageContentsDestinationBlindedPathZ_new(a_conv, b_conv, c_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ _res_conv = *(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C3Tuple_OnionMessageContentsDestinationBlindedPathZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ_free(int64_tArray _res) {
+       LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ), "LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t e = 0; e < _res_constr.datalen; e++) {
+               int64_t _res_conv_56 = _res_vals[e];
+               void* _res_conv_56_ptr = untag_ptr(_res_conv_56);
+               CHECK_ACCESS(_res_conv_56_ptr);
+               LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ _res_conv_56_conv = *(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ*)(_res_conv_56_ptr);
+               FREE(untag_ptr(_res_conv_56));
+               _res_constr.data[e] = _res_conv_56_conv;
+       }
+       FREE(_res);
+       CVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_TypeZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKType o_conv = *(LDKType*)(o_ptr);
+       if (o_conv.free == LDKType_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKType_JCalls_cloned(&o_conv);
+       }
+       LDKCOption_TypeZ *ret_copy = MALLOC(sizeof(LDKCOption_TypeZ), "LDKCOption_TypeZ");
+       *ret_copy = COption_TypeZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_TypeZ_none() {
+       LDKCOption_TypeZ *ret_copy = MALLOC(sizeof(LDKCOption_TypeZ), "LDKCOption_TypeZ");
+       *ret_copy = COption_TypeZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_TypeZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_TypeZ _res_conv = *(LDKCOption_TypeZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_TypeZ_free(_res_conv);
+}
+
+static inline uint64_t COption_TypeZ_clone_ptr(LDKCOption_TypeZ *NONNULL_PTR arg) {
+       LDKCOption_TypeZ *ret_copy = MALLOC(sizeof(LDKCOption_TypeZ), "LDKCOption_TypeZ");
+       *ret_copy = COption_TypeZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_TypeZ_clone_ptr(int64_t arg) {
+       LDKCOption_TypeZ* arg_conv = (LDKCOption_TypeZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_TypeZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_TypeZ_clone(int64_t orig) {
+       LDKCOption_TypeZ* orig_conv = (LDKCOption_TypeZ*)untag_ptr(orig);
+       LDKCOption_TypeZ *ret_copy = MALLOC(sizeof(LDKCOption_TypeZ), "LDKCOption_TypeZ");
+       *ret_copy = COption_TypeZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_TypeZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_TypeZ o_conv = *(LDKCOption_TypeZ*)(o_ptr);
+       o_conv = COption_TypeZ_clone((LDKCOption_TypeZ*)untag_ptr(o));
+       LDKCResult_COption_TypeZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_TypeZDecodeErrorZ), "LDKCResult_COption_TypeZDecodeErrorZ");
+       *ret_conv = CResult_COption_TypeZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_TypeZDecodeErrorZ_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_COption_TypeZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_TypeZDecodeErrorZ), "LDKCResult_COption_TypeZDecodeErrorZ");
+       *ret_conv = CResult_COption_TypeZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_TypeZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_TypeZDecodeErrorZ* o_conv = (LDKCResult_COption_TypeZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_TypeZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_TypeZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_TypeZDecodeErrorZ _res_conv = *(LDKCResult_COption_TypeZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_TypeZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_TypeZDecodeErrorZ_clone_ptr(LDKCResult_COption_TypeZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_TypeZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_TypeZDecodeErrorZ), "LDKCResult_COption_TypeZDecodeErrorZ");
+       *ret_conv = CResult_COption_TypeZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_TypeZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_TypeZDecodeErrorZ* arg_conv = (LDKCResult_COption_TypeZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_TypeZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_TypeZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_TypeZDecodeErrorZ* orig_conv = (LDKCResult_COption_TypeZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_TypeZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_TypeZDecodeErrorZ), "LDKCResult_COption_TypeZDecodeErrorZ");
+       *ret_conv = CResult_COption_TypeZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_SocketAddressZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKSocketAddress o_conv = *(LDKSocketAddress*)(o_ptr);
+       o_conv = SocketAddress_clone((LDKSocketAddress*)untag_ptr(o));
+       LDKCOption_SocketAddressZ *ret_copy = MALLOC(sizeof(LDKCOption_SocketAddressZ), "LDKCOption_SocketAddressZ");
+       *ret_copy = COption_SocketAddressZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_SocketAddressZ_none() {
+       LDKCOption_SocketAddressZ *ret_copy = MALLOC(sizeof(LDKCOption_SocketAddressZ), "LDKCOption_SocketAddressZ");
+       *ret_copy = COption_SocketAddressZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_SocketAddressZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_SocketAddressZ _res_conv = *(LDKCOption_SocketAddressZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_SocketAddressZ_free(_res_conv);
+}
+
+static inline uint64_t COption_SocketAddressZ_clone_ptr(LDKCOption_SocketAddressZ *NONNULL_PTR arg) {
+       LDKCOption_SocketAddressZ *ret_copy = MALLOC(sizeof(LDKCOption_SocketAddressZ), "LDKCOption_SocketAddressZ");
+       *ret_copy = COption_SocketAddressZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_SocketAddressZ_clone_ptr(int64_t arg) {
+       LDKCOption_SocketAddressZ* arg_conv = (LDKCOption_SocketAddressZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_SocketAddressZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_SocketAddressZ_clone(int64_t orig) {
+       LDKCOption_SocketAddressZ* orig_conv = (LDKCOption_SocketAddressZ*)untag_ptr(orig);
+       LDKCOption_SocketAddressZ *ret_copy = MALLOC(sizeof(LDKCOption_SocketAddressZ), "LDKCOption_SocketAddressZ");
+       *ret_copy = COption_SocketAddressZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline uint64_t C2Tuple_PublicKeyCOption_SocketAddressZZ_clone_ptr(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_PublicKeyCOption_SocketAddressZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ), "LDKC2Tuple_PublicKeyCOption_SocketAddressZZ");
+       *ret_conv = C2Tuple_PublicKeyCOption_SocketAddressZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_PublicKeyCOption_SocketAddressZZ* arg_conv = (LDKC2Tuple_PublicKeyCOption_SocketAddressZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_PublicKeyCOption_SocketAddressZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_clone(int64_t orig) {
+       LDKC2Tuple_PublicKeyCOption_SocketAddressZZ* orig_conv = (LDKC2Tuple_PublicKeyCOption_SocketAddressZZ*)untag_ptr(orig);
+       LDKC2Tuple_PublicKeyCOption_SocketAddressZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ), "LDKC2Tuple_PublicKeyCOption_SocketAddressZZ");
+       *ret_conv = C2Tuple_PublicKeyCOption_SocketAddressZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_new(int8_tArray a, int64_t b) {
+       LDKPublicKey a_ref;
+       CHECK(a->arr_len == 33);
+       memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
+       void* b_ptr = untag_ptr(b);
+       CHECK_ACCESS(b_ptr);
+       LDKCOption_SocketAddressZ b_conv = *(LDKCOption_SocketAddressZ*)(b_ptr);
+       b_conv = COption_SocketAddressZ_clone((LDKCOption_SocketAddressZ*)untag_ptr(b));
+       LDKC2Tuple_PublicKeyCOption_SocketAddressZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ), "LDKC2Tuple_PublicKeyCOption_SocketAddressZZ");
+       *ret_conv = C2Tuple_PublicKeyCOption_SocketAddressZZ_new(a_ref, b_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_PublicKeyCOption_SocketAddressZZ _res_conv = *(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_PublicKeyCOption_SocketAddressZZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ), "LDKCVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t r = 0; r < _res_constr.datalen; r++) {
+               int64_t _res_conv_43 = _res_vals[r];
+               void* _res_conv_43_ptr = untag_ptr(_res_conv_43);
+               CHECK_ACCESS(_res_conv_43_ptr);
+               LDKC2Tuple_PublicKeyCOption_SocketAddressZZ _res_conv_43_conv = *(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ*)(_res_conv_43_ptr);
+               FREE(untag_ptr(_res_conv_43));
+               _res_constr.data[r] = _res_conv_43_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_ok(int8_tArray o) {
+       LDKCVec_u8Z o_ref;
+       o_ref.datalen = o->arr_len;
+       o_ref.data = MALLOC(o_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(o_ref.data, o->elems, o_ref.datalen); FREE(o);
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZPeerHandleErrorZ), "LDKCResult_CVec_u8ZPeerHandleErrorZ");
+       *ret_conv = CResult_CVec_u8ZPeerHandleErrorZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_err(int64_t e) {
+       LDKPeerHandleError e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = PeerHandleError_clone(&e_conv);
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZPeerHandleErrorZ), "LDKCResult_CVec_u8ZPeerHandleErrorZ");
+       *ret_conv = CResult_CVec_u8ZPeerHandleErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_is_ok(int64_t o) {
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* o_conv = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_u8ZPeerHandleErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_u8ZPeerHandleErrorZ _res_conv = *(LDKCResult_CVec_u8ZPeerHandleErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_u8ZPeerHandleErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_u8ZPeerHandleErrorZ_clone_ptr(LDKCResult_CVec_u8ZPeerHandleErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZPeerHandleErrorZ), "LDKCResult_CVec_u8ZPeerHandleErrorZ");
+       *ret_conv = CResult_CVec_u8ZPeerHandleErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* arg_conv = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_u8ZPeerHandleErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_clone(int64_t orig) {
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* orig_conv = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)untag_ptr(orig);
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZPeerHandleErrorZ), "LDKCResult_CVec_u8ZPeerHandleErrorZ");
+       *ret_conv = CResult_CVec_u8ZPeerHandleErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NonePeerHandleErrorZ_ok() {
+       LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
+       *ret_conv = CResult_NonePeerHandleErrorZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NonePeerHandleErrorZ_err(int64_t e) {
+       LDKPeerHandleError e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = PeerHandleError_clone(&e_conv);
+       LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
+       *ret_conv = CResult_NonePeerHandleErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NonePeerHandleErrorZ_is_ok(int64_t o) {
+       LDKCResult_NonePeerHandleErrorZ* o_conv = (LDKCResult_NonePeerHandleErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NonePeerHandleErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NonePeerHandleErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NonePeerHandleErrorZ _res_conv = *(LDKCResult_NonePeerHandleErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NonePeerHandleErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NonePeerHandleErrorZ_clone_ptr(LDKCResult_NonePeerHandleErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
+       *ret_conv = CResult_NonePeerHandleErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NonePeerHandleErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NonePeerHandleErrorZ* arg_conv = (LDKCResult_NonePeerHandleErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NonePeerHandleErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NonePeerHandleErrorZ_clone(int64_t orig) {
+       LDKCResult_NonePeerHandleErrorZ* orig_conv = (LDKCResult_NonePeerHandleErrorZ*)untag_ptr(orig);
+       LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
+       *ret_conv = CResult_NonePeerHandleErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_boolPeerHandleErrorZ_ok(jboolean o) {
+       LDKCResult_boolPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolPeerHandleErrorZ), "LDKCResult_boolPeerHandleErrorZ");
+       *ret_conv = CResult_boolPeerHandleErrorZ_ok(o);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_boolPeerHandleErrorZ_err(int64_t e) {
+       LDKPeerHandleError e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = PeerHandleError_clone(&e_conv);
+       LDKCResult_boolPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolPeerHandleErrorZ), "LDKCResult_boolPeerHandleErrorZ");
+       *ret_conv = CResult_boolPeerHandleErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_boolPeerHandleErrorZ_is_ok(int64_t o) {
+       LDKCResult_boolPeerHandleErrorZ* o_conv = (LDKCResult_boolPeerHandleErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_boolPeerHandleErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_boolPeerHandleErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_boolPeerHandleErrorZ _res_conv = *(LDKCResult_boolPeerHandleErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_boolPeerHandleErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_boolPeerHandleErrorZ_clone_ptr(LDKCResult_boolPeerHandleErrorZ *NONNULL_PTR arg) {
+       LDKCResult_boolPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolPeerHandleErrorZ), "LDKCResult_boolPeerHandleErrorZ");
+       *ret_conv = CResult_boolPeerHandleErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_boolPeerHandleErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_boolPeerHandleErrorZ* arg_conv = (LDKCResult_boolPeerHandleErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_boolPeerHandleErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_boolPeerHandleErrorZ_clone(int64_t orig) {
+       LDKCResult_boolPeerHandleErrorZ* orig_conv = (LDKCResult_boolPeerHandleErrorZ*)untag_ptr(orig);
+       LDKCResult_boolPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolPeerHandleErrorZ), "LDKCResult_boolPeerHandleErrorZ");
+       *ret_conv = CResult_boolPeerHandleErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_u32GraphSyncErrorZ_ok(int32_t o) {
+       LDKCResult_u32GraphSyncErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_u32GraphSyncErrorZ), "LDKCResult_u32GraphSyncErrorZ");
+       *ret_conv = CResult_u32GraphSyncErrorZ_ok(o);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_u32GraphSyncErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKGraphSyncError e_conv = *(LDKGraphSyncError*)(e_ptr);
+       e_conv = GraphSyncError_clone((LDKGraphSyncError*)untag_ptr(e));
+       LDKCResult_u32GraphSyncErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_u32GraphSyncErrorZ), "LDKCResult_u32GraphSyncErrorZ");
+       *ret_conv = CResult_u32GraphSyncErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_u32GraphSyncErrorZ_is_ok(int64_t o) {
+       LDKCResult_u32GraphSyncErrorZ* o_conv = (LDKCResult_u32GraphSyncErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_u32GraphSyncErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_u32GraphSyncErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_u32GraphSyncErrorZ _res_conv = *(LDKCResult_u32GraphSyncErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_u32GraphSyncErrorZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZIOErrorZ_ok(int8_tArray o) {
+       LDKCVec_u8Z o_ref;
+       o_ref.datalen = o->arr_len;
+       o_ref.data = MALLOC(o_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(o_ref.data, o->elems, o_ref.datalen); FREE(o);
+       LDKCResult_CVec_u8ZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZIOErrorZ), "LDKCResult_CVec_u8ZIOErrorZ");
+       *ret_conv = CResult_CVec_u8ZIOErrorZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZIOErrorZ_err(int32_t e) {
+       LDKIOError e_conv = LDKIOError_from_cs(e);
+       LDKCResult_CVec_u8ZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZIOErrorZ), "LDKCResult_CVec_u8ZIOErrorZ");
+       *ret_conv = CResult_CVec_u8ZIOErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_u8ZIOErrorZ_is_ok(int64_t o) {
+       LDKCResult_CVec_u8ZIOErrorZ* o_conv = (LDKCResult_CVec_u8ZIOErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_u8ZIOErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_u8ZIOErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_u8ZIOErrorZ _res_conv = *(LDKCResult_CVec_u8ZIOErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_u8ZIOErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_u8ZIOErrorZ_clone_ptr(LDKCResult_CVec_u8ZIOErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_u8ZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZIOErrorZ), "LDKCResult_CVec_u8ZIOErrorZ");
+       *ret_conv = CResult_CVec_u8ZIOErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_u8ZIOErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_u8ZIOErrorZ* arg_conv = (LDKCResult_CVec_u8ZIOErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_u8ZIOErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_u8ZIOErrorZ_clone(int64_t orig) {
+       LDKCResult_CVec_u8ZIOErrorZ* orig_conv = (LDKCResult_CVec_u8ZIOErrorZ*)untag_ptr(orig);
+       LDKCResult_CVec_u8ZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZIOErrorZ), "LDKCResult_CVec_u8ZIOErrorZ");
+       *ret_conv = CResult_CVec_u8ZIOErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_StrZ_free(ptrArray _res) {
+       LDKCVec_StrZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKStr), "LDKCVec_StrZ Elements");
+       else
+               _res_constr.data = NULL;
+       jstring* _res_vals = (void*) _res->elems;
+       for (size_t i = 0; i < _res_constr.datalen; i++) {
+               jstring _res_conv_8 = _res_vals[i];
+               LDKStr dummy = { .chars = NULL, .len = 0, .chars_is_owned = false };
+               _res_constr.data[i] = dummy;
+       }
+       FREE(_res);
+       CVec_StrZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_CVec_StrZIOErrorZ_ok(ptrArray o) {
+       LDKCVec_StrZ o_constr;
+       o_constr.datalen = o->arr_len;
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKStr), "LDKCVec_StrZ Elements");
+       else
+               o_constr.data = NULL;
+       jstring* o_vals = (void*) o->elems;
+       for (size_t i = 0; i < o_constr.datalen; i++) {
+               jstring o_conv_8 = o_vals[i];
+               LDKStr o_conv_8_conv = str_ref_to_owned_c(o_conv_8);
+               o_constr.data[i] = o_conv_8_conv;
+       }
+       FREE(o);
+       LDKCResult_CVec_StrZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_StrZIOErrorZ), "LDKCResult_CVec_StrZIOErrorZ");
+       *ret_conv = CResult_CVec_StrZIOErrorZ_ok(o_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_StrZIOErrorZ_err(int32_t e) {
+       LDKIOError e_conv = LDKIOError_from_cs(e);
+       LDKCResult_CVec_StrZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_StrZIOErrorZ), "LDKCResult_CVec_StrZIOErrorZ");
+       *ret_conv = CResult_CVec_StrZIOErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_StrZIOErrorZ_is_ok(int64_t o) {
+       LDKCResult_CVec_StrZIOErrorZ* o_conv = (LDKCResult_CVec_StrZIOErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_StrZIOErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_StrZIOErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_StrZIOErrorZ _res_conv = *(LDKCResult_CVec_StrZIOErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_StrZIOErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_StrZIOErrorZ_clone_ptr(LDKCResult_CVec_StrZIOErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_StrZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_StrZIOErrorZ), "LDKCResult_CVec_StrZIOErrorZ");
+       *ret_conv = CResult_CVec_StrZIOErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_StrZIOErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_StrZIOErrorZ* arg_conv = (LDKCResult_CVec_StrZIOErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_StrZIOErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_StrZIOErrorZ_clone(int64_t orig) {
+       LDKCResult_CVec_StrZIOErrorZ* orig_conv = (LDKCResult_CVec_StrZIOErrorZ*)untag_ptr(orig);
+       LDKCResult_CVec_StrZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_StrZIOErrorZ), "LDKCResult_CVec_StrZIOErrorZ");
+       *ret_conv = CResult_CVec_StrZIOErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ), "LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ 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_ThirtyTwoBytesChannelMonitorZ _res_conv_40_conv = *(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)(_res_conv_40_ptr);
+               FREE(untag_ptr(_res_conv_40));
+               _res_constr.data[o] = _res_conv_40_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_ok(int64_tArray o) {
+       LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ o_constr;
+       o_constr.datalen = o->arr_len;
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ), "LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ 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_ThirtyTwoBytesChannelMonitorZ o_conv_40_conv = *(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)(o_conv_40_ptr);
+               o_conv_40_conv = C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone((LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)untag_ptr(o_conv_40));
+               o_constr.data[o] = o_conv_40_conv;
+       }
+       FREE(o);
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ");
+       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_ok(o_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_err(int32_t e) {
+       LDKIOError e_conv = LDKIOError_from_cs(e);
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ");
+       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_is_ok(int64_t o) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* o_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ _res_conv = *(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone_ptr(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ");
+       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* arg_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone(int64_t orig) {
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* orig_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ*)untag_ptr(orig);
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ");
+       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ o_conv = *(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)(o_ptr);
+       o_conv = C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone((LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ*)untag_ptr(o));
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_err(int32_t e) {
+       LDKIOError e_conv = LDKIOError_from_cs(e);
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_is_ok(int64_t o) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* o_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ _res_conv = *(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone_ptr(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ *NONNULL_PTR arg) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* arg_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone(int64_t orig) {
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* orig_conv = (LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ*)untag_ptr(orig);
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ");
+       *ret_conv = CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_SecretKeyZ_some(int8_tArray o) {
+       LDKSecretKey o_ref;
+       CHECK(o->arr_len == 32);
+       memcpy(o_ref.bytes, o->elems, 32); FREE(o);
+       LDKCOption_SecretKeyZ *ret_copy = MALLOC(sizeof(LDKCOption_SecretKeyZ), "LDKCOption_SecretKeyZ");
+       *ret_copy = COption_SecretKeyZ_some(o_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_SecretKeyZ_none() {
+       LDKCOption_SecretKeyZ *ret_copy = MALLOC(sizeof(LDKCOption_SecretKeyZ), "LDKCOption_SecretKeyZ");
+       *ret_copy = COption_SecretKeyZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_SecretKeyZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_SecretKeyZ _res_conv = *(LDKCOption_SecretKeyZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_SecretKeyZ_free(_res_conv);
+}
+
+static inline uint64_t COption_SecretKeyZ_clone_ptr(LDKCOption_SecretKeyZ *NONNULL_PTR arg) {
+       LDKCOption_SecretKeyZ *ret_copy = MALLOC(sizeof(LDKCOption_SecretKeyZ), "LDKCOption_SecretKeyZ");
+       *ret_copy = COption_SecretKeyZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_SecretKeyZ_clone_ptr(int64_t arg) {
+       LDKCOption_SecretKeyZ* arg_conv = (LDKCOption_SecretKeyZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_SecretKeyZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_SecretKeyZ_clone(int64_t orig) {
+       LDKCOption_SecretKeyZ* orig_conv = (LDKCOption_SecretKeyZ*)untag_ptr(orig);
+       LDKCOption_SecretKeyZ *ret_copy = MALLOC(sizeof(LDKCOption_SecretKeyZ), "LDKCOption_SecretKeyZ");
+       *ret_copy = COption_SecretKeyZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_ok(int64_t o) {
+       LDKVerifiedInvoiceRequest 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 = VerifiedInvoiceRequest_clone(&o_conv);
+       LDKCResult_VerifiedInvoiceRequestNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_VerifiedInvoiceRequestNoneZ), "LDKCResult_VerifiedInvoiceRequestNoneZ");
+       *ret_conv = CResult_VerifiedInvoiceRequestNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_err() {
+       LDKCResult_VerifiedInvoiceRequestNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_VerifiedInvoiceRequestNoneZ), "LDKCResult_VerifiedInvoiceRequestNoneZ");
+       *ret_conv = CResult_VerifiedInvoiceRequestNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_is_ok(int64_t o) {
+       LDKCResult_VerifiedInvoiceRequestNoneZ* o_conv = (LDKCResult_VerifiedInvoiceRequestNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_VerifiedInvoiceRequestNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_VerifiedInvoiceRequestNoneZ _res_conv = *(LDKCResult_VerifiedInvoiceRequestNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_VerifiedInvoiceRequestNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_VerifiedInvoiceRequestNoneZ_clone_ptr(LDKCResult_VerifiedInvoiceRequestNoneZ *NONNULL_PTR arg) {
+       LDKCResult_VerifiedInvoiceRequestNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_VerifiedInvoiceRequestNoneZ), "LDKCResult_VerifiedInvoiceRequestNoneZ");
+       *ret_conv = CResult_VerifiedInvoiceRequestNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_VerifiedInvoiceRequestNoneZ* arg_conv = (LDKCResult_VerifiedInvoiceRequestNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_VerifiedInvoiceRequestNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_clone(int64_t orig) {
+       LDKCResult_VerifiedInvoiceRequestNoneZ* orig_conv = (LDKCResult_VerifiedInvoiceRequestNoneZ*)untag_ptr(orig);
+       LDKCResult_VerifiedInvoiceRequestNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_VerifiedInvoiceRequestNoneZ), "LDKCResult_VerifiedInvoiceRequestNoneZ");
+       *ret_conv = CResult_VerifiedInvoiceRequestNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int32_t  CS_LDK_COption_NoneZ_some() {
+       int32_t ret_conv = LDKCOption_NoneZ_to_cs(COption_NoneZ_some());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_COption_NoneZ_none() {
+       int32_t ret_conv = LDKCOption_NoneZ_to_cs(COption_NoneZ_none());
+       return ret_conv;
+}
+
+void  CS_LDK_COption_NoneZ_free(int32_t _res) {
+       LDKCOption_NoneZ _res_conv = LDKCOption_NoneZ_from_cs(_res);
+       COption_NoneZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_WitnessZ_free(ptrArray _res) {
+       LDKCVec_WitnessZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKWitness), "LDKCVec_WitnessZ 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];
+               LDKWitness _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, "LDKWitness Bytes");
+               memcpy(_res_conv_8_ref.data, _res_conv_8->elems, _res_conv_8_ref.datalen); FREE(_res_conv_8);
+               _res_conv_8_ref.data_is_owned = true;
+               _res_constr.data[i] = _res_conv_8_ref;
+       }
+       FREE(_res);
+       CVec_WitnessZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_i64Z_some(int64_t o) {
+       LDKCOption_i64Z *ret_copy = MALLOC(sizeof(LDKCOption_i64Z), "LDKCOption_i64Z");
+       *ret_copy = COption_i64Z_some(o);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_i64Z_none() {
+       LDKCOption_i64Z *ret_copy = MALLOC(sizeof(LDKCOption_i64Z), "LDKCOption_i64Z");
+       *ret_copy = COption_i64Z_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_i64Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_i64Z _res_conv = *(LDKCOption_i64Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_i64Z_free(_res_conv);
+}
+
+static inline uint64_t COption_i64Z_clone_ptr(LDKCOption_i64Z *NONNULL_PTR arg) {
+       LDKCOption_i64Z *ret_copy = MALLOC(sizeof(LDKCOption_i64Z), "LDKCOption_i64Z");
+       *ret_copy = COption_i64Z_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_i64Z_clone_ptr(int64_t arg) {
+       LDKCOption_i64Z* arg_conv = (LDKCOption_i64Z*)untag_ptr(arg);
+       int64_t ret_conv = COption_i64Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_i64Z_clone(int64_t orig) {
+       LDKCOption_i64Z* orig_conv = (LDKCOption_i64Z*)untag_ptr(orig);
+       LDKCOption_i64Z *ret_copy = MALLOC(sizeof(LDKCOption_i64Z), "LDKCOption_i64Z");
+       *ret_copy = COption_i64Z_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_SocketAddressDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKSocketAddress o_conv = *(LDKSocketAddress*)(o_ptr);
+       o_conv = SocketAddress_clone((LDKSocketAddress*)untag_ptr(o));
+       LDKCResult_SocketAddressDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressDecodeErrorZ), "LDKCResult_SocketAddressDecodeErrorZ");
+       *ret_conv = CResult_SocketAddressDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SocketAddressDecodeErrorZ_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_SocketAddressDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressDecodeErrorZ), "LDKCResult_SocketAddressDecodeErrorZ");
+       *ret_conv = CResult_SocketAddressDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SocketAddressDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_SocketAddressDecodeErrorZ* o_conv = (LDKCResult_SocketAddressDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SocketAddressDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SocketAddressDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SocketAddressDecodeErrorZ _res_conv = *(LDKCResult_SocketAddressDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SocketAddressDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SocketAddressDecodeErrorZ_clone_ptr(LDKCResult_SocketAddressDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_SocketAddressDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressDecodeErrorZ), "LDKCResult_SocketAddressDecodeErrorZ");
+       *ret_conv = CResult_SocketAddressDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SocketAddressDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_SocketAddressDecodeErrorZ* arg_conv = (LDKCResult_SocketAddressDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SocketAddressDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SocketAddressDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_SocketAddressDecodeErrorZ* orig_conv = (LDKCResult_SocketAddressDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_SocketAddressDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressDecodeErrorZ), "LDKCResult_SocketAddressDecodeErrorZ");
+       *ret_conv = CResult_SocketAddressDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKSocketAddress o_conv = *(LDKSocketAddress*)(o_ptr);
+       o_conv = SocketAddress_clone((LDKSocketAddress*)untag_ptr(o));
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressSocketAddressParseErrorZ), "LDKCResult_SocketAddressSocketAddressParseErrorZ");
+       *ret_conv = CResult_SocketAddressSocketAddressParseErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_err(int32_t e) {
+       LDKSocketAddressParseError e_conv = LDKSocketAddressParseError_from_cs(e);
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressSocketAddressParseErrorZ), "LDKCResult_SocketAddressSocketAddressParseErrorZ");
+       *ret_conv = CResult_SocketAddressSocketAddressParseErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_is_ok(int64_t o) {
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* o_conv = (LDKCResult_SocketAddressSocketAddressParseErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SocketAddressSocketAddressParseErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SocketAddressSocketAddressParseErrorZ _res_conv = *(LDKCResult_SocketAddressSocketAddressParseErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SocketAddressSocketAddressParseErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SocketAddressSocketAddressParseErrorZ_clone_ptr(LDKCResult_SocketAddressSocketAddressParseErrorZ *NONNULL_PTR arg) {
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressSocketAddressParseErrorZ), "LDKCResult_SocketAddressSocketAddressParseErrorZ");
+       *ret_conv = CResult_SocketAddressSocketAddressParseErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* arg_conv = (LDKCResult_SocketAddressSocketAddressParseErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SocketAddressSocketAddressParseErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_clone(int64_t orig) {
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* orig_conv = (LDKCResult_SocketAddressSocketAddressParseErrorZ*)untag_ptr(orig);
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressSocketAddressParseErrorZ), "LDKCResult_SocketAddressSocketAddressParseErrorZ");
+       *ret_conv = CResult_SocketAddressSocketAddressParseErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_UpdateAddHTLCZ_free(int64_tArray _res) {
+       LDKCVec_UpdateAddHTLCZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKUpdateAddHTLC), "LDKCVec_UpdateAddHTLCZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t p = 0; p < _res_constr.datalen; p++) {
+               int64_t _res_conv_15 = _res_vals[p];
+               LDKUpdateAddHTLC _res_conv_15_conv;
+               _res_conv_15_conv.inner = untag_ptr(_res_conv_15);
+               _res_conv_15_conv.is_owned = ptr_is_owned(_res_conv_15);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_15_conv);
+               _res_constr.data[p] = _res_conv_15_conv;
+       }
+       FREE(_res);
+       CVec_UpdateAddHTLCZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_UpdateFulfillHTLCZ_free(int64_tArray _res) {
+       LDKCVec_UpdateFulfillHTLCZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKUpdateFulfillHTLC), "LDKCVec_UpdateFulfillHTLCZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t t = 0; t < _res_constr.datalen; t++) {
+               int64_t _res_conv_19 = _res_vals[t];
+               LDKUpdateFulfillHTLC _res_conv_19_conv;
+               _res_conv_19_conv.inner = untag_ptr(_res_conv_19);
+               _res_conv_19_conv.is_owned = ptr_is_owned(_res_conv_19);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_19_conv);
+               _res_constr.data[t] = _res_conv_19_conv;
+       }
+       FREE(_res);
+       CVec_UpdateFulfillHTLCZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_UpdateFailHTLCZ_free(int64_tArray _res) {
+       LDKCVec_UpdateFailHTLCZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKUpdateFailHTLC), "LDKCVec_UpdateFailHTLCZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t q = 0; q < _res_constr.datalen; q++) {
+               int64_t _res_conv_16 = _res_vals[q];
+               LDKUpdateFailHTLC _res_conv_16_conv;
+               _res_conv_16_conv.inner = untag_ptr(_res_conv_16);
+               _res_conv_16_conv.is_owned = ptr_is_owned(_res_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_16_conv);
+               _res_constr.data[q] = _res_conv_16_conv;
+       }
+       FREE(_res);
+       CVec_UpdateFailHTLCZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_UpdateFailMalformedHTLCZ_free(int64_tArray _res) {
+       LDKCVec_UpdateFailMalformedHTLCZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKUpdateFailMalformedHTLC), "LDKCVec_UpdateFailMalformedHTLCZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t z = 0; z < _res_constr.datalen; z++) {
+               int64_t _res_conv_25 = _res_vals[z];
+               LDKUpdateFailMalformedHTLC _res_conv_25_conv;
+               _res_conv_25_conv.inner = untag_ptr(_res_conv_25);
+               _res_conv_25_conv.is_owned = ptr_is_owned(_res_conv_25);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_25_conv);
+               _res_constr.data[z] = _res_conv_25_conv;
+       }
+       FREE(_res);
+       CVec_UpdateFailMalformedHTLCZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_AcceptChannelDecodeErrorZ_ok(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 = AcceptChannel_clone(&o_conv);
+       LDKCResult_AcceptChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelDecodeErrorZ), "LDKCResult_AcceptChannelDecodeErrorZ");
+       *ret_conv = CResult_AcceptChannelDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_AcceptChannelDecodeErrorZ_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_AcceptChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelDecodeErrorZ), "LDKCResult_AcceptChannelDecodeErrorZ");
+       *ret_conv = CResult_AcceptChannelDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_AcceptChannelDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_AcceptChannelDecodeErrorZ* o_conv = (LDKCResult_AcceptChannelDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_AcceptChannelDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_AcceptChannelDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_AcceptChannelDecodeErrorZ _res_conv = *(LDKCResult_AcceptChannelDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_AcceptChannelDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_AcceptChannelDecodeErrorZ_clone_ptr(LDKCResult_AcceptChannelDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_AcceptChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelDecodeErrorZ), "LDKCResult_AcceptChannelDecodeErrorZ");
+       *ret_conv = CResult_AcceptChannelDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_AcceptChannelDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_AcceptChannelDecodeErrorZ* arg_conv = (LDKCResult_AcceptChannelDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_AcceptChannelDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_AcceptChannelDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_AcceptChannelDecodeErrorZ* orig_conv = (LDKCResult_AcceptChannelDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_AcceptChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelDecodeErrorZ), "LDKCResult_AcceptChannelDecodeErrorZ");
+       *ret_conv = CResult_AcceptChannelDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_ok(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 = AcceptChannelV2_clone(&o_conv);
+       LDKCResult_AcceptChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelV2DecodeErrorZ), "LDKCResult_AcceptChannelV2DecodeErrorZ");
+       *ret_conv = CResult_AcceptChannelV2DecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_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_AcceptChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelV2DecodeErrorZ), "LDKCResult_AcceptChannelV2DecodeErrorZ");
+       *ret_conv = CResult_AcceptChannelV2DecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_AcceptChannelV2DecodeErrorZ* o_conv = (LDKCResult_AcceptChannelV2DecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_AcceptChannelV2DecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_AcceptChannelV2DecodeErrorZ _res_conv = *(LDKCResult_AcceptChannelV2DecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_AcceptChannelV2DecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_AcceptChannelV2DecodeErrorZ_clone_ptr(LDKCResult_AcceptChannelV2DecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_AcceptChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelV2DecodeErrorZ), "LDKCResult_AcceptChannelV2DecodeErrorZ");
+       *ret_conv = CResult_AcceptChannelV2DecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_AcceptChannelV2DecodeErrorZ* arg_conv = (LDKCResult_AcceptChannelV2DecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_AcceptChannelV2DecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_AcceptChannelV2DecodeErrorZ* orig_conv = (LDKCResult_AcceptChannelV2DecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_AcceptChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelV2DecodeErrorZ), "LDKCResult_AcceptChannelV2DecodeErrorZ");
+       *ret_conv = CResult_AcceptChannelV2DecodeErrorZ_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);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = TxAddInput_clone(&o_conv);
+       LDKCResult_TxAddInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddInputDecodeErrorZ), "LDKCResult_TxAddInputDecodeErrorZ");
+       *ret_conv = CResult_TxAddInputDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxAddInputDecodeErrorZ_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_TxAddInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddInputDecodeErrorZ), "LDKCResult_TxAddInputDecodeErrorZ");
+       *ret_conv = CResult_TxAddInputDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxAddInputDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxAddInputDecodeErrorZ* o_conv = (LDKCResult_TxAddInputDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxAddInputDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxAddInputDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxAddInputDecodeErrorZ _res_conv = *(LDKCResult_TxAddInputDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxAddInputDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxAddInputDecodeErrorZ_clone_ptr(LDKCResult_TxAddInputDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxAddInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddInputDecodeErrorZ), "LDKCResult_TxAddInputDecodeErrorZ");
+       *ret_conv = CResult_TxAddInputDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxAddInputDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxAddInputDecodeErrorZ* arg_conv = (LDKCResult_TxAddInputDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxAddInputDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxAddInputDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxAddInputDecodeErrorZ* orig_conv = (LDKCResult_TxAddInputDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxAddInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddInputDecodeErrorZ), "LDKCResult_TxAddInputDecodeErrorZ");
+       *ret_conv = CResult_TxAddInputDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxAddOutputDecodeErrorZ_ok(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 = TxAddOutput_clone(&o_conv);
+       LDKCResult_TxAddOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddOutputDecodeErrorZ), "LDKCResult_TxAddOutputDecodeErrorZ");
+       *ret_conv = CResult_TxAddOutputDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxAddOutputDecodeErrorZ_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_TxAddOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddOutputDecodeErrorZ), "LDKCResult_TxAddOutputDecodeErrorZ");
+       *ret_conv = CResult_TxAddOutputDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxAddOutputDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxAddOutputDecodeErrorZ* o_conv = (LDKCResult_TxAddOutputDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxAddOutputDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxAddOutputDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxAddOutputDecodeErrorZ _res_conv = *(LDKCResult_TxAddOutputDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxAddOutputDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxAddOutputDecodeErrorZ_clone_ptr(LDKCResult_TxAddOutputDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxAddOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddOutputDecodeErrorZ), "LDKCResult_TxAddOutputDecodeErrorZ");
+       *ret_conv = CResult_TxAddOutputDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxAddOutputDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxAddOutputDecodeErrorZ* arg_conv = (LDKCResult_TxAddOutputDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxAddOutputDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxAddOutputDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxAddOutputDecodeErrorZ* orig_conv = (LDKCResult_TxAddOutputDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxAddOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddOutputDecodeErrorZ), "LDKCResult_TxAddOutputDecodeErrorZ");
+       *ret_conv = CResult_TxAddOutputDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxRemoveInputDecodeErrorZ_ok(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 = TxRemoveInput_clone(&o_conv);
+       LDKCResult_TxRemoveInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveInputDecodeErrorZ), "LDKCResult_TxRemoveInputDecodeErrorZ");
+       *ret_conv = CResult_TxRemoveInputDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxRemoveInputDecodeErrorZ_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_TxRemoveInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveInputDecodeErrorZ), "LDKCResult_TxRemoveInputDecodeErrorZ");
+       *ret_conv = CResult_TxRemoveInputDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxRemoveInputDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxRemoveInputDecodeErrorZ* o_conv = (LDKCResult_TxRemoveInputDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxRemoveInputDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxRemoveInputDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxRemoveInputDecodeErrorZ _res_conv = *(LDKCResult_TxRemoveInputDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxRemoveInputDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxRemoveInputDecodeErrorZ_clone_ptr(LDKCResult_TxRemoveInputDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxRemoveInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveInputDecodeErrorZ), "LDKCResult_TxRemoveInputDecodeErrorZ");
+       *ret_conv = CResult_TxRemoveInputDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxRemoveInputDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxRemoveInputDecodeErrorZ* arg_conv = (LDKCResult_TxRemoveInputDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxRemoveInputDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxRemoveInputDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxRemoveInputDecodeErrorZ* orig_conv = (LDKCResult_TxRemoveInputDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxRemoveInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveInputDecodeErrorZ), "LDKCResult_TxRemoveInputDecodeErrorZ");
+       *ret_conv = CResult_TxRemoveInputDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxRemoveOutputDecodeErrorZ_ok(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 = TxRemoveOutput_clone(&o_conv);
+       LDKCResult_TxRemoveOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveOutputDecodeErrorZ), "LDKCResult_TxRemoveOutputDecodeErrorZ");
+       *ret_conv = CResult_TxRemoveOutputDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxRemoveOutputDecodeErrorZ_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_TxRemoveOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveOutputDecodeErrorZ), "LDKCResult_TxRemoveOutputDecodeErrorZ");
+       *ret_conv = CResult_TxRemoveOutputDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxRemoveOutputDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxRemoveOutputDecodeErrorZ* o_conv = (LDKCResult_TxRemoveOutputDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxRemoveOutputDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxRemoveOutputDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxRemoveOutputDecodeErrorZ _res_conv = *(LDKCResult_TxRemoveOutputDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxRemoveOutputDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxRemoveOutputDecodeErrorZ_clone_ptr(LDKCResult_TxRemoveOutputDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxRemoveOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveOutputDecodeErrorZ), "LDKCResult_TxRemoveOutputDecodeErrorZ");
+       *ret_conv = CResult_TxRemoveOutputDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxRemoveOutputDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxRemoveOutputDecodeErrorZ* arg_conv = (LDKCResult_TxRemoveOutputDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxRemoveOutputDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxRemoveOutputDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxRemoveOutputDecodeErrorZ* orig_conv = (LDKCResult_TxRemoveOutputDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxRemoveOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveOutputDecodeErrorZ), "LDKCResult_TxRemoveOutputDecodeErrorZ");
+       *ret_conv = CResult_TxRemoveOutputDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxCompleteDecodeErrorZ_ok(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 = TxComplete_clone(&o_conv);
+       LDKCResult_TxCompleteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCompleteDecodeErrorZ), "LDKCResult_TxCompleteDecodeErrorZ");
+       *ret_conv = CResult_TxCompleteDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxCompleteDecodeErrorZ_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_TxCompleteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCompleteDecodeErrorZ), "LDKCResult_TxCompleteDecodeErrorZ");
+       *ret_conv = CResult_TxCompleteDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxCompleteDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxCompleteDecodeErrorZ* o_conv = (LDKCResult_TxCompleteDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxCompleteDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxCompleteDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxCompleteDecodeErrorZ _res_conv = *(LDKCResult_TxCompleteDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxCompleteDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxCompleteDecodeErrorZ_clone_ptr(LDKCResult_TxCompleteDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxCompleteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCompleteDecodeErrorZ), "LDKCResult_TxCompleteDecodeErrorZ");
+       *ret_conv = CResult_TxCompleteDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxCompleteDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxCompleteDecodeErrorZ* arg_conv = (LDKCResult_TxCompleteDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxCompleteDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxCompleteDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxCompleteDecodeErrorZ* orig_conv = (LDKCResult_TxCompleteDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxCompleteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCompleteDecodeErrorZ), "LDKCResult_TxCompleteDecodeErrorZ");
+       *ret_conv = CResult_TxCompleteDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxSignaturesDecodeErrorZ_ok(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 = TxSignatures_clone(&o_conv);
+       LDKCResult_TxSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxSignaturesDecodeErrorZ), "LDKCResult_TxSignaturesDecodeErrorZ");
+       *ret_conv = CResult_TxSignaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxSignaturesDecodeErrorZ_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_TxSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxSignaturesDecodeErrorZ), "LDKCResult_TxSignaturesDecodeErrorZ");
+       *ret_conv = CResult_TxSignaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxSignaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxSignaturesDecodeErrorZ* o_conv = (LDKCResult_TxSignaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxSignaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxSignaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxSignaturesDecodeErrorZ _res_conv = *(LDKCResult_TxSignaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxSignaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxSignaturesDecodeErrorZ_clone_ptr(LDKCResult_TxSignaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxSignaturesDecodeErrorZ), "LDKCResult_TxSignaturesDecodeErrorZ");
+       *ret_conv = CResult_TxSignaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxSignaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxSignaturesDecodeErrorZ* arg_conv = (LDKCResult_TxSignaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxSignaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxSignaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxSignaturesDecodeErrorZ* orig_conv = (LDKCResult_TxSignaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxSignaturesDecodeErrorZ), "LDKCResult_TxSignaturesDecodeErrorZ");
+       *ret_conv = CResult_TxSignaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxInitRbfDecodeErrorZ_ok(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 = TxInitRbf_clone(&o_conv);
+       LDKCResult_TxInitRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxInitRbfDecodeErrorZ), "LDKCResult_TxInitRbfDecodeErrorZ");
+       *ret_conv = CResult_TxInitRbfDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxInitRbfDecodeErrorZ_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_TxInitRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxInitRbfDecodeErrorZ), "LDKCResult_TxInitRbfDecodeErrorZ");
+       *ret_conv = CResult_TxInitRbfDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxInitRbfDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxInitRbfDecodeErrorZ* o_conv = (LDKCResult_TxInitRbfDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxInitRbfDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxInitRbfDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxInitRbfDecodeErrorZ _res_conv = *(LDKCResult_TxInitRbfDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxInitRbfDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxInitRbfDecodeErrorZ_clone_ptr(LDKCResult_TxInitRbfDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxInitRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxInitRbfDecodeErrorZ), "LDKCResult_TxInitRbfDecodeErrorZ");
+       *ret_conv = CResult_TxInitRbfDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxInitRbfDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxInitRbfDecodeErrorZ* arg_conv = (LDKCResult_TxInitRbfDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxInitRbfDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxInitRbfDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxInitRbfDecodeErrorZ* orig_conv = (LDKCResult_TxInitRbfDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxInitRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxInitRbfDecodeErrorZ), "LDKCResult_TxInitRbfDecodeErrorZ");
+       *ret_conv = CResult_TxInitRbfDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxAckRbfDecodeErrorZ_ok(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 = TxAckRbf_clone(&o_conv);
+       LDKCResult_TxAckRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAckRbfDecodeErrorZ), "LDKCResult_TxAckRbfDecodeErrorZ");
+       *ret_conv = CResult_TxAckRbfDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxAckRbfDecodeErrorZ_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_TxAckRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAckRbfDecodeErrorZ), "LDKCResult_TxAckRbfDecodeErrorZ");
+       *ret_conv = CResult_TxAckRbfDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxAckRbfDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxAckRbfDecodeErrorZ* o_conv = (LDKCResult_TxAckRbfDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxAckRbfDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxAckRbfDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxAckRbfDecodeErrorZ _res_conv = *(LDKCResult_TxAckRbfDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxAckRbfDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxAckRbfDecodeErrorZ_clone_ptr(LDKCResult_TxAckRbfDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxAckRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAckRbfDecodeErrorZ), "LDKCResult_TxAckRbfDecodeErrorZ");
+       *ret_conv = CResult_TxAckRbfDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxAckRbfDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxAckRbfDecodeErrorZ* arg_conv = (LDKCResult_TxAckRbfDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxAckRbfDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxAckRbfDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxAckRbfDecodeErrorZ* orig_conv = (LDKCResult_TxAckRbfDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxAckRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAckRbfDecodeErrorZ), "LDKCResult_TxAckRbfDecodeErrorZ");
+       *ret_conv = CResult_TxAckRbfDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxAbortDecodeErrorZ_ok(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 = TxAbort_clone(&o_conv);
+       LDKCResult_TxAbortDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAbortDecodeErrorZ), "LDKCResult_TxAbortDecodeErrorZ");
+       *ret_conv = CResult_TxAbortDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxAbortDecodeErrorZ_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_TxAbortDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAbortDecodeErrorZ), "LDKCResult_TxAbortDecodeErrorZ");
+       *ret_conv = CResult_TxAbortDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxAbortDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxAbortDecodeErrorZ* o_conv = (LDKCResult_TxAbortDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxAbortDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxAbortDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxAbortDecodeErrorZ _res_conv = *(LDKCResult_TxAbortDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxAbortDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxAbortDecodeErrorZ_clone_ptr(LDKCResult_TxAbortDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxAbortDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAbortDecodeErrorZ), "LDKCResult_TxAbortDecodeErrorZ");
+       *ret_conv = CResult_TxAbortDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxAbortDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxAbortDecodeErrorZ* arg_conv = (LDKCResult_TxAbortDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxAbortDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxAbortDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxAbortDecodeErrorZ* orig_conv = (LDKCResult_TxAbortDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxAbortDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAbortDecodeErrorZ), "LDKCResult_TxAbortDecodeErrorZ");
+       *ret_conv = CResult_TxAbortDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_AnnouncementSignaturesDecodeErrorZ_ok(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 = AnnouncementSignatures_clone(&o_conv);
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AnnouncementSignaturesDecodeErrorZ), "LDKCResult_AnnouncementSignaturesDecodeErrorZ");
+       *ret_conv = CResult_AnnouncementSignaturesDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_AnnouncementSignaturesDecodeErrorZ_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_AnnouncementSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AnnouncementSignaturesDecodeErrorZ), "LDKCResult_AnnouncementSignaturesDecodeErrorZ");
+       *ret_conv = CResult_AnnouncementSignaturesDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_AnnouncementSignaturesDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* o_conv = (LDKCResult_AnnouncementSignaturesDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_AnnouncementSignaturesDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_AnnouncementSignaturesDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ _res_conv = *(LDKCResult_AnnouncementSignaturesDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_AnnouncementSignaturesDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_AnnouncementSignaturesDecodeErrorZ_clone_ptr(LDKCResult_AnnouncementSignaturesDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AnnouncementSignaturesDecodeErrorZ), "LDKCResult_AnnouncementSignaturesDecodeErrorZ");
+       *ret_conv = CResult_AnnouncementSignaturesDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_AnnouncementSignaturesDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* arg_conv = (LDKCResult_AnnouncementSignaturesDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_AnnouncementSignaturesDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_AnnouncementSignaturesDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* orig_conv = (LDKCResult_AnnouncementSignaturesDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AnnouncementSignaturesDecodeErrorZ), "LDKCResult_AnnouncementSignaturesDecodeErrorZ");
+       *ret_conv = CResult_AnnouncementSignaturesDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelReestablishDecodeErrorZ_ok(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 = ChannelReestablish_clone(&o_conv);
+       LDKCResult_ChannelReestablishDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReestablishDecodeErrorZ), "LDKCResult_ChannelReestablishDecodeErrorZ");
+       *ret_conv = CResult_ChannelReestablishDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelReestablishDecodeErrorZ_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_ChannelReestablishDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReestablishDecodeErrorZ), "LDKCResult_ChannelReestablishDecodeErrorZ");
+       *ret_conv = CResult_ChannelReestablishDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelReestablishDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelReestablishDecodeErrorZ* o_conv = (LDKCResult_ChannelReestablishDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelReestablishDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelReestablishDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelReestablishDecodeErrorZ _res_conv = *(LDKCResult_ChannelReestablishDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelReestablishDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelReestablishDecodeErrorZ_clone_ptr(LDKCResult_ChannelReestablishDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelReestablishDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReestablishDecodeErrorZ), "LDKCResult_ChannelReestablishDecodeErrorZ");
+       *ret_conv = CResult_ChannelReestablishDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelReestablishDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelReestablishDecodeErrorZ* arg_conv = (LDKCResult_ChannelReestablishDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelReestablishDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelReestablishDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelReestablishDecodeErrorZ* orig_conv = (LDKCResult_ChannelReestablishDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelReestablishDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReestablishDecodeErrorZ), "LDKCResult_ChannelReestablishDecodeErrorZ");
+       *ret_conv = CResult_ChannelReestablishDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ClosingSignedDecodeErrorZ_ok(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 = ClosingSigned_clone(&o_conv);
+       LDKCResult_ClosingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedDecodeErrorZ), "LDKCResult_ClosingSignedDecodeErrorZ");
+       *ret_conv = CResult_ClosingSignedDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ClosingSignedDecodeErrorZ_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_ClosingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedDecodeErrorZ), "LDKCResult_ClosingSignedDecodeErrorZ");
+       *ret_conv = CResult_ClosingSignedDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ClosingSignedDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ClosingSignedDecodeErrorZ* o_conv = (LDKCResult_ClosingSignedDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ClosingSignedDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ClosingSignedDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ClosingSignedDecodeErrorZ _res_conv = *(LDKCResult_ClosingSignedDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ClosingSignedDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ClosingSignedDecodeErrorZ_clone_ptr(LDKCResult_ClosingSignedDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ClosingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedDecodeErrorZ), "LDKCResult_ClosingSignedDecodeErrorZ");
+       *ret_conv = CResult_ClosingSignedDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ClosingSignedDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ClosingSignedDecodeErrorZ* arg_conv = (LDKCResult_ClosingSignedDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ClosingSignedDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ClosingSignedDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ClosingSignedDecodeErrorZ* orig_conv = (LDKCResult_ClosingSignedDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ClosingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedDecodeErrorZ), "LDKCResult_ClosingSignedDecodeErrorZ");
+       *ret_conv = CResult_ClosingSignedDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ClosingSignedFeeRangeDecodeErrorZ_ok(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 = ClosingSignedFeeRange_clone(&o_conv);
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ), "LDKCResult_ClosingSignedFeeRangeDecodeErrorZ");
+       *ret_conv = CResult_ClosingSignedFeeRangeDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ClosingSignedFeeRangeDecodeErrorZ_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_ClosingSignedFeeRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ), "LDKCResult_ClosingSignedFeeRangeDecodeErrorZ");
+       *ret_conv = CResult_ClosingSignedFeeRangeDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ClosingSignedFeeRangeDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* o_conv = (LDKCResult_ClosingSignedFeeRangeDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ClosingSignedFeeRangeDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ClosingSignedFeeRangeDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ _res_conv = *(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ClosingSignedFeeRangeDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ClosingSignedFeeRangeDecodeErrorZ_clone_ptr(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ), "LDKCResult_ClosingSignedFeeRangeDecodeErrorZ");
+       *ret_conv = CResult_ClosingSignedFeeRangeDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ClosingSignedFeeRangeDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* arg_conv = (LDKCResult_ClosingSignedFeeRangeDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ClosingSignedFeeRangeDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ClosingSignedFeeRangeDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* orig_conv = (LDKCResult_ClosingSignedFeeRangeDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ), "LDKCResult_ClosingSignedFeeRangeDecodeErrorZ");
+       *ret_conv = CResult_ClosingSignedFeeRangeDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CommitmentSignedDecodeErrorZ_ok(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 = CommitmentSigned_clone(&o_conv);
+       LDKCResult_CommitmentSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentSignedDecodeErrorZ), "LDKCResult_CommitmentSignedDecodeErrorZ");
+       *ret_conv = CResult_CommitmentSignedDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CommitmentSignedDecodeErrorZ_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_CommitmentSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentSignedDecodeErrorZ), "LDKCResult_CommitmentSignedDecodeErrorZ");
+       *ret_conv = CResult_CommitmentSignedDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CommitmentSignedDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_CommitmentSignedDecodeErrorZ* o_conv = (LDKCResult_CommitmentSignedDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CommitmentSignedDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CommitmentSignedDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CommitmentSignedDecodeErrorZ _res_conv = *(LDKCResult_CommitmentSignedDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CommitmentSignedDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CommitmentSignedDecodeErrorZ_clone_ptr(LDKCResult_CommitmentSignedDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CommitmentSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentSignedDecodeErrorZ), "LDKCResult_CommitmentSignedDecodeErrorZ");
+       *ret_conv = CResult_CommitmentSignedDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CommitmentSignedDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CommitmentSignedDecodeErrorZ* arg_conv = (LDKCResult_CommitmentSignedDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CommitmentSignedDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CommitmentSignedDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_CommitmentSignedDecodeErrorZ* orig_conv = (LDKCResult_CommitmentSignedDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_CommitmentSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentSignedDecodeErrorZ), "LDKCResult_CommitmentSignedDecodeErrorZ");
+       *ret_conv = CResult_CommitmentSignedDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_FundingCreatedDecodeErrorZ_ok(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 = FundingCreated_clone(&o_conv);
+       LDKCResult_FundingCreatedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingCreatedDecodeErrorZ), "LDKCResult_FundingCreatedDecodeErrorZ");
+       *ret_conv = CResult_FundingCreatedDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_FundingCreatedDecodeErrorZ_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_FundingCreatedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingCreatedDecodeErrorZ), "LDKCResult_FundingCreatedDecodeErrorZ");
+       *ret_conv = CResult_FundingCreatedDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_FundingCreatedDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_FundingCreatedDecodeErrorZ* o_conv = (LDKCResult_FundingCreatedDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_FundingCreatedDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_FundingCreatedDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_FundingCreatedDecodeErrorZ _res_conv = *(LDKCResult_FundingCreatedDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_FundingCreatedDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_FundingCreatedDecodeErrorZ_clone_ptr(LDKCResult_FundingCreatedDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_FundingCreatedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingCreatedDecodeErrorZ), "LDKCResult_FundingCreatedDecodeErrorZ");
+       *ret_conv = CResult_FundingCreatedDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_FundingCreatedDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_FundingCreatedDecodeErrorZ* arg_conv = (LDKCResult_FundingCreatedDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_FundingCreatedDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_FundingCreatedDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_FundingCreatedDecodeErrorZ* orig_conv = (LDKCResult_FundingCreatedDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_FundingCreatedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingCreatedDecodeErrorZ), "LDKCResult_FundingCreatedDecodeErrorZ");
+       *ret_conv = CResult_FundingCreatedDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_FundingSignedDecodeErrorZ_ok(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 = FundingSigned_clone(&o_conv);
+       LDKCResult_FundingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingSignedDecodeErrorZ), "LDKCResult_FundingSignedDecodeErrorZ");
+       *ret_conv = CResult_FundingSignedDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_FundingSignedDecodeErrorZ_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_FundingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingSignedDecodeErrorZ), "LDKCResult_FundingSignedDecodeErrorZ");
+       *ret_conv = CResult_FundingSignedDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_FundingSignedDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_FundingSignedDecodeErrorZ* o_conv = (LDKCResult_FundingSignedDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_FundingSignedDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_FundingSignedDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_FundingSignedDecodeErrorZ _res_conv = *(LDKCResult_FundingSignedDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_FundingSignedDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_FundingSignedDecodeErrorZ_clone_ptr(LDKCResult_FundingSignedDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_FundingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingSignedDecodeErrorZ), "LDKCResult_FundingSignedDecodeErrorZ");
+       *ret_conv = CResult_FundingSignedDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_FundingSignedDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_FundingSignedDecodeErrorZ* arg_conv = (LDKCResult_FundingSignedDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_FundingSignedDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_FundingSignedDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_FundingSignedDecodeErrorZ* orig_conv = (LDKCResult_FundingSignedDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_FundingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingSignedDecodeErrorZ), "LDKCResult_FundingSignedDecodeErrorZ");
+       *ret_conv = CResult_FundingSignedDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelReadyDecodeErrorZ_ok(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 = ChannelReady_clone(&o_conv);
+       LDKCResult_ChannelReadyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReadyDecodeErrorZ), "LDKCResult_ChannelReadyDecodeErrorZ");
+       *ret_conv = CResult_ChannelReadyDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelReadyDecodeErrorZ_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_ChannelReadyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReadyDecodeErrorZ), "LDKCResult_ChannelReadyDecodeErrorZ");
+       *ret_conv = CResult_ChannelReadyDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelReadyDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelReadyDecodeErrorZ* o_conv = (LDKCResult_ChannelReadyDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelReadyDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelReadyDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelReadyDecodeErrorZ _res_conv = *(LDKCResult_ChannelReadyDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelReadyDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelReadyDecodeErrorZ_clone_ptr(LDKCResult_ChannelReadyDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelReadyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReadyDecodeErrorZ), "LDKCResult_ChannelReadyDecodeErrorZ");
+       *ret_conv = CResult_ChannelReadyDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelReadyDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelReadyDecodeErrorZ* arg_conv = (LDKCResult_ChannelReadyDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelReadyDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelReadyDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelReadyDecodeErrorZ* orig_conv = (LDKCResult_ChannelReadyDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelReadyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReadyDecodeErrorZ), "LDKCResult_ChannelReadyDecodeErrorZ");
+       *ret_conv = CResult_ChannelReadyDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_InitDecodeErrorZ_ok(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 = Init_clone(&o_conv);
+       LDKCResult_InitDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitDecodeErrorZ), "LDKCResult_InitDecodeErrorZ");
+       *ret_conv = CResult_InitDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_InitDecodeErrorZ_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_InitDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitDecodeErrorZ), "LDKCResult_InitDecodeErrorZ");
+       *ret_conv = CResult_InitDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_InitDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_InitDecodeErrorZ* o_conv = (LDKCResult_InitDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_InitDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_InitDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_InitDecodeErrorZ _res_conv = *(LDKCResult_InitDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_InitDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_InitDecodeErrorZ_clone_ptr(LDKCResult_InitDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_InitDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitDecodeErrorZ), "LDKCResult_InitDecodeErrorZ");
+       *ret_conv = CResult_InitDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_InitDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_InitDecodeErrorZ* arg_conv = (LDKCResult_InitDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_InitDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_InitDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_InitDecodeErrorZ* orig_conv = (LDKCResult_InitDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_InitDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitDecodeErrorZ), "LDKCResult_InitDecodeErrorZ");
+       *ret_conv = CResult_InitDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OpenChannelDecodeErrorZ_ok(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 = OpenChannel_clone(&o_conv);
+       LDKCResult_OpenChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelDecodeErrorZ), "LDKCResult_OpenChannelDecodeErrorZ");
+       *ret_conv = CResult_OpenChannelDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OpenChannelDecodeErrorZ_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_OpenChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelDecodeErrorZ), "LDKCResult_OpenChannelDecodeErrorZ");
+       *ret_conv = CResult_OpenChannelDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_OpenChannelDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_OpenChannelDecodeErrorZ* o_conv = (LDKCResult_OpenChannelDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_OpenChannelDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_OpenChannelDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_OpenChannelDecodeErrorZ _res_conv = *(LDKCResult_OpenChannelDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_OpenChannelDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_OpenChannelDecodeErrorZ_clone_ptr(LDKCResult_OpenChannelDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_OpenChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelDecodeErrorZ), "LDKCResult_OpenChannelDecodeErrorZ");
+       *ret_conv = CResult_OpenChannelDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_OpenChannelDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_OpenChannelDecodeErrorZ* arg_conv = (LDKCResult_OpenChannelDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_OpenChannelDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_OpenChannelDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_OpenChannelDecodeErrorZ* orig_conv = (LDKCResult_OpenChannelDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_OpenChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelDecodeErrorZ), "LDKCResult_OpenChannelDecodeErrorZ");
+       *ret_conv = CResult_OpenChannelDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OpenChannelV2DecodeErrorZ_ok(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 = OpenChannelV2_clone(&o_conv);
+       LDKCResult_OpenChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelV2DecodeErrorZ), "LDKCResult_OpenChannelV2DecodeErrorZ");
+       *ret_conv = CResult_OpenChannelV2DecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OpenChannelV2DecodeErrorZ_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_OpenChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelV2DecodeErrorZ), "LDKCResult_OpenChannelV2DecodeErrorZ");
+       *ret_conv = CResult_OpenChannelV2DecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_OpenChannelV2DecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_OpenChannelV2DecodeErrorZ* o_conv = (LDKCResult_OpenChannelV2DecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_OpenChannelV2DecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_OpenChannelV2DecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_OpenChannelV2DecodeErrorZ _res_conv = *(LDKCResult_OpenChannelV2DecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_OpenChannelV2DecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_OpenChannelV2DecodeErrorZ_clone_ptr(LDKCResult_OpenChannelV2DecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_OpenChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelV2DecodeErrorZ), "LDKCResult_OpenChannelV2DecodeErrorZ");
+       *ret_conv = CResult_OpenChannelV2DecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_OpenChannelV2DecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_OpenChannelV2DecodeErrorZ* arg_conv = (LDKCResult_OpenChannelV2DecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_OpenChannelV2DecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_OpenChannelV2DecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_OpenChannelV2DecodeErrorZ* orig_conv = (LDKCResult_OpenChannelV2DecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_OpenChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelV2DecodeErrorZ), "LDKCResult_OpenChannelV2DecodeErrorZ");
+       *ret_conv = CResult_OpenChannelV2DecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RevokeAndACKDecodeErrorZ_ok(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 = RevokeAndACK_clone(&o_conv);
+       LDKCResult_RevokeAndACKDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevokeAndACKDecodeErrorZ), "LDKCResult_RevokeAndACKDecodeErrorZ");
+       *ret_conv = CResult_RevokeAndACKDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RevokeAndACKDecodeErrorZ_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_RevokeAndACKDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevokeAndACKDecodeErrorZ), "LDKCResult_RevokeAndACKDecodeErrorZ");
+       *ret_conv = CResult_RevokeAndACKDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RevokeAndACKDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RevokeAndACKDecodeErrorZ* o_conv = (LDKCResult_RevokeAndACKDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RevokeAndACKDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RevokeAndACKDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RevokeAndACKDecodeErrorZ _res_conv = *(LDKCResult_RevokeAndACKDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RevokeAndACKDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RevokeAndACKDecodeErrorZ_clone_ptr(LDKCResult_RevokeAndACKDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RevokeAndACKDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevokeAndACKDecodeErrorZ), "LDKCResult_RevokeAndACKDecodeErrorZ");
+       *ret_conv = CResult_RevokeAndACKDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RevokeAndACKDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RevokeAndACKDecodeErrorZ* arg_conv = (LDKCResult_RevokeAndACKDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RevokeAndACKDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RevokeAndACKDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RevokeAndACKDecodeErrorZ* orig_conv = (LDKCResult_RevokeAndACKDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RevokeAndACKDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevokeAndACKDecodeErrorZ), "LDKCResult_RevokeAndACKDecodeErrorZ");
+       *ret_conv = CResult_RevokeAndACKDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ShutdownDecodeErrorZ_ok(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 = Shutdown_clone(&o_conv);
+       LDKCResult_ShutdownDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownDecodeErrorZ), "LDKCResult_ShutdownDecodeErrorZ");
+       *ret_conv = CResult_ShutdownDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ShutdownDecodeErrorZ_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_ShutdownDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownDecodeErrorZ), "LDKCResult_ShutdownDecodeErrorZ");
+       *ret_conv = CResult_ShutdownDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ShutdownDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ShutdownDecodeErrorZ* o_conv = (LDKCResult_ShutdownDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ShutdownDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ShutdownDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ShutdownDecodeErrorZ _res_conv = *(LDKCResult_ShutdownDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ShutdownDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ShutdownDecodeErrorZ_clone_ptr(LDKCResult_ShutdownDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ShutdownDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownDecodeErrorZ), "LDKCResult_ShutdownDecodeErrorZ");
+       *ret_conv = CResult_ShutdownDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ShutdownDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ShutdownDecodeErrorZ* arg_conv = (LDKCResult_ShutdownDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ShutdownDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ShutdownDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ShutdownDecodeErrorZ* orig_conv = (LDKCResult_ShutdownDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ShutdownDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownDecodeErrorZ), "LDKCResult_ShutdownDecodeErrorZ");
+       *ret_conv = CResult_ShutdownDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateFailHTLCDecodeErrorZ_ok(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 = UpdateFailHTLC_clone(&o_conv);
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailHTLCDecodeErrorZ), "LDKCResult_UpdateFailHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFailHTLCDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateFailHTLCDecodeErrorZ_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_UpdateFailHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailHTLCDecodeErrorZ), "LDKCResult_UpdateFailHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFailHTLCDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UpdateFailHTLCDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* o_conv = (LDKCResult_UpdateFailHTLCDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UpdateFailHTLCDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UpdateFailHTLCDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UpdateFailHTLCDecodeErrorZ _res_conv = *(LDKCResult_UpdateFailHTLCDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UpdateFailHTLCDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UpdateFailHTLCDecodeErrorZ_clone_ptr(LDKCResult_UpdateFailHTLCDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailHTLCDecodeErrorZ), "LDKCResult_UpdateFailHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFailHTLCDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UpdateFailHTLCDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* arg_conv = (LDKCResult_UpdateFailHTLCDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UpdateFailHTLCDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UpdateFailHTLCDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* orig_conv = (LDKCResult_UpdateFailHTLCDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailHTLCDecodeErrorZ), "LDKCResult_UpdateFailHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFailHTLCDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateFailMalformedHTLCDecodeErrorZ_ok(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 = UpdateFailMalformedHTLC_clone(&o_conv);
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ), "LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFailMalformedHTLCDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateFailMalformedHTLCDecodeErrorZ_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_UpdateFailMalformedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ), "LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFailMalformedHTLCDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UpdateFailMalformedHTLCDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* o_conv = (LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UpdateFailMalformedHTLCDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UpdateFailMalformedHTLCDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ _res_conv = *(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UpdateFailMalformedHTLCDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UpdateFailMalformedHTLCDecodeErrorZ_clone_ptr(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ), "LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFailMalformedHTLCDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UpdateFailMalformedHTLCDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* arg_conv = (LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UpdateFailMalformedHTLCDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UpdateFailMalformedHTLCDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* orig_conv = (LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ), "LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFailMalformedHTLCDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateFeeDecodeErrorZ_ok(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 = UpdateFee_clone(&o_conv);
+       LDKCResult_UpdateFeeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFeeDecodeErrorZ), "LDKCResult_UpdateFeeDecodeErrorZ");
+       *ret_conv = CResult_UpdateFeeDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateFeeDecodeErrorZ_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_UpdateFeeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFeeDecodeErrorZ), "LDKCResult_UpdateFeeDecodeErrorZ");
+       *ret_conv = CResult_UpdateFeeDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UpdateFeeDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UpdateFeeDecodeErrorZ* o_conv = (LDKCResult_UpdateFeeDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UpdateFeeDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UpdateFeeDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UpdateFeeDecodeErrorZ _res_conv = *(LDKCResult_UpdateFeeDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UpdateFeeDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UpdateFeeDecodeErrorZ_clone_ptr(LDKCResult_UpdateFeeDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UpdateFeeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFeeDecodeErrorZ), "LDKCResult_UpdateFeeDecodeErrorZ");
+       *ret_conv = CResult_UpdateFeeDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UpdateFeeDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UpdateFeeDecodeErrorZ* arg_conv = (LDKCResult_UpdateFeeDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UpdateFeeDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UpdateFeeDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UpdateFeeDecodeErrorZ* orig_conv = (LDKCResult_UpdateFeeDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UpdateFeeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFeeDecodeErrorZ), "LDKCResult_UpdateFeeDecodeErrorZ");
+       *ret_conv = CResult_UpdateFeeDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_ok(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 = UpdateFulfillHTLC_clone(&o_conv);
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFulfillHTLCDecodeErrorZ), "LDKCResult_UpdateFulfillHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFulfillHTLCDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_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_UpdateFulfillHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFulfillHTLCDecodeErrorZ), "LDKCResult_UpdateFulfillHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFulfillHTLCDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* o_conv = (LDKCResult_UpdateFulfillHTLCDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UpdateFulfillHTLCDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ _res_conv = *(LDKCResult_UpdateFulfillHTLCDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UpdateFulfillHTLCDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UpdateFulfillHTLCDecodeErrorZ_clone_ptr(LDKCResult_UpdateFulfillHTLCDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFulfillHTLCDecodeErrorZ), "LDKCResult_UpdateFulfillHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFulfillHTLCDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* arg_conv = (LDKCResult_UpdateFulfillHTLCDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UpdateFulfillHTLCDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* orig_conv = (LDKCResult_UpdateFulfillHTLCDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFulfillHTLCDecodeErrorZ), "LDKCResult_UpdateFulfillHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateFulfillHTLCDecodeErrorZ_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);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = UpdateAddHTLC_clone(&o_conv);
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateAddHTLCDecodeErrorZ), "LDKCResult_UpdateAddHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateAddHTLCDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_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_UpdateAddHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateAddHTLCDecodeErrorZ), "LDKCResult_UpdateAddHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateAddHTLCDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* o_conv = (LDKCResult_UpdateAddHTLCDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UpdateAddHTLCDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UpdateAddHTLCDecodeErrorZ _res_conv = *(LDKCResult_UpdateAddHTLCDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UpdateAddHTLCDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UpdateAddHTLCDecodeErrorZ_clone_ptr(LDKCResult_UpdateAddHTLCDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateAddHTLCDecodeErrorZ), "LDKCResult_UpdateAddHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateAddHTLCDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* arg_conv = (LDKCResult_UpdateAddHTLCDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UpdateAddHTLCDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* orig_conv = (LDKCResult_UpdateAddHTLCDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateAddHTLCDecodeErrorZ), "LDKCResult_UpdateAddHTLCDecodeErrorZ");
+       *ret_conv = CResult_UpdateAddHTLCDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OnionMessageDecodeErrorZ_ok(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 = OnionMessage_clone(&o_conv);
+       LDKCResult_OnionMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessageDecodeErrorZ), "LDKCResult_OnionMessageDecodeErrorZ");
+       *ret_conv = CResult_OnionMessageDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OnionMessageDecodeErrorZ_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_OnionMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessageDecodeErrorZ), "LDKCResult_OnionMessageDecodeErrorZ");
+       *ret_conv = CResult_OnionMessageDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_OnionMessageDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_OnionMessageDecodeErrorZ* o_conv = (LDKCResult_OnionMessageDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_OnionMessageDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_OnionMessageDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_OnionMessageDecodeErrorZ _res_conv = *(LDKCResult_OnionMessageDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_OnionMessageDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_OnionMessageDecodeErrorZ_clone_ptr(LDKCResult_OnionMessageDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_OnionMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessageDecodeErrorZ), "LDKCResult_OnionMessageDecodeErrorZ");
+       *ret_conv = CResult_OnionMessageDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_OnionMessageDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_OnionMessageDecodeErrorZ* arg_conv = (LDKCResult_OnionMessageDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_OnionMessageDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_OnionMessageDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_OnionMessageDecodeErrorZ* orig_conv = (LDKCResult_OnionMessageDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_OnionMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessageDecodeErrorZ), "LDKCResult_OnionMessageDecodeErrorZ");
+       *ret_conv = CResult_OnionMessageDecodeErrorZ_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);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = Ping_clone(&o_conv);
+       LDKCResult_PingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PingDecodeErrorZ), "LDKCResult_PingDecodeErrorZ");
+       *ret_conv = CResult_PingDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PingDecodeErrorZ_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_PingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PingDecodeErrorZ), "LDKCResult_PingDecodeErrorZ");
+       *ret_conv = CResult_PingDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PingDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PingDecodeErrorZ* o_conv = (LDKCResult_PingDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PingDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PingDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PingDecodeErrorZ _res_conv = *(LDKCResult_PingDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PingDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PingDecodeErrorZ_clone_ptr(LDKCResult_PingDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PingDecodeErrorZ), "LDKCResult_PingDecodeErrorZ");
+       *ret_conv = CResult_PingDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PingDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PingDecodeErrorZ* arg_conv = (LDKCResult_PingDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PingDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PingDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PingDecodeErrorZ* orig_conv = (LDKCResult_PingDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PingDecodeErrorZ), "LDKCResult_PingDecodeErrorZ");
+       *ret_conv = CResult_PingDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PongDecodeErrorZ_ok(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 = Pong_clone(&o_conv);
+       LDKCResult_PongDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PongDecodeErrorZ), "LDKCResult_PongDecodeErrorZ");
+       *ret_conv = CResult_PongDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PongDecodeErrorZ_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_PongDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PongDecodeErrorZ), "LDKCResult_PongDecodeErrorZ");
+       *ret_conv = CResult_PongDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PongDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PongDecodeErrorZ* o_conv = (LDKCResult_PongDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PongDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PongDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PongDecodeErrorZ _res_conv = *(LDKCResult_PongDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PongDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PongDecodeErrorZ_clone_ptr(LDKCResult_PongDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PongDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PongDecodeErrorZ), "LDKCResult_PongDecodeErrorZ");
+       *ret_conv = CResult_PongDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PongDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PongDecodeErrorZ* arg_conv = (LDKCResult_PongDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PongDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PongDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PongDecodeErrorZ* orig_conv = (LDKCResult_PongDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PongDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PongDecodeErrorZ), "LDKCResult_PongDecodeErrorZ");
+       *ret_conv = CResult_PongDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UnsignedChannelAnnouncementDecodeErrorZ_ok(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 = UnsignedChannelAnnouncement_clone(&o_conv);
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ), "LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_UnsignedChannelAnnouncementDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UnsignedChannelAnnouncementDecodeErrorZ_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_UnsignedChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ), "LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_UnsignedChannelAnnouncementDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UnsignedChannelAnnouncementDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* o_conv = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UnsignedChannelAnnouncementDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UnsignedChannelAnnouncementDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ _res_conv = *(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UnsignedChannelAnnouncementDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UnsignedChannelAnnouncementDecodeErrorZ_clone_ptr(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ), "LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_UnsignedChannelAnnouncementDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UnsignedChannelAnnouncementDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* arg_conv = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UnsignedChannelAnnouncementDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UnsignedChannelAnnouncementDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* orig_conv = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ), "LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_UnsignedChannelAnnouncementDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelAnnouncementDecodeErrorZ_ok(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 = ChannelAnnouncement_clone(&o_conv);
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelAnnouncementDecodeErrorZ), "LDKCResult_ChannelAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_ChannelAnnouncementDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelAnnouncementDecodeErrorZ_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_ChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelAnnouncementDecodeErrorZ), "LDKCResult_ChannelAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_ChannelAnnouncementDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelAnnouncementDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* o_conv = (LDKCResult_ChannelAnnouncementDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelAnnouncementDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelAnnouncementDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelAnnouncementDecodeErrorZ _res_conv = *(LDKCResult_ChannelAnnouncementDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelAnnouncementDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelAnnouncementDecodeErrorZ_clone_ptr(LDKCResult_ChannelAnnouncementDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelAnnouncementDecodeErrorZ), "LDKCResult_ChannelAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_ChannelAnnouncementDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelAnnouncementDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* arg_conv = (LDKCResult_ChannelAnnouncementDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelAnnouncementDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelAnnouncementDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* orig_conv = (LDKCResult_ChannelAnnouncementDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelAnnouncementDecodeErrorZ), "LDKCResult_ChannelAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_ChannelAnnouncementDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UnsignedChannelUpdateDecodeErrorZ_ok(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 = UnsignedChannelUpdate_clone(&o_conv);
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelUpdateDecodeErrorZ), "LDKCResult_UnsignedChannelUpdateDecodeErrorZ");
+       *ret_conv = CResult_UnsignedChannelUpdateDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UnsignedChannelUpdateDecodeErrorZ_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_UnsignedChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelUpdateDecodeErrorZ), "LDKCResult_UnsignedChannelUpdateDecodeErrorZ");
+       *ret_conv = CResult_UnsignedChannelUpdateDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UnsignedChannelUpdateDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* o_conv = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UnsignedChannelUpdateDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UnsignedChannelUpdateDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ _res_conv = *(LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UnsignedChannelUpdateDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UnsignedChannelUpdateDecodeErrorZ_clone_ptr(LDKCResult_UnsignedChannelUpdateDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelUpdateDecodeErrorZ), "LDKCResult_UnsignedChannelUpdateDecodeErrorZ");
+       *ret_conv = CResult_UnsignedChannelUpdateDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UnsignedChannelUpdateDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* arg_conv = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UnsignedChannelUpdateDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UnsignedChannelUpdateDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* orig_conv = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelUpdateDecodeErrorZ), "LDKCResult_UnsignedChannelUpdateDecodeErrorZ");
+       *ret_conv = CResult_UnsignedChannelUpdateDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelUpdateDecodeErrorZ_ok(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 = ChannelUpdate_clone(&o_conv);
+       LDKCResult_ChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateDecodeErrorZ), "LDKCResult_ChannelUpdateDecodeErrorZ");
+       *ret_conv = CResult_ChannelUpdateDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelUpdateDecodeErrorZ_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_ChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateDecodeErrorZ), "LDKCResult_ChannelUpdateDecodeErrorZ");
+       *ret_conv = CResult_ChannelUpdateDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelUpdateDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelUpdateDecodeErrorZ* o_conv = (LDKCResult_ChannelUpdateDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelUpdateDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelUpdateDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelUpdateDecodeErrorZ _res_conv = *(LDKCResult_ChannelUpdateDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelUpdateDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelUpdateDecodeErrorZ_clone_ptr(LDKCResult_ChannelUpdateDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateDecodeErrorZ), "LDKCResult_ChannelUpdateDecodeErrorZ");
+       *ret_conv = CResult_ChannelUpdateDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelUpdateDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelUpdateDecodeErrorZ* arg_conv = (LDKCResult_ChannelUpdateDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelUpdateDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelUpdateDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelUpdateDecodeErrorZ* orig_conv = (LDKCResult_ChannelUpdateDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateDecodeErrorZ), "LDKCResult_ChannelUpdateDecodeErrorZ");
+       *ret_conv = CResult_ChannelUpdateDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ErrorMessageDecodeErrorZ_ok(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 = ErrorMessage_clone(&o_conv);
+       LDKCResult_ErrorMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ErrorMessageDecodeErrorZ), "LDKCResult_ErrorMessageDecodeErrorZ");
+       *ret_conv = CResult_ErrorMessageDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ErrorMessageDecodeErrorZ_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_ErrorMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ErrorMessageDecodeErrorZ), "LDKCResult_ErrorMessageDecodeErrorZ");
+       *ret_conv = CResult_ErrorMessageDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ErrorMessageDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ErrorMessageDecodeErrorZ* o_conv = (LDKCResult_ErrorMessageDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ErrorMessageDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ErrorMessageDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ErrorMessageDecodeErrorZ _res_conv = *(LDKCResult_ErrorMessageDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ErrorMessageDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ErrorMessageDecodeErrorZ_clone_ptr(LDKCResult_ErrorMessageDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ErrorMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ErrorMessageDecodeErrorZ), "LDKCResult_ErrorMessageDecodeErrorZ");
+       *ret_conv = CResult_ErrorMessageDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ErrorMessageDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ErrorMessageDecodeErrorZ* arg_conv = (LDKCResult_ErrorMessageDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ErrorMessageDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ErrorMessageDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ErrorMessageDecodeErrorZ* orig_conv = (LDKCResult_ErrorMessageDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ErrorMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ErrorMessageDecodeErrorZ), "LDKCResult_ErrorMessageDecodeErrorZ");
+       *ret_conv = CResult_ErrorMessageDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_WarningMessageDecodeErrorZ_ok(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 = WarningMessage_clone(&o_conv);
+       LDKCResult_WarningMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WarningMessageDecodeErrorZ), "LDKCResult_WarningMessageDecodeErrorZ");
+       *ret_conv = CResult_WarningMessageDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_WarningMessageDecodeErrorZ_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_WarningMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WarningMessageDecodeErrorZ), "LDKCResult_WarningMessageDecodeErrorZ");
+       *ret_conv = CResult_WarningMessageDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_WarningMessageDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_WarningMessageDecodeErrorZ* o_conv = (LDKCResult_WarningMessageDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_WarningMessageDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_WarningMessageDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_WarningMessageDecodeErrorZ _res_conv = *(LDKCResult_WarningMessageDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_WarningMessageDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_WarningMessageDecodeErrorZ_clone_ptr(LDKCResult_WarningMessageDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_WarningMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WarningMessageDecodeErrorZ), "LDKCResult_WarningMessageDecodeErrorZ");
+       *ret_conv = CResult_WarningMessageDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_WarningMessageDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_WarningMessageDecodeErrorZ* arg_conv = (LDKCResult_WarningMessageDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_WarningMessageDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_WarningMessageDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_WarningMessageDecodeErrorZ* orig_conv = (LDKCResult_WarningMessageDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_WarningMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WarningMessageDecodeErrorZ), "LDKCResult_WarningMessageDecodeErrorZ");
+       *ret_conv = CResult_WarningMessageDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UnsignedNodeAnnouncementDecodeErrorZ_ok(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 = UnsignedNodeAnnouncement_clone(&o_conv);
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ), "LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_UnsignedNodeAnnouncementDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UnsignedNodeAnnouncementDecodeErrorZ_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_UnsignedNodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ), "LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_UnsignedNodeAnnouncementDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UnsignedNodeAnnouncementDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* o_conv = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UnsignedNodeAnnouncementDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UnsignedNodeAnnouncementDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ _res_conv = *(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UnsignedNodeAnnouncementDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UnsignedNodeAnnouncementDecodeErrorZ_clone_ptr(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ), "LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_UnsignedNodeAnnouncementDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UnsignedNodeAnnouncementDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* arg_conv = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UnsignedNodeAnnouncementDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UnsignedNodeAnnouncementDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* orig_conv = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ), "LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_UnsignedNodeAnnouncementDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeAnnouncementDecodeErrorZ_ok(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 = NodeAnnouncement_clone(&o_conv);
+       LDKCResult_NodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementDecodeErrorZ), "LDKCResult_NodeAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NodeAnnouncementDecodeErrorZ_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_NodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementDecodeErrorZ), "LDKCResult_NodeAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NodeAnnouncementDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_NodeAnnouncementDecodeErrorZ* o_conv = (LDKCResult_NodeAnnouncementDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NodeAnnouncementDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NodeAnnouncementDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NodeAnnouncementDecodeErrorZ _res_conv = *(LDKCResult_NodeAnnouncementDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NodeAnnouncementDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NodeAnnouncementDecodeErrorZ_clone_ptr(LDKCResult_NodeAnnouncementDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementDecodeErrorZ), "LDKCResult_NodeAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NodeAnnouncementDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NodeAnnouncementDecodeErrorZ* arg_conv = (LDKCResult_NodeAnnouncementDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NodeAnnouncementDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NodeAnnouncementDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_NodeAnnouncementDecodeErrorZ* orig_conv = (LDKCResult_NodeAnnouncementDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_NodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementDecodeErrorZ), "LDKCResult_NodeAnnouncementDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_QueryShortChannelIdsDecodeErrorZ_ok(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 = QueryShortChannelIds_clone(&o_conv);
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryShortChannelIdsDecodeErrorZ), "LDKCResult_QueryShortChannelIdsDecodeErrorZ");
+       *ret_conv = CResult_QueryShortChannelIdsDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_QueryShortChannelIdsDecodeErrorZ_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_QueryShortChannelIdsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryShortChannelIdsDecodeErrorZ), "LDKCResult_QueryShortChannelIdsDecodeErrorZ");
+       *ret_conv = CResult_QueryShortChannelIdsDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_QueryShortChannelIdsDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* o_conv = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_QueryShortChannelIdsDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_QueryShortChannelIdsDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ _res_conv = *(LDKCResult_QueryShortChannelIdsDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_QueryShortChannelIdsDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_QueryShortChannelIdsDecodeErrorZ_clone_ptr(LDKCResult_QueryShortChannelIdsDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryShortChannelIdsDecodeErrorZ), "LDKCResult_QueryShortChannelIdsDecodeErrorZ");
+       *ret_conv = CResult_QueryShortChannelIdsDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_QueryShortChannelIdsDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* arg_conv = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_QueryShortChannelIdsDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_QueryShortChannelIdsDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* orig_conv = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryShortChannelIdsDecodeErrorZ), "LDKCResult_QueryShortChannelIdsDecodeErrorZ");
+       *ret_conv = CResult_QueryShortChannelIdsDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ReplyShortChannelIdsEndDecodeErrorZ_ok(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 = ReplyShortChannelIdsEnd_clone(&o_conv);
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ), "LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ");
+       *ret_conv = CResult_ReplyShortChannelIdsEndDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ReplyShortChannelIdsEndDecodeErrorZ_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_ReplyShortChannelIdsEndDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ), "LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ");
+       *ret_conv = CResult_ReplyShortChannelIdsEndDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ReplyShortChannelIdsEndDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* o_conv = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ReplyShortChannelIdsEndDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ReplyShortChannelIdsEndDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ _res_conv = *(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ReplyShortChannelIdsEndDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ReplyShortChannelIdsEndDecodeErrorZ_clone_ptr(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ), "LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ");
+       *ret_conv = CResult_ReplyShortChannelIdsEndDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ReplyShortChannelIdsEndDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* arg_conv = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ReplyShortChannelIdsEndDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ReplyShortChannelIdsEndDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* orig_conv = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ), "LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ");
+       *ret_conv = CResult_ReplyShortChannelIdsEndDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_QueryChannelRangeDecodeErrorZ_ok(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 = QueryChannelRange_clone(&o_conv);
+       LDKCResult_QueryChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryChannelRangeDecodeErrorZ), "LDKCResult_QueryChannelRangeDecodeErrorZ");
+       *ret_conv = CResult_QueryChannelRangeDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_QueryChannelRangeDecodeErrorZ_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_QueryChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryChannelRangeDecodeErrorZ), "LDKCResult_QueryChannelRangeDecodeErrorZ");
+       *ret_conv = CResult_QueryChannelRangeDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_QueryChannelRangeDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_QueryChannelRangeDecodeErrorZ* o_conv = (LDKCResult_QueryChannelRangeDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_QueryChannelRangeDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_QueryChannelRangeDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_QueryChannelRangeDecodeErrorZ _res_conv = *(LDKCResult_QueryChannelRangeDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_QueryChannelRangeDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_QueryChannelRangeDecodeErrorZ_clone_ptr(LDKCResult_QueryChannelRangeDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_QueryChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryChannelRangeDecodeErrorZ), "LDKCResult_QueryChannelRangeDecodeErrorZ");
+       *ret_conv = CResult_QueryChannelRangeDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_QueryChannelRangeDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_QueryChannelRangeDecodeErrorZ* arg_conv = (LDKCResult_QueryChannelRangeDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_QueryChannelRangeDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_QueryChannelRangeDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_QueryChannelRangeDecodeErrorZ* orig_conv = (LDKCResult_QueryChannelRangeDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_QueryChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryChannelRangeDecodeErrorZ), "LDKCResult_QueryChannelRangeDecodeErrorZ");
+       *ret_conv = CResult_QueryChannelRangeDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ReplyChannelRangeDecodeErrorZ_ok(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 = ReplyChannelRange_clone(&o_conv);
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyChannelRangeDecodeErrorZ), "LDKCResult_ReplyChannelRangeDecodeErrorZ");
+       *ret_conv = CResult_ReplyChannelRangeDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ReplyChannelRangeDecodeErrorZ_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_ReplyChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyChannelRangeDecodeErrorZ), "LDKCResult_ReplyChannelRangeDecodeErrorZ");
+       *ret_conv = CResult_ReplyChannelRangeDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ReplyChannelRangeDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* o_conv = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ReplyChannelRangeDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ReplyChannelRangeDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ReplyChannelRangeDecodeErrorZ _res_conv = *(LDKCResult_ReplyChannelRangeDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ReplyChannelRangeDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ReplyChannelRangeDecodeErrorZ_clone_ptr(LDKCResult_ReplyChannelRangeDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyChannelRangeDecodeErrorZ), "LDKCResult_ReplyChannelRangeDecodeErrorZ");
+       *ret_conv = CResult_ReplyChannelRangeDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ReplyChannelRangeDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* arg_conv = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ReplyChannelRangeDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ReplyChannelRangeDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* orig_conv = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyChannelRangeDecodeErrorZ), "LDKCResult_ReplyChannelRangeDecodeErrorZ");
+       *ret_conv = CResult_ReplyChannelRangeDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_ok(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 = GossipTimestampFilter_clone(&o_conv);
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_GossipTimestampFilterDecodeErrorZ), "LDKCResult_GossipTimestampFilterDecodeErrorZ");
+       *ret_conv = CResult_GossipTimestampFilterDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_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_GossipTimestampFilterDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_GossipTimestampFilterDecodeErrorZ), "LDKCResult_GossipTimestampFilterDecodeErrorZ");
+       *ret_conv = CResult_GossipTimestampFilterDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* o_conv = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_GossipTimestampFilterDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_GossipTimestampFilterDecodeErrorZ _res_conv = *(LDKCResult_GossipTimestampFilterDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_GossipTimestampFilterDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_GossipTimestampFilterDecodeErrorZ_clone_ptr(LDKCResult_GossipTimestampFilterDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_GossipTimestampFilterDecodeErrorZ), "LDKCResult_GossipTimestampFilterDecodeErrorZ");
+       *ret_conv = CResult_GossipTimestampFilterDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* arg_conv = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_GossipTimestampFilterDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* orig_conv = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_GossipTimestampFilterDecodeErrorZ), "LDKCResult_GossipTimestampFilterDecodeErrorZ");
+       *ret_conv = CResult_GossipTimestampFilterDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_PhantomRouteHintsZ_free(int64_tArray _res) {
+       LDKCVec_PhantomRouteHintsZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKPhantomRouteHints), "LDKCVec_PhantomRouteHintsZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t t = 0; t < _res_constr.datalen; t++) {
+               int64_t _res_conv_19 = _res_vals[t];
+               LDKPhantomRouteHints _res_conv_19_conv;
+               _res_conv_19_conv.inner = untag_ptr(_res_conv_19);
+               _res_conv_19_conv.is_owned = ptr_is_owned(_res_conv_19);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_19_conv);
+               _res_constr.data[t] = _res_conv_19_conv;
+       }
+       FREE(_res);
+       CVec_PhantomRouteHintsZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_ok(int64_t o) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_clone(&o_conv);
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceSignOrCreationErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKSignOrCreationError e_conv = *(LDKSignOrCreationError*)(e_ptr);
+       e_conv = SignOrCreationError_clone((LDKSignOrCreationError*)untag_ptr(e));
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceSignOrCreationErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_is_ok(int64_t o) {
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* o_conv = (LDKCResult_Bolt11InvoiceSignOrCreationErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_Bolt11InvoiceSignOrCreationErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ _res_conv = *(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_Bolt11InvoiceSignOrCreationErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_Bolt11InvoiceSignOrCreationErrorZ_clone_ptr(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ *NONNULL_PTR arg) {
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceSignOrCreationErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* arg_conv = (LDKCResult_Bolt11InvoiceSignOrCreationErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_Bolt11InvoiceSignOrCreationErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_clone(int64_t orig) {
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* orig_conv = (LDKCResult_Bolt11InvoiceSignOrCreationErrorZ*)untag_ptr(orig);
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceSignOrCreationErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_FutureZ_free(int64_tArray _res) {
+       LDKCVec_FutureZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKFuture), "LDKCVec_FutureZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t i = 0; i < _res_constr.datalen; i++) {
+               int64_t _res_conv_8 = _res_vals[i];
+               LDKFuture _res_conv_8_conv;
+               _res_conv_8_conv.inner = untag_ptr(_res_conv_8);
+               _res_conv_8_conv.is_owned = ptr_is_owned(_res_conv_8);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_8_conv);
+               _res_constr.data[i] = _res_conv_8_conv;
+       }
+       FREE(_res);
+       CVec_FutureZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_OffersMessageDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKOffersMessage o_conv = *(LDKOffersMessage*)(o_ptr);
+       o_conv = OffersMessage_clone((LDKOffersMessage*)untag_ptr(o));
+       LDKCResult_OffersMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OffersMessageDecodeErrorZ), "LDKCResult_OffersMessageDecodeErrorZ");
+       *ret_conv = CResult_OffersMessageDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OffersMessageDecodeErrorZ_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_OffersMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OffersMessageDecodeErrorZ), "LDKCResult_OffersMessageDecodeErrorZ");
+       *ret_conv = CResult_OffersMessageDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_OffersMessageDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_OffersMessageDecodeErrorZ* o_conv = (LDKCResult_OffersMessageDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_OffersMessageDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_OffersMessageDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_OffersMessageDecodeErrorZ _res_conv = *(LDKCResult_OffersMessageDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_OffersMessageDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_OffersMessageDecodeErrorZ_clone_ptr(LDKCResult_OffersMessageDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_OffersMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OffersMessageDecodeErrorZ), "LDKCResult_OffersMessageDecodeErrorZ");
+       *ret_conv = CResult_OffersMessageDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_OffersMessageDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_OffersMessageDecodeErrorZ* arg_conv = (LDKCResult_OffersMessageDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_OffersMessageDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_OffersMessageDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_OffersMessageDecodeErrorZ* orig_conv = (LDKCResult_OffersMessageDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_OffersMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OffersMessageDecodeErrorZ), "LDKCResult_OffersMessageDecodeErrorZ");
+       *ret_conv = CResult_OffersMessageDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_HTLCClaimZ_some(int32_t o) {
+       LDKHTLCClaim o_conv = LDKHTLCClaim_from_cs(o);
+       LDKCOption_HTLCClaimZ *ret_copy = MALLOC(sizeof(LDKCOption_HTLCClaimZ), "LDKCOption_HTLCClaimZ");
+       *ret_copy = COption_HTLCClaimZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_HTLCClaimZ_none() {
+       LDKCOption_HTLCClaimZ *ret_copy = MALLOC(sizeof(LDKCOption_HTLCClaimZ), "LDKCOption_HTLCClaimZ");
+       *ret_copy = COption_HTLCClaimZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_HTLCClaimZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_HTLCClaimZ _res_conv = *(LDKCOption_HTLCClaimZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_HTLCClaimZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_CounterpartyCommitmentSecretsDecodeErrorZ_ok(int64_t o) {
+       LDKCounterpartyCommitmentSecrets 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 = CounterpartyCommitmentSecrets_clone(&o_conv);
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ), "LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyCommitmentSecretsDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CounterpartyCommitmentSecretsDecodeErrorZ_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_CounterpartyCommitmentSecretsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ), "LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyCommitmentSecretsDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CounterpartyCommitmentSecretsDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* o_conv = (LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CounterpartyCommitmentSecretsDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CounterpartyCommitmentSecretsDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ _res_conv = *(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CounterpartyCommitmentSecretsDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CounterpartyCommitmentSecretsDecodeErrorZ_clone_ptr(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ), "LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyCommitmentSecretsDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CounterpartyCommitmentSecretsDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* arg_conv = (LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CounterpartyCommitmentSecretsDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CounterpartyCommitmentSecretsDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* orig_conv = (LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ), "LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyCommitmentSecretsDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxCreationKeysDecodeErrorZ_ok(int64_t o) {
+       LDKTxCreationKeys 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 = TxCreationKeys_clone(&o_conv);
+       LDKCResult_TxCreationKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCreationKeysDecodeErrorZ), "LDKCResult_TxCreationKeysDecodeErrorZ");
+       *ret_conv = CResult_TxCreationKeysDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxCreationKeysDecodeErrorZ_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_TxCreationKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCreationKeysDecodeErrorZ), "LDKCResult_TxCreationKeysDecodeErrorZ");
+       *ret_conv = CResult_TxCreationKeysDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxCreationKeysDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxCreationKeysDecodeErrorZ* o_conv = (LDKCResult_TxCreationKeysDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxCreationKeysDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxCreationKeysDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxCreationKeysDecodeErrorZ _res_conv = *(LDKCResult_TxCreationKeysDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxCreationKeysDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxCreationKeysDecodeErrorZ_clone_ptr(LDKCResult_TxCreationKeysDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxCreationKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCreationKeysDecodeErrorZ), "LDKCResult_TxCreationKeysDecodeErrorZ");
+       *ret_conv = CResult_TxCreationKeysDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxCreationKeysDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxCreationKeysDecodeErrorZ* arg_conv = (LDKCResult_TxCreationKeysDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxCreationKeysDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxCreationKeysDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TxCreationKeysDecodeErrorZ* orig_conv = (LDKCResult_TxCreationKeysDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TxCreationKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCreationKeysDecodeErrorZ), "LDKCResult_TxCreationKeysDecodeErrorZ");
+       *ret_conv = CResult_TxCreationKeysDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelPublicKeysDecodeErrorZ_ok(int64_t o) {
+       LDKChannelPublicKeys 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 = ChannelPublicKeys_clone(&o_conv);
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelPublicKeysDecodeErrorZ), "LDKCResult_ChannelPublicKeysDecodeErrorZ");
+       *ret_conv = CResult_ChannelPublicKeysDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelPublicKeysDecodeErrorZ_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_ChannelPublicKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelPublicKeysDecodeErrorZ), "LDKCResult_ChannelPublicKeysDecodeErrorZ");
+       *ret_conv = CResult_ChannelPublicKeysDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelPublicKeysDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* o_conv = (LDKCResult_ChannelPublicKeysDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelPublicKeysDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelPublicKeysDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelPublicKeysDecodeErrorZ _res_conv = *(LDKCResult_ChannelPublicKeysDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelPublicKeysDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelPublicKeysDecodeErrorZ_clone_ptr(LDKCResult_ChannelPublicKeysDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelPublicKeysDecodeErrorZ), "LDKCResult_ChannelPublicKeysDecodeErrorZ");
+       *ret_conv = CResult_ChannelPublicKeysDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelPublicKeysDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* arg_conv = (LDKCResult_ChannelPublicKeysDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelPublicKeysDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelPublicKeysDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* orig_conv = (LDKCResult_ChannelPublicKeysDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelPublicKeysDecodeErrorZ), "LDKCResult_ChannelPublicKeysDecodeErrorZ");
+       *ret_conv = CResult_ChannelPublicKeysDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HTLCOutputInCommitmentDecodeErrorZ_ok(int64_t o) {
+       LDKHTLCOutputInCommitment 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 = HTLCOutputInCommitment_clone(&o_conv);
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ), "LDKCResult_HTLCOutputInCommitmentDecodeErrorZ");
+       *ret_conv = CResult_HTLCOutputInCommitmentDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HTLCOutputInCommitmentDecodeErrorZ_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_HTLCOutputInCommitmentDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ), "LDKCResult_HTLCOutputInCommitmentDecodeErrorZ");
+       *ret_conv = CResult_HTLCOutputInCommitmentDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_HTLCOutputInCommitmentDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* o_conv = (LDKCResult_HTLCOutputInCommitmentDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_HTLCOutputInCommitmentDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_HTLCOutputInCommitmentDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ _res_conv = *(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_HTLCOutputInCommitmentDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_HTLCOutputInCommitmentDecodeErrorZ_clone_ptr(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ), "LDKCResult_HTLCOutputInCommitmentDecodeErrorZ");
+       *ret_conv = CResult_HTLCOutputInCommitmentDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_HTLCOutputInCommitmentDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* arg_conv = (LDKCResult_HTLCOutputInCommitmentDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_HTLCOutputInCommitmentDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_HTLCOutputInCommitmentDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* orig_conv = (LDKCResult_HTLCOutputInCommitmentDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ), "LDKCResult_HTLCOutputInCommitmentDecodeErrorZ");
+       *ret_conv = CResult_HTLCOutputInCommitmentDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_ok(int64_t o) {
+       LDKCounterpartyChannelTransactionParameters 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 = CounterpartyChannelTransactionParameters_clone(&o_conv);
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ), "LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_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_CounterpartyChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ), "LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* o_conv = (LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ _res_conv = *(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_clone_ptr(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ), "LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* arg_conv = (LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* orig_conv = (LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ), "LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CResult_CounterpartyChannelTransactionParametersDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelTransactionParametersDecodeErrorZ_ok(int64_t o) {
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_clone(&o_conv);
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTransactionParametersDecodeErrorZ), "LDKCResult_ChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CResult_ChannelTransactionParametersDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ChannelTransactionParametersDecodeErrorZ_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_ChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTransactionParametersDecodeErrorZ), "LDKCResult_ChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CResult_ChannelTransactionParametersDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ChannelTransactionParametersDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* o_conv = (LDKCResult_ChannelTransactionParametersDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ChannelTransactionParametersDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ChannelTransactionParametersDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ _res_conv = *(LDKCResult_ChannelTransactionParametersDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ChannelTransactionParametersDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ChannelTransactionParametersDecodeErrorZ_clone_ptr(LDKCResult_ChannelTransactionParametersDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTransactionParametersDecodeErrorZ), "LDKCResult_ChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CResult_ChannelTransactionParametersDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ChannelTransactionParametersDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* arg_conv = (LDKCResult_ChannelTransactionParametersDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ChannelTransactionParametersDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ChannelTransactionParametersDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* orig_conv = (LDKCResult_ChannelTransactionParametersDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTransactionParametersDecodeErrorZ), "LDKCResult_ChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CResult_ChannelTransactionParametersDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HolderCommitmentTransactionDecodeErrorZ_ok(int64_t o) {
+       LDKHolderCommitmentTransaction 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 = HolderCommitmentTransaction_clone(&o_conv);
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HolderCommitmentTransactionDecodeErrorZ), "LDKCResult_HolderCommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_HolderCommitmentTransactionDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HolderCommitmentTransactionDecodeErrorZ_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_HolderCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HolderCommitmentTransactionDecodeErrorZ), "LDKCResult_HolderCommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_HolderCommitmentTransactionDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_HolderCommitmentTransactionDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* o_conv = (LDKCResult_HolderCommitmentTransactionDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_HolderCommitmentTransactionDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_HolderCommitmentTransactionDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ _res_conv = *(LDKCResult_HolderCommitmentTransactionDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_HolderCommitmentTransactionDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_HolderCommitmentTransactionDecodeErrorZ_clone_ptr(LDKCResult_HolderCommitmentTransactionDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HolderCommitmentTransactionDecodeErrorZ), "LDKCResult_HolderCommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_HolderCommitmentTransactionDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_HolderCommitmentTransactionDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* arg_conv = (LDKCResult_HolderCommitmentTransactionDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_HolderCommitmentTransactionDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_HolderCommitmentTransactionDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* orig_conv = (LDKCResult_HolderCommitmentTransactionDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HolderCommitmentTransactionDecodeErrorZ), "LDKCResult_HolderCommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_HolderCommitmentTransactionDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BuiltCommitmentTransactionDecodeErrorZ_ok(int64_t o) {
+       LDKBuiltCommitmentTransaction 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 = BuiltCommitmentTransaction_clone(&o_conv);
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ), "LDKCResult_BuiltCommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_BuiltCommitmentTransactionDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BuiltCommitmentTransactionDecodeErrorZ_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_BuiltCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ), "LDKCResult_BuiltCommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_BuiltCommitmentTransactionDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BuiltCommitmentTransactionDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* o_conv = (LDKCResult_BuiltCommitmentTransactionDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BuiltCommitmentTransactionDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BuiltCommitmentTransactionDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ _res_conv = *(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BuiltCommitmentTransactionDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BuiltCommitmentTransactionDecodeErrorZ_clone_ptr(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ), "LDKCResult_BuiltCommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_BuiltCommitmentTransactionDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BuiltCommitmentTransactionDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* arg_conv = (LDKCResult_BuiltCommitmentTransactionDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BuiltCommitmentTransactionDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BuiltCommitmentTransactionDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* orig_conv = (LDKCResult_BuiltCommitmentTransactionDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ), "LDKCResult_BuiltCommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_BuiltCommitmentTransactionDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TrustedClosingTransactionNoneZ_ok(int64_t o) {
+       LDKTrustedClosingTransaction o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       // WARNING: we need a move here but no clone is available for LDKTrustedClosingTransaction
+       
+       LDKCResult_TrustedClosingTransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TrustedClosingTransactionNoneZ), "LDKCResult_TrustedClosingTransactionNoneZ");
+       *ret_conv = CResult_TrustedClosingTransactionNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TrustedClosingTransactionNoneZ_err() {
+       LDKCResult_TrustedClosingTransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TrustedClosingTransactionNoneZ), "LDKCResult_TrustedClosingTransactionNoneZ");
+       *ret_conv = CResult_TrustedClosingTransactionNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TrustedClosingTransactionNoneZ_is_ok(int64_t o) {
+       LDKCResult_TrustedClosingTransactionNoneZ* o_conv = (LDKCResult_TrustedClosingTransactionNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TrustedClosingTransactionNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TrustedClosingTransactionNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TrustedClosingTransactionNoneZ _res_conv = *(LDKCResult_TrustedClosingTransactionNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TrustedClosingTransactionNoneZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_CommitmentTransactionDecodeErrorZ_ok(int64_t o) {
+       LDKCommitmentTransaction 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 = CommitmentTransaction_clone(&o_conv);
+       LDKCResult_CommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentTransactionDecodeErrorZ), "LDKCResult_CommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_CommitmentTransactionDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CommitmentTransactionDecodeErrorZ_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_CommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentTransactionDecodeErrorZ), "LDKCResult_CommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_CommitmentTransactionDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CommitmentTransactionDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_CommitmentTransactionDecodeErrorZ* o_conv = (LDKCResult_CommitmentTransactionDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CommitmentTransactionDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CommitmentTransactionDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CommitmentTransactionDecodeErrorZ _res_conv = *(LDKCResult_CommitmentTransactionDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CommitmentTransactionDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CommitmentTransactionDecodeErrorZ_clone_ptr(LDKCResult_CommitmentTransactionDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_CommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentTransactionDecodeErrorZ), "LDKCResult_CommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_CommitmentTransactionDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CommitmentTransactionDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_CommitmentTransactionDecodeErrorZ* arg_conv = (LDKCResult_CommitmentTransactionDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CommitmentTransactionDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CommitmentTransactionDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_CommitmentTransactionDecodeErrorZ* orig_conv = (LDKCResult_CommitmentTransactionDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_CommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentTransactionDecodeErrorZ), "LDKCResult_CommitmentTransactionDecodeErrorZ");
+       *ret_conv = CResult_CommitmentTransactionDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TrustedCommitmentTransactionNoneZ_ok(int64_t o) {
+       LDKTrustedCommitmentTransaction o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       // WARNING: we need a move here but no clone is available for LDKTrustedCommitmentTransaction
+       
+       LDKCResult_TrustedCommitmentTransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TrustedCommitmentTransactionNoneZ), "LDKCResult_TrustedCommitmentTransactionNoneZ");
+       *ret_conv = CResult_TrustedCommitmentTransactionNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TrustedCommitmentTransactionNoneZ_err() {
+       LDKCResult_TrustedCommitmentTransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TrustedCommitmentTransactionNoneZ), "LDKCResult_TrustedCommitmentTransactionNoneZ");
+       *ret_conv = CResult_TrustedCommitmentTransactionNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TrustedCommitmentTransactionNoneZ_is_ok(int64_t o) {
+       LDKCResult_TrustedCommitmentTransactionNoneZ* o_conv = (LDKCResult_TrustedCommitmentTransactionNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TrustedCommitmentTransactionNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TrustedCommitmentTransactionNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TrustedCommitmentTransactionNoneZ _res_conv = *(LDKCResult_TrustedCommitmentTransactionNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TrustedCommitmentTransactionNoneZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_ok(ptrArray o) {
+       LDKCVec_ECDSASignatureZ o_constr;
+       o_constr.datalen = o->arr_len;
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_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];
+               LDKECDSASignature o_conv_8_ref;
+               CHECK(o_conv_8->arr_len == 64);
+               memcpy(o_conv_8_ref.compact_form, o_conv_8->elems, 64); FREE(o_conv_8);
+               o_constr.data[i] = o_conv_8_ref;
+       }
+       FREE(o);
+       LDKCResult_CVec_ECDSASignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_ECDSASignatureZNoneZ), "LDKCResult_CVec_ECDSASignatureZNoneZ");
+       *ret_conv = CResult_CVec_ECDSASignatureZNoneZ_ok(o_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_err() {
+       LDKCResult_CVec_ECDSASignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_ECDSASignatureZNoneZ), "LDKCResult_CVec_ECDSASignatureZNoneZ");
+       *ret_conv = CResult_CVec_ECDSASignatureZNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_is_ok(int64_t o) {
+       LDKCResult_CVec_ECDSASignatureZNoneZ* o_conv = (LDKCResult_CVec_ECDSASignatureZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_ECDSASignatureZNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_ECDSASignatureZNoneZ _res_conv = *(LDKCResult_CVec_ECDSASignatureZNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_ECDSASignatureZNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_ECDSASignatureZNoneZ_clone_ptr(LDKCResult_CVec_ECDSASignatureZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_ECDSASignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_ECDSASignatureZNoneZ), "LDKCResult_CVec_ECDSASignatureZNoneZ");
+       *ret_conv = CResult_CVec_ECDSASignatureZNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_ECDSASignatureZNoneZ* arg_conv = (LDKCResult_CVec_ECDSASignatureZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_ECDSASignatureZNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_clone(int64_t orig) {
+       LDKCResult_CVec_ECDSASignatureZNoneZ* orig_conv = (LDKCResult_CVec_ECDSASignatureZNoneZ*)untag_ptr(orig);
+       LDKCResult_CVec_ECDSASignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_ECDSASignatureZNoneZ), "LDKCResult_CVec_ECDSASignatureZNoneZ");
+       *ret_conv = CResult_CVec_ECDSASignatureZNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_usizeZ_some(int64_t o) {
+       LDKCOption_usizeZ *ret_copy = MALLOC(sizeof(LDKCOption_usizeZ), "LDKCOption_usizeZ");
+       *ret_copy = COption_usizeZ_some(o);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_usizeZ_none() {
+       LDKCOption_usizeZ *ret_copy = MALLOC(sizeof(LDKCOption_usizeZ), "LDKCOption_usizeZ");
+       *ret_copy = COption_usizeZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_usizeZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_usizeZ _res_conv = *(LDKCOption_usizeZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_usizeZ_free(_res_conv);
+}
+
+static inline uint64_t COption_usizeZ_clone_ptr(LDKCOption_usizeZ *NONNULL_PTR arg) {
+       LDKCOption_usizeZ *ret_copy = MALLOC(sizeof(LDKCOption_usizeZ), "LDKCOption_usizeZ");
+       *ret_copy = COption_usizeZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_usizeZ_clone_ptr(int64_t arg) {
+       LDKCOption_usizeZ* arg_conv = (LDKCOption_usizeZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_usizeZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_usizeZ_clone(int64_t orig) {
+       LDKCOption_usizeZ* orig_conv = (LDKCOption_usizeZ*)untag_ptr(orig);
+       LDKCOption_usizeZ *ret_copy = MALLOC(sizeof(LDKCOption_usizeZ), "LDKCOption_usizeZ");
+       *ret_copy = COption_usizeZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptDecodeErrorZ_ok(int64_t o) {
+       LDKShutdownScript 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 = ShutdownScript_clone(&o_conv);
+       LDKCResult_ShutdownScriptDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptDecodeErrorZ), "LDKCResult_ShutdownScriptDecodeErrorZ");
+       *ret_conv = CResult_ShutdownScriptDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptDecodeErrorZ_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_ShutdownScriptDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptDecodeErrorZ), "LDKCResult_ShutdownScriptDecodeErrorZ");
+       *ret_conv = CResult_ShutdownScriptDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ShutdownScriptDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ShutdownScriptDecodeErrorZ* o_conv = (LDKCResult_ShutdownScriptDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ShutdownScriptDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ShutdownScriptDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ShutdownScriptDecodeErrorZ _res_conv = *(LDKCResult_ShutdownScriptDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ShutdownScriptDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ShutdownScriptDecodeErrorZ_clone_ptr(LDKCResult_ShutdownScriptDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ShutdownScriptDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptDecodeErrorZ), "LDKCResult_ShutdownScriptDecodeErrorZ");
+       *ret_conv = CResult_ShutdownScriptDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ShutdownScriptDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ShutdownScriptDecodeErrorZ* arg_conv = (LDKCResult_ShutdownScriptDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ShutdownScriptDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ShutdownScriptDecodeErrorZ* orig_conv = (LDKCResult_ShutdownScriptDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ShutdownScriptDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptDecodeErrorZ), "LDKCResult_ShutdownScriptDecodeErrorZ");
+       *ret_conv = CResult_ShutdownScriptDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_ok(int64_t o) {
+       LDKShutdownScript 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 = ShutdownScript_clone(&o_conv);
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptInvalidShutdownScriptZ), "LDKCResult_ShutdownScriptInvalidShutdownScriptZ");
+       *ret_conv = CResult_ShutdownScriptInvalidShutdownScriptZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_err(int64_t e) {
+       LDKInvalidShutdownScript e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       e_conv = InvalidShutdownScript_clone(&e_conv);
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptInvalidShutdownScriptZ), "LDKCResult_ShutdownScriptInvalidShutdownScriptZ");
+       *ret_conv = CResult_ShutdownScriptInvalidShutdownScriptZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_is_ok(int64_t o) {
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* o_conv = (LDKCResult_ShutdownScriptInvalidShutdownScriptZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ShutdownScriptInvalidShutdownScriptZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ _res_conv = *(LDKCResult_ShutdownScriptInvalidShutdownScriptZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ShutdownScriptInvalidShutdownScriptZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ShutdownScriptInvalidShutdownScriptZ_clone_ptr(LDKCResult_ShutdownScriptInvalidShutdownScriptZ *NONNULL_PTR arg) {
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptInvalidShutdownScriptZ), "LDKCResult_ShutdownScriptInvalidShutdownScriptZ");
+       *ret_conv = CResult_ShutdownScriptInvalidShutdownScriptZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_clone_ptr(int64_t arg) {
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* arg_conv = (LDKCResult_ShutdownScriptInvalidShutdownScriptZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ShutdownScriptInvalidShutdownScriptZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_clone(int64_t orig) {
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* orig_conv = (LDKCResult_ShutdownScriptInvalidShutdownScriptZ*)untag_ptr(orig);
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptInvalidShutdownScriptZ), "LDKCResult_ShutdownScriptInvalidShutdownScriptZ");
+       *ret_conv = CResult_ShutdownScriptInvalidShutdownScriptZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PaymentPurposeDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKPaymentPurpose o_conv = *(LDKPaymentPurpose*)(o_ptr);
+       o_conv = PaymentPurpose_clone((LDKPaymentPurpose*)untag_ptr(o));
+       LDKCResult_PaymentPurposeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentPurposeDecodeErrorZ), "LDKCResult_PaymentPurposeDecodeErrorZ");
+       *ret_conv = CResult_PaymentPurposeDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PaymentPurposeDecodeErrorZ_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_PaymentPurposeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentPurposeDecodeErrorZ), "LDKCResult_PaymentPurposeDecodeErrorZ");
+       *ret_conv = CResult_PaymentPurposeDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PaymentPurposeDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PaymentPurposeDecodeErrorZ* o_conv = (LDKCResult_PaymentPurposeDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PaymentPurposeDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PaymentPurposeDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PaymentPurposeDecodeErrorZ _res_conv = *(LDKCResult_PaymentPurposeDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PaymentPurposeDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PaymentPurposeDecodeErrorZ_clone_ptr(LDKCResult_PaymentPurposeDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PaymentPurposeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentPurposeDecodeErrorZ), "LDKCResult_PaymentPurposeDecodeErrorZ");
+       *ret_conv = CResult_PaymentPurposeDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PaymentPurposeDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PaymentPurposeDecodeErrorZ* arg_conv = (LDKCResult_PaymentPurposeDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PaymentPurposeDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PaymentPurposeDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PaymentPurposeDecodeErrorZ* orig_conv = (LDKCResult_PaymentPurposeDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PaymentPurposeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentPurposeDecodeErrorZ), "LDKCResult_PaymentPurposeDecodeErrorZ");
+       *ret_conv = CResult_PaymentPurposeDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_ok(int64_t o) {
+       LDKClaimedHTLC 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 = ClaimedHTLC_clone(&o_conv);
+       LDKCResult_ClaimedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClaimedHTLCDecodeErrorZ), "LDKCResult_ClaimedHTLCDecodeErrorZ");
+       *ret_conv = CResult_ClaimedHTLCDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_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_ClaimedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClaimedHTLCDecodeErrorZ), "LDKCResult_ClaimedHTLCDecodeErrorZ");
+       *ret_conv = CResult_ClaimedHTLCDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_ClaimedHTLCDecodeErrorZ* o_conv = (LDKCResult_ClaimedHTLCDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ClaimedHTLCDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ClaimedHTLCDecodeErrorZ _res_conv = *(LDKCResult_ClaimedHTLCDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ClaimedHTLCDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ClaimedHTLCDecodeErrorZ_clone_ptr(LDKCResult_ClaimedHTLCDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_ClaimedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClaimedHTLCDecodeErrorZ), "LDKCResult_ClaimedHTLCDecodeErrorZ");
+       *ret_conv = CResult_ClaimedHTLCDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_ClaimedHTLCDecodeErrorZ* arg_conv = (LDKCResult_ClaimedHTLCDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ClaimedHTLCDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_ClaimedHTLCDecodeErrorZ* orig_conv = (LDKCResult_ClaimedHTLCDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_ClaimedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClaimedHTLCDecodeErrorZ), "LDKCResult_ClaimedHTLCDecodeErrorZ");
+       *ret_conv = CResult_ClaimedHTLCDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_PathFailureZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKPathFailure o_conv = *(LDKPathFailure*)(o_ptr);
+       o_conv = PathFailure_clone((LDKPathFailure*)untag_ptr(o));
+       LDKCOption_PathFailureZ *ret_copy = MALLOC(sizeof(LDKCOption_PathFailureZ), "LDKCOption_PathFailureZ");
+       *ret_copy = COption_PathFailureZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_PathFailureZ_none() {
+       LDKCOption_PathFailureZ *ret_copy = MALLOC(sizeof(LDKCOption_PathFailureZ), "LDKCOption_PathFailureZ");
+       *ret_copy = COption_PathFailureZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_PathFailureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_PathFailureZ _res_conv = *(LDKCOption_PathFailureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_PathFailureZ_free(_res_conv);
+}
+
+static inline uint64_t COption_PathFailureZ_clone_ptr(LDKCOption_PathFailureZ *NONNULL_PTR arg) {
+       LDKCOption_PathFailureZ *ret_copy = MALLOC(sizeof(LDKCOption_PathFailureZ), "LDKCOption_PathFailureZ");
+       *ret_copy = COption_PathFailureZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_PathFailureZ_clone_ptr(int64_t arg) {
+       LDKCOption_PathFailureZ* arg_conv = (LDKCOption_PathFailureZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_PathFailureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_PathFailureZ_clone(int64_t orig) {
+       LDKCOption_PathFailureZ* orig_conv = (LDKCOption_PathFailureZ*)untag_ptr(orig);
+       LDKCOption_PathFailureZ *ret_copy = MALLOC(sizeof(LDKCOption_PathFailureZ), "LDKCOption_PathFailureZ");
+       *ret_copy = COption_PathFailureZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_PathFailureZ o_conv = *(LDKCOption_PathFailureZ*)(o_ptr);
+       o_conv = COption_PathFailureZ_clone((LDKCOption_PathFailureZ*)untag_ptr(o));
+       LDKCResult_COption_PathFailureZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_PathFailureZDecodeErrorZ), "LDKCResult_COption_PathFailureZDecodeErrorZ");
+       *ret_conv = CResult_COption_PathFailureZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_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_COption_PathFailureZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_PathFailureZDecodeErrorZ), "LDKCResult_COption_PathFailureZDecodeErrorZ");
+       *ret_conv = CResult_COption_PathFailureZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_PathFailureZDecodeErrorZ* o_conv = (LDKCResult_COption_PathFailureZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_PathFailureZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_PathFailureZDecodeErrorZ _res_conv = *(LDKCResult_COption_PathFailureZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_PathFailureZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_PathFailureZDecodeErrorZ_clone_ptr(LDKCResult_COption_PathFailureZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_PathFailureZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_PathFailureZDecodeErrorZ), "LDKCResult_COption_PathFailureZDecodeErrorZ");
+       *ret_conv = CResult_COption_PathFailureZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_PathFailureZDecodeErrorZ* arg_conv = (LDKCResult_COption_PathFailureZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_PathFailureZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_PathFailureZDecodeErrorZ* orig_conv = (LDKCResult_COption_PathFailureZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_PathFailureZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_PathFailureZDecodeErrorZ), "LDKCResult_COption_PathFailureZDecodeErrorZ");
+       *ret_conv = CResult_COption_PathFailureZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_ClosureReasonZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKClosureReason o_conv = *(LDKClosureReason*)(o_ptr);
+       o_conv = ClosureReason_clone((LDKClosureReason*)untag_ptr(o));
+       LDKCOption_ClosureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_ClosureReasonZ), "LDKCOption_ClosureReasonZ");
+       *ret_copy = COption_ClosureReasonZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_ClosureReasonZ_none() {
+       LDKCOption_ClosureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_ClosureReasonZ), "LDKCOption_ClosureReasonZ");
+       *ret_copy = COption_ClosureReasonZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_ClosureReasonZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_ClosureReasonZ _res_conv = *(LDKCOption_ClosureReasonZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_ClosureReasonZ_free(_res_conv);
+}
+
+static inline uint64_t COption_ClosureReasonZ_clone_ptr(LDKCOption_ClosureReasonZ *NONNULL_PTR arg) {
+       LDKCOption_ClosureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_ClosureReasonZ), "LDKCOption_ClosureReasonZ");
+       *ret_copy = COption_ClosureReasonZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_ClosureReasonZ_clone_ptr(int64_t arg) {
+       LDKCOption_ClosureReasonZ* arg_conv = (LDKCOption_ClosureReasonZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_ClosureReasonZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_ClosureReasonZ_clone(int64_t orig) {
+       LDKCOption_ClosureReasonZ* orig_conv = (LDKCOption_ClosureReasonZ*)untag_ptr(orig);
+       LDKCOption_ClosureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_ClosureReasonZ), "LDKCOption_ClosureReasonZ");
+       *ret_copy = COption_ClosureReasonZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_ClosureReasonZ o_conv = *(LDKCOption_ClosureReasonZ*)(o_ptr);
+       o_conv = COption_ClosureReasonZ_clone((LDKCOption_ClosureReasonZ*)untag_ptr(o));
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_ClosureReasonZDecodeErrorZ), "LDKCResult_COption_ClosureReasonZDecodeErrorZ");
+       *ret_conv = CResult_COption_ClosureReasonZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_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_COption_ClosureReasonZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_ClosureReasonZDecodeErrorZ), "LDKCResult_COption_ClosureReasonZDecodeErrorZ");
+       *ret_conv = CResult_COption_ClosureReasonZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* o_conv = (LDKCResult_COption_ClosureReasonZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_ClosureReasonZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ _res_conv = *(LDKCResult_COption_ClosureReasonZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_ClosureReasonZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_ClosureReasonZDecodeErrorZ_clone_ptr(LDKCResult_COption_ClosureReasonZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_ClosureReasonZDecodeErrorZ), "LDKCResult_COption_ClosureReasonZDecodeErrorZ");
+       *ret_conv = CResult_COption_ClosureReasonZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* arg_conv = (LDKCResult_COption_ClosureReasonZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_ClosureReasonZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* orig_conv = (LDKCResult_COption_ClosureReasonZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_ClosureReasonZDecodeErrorZ), "LDKCResult_COption_ClosureReasonZDecodeErrorZ");
+       *ret_conv = CResult_COption_ClosureReasonZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_HTLCDestinationZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKHTLCDestination o_conv = *(LDKHTLCDestination*)(o_ptr);
+       o_conv = HTLCDestination_clone((LDKHTLCDestination*)untag_ptr(o));
+       LDKCOption_HTLCDestinationZ *ret_copy = MALLOC(sizeof(LDKCOption_HTLCDestinationZ), "LDKCOption_HTLCDestinationZ");
+       *ret_copy = COption_HTLCDestinationZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_HTLCDestinationZ_none() {
+       LDKCOption_HTLCDestinationZ *ret_copy = MALLOC(sizeof(LDKCOption_HTLCDestinationZ), "LDKCOption_HTLCDestinationZ");
+       *ret_copy = COption_HTLCDestinationZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_HTLCDestinationZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_HTLCDestinationZ _res_conv = *(LDKCOption_HTLCDestinationZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_HTLCDestinationZ_free(_res_conv);
+}
+
+static inline uint64_t COption_HTLCDestinationZ_clone_ptr(LDKCOption_HTLCDestinationZ *NONNULL_PTR arg) {
+       LDKCOption_HTLCDestinationZ *ret_copy = MALLOC(sizeof(LDKCOption_HTLCDestinationZ), "LDKCOption_HTLCDestinationZ");
+       *ret_copy = COption_HTLCDestinationZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_HTLCDestinationZ_clone_ptr(int64_t arg) {
+       LDKCOption_HTLCDestinationZ* arg_conv = (LDKCOption_HTLCDestinationZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_HTLCDestinationZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_HTLCDestinationZ_clone(int64_t orig) {
+       LDKCOption_HTLCDestinationZ* orig_conv = (LDKCOption_HTLCDestinationZ*)untag_ptr(orig);
+       LDKCOption_HTLCDestinationZ *ret_copy = MALLOC(sizeof(LDKCOption_HTLCDestinationZ), "LDKCOption_HTLCDestinationZ");
+       *ret_copy = COption_HTLCDestinationZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_HTLCDestinationZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_HTLCDestinationZ o_conv = *(LDKCOption_HTLCDestinationZ*)(o_ptr);
+       o_conv = COption_HTLCDestinationZ_clone((LDKCOption_HTLCDestinationZ*)untag_ptr(o));
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_HTLCDestinationZDecodeErrorZ), "LDKCResult_COption_HTLCDestinationZDecodeErrorZ");
+       *ret_conv = CResult_COption_HTLCDestinationZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_HTLCDestinationZDecodeErrorZ_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_COption_HTLCDestinationZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_HTLCDestinationZDecodeErrorZ), "LDKCResult_COption_HTLCDestinationZDecodeErrorZ");
+       *ret_conv = CResult_COption_HTLCDestinationZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_HTLCDestinationZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* o_conv = (LDKCResult_COption_HTLCDestinationZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_HTLCDestinationZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_HTLCDestinationZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ _res_conv = *(LDKCResult_COption_HTLCDestinationZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_HTLCDestinationZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_HTLCDestinationZDecodeErrorZ_clone_ptr(LDKCResult_COption_HTLCDestinationZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_HTLCDestinationZDecodeErrorZ), "LDKCResult_COption_HTLCDestinationZDecodeErrorZ");
+       *ret_conv = CResult_COption_HTLCDestinationZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_HTLCDestinationZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* arg_conv = (LDKCResult_COption_HTLCDestinationZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_HTLCDestinationZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_HTLCDestinationZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* orig_conv = (LDKCResult_COption_HTLCDestinationZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_HTLCDestinationZDecodeErrorZ), "LDKCResult_COption_HTLCDestinationZDecodeErrorZ");
+       *ret_conv = CResult_COption_HTLCDestinationZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_ok(int32_t o) {
+       LDKPaymentFailureReason o_conv = LDKPaymentFailureReason_from_cs(o);
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentFailureReasonDecodeErrorZ), "LDKCResult_PaymentFailureReasonDecodeErrorZ");
+       *ret_conv = CResult_PaymentFailureReasonDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_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_PaymentFailureReasonDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentFailureReasonDecodeErrorZ), "LDKCResult_PaymentFailureReasonDecodeErrorZ");
+       *ret_conv = CResult_PaymentFailureReasonDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* o_conv = (LDKCResult_PaymentFailureReasonDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PaymentFailureReasonDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PaymentFailureReasonDecodeErrorZ _res_conv = *(LDKCResult_PaymentFailureReasonDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PaymentFailureReasonDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PaymentFailureReasonDecodeErrorZ_clone_ptr(LDKCResult_PaymentFailureReasonDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentFailureReasonDecodeErrorZ), "LDKCResult_PaymentFailureReasonDecodeErrorZ");
+       *ret_conv = CResult_PaymentFailureReasonDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* arg_conv = (LDKCResult_PaymentFailureReasonDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PaymentFailureReasonDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* orig_conv = (LDKCResult_PaymentFailureReasonDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentFailureReasonDecodeErrorZ), "LDKCResult_PaymentFailureReasonDecodeErrorZ");
+       *ret_conv = CResult_PaymentFailureReasonDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_COption_U128Z_some(int8_tArray o) {
+       LDKU128 o_ref;
+       CHECK(o->arr_len == 16);
+       memcpy(o_ref.le_bytes, o->elems, 16); FREE(o);
+       LDKCOption_U128Z *ret_copy = MALLOC(sizeof(LDKCOption_U128Z), "LDKCOption_U128Z");
+       *ret_copy = COption_U128Z_some(o_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_U128Z_none() {
+       LDKCOption_U128Z *ret_copy = MALLOC(sizeof(LDKCOption_U128Z), "LDKCOption_U128Z");
+       *ret_copy = COption_U128Z_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_U128Z_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_U128Z _res_conv = *(LDKCOption_U128Z*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_U128Z_free(_res_conv);
+}
+
+static inline uint64_t COption_U128Z_clone_ptr(LDKCOption_U128Z *NONNULL_PTR arg) {
+       LDKCOption_U128Z *ret_copy = MALLOC(sizeof(LDKCOption_U128Z), "LDKCOption_U128Z");
+       *ret_copy = COption_U128Z_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_U128Z_clone_ptr(int64_t arg) {
+       LDKCOption_U128Z* arg_conv = (LDKCOption_U128Z*)untag_ptr(arg);
+       int64_t ret_conv = COption_U128Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_U128Z_clone(int64_t orig) {
+       LDKCOption_U128Z* orig_conv = (LDKCOption_U128Z*)untag_ptr(orig);
+       LDKCOption_U128Z *ret_copy = MALLOC(sizeof(LDKCOption_U128Z), "LDKCOption_U128Z");
+       *ret_copy = COption_U128Z_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CVec_ClaimedHTLCZ_free(int64_tArray _res) {
+       LDKCVec_ClaimedHTLCZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKClaimedHTLC), "LDKCVec_ClaimedHTLCZ 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];
+               LDKClaimedHTLC _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_ClaimedHTLCZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_COption_PaymentFailureReasonZ_some(int32_t o) {
+       LDKPaymentFailureReason o_conv = LDKPaymentFailureReason_from_cs(o);
+       LDKCOption_PaymentFailureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_PaymentFailureReasonZ), "LDKCOption_PaymentFailureReasonZ");
+       *ret_copy = COption_PaymentFailureReasonZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_PaymentFailureReasonZ_none() {
+       LDKCOption_PaymentFailureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_PaymentFailureReasonZ), "LDKCOption_PaymentFailureReasonZ");
+       *ret_copy = COption_PaymentFailureReasonZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_PaymentFailureReasonZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_PaymentFailureReasonZ _res_conv = *(LDKCOption_PaymentFailureReasonZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_PaymentFailureReasonZ_free(_res_conv);
+}
+
+static inline uint64_t COption_PaymentFailureReasonZ_clone_ptr(LDKCOption_PaymentFailureReasonZ *NONNULL_PTR arg) {
+       LDKCOption_PaymentFailureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_PaymentFailureReasonZ), "LDKCOption_PaymentFailureReasonZ");
+       *ret_copy = COption_PaymentFailureReasonZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_PaymentFailureReasonZ_clone_ptr(int64_t arg) {
+       LDKCOption_PaymentFailureReasonZ* arg_conv = (LDKCOption_PaymentFailureReasonZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_PaymentFailureReasonZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_PaymentFailureReasonZ_clone(int64_t orig) {
+       LDKCOption_PaymentFailureReasonZ* orig_conv = (LDKCOption_PaymentFailureReasonZ*)untag_ptr(orig);
+       LDKCOption_PaymentFailureReasonZ *ret_copy = MALLOC(sizeof(LDKCOption_PaymentFailureReasonZ), "LDKCOption_PaymentFailureReasonZ");
+       *ret_copy = COption_PaymentFailureReasonZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_EventZ_some(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKEvent o_conv = *(LDKEvent*)(o_ptr);
+       o_conv = Event_clone((LDKEvent*)untag_ptr(o));
+       LDKCOption_EventZ *ret_copy = MALLOC(sizeof(LDKCOption_EventZ), "LDKCOption_EventZ");
+       *ret_copy = COption_EventZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_EventZ_none() {
+       LDKCOption_EventZ *ret_copy = MALLOC(sizeof(LDKCOption_EventZ), "LDKCOption_EventZ");
+       *ret_copy = COption_EventZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_EventZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_EventZ _res_conv = *(LDKCOption_EventZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_EventZ_free(_res_conv);
+}
+
+static inline uint64_t COption_EventZ_clone_ptr(LDKCOption_EventZ *NONNULL_PTR arg) {
+       LDKCOption_EventZ *ret_copy = MALLOC(sizeof(LDKCOption_EventZ), "LDKCOption_EventZ");
+       *ret_copy = COption_EventZ_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_COption_EventZ_clone_ptr(int64_t arg) {
+       LDKCOption_EventZ* arg_conv = (LDKCOption_EventZ*)untag_ptr(arg);
+       int64_t ret_conv = COption_EventZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_COption_EventZ_clone(int64_t orig) {
+       LDKCOption_EventZ* orig_conv = (LDKCOption_EventZ*)untag_ptr(orig);
+       LDKCOption_EventZ *ret_copy = MALLOC(sizeof(LDKCOption_EventZ), "LDKCOption_EventZ");
+       *ret_copy = COption_EventZ_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CResult_COption_EventZDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKCOption_EventZ o_conv = *(LDKCOption_EventZ*)(o_ptr);
+       o_conv = COption_EventZ_clone((LDKCOption_EventZ*)untag_ptr(o));
+       LDKCResult_COption_EventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_EventZDecodeErrorZ), "LDKCResult_COption_EventZDecodeErrorZ");
+       *ret_conv = CResult_COption_EventZDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_COption_EventZDecodeErrorZ_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_COption_EventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_EventZDecodeErrorZ), "LDKCResult_COption_EventZDecodeErrorZ");
+       *ret_conv = CResult_COption_EventZDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_COption_EventZDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_COption_EventZDecodeErrorZ* o_conv = (LDKCResult_COption_EventZDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_COption_EventZDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_COption_EventZDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_COption_EventZDecodeErrorZ _res_conv = *(LDKCResult_COption_EventZDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_COption_EventZDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_COption_EventZDecodeErrorZ_clone_ptr(LDKCResult_COption_EventZDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_COption_EventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_EventZDecodeErrorZ), "LDKCResult_COption_EventZDecodeErrorZ");
+       *ret_conv = CResult_COption_EventZDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_COption_EventZDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_COption_EventZDecodeErrorZ* arg_conv = (LDKCResult_COption_EventZDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_COption_EventZDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_COption_EventZDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_COption_EventZDecodeErrorZ* orig_conv = (LDKCResult_COption_EventZDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_COption_EventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_EventZDecodeErrorZ), "LDKCResult_COption_EventZDecodeErrorZ");
+       *ret_conv = CResult_COption_EventZDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_ok(int32_t o) {
+       LDKSiPrefix o_conv = LDKSiPrefix_from_cs(o);
+       LDKCResult_SiPrefixBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SiPrefixBolt11ParseErrorZ), "LDKCResult_SiPrefixBolt11ParseErrorZ");
+       *ret_conv = CResult_SiPrefixBolt11ParseErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKBolt11ParseError e_conv = *(LDKBolt11ParseError*)(e_ptr);
+       e_conv = Bolt11ParseError_clone((LDKBolt11ParseError*)untag_ptr(e));
+       LDKCResult_SiPrefixBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SiPrefixBolt11ParseErrorZ), "LDKCResult_SiPrefixBolt11ParseErrorZ");
+       *ret_conv = CResult_SiPrefixBolt11ParseErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_is_ok(int64_t o) {
+       LDKCResult_SiPrefixBolt11ParseErrorZ* o_conv = (LDKCResult_SiPrefixBolt11ParseErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SiPrefixBolt11ParseErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SiPrefixBolt11ParseErrorZ _res_conv = *(LDKCResult_SiPrefixBolt11ParseErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SiPrefixBolt11ParseErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SiPrefixBolt11ParseErrorZ_clone_ptr(LDKCResult_SiPrefixBolt11ParseErrorZ *NONNULL_PTR arg) {
+       LDKCResult_SiPrefixBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SiPrefixBolt11ParseErrorZ), "LDKCResult_SiPrefixBolt11ParseErrorZ");
+       *ret_conv = CResult_SiPrefixBolt11ParseErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_SiPrefixBolt11ParseErrorZ* arg_conv = (LDKCResult_SiPrefixBolt11ParseErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SiPrefixBolt11ParseErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_clone(int64_t orig) {
+       LDKCResult_SiPrefixBolt11ParseErrorZ* orig_conv = (LDKCResult_SiPrefixBolt11ParseErrorZ*)untag_ptr(orig);
+       LDKCResult_SiPrefixBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SiPrefixBolt11ParseErrorZ), "LDKCResult_SiPrefixBolt11ParseErrorZ");
+       *ret_conv = CResult_SiPrefixBolt11ParseErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceParseOrSemanticErrorZ_ok(int64_t o) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_clone(&o_conv);
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ), "LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceParseOrSemanticErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceParseOrSemanticErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKParseOrSemanticError e_conv = *(LDKParseOrSemanticError*)(e_ptr);
+       e_conv = ParseOrSemanticError_clone((LDKParseOrSemanticError*)untag_ptr(e));
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ), "LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceParseOrSemanticErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_Bolt11InvoiceParseOrSemanticErrorZ_is_ok(int64_t o) {
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* o_conv = (LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_Bolt11InvoiceParseOrSemanticErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_Bolt11InvoiceParseOrSemanticErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ _res_conv = *(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_Bolt11InvoiceParseOrSemanticErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_Bolt11InvoiceParseOrSemanticErrorZ_clone_ptr(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ *NONNULL_PTR arg) {
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ), "LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceParseOrSemanticErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceParseOrSemanticErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* arg_conv = (LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_Bolt11InvoiceParseOrSemanticErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceParseOrSemanticErrorZ_clone(int64_t orig) {
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* orig_conv = (LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ*)untag_ptr(orig);
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ), "LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceParseOrSemanticErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_ok(int64_t o) {
+       LDKSignedRawBolt11Invoice 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 = SignedRawBolt11Invoice_clone(&o_conv);
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ), "LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ");
+       *ret_conv = CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKBolt11ParseError e_conv = *(LDKBolt11ParseError*)(e_ptr);
+       e_conv = Bolt11ParseError_clone((LDKBolt11ParseError*)untag_ptr(e));
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ), "LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ");
+       *ret_conv = CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_is_ok(int64_t o) {
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* o_conv = (LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ _res_conv = *(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_clone_ptr(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ *NONNULL_PTR arg) {
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ), "LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ");
+       *ret_conv = CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* arg_conv = (LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_clone(int64_t orig) {
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* orig_conv = (LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ*)untag_ptr(orig);
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ), "LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ");
+       *ret_conv = CResult_SignedRawBolt11InvoiceBolt11ParseErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline uint64_t C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_clone_ptr(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ *NONNULL_PTR arg) {
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ), "LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ");
+       *ret_conv = C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_clone_ptr(int64_t arg) {
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* arg_conv = (LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ*)untag_ptr(arg);
+       int64_t ret_conv = C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_clone(int64_t orig) {
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* orig_conv = (LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ*)untag_ptr(orig);
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ), "LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ");
+       *ret_conv = C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_new(int64_t a, int8_tArray b, int64_t c) {
+       LDKRawBolt11Invoice 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 = RawBolt11Invoice_clone(&a_conv);
+       LDKThirtyTwoBytes b_ref;
+       CHECK(b->arr_len == 32);
+       memcpy(b_ref.data, b->elems, 32); FREE(b);
+       LDKBolt11InvoiceSignature 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 = Bolt11InvoiceSignature_clone(&c_conv);
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ), "LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ");
+       *ret_conv = C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_new(a_conv, b_ref, c_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ _res_conv = *(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_ok(int64_t o) {
+       LDKPayeePubKey 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 = PayeePubKey_clone(&o_conv);
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PayeePubKeySecp256k1ErrorZ), "LDKCResult_PayeePubKeySecp256k1ErrorZ");
+       *ret_conv = CResult_PayeePubKeySecp256k1ErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_err(int32_t e) {
+       LDKSecp256k1Error e_conv = LDKSecp256k1Error_from_cs(e);
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PayeePubKeySecp256k1ErrorZ), "LDKCResult_PayeePubKeySecp256k1ErrorZ");
+       *ret_conv = CResult_PayeePubKeySecp256k1ErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_is_ok(int64_t o) {
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* o_conv = (LDKCResult_PayeePubKeySecp256k1ErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PayeePubKeySecp256k1ErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PayeePubKeySecp256k1ErrorZ _res_conv = *(LDKCResult_PayeePubKeySecp256k1ErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PayeePubKeySecp256k1ErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PayeePubKeySecp256k1ErrorZ_clone_ptr(LDKCResult_PayeePubKeySecp256k1ErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PayeePubKeySecp256k1ErrorZ), "LDKCResult_PayeePubKeySecp256k1ErrorZ");
+       *ret_conv = CResult_PayeePubKeySecp256k1ErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* arg_conv = (LDKCResult_PayeePubKeySecp256k1ErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PayeePubKeySecp256k1ErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_clone(int64_t orig) {
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* orig_conv = (LDKCResult_PayeePubKeySecp256k1ErrorZ*)untag_ptr(orig);
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PayeePubKeySecp256k1ErrorZ), "LDKCResult_PayeePubKeySecp256k1ErrorZ");
+       *ret_conv = CResult_PayeePubKeySecp256k1ErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_PrivateRouteZ_free(int64_tArray _res) {
+       LDKCVec_PrivateRouteZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKPrivateRoute), "LDKCVec_PrivateRouteZ 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_14 = _res_vals[o];
+               LDKPrivateRoute _res_conv_14_conv;
+               _res_conv_14_conv.inner = untag_ptr(_res_conv_14);
+               _res_conv_14_conv.is_owned = ptr_is_owned(_res_conv_14);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_14_conv);
+               _res_constr.data[o] = _res_conv_14_conv;
+       }
+       FREE(_res);
+       CVec_PrivateRouteZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_PositiveTimestampCreationErrorZ_ok(int64_t o) {
+       LDKPositiveTimestamp 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 = PositiveTimestamp_clone(&o_conv);
+       LDKCResult_PositiveTimestampCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PositiveTimestampCreationErrorZ), "LDKCResult_PositiveTimestampCreationErrorZ");
+       *ret_conv = CResult_PositiveTimestampCreationErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PositiveTimestampCreationErrorZ_err(int32_t e) {
+       LDKCreationError e_conv = LDKCreationError_from_cs(e);
+       LDKCResult_PositiveTimestampCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PositiveTimestampCreationErrorZ), "LDKCResult_PositiveTimestampCreationErrorZ");
+       *ret_conv = CResult_PositiveTimestampCreationErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PositiveTimestampCreationErrorZ_is_ok(int64_t o) {
+       LDKCResult_PositiveTimestampCreationErrorZ* o_conv = (LDKCResult_PositiveTimestampCreationErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PositiveTimestampCreationErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PositiveTimestampCreationErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PositiveTimestampCreationErrorZ _res_conv = *(LDKCResult_PositiveTimestampCreationErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PositiveTimestampCreationErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PositiveTimestampCreationErrorZ_clone_ptr(LDKCResult_PositiveTimestampCreationErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PositiveTimestampCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PositiveTimestampCreationErrorZ), "LDKCResult_PositiveTimestampCreationErrorZ");
+       *ret_conv = CResult_PositiveTimestampCreationErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PositiveTimestampCreationErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PositiveTimestampCreationErrorZ* arg_conv = (LDKCResult_PositiveTimestampCreationErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PositiveTimestampCreationErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PositiveTimestampCreationErrorZ_clone(int64_t orig) {
+       LDKCResult_PositiveTimestampCreationErrorZ* orig_conv = (LDKCResult_PositiveTimestampCreationErrorZ*)untag_ptr(orig);
+       LDKCResult_PositiveTimestampCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PositiveTimestampCreationErrorZ), "LDKCResult_PositiveTimestampCreationErrorZ");
+       *ret_conv = CResult_PositiveTimestampCreationErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneBolt11SemanticErrorZ_ok() {
+       LDKCResult_NoneBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt11SemanticErrorZ), "LDKCResult_NoneBolt11SemanticErrorZ");
+       *ret_conv = CResult_NoneBolt11SemanticErrorZ_ok();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneBolt11SemanticErrorZ_err(int32_t e) {
+       LDKBolt11SemanticError e_conv = LDKBolt11SemanticError_from_cs(e);
+       LDKCResult_NoneBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt11SemanticErrorZ), "LDKCResult_NoneBolt11SemanticErrorZ");
+       *ret_conv = CResult_NoneBolt11SemanticErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_NoneBolt11SemanticErrorZ_is_ok(int64_t o) {
+       LDKCResult_NoneBolt11SemanticErrorZ* o_conv = (LDKCResult_NoneBolt11SemanticErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_NoneBolt11SemanticErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NoneBolt11SemanticErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NoneBolt11SemanticErrorZ _res_conv = *(LDKCResult_NoneBolt11SemanticErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_NoneBolt11SemanticErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_NoneBolt11SemanticErrorZ_clone_ptr(LDKCResult_NoneBolt11SemanticErrorZ *NONNULL_PTR arg) {
+       LDKCResult_NoneBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt11SemanticErrorZ), "LDKCResult_NoneBolt11SemanticErrorZ");
+       *ret_conv = CResult_NoneBolt11SemanticErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_NoneBolt11SemanticErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_NoneBolt11SemanticErrorZ* arg_conv = (LDKCResult_NoneBolt11SemanticErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_NoneBolt11SemanticErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_NoneBolt11SemanticErrorZ_clone(int64_t orig) {
+       LDKCResult_NoneBolt11SemanticErrorZ* orig_conv = (LDKCResult_NoneBolt11SemanticErrorZ*)untag_ptr(orig);
+       LDKCResult_NoneBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt11SemanticErrorZ), "LDKCResult_NoneBolt11SemanticErrorZ");
+       *ret_conv = CResult_NoneBolt11SemanticErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_ok(int64_t o) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_clone(&o_conv);
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ), "LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceBolt11SemanticErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_err(int32_t e) {
+       LDKBolt11SemanticError e_conv = LDKBolt11SemanticError_from_cs(e);
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ), "LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceBolt11SemanticErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_is_ok(int64_t o) {
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* o_conv = (LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_Bolt11InvoiceBolt11SemanticErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ _res_conv = *(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_Bolt11InvoiceBolt11SemanticErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone_ptr(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ *NONNULL_PTR arg) {
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ), "LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* arg_conv = (LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone(int64_t orig) {
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* orig_conv = (LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ*)untag_ptr(orig);
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ), "LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ");
+       *ret_conv = CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_DescriptionCreationErrorZ_ok(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 = Description_clone(&o_conv);
+       LDKCResult_DescriptionCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DescriptionCreationErrorZ), "LDKCResult_DescriptionCreationErrorZ");
+       *ret_conv = CResult_DescriptionCreationErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_DescriptionCreationErrorZ_err(int32_t e) {
+       LDKCreationError e_conv = LDKCreationError_from_cs(e);
+       LDKCResult_DescriptionCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DescriptionCreationErrorZ), "LDKCResult_DescriptionCreationErrorZ");
+       *ret_conv = CResult_DescriptionCreationErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_DescriptionCreationErrorZ_is_ok(int64_t o) {
+       LDKCResult_DescriptionCreationErrorZ* o_conv = (LDKCResult_DescriptionCreationErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_DescriptionCreationErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_DescriptionCreationErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_DescriptionCreationErrorZ _res_conv = *(LDKCResult_DescriptionCreationErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_DescriptionCreationErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_DescriptionCreationErrorZ_clone_ptr(LDKCResult_DescriptionCreationErrorZ *NONNULL_PTR arg) {
+       LDKCResult_DescriptionCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DescriptionCreationErrorZ), "LDKCResult_DescriptionCreationErrorZ");
+       *ret_conv = CResult_DescriptionCreationErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_DescriptionCreationErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_DescriptionCreationErrorZ* arg_conv = (LDKCResult_DescriptionCreationErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_DescriptionCreationErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_DescriptionCreationErrorZ_clone(int64_t orig) {
+       LDKCResult_DescriptionCreationErrorZ* orig_conv = (LDKCResult_DescriptionCreationErrorZ*)untag_ptr(orig);
+       LDKCResult_DescriptionCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DescriptionCreationErrorZ), "LDKCResult_DescriptionCreationErrorZ");
+       *ret_conv = CResult_DescriptionCreationErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PrivateRouteCreationErrorZ_ok(int64_t o) {
+       LDKPrivateRoute 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 = PrivateRoute_clone(&o_conv);
+       LDKCResult_PrivateRouteCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PrivateRouteCreationErrorZ), "LDKCResult_PrivateRouteCreationErrorZ");
+       *ret_conv = CResult_PrivateRouteCreationErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PrivateRouteCreationErrorZ_err(int32_t e) {
+       LDKCreationError e_conv = LDKCreationError_from_cs(e);
+       LDKCResult_PrivateRouteCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PrivateRouteCreationErrorZ), "LDKCResult_PrivateRouteCreationErrorZ");
+       *ret_conv = CResult_PrivateRouteCreationErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PrivateRouteCreationErrorZ_is_ok(int64_t o) {
+       LDKCResult_PrivateRouteCreationErrorZ* o_conv = (LDKCResult_PrivateRouteCreationErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PrivateRouteCreationErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PrivateRouteCreationErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PrivateRouteCreationErrorZ _res_conv = *(LDKCResult_PrivateRouteCreationErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PrivateRouteCreationErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PrivateRouteCreationErrorZ_clone_ptr(LDKCResult_PrivateRouteCreationErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PrivateRouteCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PrivateRouteCreationErrorZ), "LDKCResult_PrivateRouteCreationErrorZ");
+       *ret_conv = CResult_PrivateRouteCreationErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PrivateRouteCreationErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PrivateRouteCreationErrorZ* arg_conv = (LDKCResult_PrivateRouteCreationErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PrivateRouteCreationErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PrivateRouteCreationErrorZ_clone(int64_t orig) {
+       LDKCResult_PrivateRouteCreationErrorZ* orig_conv = (LDKCResult_PrivateRouteCreationErrorZ*)untag_ptr(orig);
+       LDKCResult_PrivateRouteCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PrivateRouteCreationErrorZ), "LDKCResult_PrivateRouteCreationErrorZ");
+       *ret_conv = CResult_PrivateRouteCreationErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OutPointDecodeErrorZ_ok(int64_t o) {
+       LDKOutPoint 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 = OutPoint_clone(&o_conv);
+       LDKCResult_OutPointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OutPointDecodeErrorZ), "LDKCResult_OutPointDecodeErrorZ");
+       *ret_conv = CResult_OutPointDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OutPointDecodeErrorZ_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_OutPointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OutPointDecodeErrorZ), "LDKCResult_OutPointDecodeErrorZ");
+       *ret_conv = CResult_OutPointDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_OutPointDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_OutPointDecodeErrorZ* o_conv = (LDKCResult_OutPointDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_OutPointDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_OutPointDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_OutPointDecodeErrorZ _res_conv = *(LDKCResult_OutPointDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_OutPointDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_OutPointDecodeErrorZ_clone_ptr(LDKCResult_OutPointDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_OutPointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OutPointDecodeErrorZ), "LDKCResult_OutPointDecodeErrorZ");
+       *ret_conv = CResult_OutPointDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_OutPointDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_OutPointDecodeErrorZ* arg_conv = (LDKCResult_OutPointDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_OutPointDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_OutPointDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_OutPointDecodeErrorZ* orig_conv = (LDKCResult_OutPointDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_OutPointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OutPointDecodeErrorZ), "LDKCResult_OutPointDecodeErrorZ");
+       *ret_conv = CResult_OutPointDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BigSizeDecodeErrorZ_ok(int64_t o) {
+       LDKBigSize 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 = BigSize_clone(&o_conv);
+       LDKCResult_BigSizeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BigSizeDecodeErrorZ), "LDKCResult_BigSizeDecodeErrorZ");
+       *ret_conv = CResult_BigSizeDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BigSizeDecodeErrorZ_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_BigSizeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BigSizeDecodeErrorZ), "LDKCResult_BigSizeDecodeErrorZ");
+       *ret_conv = CResult_BigSizeDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BigSizeDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BigSizeDecodeErrorZ* o_conv = (LDKCResult_BigSizeDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BigSizeDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BigSizeDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BigSizeDecodeErrorZ _res_conv = *(LDKCResult_BigSizeDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BigSizeDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BigSizeDecodeErrorZ_clone_ptr(LDKCResult_BigSizeDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BigSizeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BigSizeDecodeErrorZ), "LDKCResult_BigSizeDecodeErrorZ");
+       *ret_conv = CResult_BigSizeDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BigSizeDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BigSizeDecodeErrorZ* arg_conv = (LDKCResult_BigSizeDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BigSizeDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BigSizeDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BigSizeDecodeErrorZ* orig_conv = (LDKCResult_BigSizeDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BigSizeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BigSizeDecodeErrorZ), "LDKCResult_BigSizeDecodeErrorZ");
+       *ret_conv = CResult_BigSizeDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HostnameDecodeErrorZ_ok(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 = Hostname_clone(&o_conv);
+       LDKCResult_HostnameDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HostnameDecodeErrorZ), "LDKCResult_HostnameDecodeErrorZ");
+       *ret_conv = CResult_HostnameDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HostnameDecodeErrorZ_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_HostnameDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HostnameDecodeErrorZ), "LDKCResult_HostnameDecodeErrorZ");
+       *ret_conv = CResult_HostnameDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_HostnameDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_HostnameDecodeErrorZ* o_conv = (LDKCResult_HostnameDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_HostnameDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_HostnameDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_HostnameDecodeErrorZ _res_conv = *(LDKCResult_HostnameDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_HostnameDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_HostnameDecodeErrorZ_clone_ptr(LDKCResult_HostnameDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_HostnameDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HostnameDecodeErrorZ), "LDKCResult_HostnameDecodeErrorZ");
+       *ret_conv = CResult_HostnameDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_HostnameDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_HostnameDecodeErrorZ* arg_conv = (LDKCResult_HostnameDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_HostnameDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_HostnameDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_HostnameDecodeErrorZ* orig_conv = (LDKCResult_HostnameDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_HostnameDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HostnameDecodeErrorZ), "LDKCResult_HostnameDecodeErrorZ");
+       *ret_conv = CResult_HostnameDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedNoneZ_ok(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 = TransactionU16LenLimited_clone(&o_conv);
+       LDKCResult_TransactionU16LenLimitedNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedNoneZ), "LDKCResult_TransactionU16LenLimitedNoneZ");
+       *ret_conv = CResult_TransactionU16LenLimitedNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedNoneZ_err() {
+       LDKCResult_TransactionU16LenLimitedNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedNoneZ), "LDKCResult_TransactionU16LenLimitedNoneZ");
+       *ret_conv = CResult_TransactionU16LenLimitedNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TransactionU16LenLimitedNoneZ_is_ok(int64_t o) {
+       LDKCResult_TransactionU16LenLimitedNoneZ* o_conv = (LDKCResult_TransactionU16LenLimitedNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TransactionU16LenLimitedNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TransactionU16LenLimitedNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TransactionU16LenLimitedNoneZ _res_conv = *(LDKCResult_TransactionU16LenLimitedNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TransactionU16LenLimitedNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TransactionU16LenLimitedNoneZ_clone_ptr(LDKCResult_TransactionU16LenLimitedNoneZ *NONNULL_PTR arg) {
+       LDKCResult_TransactionU16LenLimitedNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedNoneZ), "LDKCResult_TransactionU16LenLimitedNoneZ");
+       *ret_conv = CResult_TransactionU16LenLimitedNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_TransactionU16LenLimitedNoneZ* arg_conv = (LDKCResult_TransactionU16LenLimitedNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TransactionU16LenLimitedNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedNoneZ_clone(int64_t orig) {
+       LDKCResult_TransactionU16LenLimitedNoneZ* orig_conv = (LDKCResult_TransactionU16LenLimitedNoneZ*)untag_ptr(orig);
+       LDKCResult_TransactionU16LenLimitedNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedNoneZ), "LDKCResult_TransactionU16LenLimitedNoneZ");
+       *ret_conv = CResult_TransactionU16LenLimitedNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedDecodeErrorZ_ok(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 = TransactionU16LenLimited_clone(&o_conv);
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedDecodeErrorZ), "LDKCResult_TransactionU16LenLimitedDecodeErrorZ");
+       *ret_conv = CResult_TransactionU16LenLimitedDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedDecodeErrorZ_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_TransactionU16LenLimitedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedDecodeErrorZ), "LDKCResult_TransactionU16LenLimitedDecodeErrorZ");
+       *ret_conv = CResult_TransactionU16LenLimitedDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TransactionU16LenLimitedDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* o_conv = (LDKCResult_TransactionU16LenLimitedDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TransactionU16LenLimitedDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TransactionU16LenLimitedDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ _res_conv = *(LDKCResult_TransactionU16LenLimitedDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TransactionU16LenLimitedDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TransactionU16LenLimitedDecodeErrorZ_clone_ptr(LDKCResult_TransactionU16LenLimitedDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedDecodeErrorZ), "LDKCResult_TransactionU16LenLimitedDecodeErrorZ");
+       *ret_conv = CResult_TransactionU16LenLimitedDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* arg_conv = (LDKCResult_TransactionU16LenLimitedDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TransactionU16LenLimitedDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TransactionU16LenLimitedDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* orig_conv = (LDKCResult_TransactionU16LenLimitedDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedDecodeErrorZ), "LDKCResult_TransactionU16LenLimitedDecodeErrorZ");
+       *ret_conv = CResult_TransactionU16LenLimitedDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UntrustedStringDecodeErrorZ_ok(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 = UntrustedString_clone(&o_conv);
+       LDKCResult_UntrustedStringDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UntrustedStringDecodeErrorZ), "LDKCResult_UntrustedStringDecodeErrorZ");
+       *ret_conv = CResult_UntrustedStringDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_UntrustedStringDecodeErrorZ_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_UntrustedStringDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UntrustedStringDecodeErrorZ), "LDKCResult_UntrustedStringDecodeErrorZ");
+       *ret_conv = CResult_UntrustedStringDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_UntrustedStringDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_UntrustedStringDecodeErrorZ* o_conv = (LDKCResult_UntrustedStringDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_UntrustedStringDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_UntrustedStringDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_UntrustedStringDecodeErrorZ _res_conv = *(LDKCResult_UntrustedStringDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_UntrustedStringDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_UntrustedStringDecodeErrorZ_clone_ptr(LDKCResult_UntrustedStringDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_UntrustedStringDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UntrustedStringDecodeErrorZ), "LDKCResult_UntrustedStringDecodeErrorZ");
+       *ret_conv = CResult_UntrustedStringDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_UntrustedStringDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_UntrustedStringDecodeErrorZ* arg_conv = (LDKCResult_UntrustedStringDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_UntrustedStringDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_UntrustedStringDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_UntrustedStringDecodeErrorZ* orig_conv = (LDKCResult_UntrustedStringDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_UntrustedStringDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UntrustedStringDecodeErrorZ), "LDKCResult_UntrustedStringDecodeErrorZ");
+       *ret_conv = CResult_UntrustedStringDecodeErrorZ_clone(orig_conv);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+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);
+       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;
+}
+
+void  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_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);
+       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);
+}
+
+int64_t  CS_LDK_CResult_PaymentRelayDecodeErrorZ_ok(int64_t o) {
+       LDKPaymentRelay 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 = PaymentRelay_clone(&o_conv);
+       LDKCResult_PaymentRelayDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentRelayDecodeErrorZ), "LDKCResult_PaymentRelayDecodeErrorZ");
+       *ret_conv = CResult_PaymentRelayDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PaymentRelayDecodeErrorZ_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_PaymentRelayDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentRelayDecodeErrorZ), "LDKCResult_PaymentRelayDecodeErrorZ");
+       *ret_conv = CResult_PaymentRelayDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PaymentRelayDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PaymentRelayDecodeErrorZ* o_conv = (LDKCResult_PaymentRelayDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PaymentRelayDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PaymentRelayDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PaymentRelayDecodeErrorZ _res_conv = *(LDKCResult_PaymentRelayDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PaymentRelayDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PaymentRelayDecodeErrorZ_clone_ptr(LDKCResult_PaymentRelayDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PaymentRelayDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentRelayDecodeErrorZ), "LDKCResult_PaymentRelayDecodeErrorZ");
+       *ret_conv = CResult_PaymentRelayDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PaymentRelayDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PaymentRelayDecodeErrorZ* arg_conv = (LDKCResult_PaymentRelayDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PaymentRelayDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PaymentRelayDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PaymentRelayDecodeErrorZ* orig_conv = (LDKCResult_PaymentRelayDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PaymentRelayDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentRelayDecodeErrorZ), "LDKCResult_PaymentRelayDecodeErrorZ");
+       *ret_conv = CResult_PaymentRelayDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_ok(int64_t o) {
+       LDKPaymentConstraints 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 = PaymentConstraints_clone(&o_conv);
+       LDKCResult_PaymentConstraintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentConstraintsDecodeErrorZ), "LDKCResult_PaymentConstraintsDecodeErrorZ");
+       *ret_conv = CResult_PaymentConstraintsDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_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_PaymentConstraintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentConstraintsDecodeErrorZ), "LDKCResult_PaymentConstraintsDecodeErrorZ");
+       *ret_conv = CResult_PaymentConstraintsDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PaymentConstraintsDecodeErrorZ* o_conv = (LDKCResult_PaymentConstraintsDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PaymentConstraintsDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PaymentConstraintsDecodeErrorZ _res_conv = *(LDKCResult_PaymentConstraintsDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PaymentConstraintsDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PaymentConstraintsDecodeErrorZ_clone_ptr(LDKCResult_PaymentConstraintsDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PaymentConstraintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentConstraintsDecodeErrorZ), "LDKCResult_PaymentConstraintsDecodeErrorZ");
+       *ret_conv = CResult_PaymentConstraintsDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PaymentConstraintsDecodeErrorZ* arg_conv = (LDKCResult_PaymentConstraintsDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PaymentConstraintsDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PaymentConstraintsDecodeErrorZ* orig_conv = (LDKCResult_PaymentConstraintsDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PaymentConstraintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentConstraintsDecodeErrorZ), "LDKCResult_PaymentConstraintsDecodeErrorZ");
+       *ret_conv = CResult_PaymentConstraintsDecodeErrorZ_clone(orig_conv);
+       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);
+       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);
+       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);
+       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);
+       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) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_NonePaymentErrorZ _res_conv = *(LDKCResult_NonePaymentErrorZ*)(_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);
+}
+
+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);
+       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);
+       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);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_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);
+       FREE(untag_ptr(_res));
+       CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_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);
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_StrSecp256k1ErrorZ_ok(jstring o) {
+       LDKStr o_conv = str_ref_to_owned_c(o);
+       LDKCResult_StrSecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StrSecp256k1ErrorZ), "LDKCResult_StrSecp256k1ErrorZ");
+       *ret_conv = CResult_StrSecp256k1ErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_StrSecp256k1ErrorZ_err(int32_t e) {
+       LDKSecp256k1Error e_conv = LDKSecp256k1Error_from_cs(e);
+       LDKCResult_StrSecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StrSecp256k1ErrorZ), "LDKCResult_StrSecp256k1ErrorZ");
+       *ret_conv = CResult_StrSecp256k1ErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_StrSecp256k1ErrorZ_is_ok(int64_t o) {
+       LDKCResult_StrSecp256k1ErrorZ* o_conv = (LDKCResult_StrSecp256k1ErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_StrSecp256k1ErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_StrSecp256k1ErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_StrSecp256k1ErrorZ _res_conv = *(LDKCResult_StrSecp256k1ErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_StrSecp256k1ErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_StrSecp256k1ErrorZ_clone_ptr(LDKCResult_StrSecp256k1ErrorZ *NONNULL_PTR arg) {
+       LDKCResult_StrSecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StrSecp256k1ErrorZ), "LDKCResult_StrSecp256k1ErrorZ");
+       *ret_conv = CResult_StrSecp256k1ErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_StrSecp256k1ErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_StrSecp256k1ErrorZ* arg_conv = (LDKCResult_StrSecp256k1ErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_StrSecp256k1ErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_StrSecp256k1ErrorZ_clone(int64_t orig) {
+       LDKCResult_StrSecp256k1ErrorZ* orig_conv = (LDKCResult_StrSecp256k1ErrorZ*)untag_ptr(orig);
+       LDKCResult_StrSecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StrSecp256k1ErrorZ), "LDKCResult_StrSecp256k1ErrorZ");
+       *ret_conv = CResult_StrSecp256k1ErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxOutUtxoLookupErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKTxOut o_conv = *(LDKTxOut*)(o_ptr);
+       o_conv = TxOut_clone((LDKTxOut*)untag_ptr(o));
+       LDKCResult_TxOutUtxoLookupErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxOutUtxoLookupErrorZ), "LDKCResult_TxOutUtxoLookupErrorZ");
+       *ret_conv = CResult_TxOutUtxoLookupErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_TxOutUtxoLookupErrorZ_err(int32_t e) {
+       LDKUtxoLookupError e_conv = LDKUtxoLookupError_from_cs(e);
+       LDKCResult_TxOutUtxoLookupErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxOutUtxoLookupErrorZ), "LDKCResult_TxOutUtxoLookupErrorZ");
+       *ret_conv = CResult_TxOutUtxoLookupErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_TxOutUtxoLookupErrorZ_is_ok(int64_t o) {
+       LDKCResult_TxOutUtxoLookupErrorZ* o_conv = (LDKCResult_TxOutUtxoLookupErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_TxOutUtxoLookupErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_TxOutUtxoLookupErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_TxOutUtxoLookupErrorZ _res_conv = *(LDKCResult_TxOutUtxoLookupErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_TxOutUtxoLookupErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_TxOutUtxoLookupErrorZ_clone_ptr(LDKCResult_TxOutUtxoLookupErrorZ *NONNULL_PTR arg) {
+       LDKCResult_TxOutUtxoLookupErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxOutUtxoLookupErrorZ), "LDKCResult_TxOutUtxoLookupErrorZ");
+       *ret_conv = CResult_TxOutUtxoLookupErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_TxOutUtxoLookupErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_TxOutUtxoLookupErrorZ* arg_conv = (LDKCResult_TxOutUtxoLookupErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_TxOutUtxoLookupErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_TxOutUtxoLookupErrorZ_clone(int64_t orig) {
+       LDKCResult_TxOutUtxoLookupErrorZ* orig_conv = (LDKCResult_TxOutUtxoLookupErrorZ*)untag_ptr(orig);
+       LDKCResult_TxOutUtxoLookupErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxOutUtxoLookupErrorZ), "LDKCResult_TxOutUtxoLookupErrorZ");
+       *ret_conv = CResult_TxOutUtxoLookupErrorZ_clone(orig_conv);
+       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);
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_new(int8_tArray a, int64_t b) {
+       LDKPublicKey a_ref;
+       CHECK(a->arr_len == 33);
+       memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
+       LDKOnionMessage 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 = OnionMessage_clone(&b_conv);
+       LDKC2Tuple_PublicKeyOnionMessageZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyOnionMessageZ), "LDKC2Tuple_PublicKeyOnionMessageZ");
+       *ret_conv = C2Tuple_PublicKeyOnionMessageZ_new(a_ref, b_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_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);
+       FREE(untag_ptr(_res));
+       C2Tuple_PublicKeyOnionMessageZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_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);
+       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);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_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);
+       FREE(untag_ptr(_res));
+       CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_PeeledOnionNoneZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKPeeledOnion o_conv = *(LDKPeeledOnion*)(o_ptr);
+       o_conv = PeeledOnion_clone((LDKPeeledOnion*)untag_ptr(o));
+       LDKCResult_PeeledOnionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_PeeledOnionNoneZ), "LDKCResult_PeeledOnionNoneZ");
+       *ret_conv = CResult_PeeledOnionNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PeeledOnionNoneZ_err() {
+       LDKCResult_PeeledOnionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_PeeledOnionNoneZ), "LDKCResult_PeeledOnionNoneZ");
+       *ret_conv = CResult_PeeledOnionNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PeeledOnionNoneZ_is_ok(int64_t o) {
+       LDKCResult_PeeledOnionNoneZ* o_conv = (LDKCResult_PeeledOnionNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PeeledOnionNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PeeledOnionNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PeeledOnionNoneZ _res_conv = *(LDKCResult_PeeledOnionNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_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();
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_NoneSendErrorZ_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);
+       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);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_NoneSendErrorZ_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);
+       FREE(untag_ptr(_res));
+       CResult_NoneSendErrorZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_BlindedPathNoneZ_ok(int64_t o) {
+       LDKBlindedPath 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 = BlindedPath_clone(&o_conv);
+       LDKCResult_BlindedPathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathNoneZ), "LDKCResult_BlindedPathNoneZ");
+       *ret_conv = CResult_BlindedPathNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedPathNoneZ_err() {
+       LDKCResult_BlindedPathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathNoneZ), "LDKCResult_BlindedPathNoneZ");
+       *ret_conv = CResult_BlindedPathNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BlindedPathNoneZ_is_ok(int64_t o) {
+       LDKCResult_BlindedPathNoneZ* o_conv = (LDKCResult_BlindedPathNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BlindedPathNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BlindedPathNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BlindedPathNoneZ _res_conv = *(LDKCResult_BlindedPathNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BlindedPathNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BlindedPathNoneZ_clone_ptr(LDKCResult_BlindedPathNoneZ *NONNULL_PTR arg) {
+       LDKCResult_BlindedPathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathNoneZ), "LDKCResult_BlindedPathNoneZ");
+       *ret_conv = CResult_BlindedPathNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BlindedPathNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_BlindedPathNoneZ* arg_conv = (LDKCResult_BlindedPathNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BlindedPathNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BlindedPathNoneZ_clone(int64_t orig) {
+       LDKCResult_BlindedPathNoneZ* orig_conv = (LDKCResult_BlindedPathNoneZ*)untag_ptr(orig);
+       LDKCResult_BlindedPathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathNoneZ), "LDKCResult_BlindedPathNoneZ");
+       *ret_conv = CResult_BlindedPathNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ o_conv = *(LDKC2Tuple_BlindedPayInfoBlindedPathZ*)(o_ptr);
+       o_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone((LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(o));
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ), "LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ");
+       *ret_conv = CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_err() {
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ), "LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ");
+       *ret_conv = CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_is_ok(int64_t o) {
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* o_conv = (LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ _res_conv = *(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone_ptr(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ), "LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ");
+       *ret_conv = CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* arg_conv = (LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone(int64_t orig) {
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* orig_conv = (LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ*)untag_ptr(orig);
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ), "LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ");
+       *ret_conv = CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedPathDecodeErrorZ_ok(int64_t o) {
+       LDKBlindedPath 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 = BlindedPath_clone(&o_conv);
+       LDKCResult_BlindedPathDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathDecodeErrorZ), "LDKCResult_BlindedPathDecodeErrorZ");
+       *ret_conv = CResult_BlindedPathDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedPathDecodeErrorZ_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_BlindedPathDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathDecodeErrorZ), "LDKCResult_BlindedPathDecodeErrorZ");
+       *ret_conv = CResult_BlindedPathDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BlindedPathDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BlindedPathDecodeErrorZ* o_conv = (LDKCResult_BlindedPathDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BlindedPathDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BlindedPathDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BlindedPathDecodeErrorZ _res_conv = *(LDKCResult_BlindedPathDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BlindedPathDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BlindedPathDecodeErrorZ_clone_ptr(LDKCResult_BlindedPathDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BlindedPathDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathDecodeErrorZ), "LDKCResult_BlindedPathDecodeErrorZ");
+       *ret_conv = CResult_BlindedPathDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BlindedPathDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BlindedPathDecodeErrorZ* arg_conv = (LDKCResult_BlindedPathDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BlindedPathDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BlindedPathDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BlindedPathDecodeErrorZ* orig_conv = (LDKCResult_BlindedPathDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BlindedPathDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathDecodeErrorZ), "LDKCResult_BlindedPathDecodeErrorZ");
+       *ret_conv = CResult_BlindedPathDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedHopDecodeErrorZ_ok(int64_t o) {
+       LDKBlindedHop 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 = BlindedHop_clone(&o_conv);
+       LDKCResult_BlindedHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopDecodeErrorZ), "LDKCResult_BlindedHopDecodeErrorZ");
+       *ret_conv = CResult_BlindedHopDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedHopDecodeErrorZ_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_BlindedHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopDecodeErrorZ), "LDKCResult_BlindedHopDecodeErrorZ");
+       *ret_conv = CResult_BlindedHopDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BlindedHopDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BlindedHopDecodeErrorZ* o_conv = (LDKCResult_BlindedHopDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BlindedHopDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BlindedHopDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BlindedHopDecodeErrorZ _res_conv = *(LDKCResult_BlindedHopDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BlindedHopDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BlindedHopDecodeErrorZ_clone_ptr(LDKCResult_BlindedHopDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BlindedHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopDecodeErrorZ), "LDKCResult_BlindedHopDecodeErrorZ");
+       *ret_conv = CResult_BlindedHopDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BlindedHopDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BlindedHopDecodeErrorZ* arg_conv = (LDKCResult_BlindedHopDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BlindedHopDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BlindedHopDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BlindedHopDecodeErrorZ* orig_conv = (LDKCResult_BlindedHopDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BlindedHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopDecodeErrorZ), "LDKCResult_BlindedHopDecodeErrorZ");
+       *ret_conv = CResult_BlindedHopDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_ok(int64_t o) {
+       LDKInvoiceError 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 = InvoiceError_clone(&o_conv);
+       LDKCResult_InvoiceErrorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InvoiceErrorDecodeErrorZ), "LDKCResult_InvoiceErrorDecodeErrorZ");
+       *ret_conv = CResult_InvoiceErrorDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_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_InvoiceErrorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InvoiceErrorDecodeErrorZ), "LDKCResult_InvoiceErrorDecodeErrorZ");
+       *ret_conv = CResult_InvoiceErrorDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_InvoiceErrorDecodeErrorZ* o_conv = (LDKCResult_InvoiceErrorDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_InvoiceErrorDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_InvoiceErrorDecodeErrorZ _res_conv = *(LDKCResult_InvoiceErrorDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_InvoiceErrorDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_InvoiceErrorDecodeErrorZ_clone_ptr(LDKCResult_InvoiceErrorDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_InvoiceErrorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InvoiceErrorDecodeErrorZ), "LDKCResult_InvoiceErrorDecodeErrorZ");
+       *ret_conv = CResult_InvoiceErrorDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_InvoiceErrorDecodeErrorZ* arg_conv = (LDKCResult_InvoiceErrorDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_InvoiceErrorDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_InvoiceErrorDecodeErrorZ* orig_conv = (LDKCResult_InvoiceErrorDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_InvoiceErrorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InvoiceErrorDecodeErrorZ), "LDKCResult_InvoiceErrorDecodeErrorZ");
+       *ret_conv = CResult_InvoiceErrorDecodeErrorZ_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);
+       LDKFilter o_conv = *(LDKFilter*)(o_ptr);
+       if (o_conv.free == LDKFilter_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFilter_JCalls_cloned(&o_conv);
+       }
+       LDKCOption_FilterZ *ret_copy = MALLOC(sizeof(LDKCOption_FilterZ), "LDKCOption_FilterZ");
+       *ret_copy = COption_FilterZ_some(o_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_COption_FilterZ_none() {
+       LDKCOption_FilterZ *ret_copy = MALLOC(sizeof(LDKCOption_FilterZ), "LDKCOption_FilterZ");
+       *ret_copy = COption_FilterZ_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_COption_FilterZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCOption_FilterZ _res_conv = *(LDKCOption_FilterZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       COption_FilterZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_LockedChannelMonitorNoneZ_ok(int64_t o) {
+       LDKLockedChannelMonitor o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       // WARNING: we need a move here but no clone is available for LDKLockedChannelMonitor
+       
+       LDKCResult_LockedChannelMonitorNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_LockedChannelMonitorNoneZ), "LDKCResult_LockedChannelMonitorNoneZ");
+       *ret_conv = CResult_LockedChannelMonitorNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_LockedChannelMonitorNoneZ_err() {
+       LDKCResult_LockedChannelMonitorNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_LockedChannelMonitorNoneZ), "LDKCResult_LockedChannelMonitorNoneZ");
+       *ret_conv = CResult_LockedChannelMonitorNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_LockedChannelMonitorNoneZ_is_ok(int64_t o) {
+       LDKCResult_LockedChannelMonitorNoneZ* o_conv = (LDKCResult_LockedChannelMonitorNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_LockedChannelMonitorNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_LockedChannelMonitorNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_LockedChannelMonitorNoneZ _res_conv = *(LDKCResult_LockedChannelMonitorNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_LockedChannelMonitorNoneZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_OutPointZ_free(int64_tArray _res) {
+       LDKCVec_OutPointZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKOutPoint), "LDKCVec_OutPointZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t k = 0; k < _res_constr.datalen; k++) {
+               int64_t _res_conv_10 = _res_vals[k];
+               LDKOutPoint _res_conv_10_conv;
+               _res_conv_10_conv.inner = untag_ptr(_res_conv_10);
+               _res_conv_10_conv.is_owned = ptr_is_owned(_res_conv_10);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_10_conv);
+               _res_constr.data[k] = _res_conv_10_conv;
+       }
+       FREE(_res);
+       CVec_OutPointZ_free(_res_constr);
+}
+
+void  CS_LDK_CVec_MonitorUpdateIdZ_free(int64_tArray _res) {
+       LDKCVec_MonitorUpdateIdZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKMonitorUpdateId), "LDKCVec_MonitorUpdateIdZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t r = 0; r < _res_constr.datalen; r++) {
+               int64_t _res_conv_17 = _res_vals[r];
+               LDKMonitorUpdateId _res_conv_17_conv;
+               _res_conv_17_conv.inner = untag_ptr(_res_conv_17);
+               _res_conv_17_conv.is_owned = ptr_is_owned(_res_conv_17);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_17_conv);
+               _res_constr.data[r] = _res_conv_17_conv;
+       }
+       FREE(_res);
+       CVec_MonitorUpdateIdZ_free(_res_constr);
+}
+
+static inline uint64_t C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone_ptr(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ), "LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ");
+       *ret_conv = C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ* arg_conv = (LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone(int64_t orig) {
+       LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ* orig_conv = (LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ*)untag_ptr(orig);
+       LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ), "LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ");
+       *ret_conv = C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_new(int64_t a, int64_tArray b) {
+       LDKOutPoint 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 = OutPoint_clone(&a_conv);
+       LDKCVec_MonitorUpdateIdZ b_constr;
+       b_constr.datalen = b->arr_len;
+       if (b_constr.datalen > 0)
+               b_constr.data = MALLOC(b_constr.datalen * sizeof(LDKMonitorUpdateId), "LDKCVec_MonitorUpdateIdZ Elements");
+       else
+               b_constr.data = NULL;
+       int64_t* b_vals = b->elems;
+       for (size_t r = 0; r < b_constr.datalen; r++) {
+               int64_t b_conv_17 = b_vals[r];
+               LDKMonitorUpdateId b_conv_17_conv;
+               b_conv_17_conv.inner = untag_ptr(b_conv_17);
+               b_conv_17_conv.is_owned = ptr_is_owned(b_conv_17);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv_17_conv);
+               b_conv_17_conv = MonitorUpdateId_clone(&b_conv_17_conv);
+               b_constr.data[r] = b_conv_17_conv;
+       }
+       FREE(b);
+       LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ), "LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ");
+       *ret_conv = C2Tuple_OutPointCVec_MonitorUpdateIdZZ_new(a_conv, b_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ _res_conv = *(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_OutPointCVec_MonitorUpdateIdZZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ), "LDKCVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t p = 0; p < _res_constr.datalen; p++) {
+               int64_t _res_conv_41 = _res_vals[p];
+               void* _res_conv_41_ptr = untag_ptr(_res_conv_41);
+               CHECK_ACCESS(_res_conv_41_ptr);
+               LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ _res_conv_41_conv = *(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ*)(_res_conv_41_ptr);
+               FREE(untag_ptr(_res_conv_41));
+               _res_constr.data[p] = _res_conv_41_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ_free(_res_constr);
+}
+
+void  CS_LDK_APIError_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);
+       LDKAPIError this_ptr_conv = *(LDKAPIError*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       APIError_free(this_ptr_conv);
+}
+
+static inline uint64_t APIError_clone_ptr(LDKAPIError *NONNULL_PTR arg) {
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = APIError_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_APIError_clone_ptr(int64_t arg) {
+       LDKAPIError* arg_conv = (LDKAPIError*)untag_ptr(arg);
+       int64_t ret_conv = APIError_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_APIError_clone(int64_t orig) {
+       LDKAPIError* orig_conv = (LDKAPIError*)untag_ptr(orig);
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = APIError_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_APIError_apimisuse_error(jstring err) {
+       LDKStr err_conv = str_ref_to_owned_c(err);
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = APIError_apimisuse_error(err_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_APIError_fee_rate_too_high(jstring err, int32_t feerate) {
+       LDKStr err_conv = str_ref_to_owned_c(err);
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = APIError_fee_rate_too_high(err_conv, feerate);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_APIError_invalid_route(jstring err) {
+       LDKStr err_conv = str_ref_to_owned_c(err);
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = APIError_invalid_route(err_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_APIError_channel_unavailable(jstring err) {
+       LDKStr err_conv = str_ref_to_owned_c(err);
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = APIError_channel_unavailable(err_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_APIError_monitor_update_in_progress() {
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = APIError_monitor_update_in_progress();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_APIError_incompatible_shutdown_script(int64_t script) {
+       LDKShutdownScript script_conv;
+       script_conv.inner = untag_ptr(script);
+       script_conv.is_owned = ptr_is_owned(script);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(script_conv);
+       script_conv = ShutdownScript_clone(&script_conv);
+       LDKAPIError *ret_copy = MALLOC(sizeof(LDKAPIError), "LDKAPIError");
+       *ret_copy = APIError_incompatible_shutdown_script(script_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_APIError_eq(int64_t a, int64_t b) {
+       LDKAPIError* a_conv = (LDKAPIError*)untag_ptr(a);
+       LDKAPIError* b_conv = (LDKAPIError*)untag_ptr(b);
+       jboolean ret_conv = APIError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_APIError_write(int64_t obj) {
+       LDKAPIError* obj_conv = (LDKAPIError*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = APIError_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_APIError_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_COption_APIErrorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_APIErrorZDecodeErrorZ), "LDKCResult_COption_APIErrorZDecodeErrorZ");
+       *ret_conv = APIError_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_BigSize_free(int64_t this_obj) {
+       LDKBigSize 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);
+       BigSize_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_BigSize_get_a(int64_t this_ptr) {
+       LDKBigSize 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 = BigSize_get_a(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BigSize_set_a(int64_t this_ptr, int64_t val) {
+       LDKBigSize 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;
+       BigSize_set_a(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_BigSize_new(int64_t a_arg) {
+       LDKBigSize ret_var = BigSize_new(a_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 BigSize_clone_ptr(LDKBigSize *NONNULL_PTR arg) {
+       LDKBigSize ret_var = BigSize_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_BigSize_clone_ptr(int64_t arg) {
+       LDKBigSize 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 = BigSize_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BigSize_clone(int64_t orig) {
+       LDKBigSize 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;
+       LDKBigSize ret_var = BigSize_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_BigSize_hash(int64_t o) {
+       LDKBigSize 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 = BigSize_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BigSize_eq(int64_t a, int64_t b) {
+       LDKBigSize 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;
+       LDKBigSize 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 = BigSize_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_BigSize_write(int64_t obj) {
+       LDKBigSize 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 = BigSize_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_BigSize_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BigSizeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BigSizeDecodeErrorZ), "LDKCResult_BigSizeDecodeErrorZ");
+       *ret_conv = BigSize_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_Hostname_free(int64_t this_obj) {
+       LDKHostname 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);
+       Hostname_free(this_obj_conv);
+}
+
+static inline uint64_t Hostname_clone_ptr(LDKHostname *NONNULL_PTR arg) {
+       LDKHostname ret_var = Hostname_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_Hostname_clone_ptr(int64_t arg) {
+       LDKHostname 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 = Hostname_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Hostname_clone(int64_t orig) {
+       LDKHostname 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;
+       LDKHostname ret_var = Hostname_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_Hostname_eq(int64_t a, int64_t b) {
+       LDKHostname 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;
+       LDKHostname 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 = Hostname_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_t  CS_LDK_Hostname_len(int64_t this_arg) {
+       LDKHostname 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_t ret_conv = Hostname_len(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Hostname_write(int64_t obj) {
+       LDKHostname 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 = Hostname_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_Hostname_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_HostnameDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HostnameDecodeErrorZ), "LDKCResult_HostnameDecodeErrorZ");
+       *ret_conv = Hostname_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_TransactionU16LenLimited_free(int64_t this_obj) {
+       LDKTransactionU16LenLimited 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);
+       TransactionU16LenLimited_free(this_obj_conv);
+}
+
+static inline uint64_t TransactionU16LenLimited_clone_ptr(LDKTransactionU16LenLimited *NONNULL_PTR arg) {
+       LDKTransactionU16LenLimited ret_var = TransactionU16LenLimited_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_TransactionU16LenLimited_clone_ptr(int64_t arg) {
+       LDKTransactionU16LenLimited 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 = TransactionU16LenLimited_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TransactionU16LenLimited_clone(int64_t orig) {
+       LDKTransactionU16LenLimited 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;
+       LDKTransactionU16LenLimited ret_var = TransactionU16LenLimited_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_TransactionU16LenLimited_eq(int64_t a, int64_t b) {
+       LDKTransactionU16LenLimited 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;
+       LDKTransactionU16LenLimited 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 = TransactionU16LenLimited_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TransactionU16LenLimited_new(int8_tArray transaction) {
+       LDKTransaction transaction_ref;
+       transaction_ref.datalen = transaction->arr_len;
+       transaction_ref.data = MALLOC(transaction_ref.datalen, "LDKTransaction Bytes");
+       memcpy(transaction_ref.data, transaction->elems, transaction_ref.datalen); FREE(transaction);
+       transaction_ref.data_is_owned = true;
+       LDKCResult_TransactionU16LenLimitedNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedNoneZ), "LDKCResult_TransactionU16LenLimitedNoneZ");
+       *ret_conv = TransactionU16LenLimited_new(transaction_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TransactionU16LenLimited_into_transaction(int64_t this_arg) {
+       LDKTransactionU16LenLimited 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 = TransactionU16LenLimited_clone(&this_arg_conv);
+       LDKTransaction ret_var = TransactionU16LenLimited_into_transaction(this_arg_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);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_TransactionU16LenLimited_write(int64_t obj) {
+       LDKTransactionU16LenLimited 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 = TransactionU16LenLimited_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_TransactionU16LenLimited_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TransactionU16LenLimitedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionU16LenLimitedDecodeErrorZ), "LDKCResult_TransactionU16LenLimitedDecodeErrorZ");
+       *ret_conv = TransactionU16LenLimited_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_sign(int8_tArray msg, int8_tArray sk) {
+       LDKu8slice msg_ref;
+       msg_ref.datalen = msg->arr_len;
+       msg_ref.data = msg->elems;
+       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;
+       LDKCResult_StrSecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StrSecp256k1ErrorZ), "LDKCResult_StrSecp256k1ErrorZ");
+       *ret_conv = sign(msg_ref, sk_ref);
+       FREE(msg);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_recover_pk(int8_tArray msg, jstring sig) {
+       LDKu8slice msg_ref;
+       msg_ref.datalen = msg->arr_len;
+       msg_ref.data = msg->elems;
+       LDKStr sig_conv = str_ref_to_owned_c(sig);
+       LDKCResult_PublicKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeySecp256k1ErrorZ), "LDKCResult_PublicKeySecp256k1ErrorZ");
+       *ret_conv = recover_pk(msg_ref, sig_conv);
+       FREE(msg);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_verify(int8_tArray msg, jstring sig, int8_tArray pk) {
+       LDKu8slice msg_ref;
+       msg_ref.datalen = msg->arr_len;
+       msg_ref.data = msg->elems;
+       LDKStr sig_conv = str_ref_to_owned_c(sig);
+       LDKPublicKey pk_ref;
+       CHECK(pk->arr_len == 33);
+       memcpy(pk_ref.compressed_form, pk->elems, 33); FREE(pk);
+       jboolean ret_conv = verify(msg_ref, sig_conv, pk_ref);
+       FREE(msg);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_construct_invoice_preimage(int8_tArray hrp_bytes, ptrArray data_without_signature) {
+       LDKu8slice hrp_bytes_ref;
+       hrp_bytes_ref.datalen = hrp_bytes->arr_len;
+       hrp_bytes_ref.data = hrp_bytes->elems;
+       LDKCVec_U5Z data_without_signature_constr;
+       data_without_signature_constr.datalen = data_without_signature->arr_len;
+       if (data_without_signature_constr.datalen > 0)
+               data_without_signature_constr.data = MALLOC(data_without_signature_constr.datalen * sizeof(LDKU5), "LDKCVec_U5Z Elements");
+       else
+               data_without_signature_constr.data = NULL;
+       int8_t* data_without_signature_vals = (void*) data_without_signature->elems;
+       for (size_t h = 0; h < data_without_signature_constr.datalen; h++) {
+               int8_t data_without_signature_conv_7 = data_without_signature_vals[h];
+               
+               data_without_signature_constr.data[h] = (LDKU5){ ._0 = data_without_signature_conv_7 };
+       }
+       FREE(data_without_signature);
+       LDKCVec_u8Z ret_var = construct_invoice_preimage(hrp_bytes_ref, data_without_signature_constr);
+       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);
+       FREE(hrp_bytes);
+       return ret_arr;
+}
+
+void  CS_LDK_KVStore_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);
+       LDKKVStore this_ptr_conv = *(LDKKVStore*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       KVStore_free(this_ptr_conv);
+}
+
+void  CS_LDK_Persister_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);
+       LDKPersister this_ptr_conv = *(LDKPersister*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Persister_free(this_ptr_conv);
+}
+
+int64_t  CS_LDK_read_channel_monitors(int64_t kv_store, int64_t entropy_source, int64_t signer_provider) {
+       void* kv_store_ptr = untag_ptr(kv_store);
+       CHECK_ACCESS(kv_store_ptr);
+       LDKKVStore kv_store_conv = *(LDKKVStore*)(kv_store_ptr);
+       if (kv_store_conv.free == LDKKVStore_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKKVStore_JCalls_cloned(&kv_store_conv);
+       }
+       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* signer_provider_ptr = untag_ptr(signer_provider);
+       CHECK_ACCESS(signer_provider_ptr);
+       LDKSignerProvider signer_provider_conv = *(LDKSignerProvider*)(signer_provider_ptr);
+       if (signer_provider_conv.free == LDKSignerProvider_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKSignerProvider_JCalls_cloned(&signer_provider_conv);
+       }
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ");
+       *ret_conv = read_channel_monitors(kv_store_conv, entropy_source_conv, signer_provider_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_MonitorUpdatingPersister_free(int64_t this_obj) {
+       LDKMonitorUpdatingPersister 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);
+       MonitorUpdatingPersister_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_MonitorUpdatingPersister_new(int64_t kv_store, int64_t logger, int64_t maximum_pending_updates, int64_t entropy_source, int64_t signer_provider) {
+       void* kv_store_ptr = untag_ptr(kv_store);
+       CHECK_ACCESS(kv_store_ptr);
+       LDKKVStore kv_store_conv = *(LDKKVStore*)(kv_store_ptr);
+       if (kv_store_conv.free == LDKKVStore_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKKVStore_JCalls_cloned(&kv_store_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);
+       }
+       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* signer_provider_ptr = untag_ptr(signer_provider);
+       CHECK_ACCESS(signer_provider_ptr);
+       LDKSignerProvider signer_provider_conv = *(LDKSignerProvider*)(signer_provider_ptr);
+       if (signer_provider_conv.free == LDKSignerProvider_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKSignerProvider_JCalls_cloned(&signer_provider_conv);
+       }
+       LDKMonitorUpdatingPersister ret_var = MonitorUpdatingPersister_new(kv_store_conv, logger_conv, maximum_pending_updates, entropy_source_conv, signer_provider_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_MonitorUpdatingPersister_read_all_channel_monitors_with_updates(int64_t this_arg, int64_t broadcaster, int64_t fee_estimator) {
+       LDKMonitorUpdatingPersister 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;
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       if (ptr_is_owned(broadcaster)) { CHECK_ACCESS(broadcaster_ptr); }
+       LDKBroadcasterInterface* broadcaster_conv = (LDKBroadcasterInterface*)broadcaster_ptr;
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       if (ptr_is_owned(fee_estimator)) { CHECK_ACCESS(fee_estimator_ptr); }
+       LDKFeeEstimator* fee_estimator_conv = (LDKFeeEstimator*)fee_estimator_ptr;
+       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ");
+       *ret_conv = MonitorUpdatingPersister_read_all_channel_monitors_with_updates(&this_arg_conv, broadcaster_conv, fee_estimator_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_MonitorUpdatingPersister_read_channel_monitor_with_updates(int64_t this_arg, int64_t broadcaster, int64_t fee_estimator, jstring monitor_key) {
+       LDKMonitorUpdatingPersister 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;
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       if (ptr_is_owned(broadcaster)) { CHECK_ACCESS(broadcaster_ptr); }
+       LDKBroadcasterInterface* broadcaster_conv = (LDKBroadcasterInterface*)broadcaster_ptr;
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       if (ptr_is_owned(fee_estimator)) { CHECK_ACCESS(fee_estimator_ptr); }
+       LDKFeeEstimator* fee_estimator_conv = (LDKFeeEstimator*)fee_estimator_ptr;
+       LDKStr monitor_key_conv = str_ref_to_owned_c(monitor_key);
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ");
+       *ret_conv = MonitorUpdatingPersister_read_channel_monitor_with_updates(&this_arg_conv, broadcaster_conv, fee_estimator_conv, monitor_key_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_MonitorUpdatingPersister_cleanup_stale_updates(int64_t this_arg, jboolean lazy) {
+       LDKMonitorUpdatingPersister 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;
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = MonitorUpdatingPersister_cleanup_stale_updates(&this_arg_conv, lazy);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_MonitorUpdatingPersister_as_Persist(int64_t this_arg) {
+       LDKMonitorUpdatingPersister 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;
+       LDKPersist* ret_ret = MALLOC(sizeof(LDKPersist), "LDKPersist");
+       *ret_ret = MonitorUpdatingPersister_as_Persist(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_UntrustedString_free(int64_t this_obj) {
+       LDKUntrustedString 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);
+       UntrustedString_free(this_obj_conv);
+}
+
+jstring  CS_LDK_UntrustedString_get_a(int64_t this_ptr) {
+       LDKUntrustedString 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 = UntrustedString_get_a(&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_UntrustedString_set_a(int64_t this_ptr, jstring val) {
+       LDKUntrustedString 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);
+       UntrustedString_set_a(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_UntrustedString_new(jstring a_arg) {
+       LDKStr a_arg_conv = str_ref_to_owned_c(a_arg);
+       LDKUntrustedString ret_var = UntrustedString_new(a_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 UntrustedString_clone_ptr(LDKUntrustedString *NONNULL_PTR arg) {
+       LDKUntrustedString ret_var = UntrustedString_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_UntrustedString_clone_ptr(int64_t arg) {
+       LDKUntrustedString 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 = UntrustedString_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UntrustedString_clone(int64_t orig) {
+       LDKUntrustedString 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;
+       LDKUntrustedString ret_var = UntrustedString_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_UntrustedString_eq(int64_t a, int64_t b) {
+       LDKUntrustedString 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;
+       LDKUntrustedString 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 = UntrustedString_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_UntrustedString_write(int64_t obj) {
+       LDKUntrustedString 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 = UntrustedString_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_UntrustedString_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UntrustedStringDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UntrustedStringDecodeErrorZ), "LDKCResult_UntrustedStringDecodeErrorZ");
+       *ret_conv = UntrustedString_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_PrintableString_free(int64_t this_obj) {
+       LDKPrintableString 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);
+       PrintableString_free(this_obj_conv);
+}
+
+jstring  CS_LDK_PrintableString_get_a(int64_t this_ptr) {
+       LDKPrintableString 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 = PrintableString_get_a(&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_PrintableString_set_a(int64_t this_ptr, jstring val) {
+       LDKPrintableString 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);
+       PrintableString_set_a(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_PrintableString_new(jstring a_arg) {
+       LDKStr a_arg_conv = str_ref_to_owned_c(a_arg);
+       LDKPrintableString ret_var = PrintableString_new(a_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;
+}
+
+void  CS_LDK_FutureCallback_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);
+       LDKFutureCallback this_ptr_conv = *(LDKFutureCallback*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       FutureCallback_free(this_ptr_conv);
+}
+
+void  CS_LDK_Future_free(int64_t this_obj) {
+       LDKFuture 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);
+       Future_free(this_obj_conv);
+}
+
+static inline uint64_t Future_clone_ptr(LDKFuture *NONNULL_PTR arg) {
+       LDKFuture ret_var = Future_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_Future_clone_ptr(int64_t arg) {
+       LDKFuture 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 = Future_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Future_clone(int64_t orig) {
+       LDKFuture 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;
+       LDKFuture ret_var = Future_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_Future_register_callback_fn(int64_t this_arg, int64_t callback) {
+       LDKFuture 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;
+       void* callback_ptr = untag_ptr(callback);
+       CHECK_ACCESS(callback_ptr);
+       LDKFutureCallback callback_conv = *(LDKFutureCallback*)(callback_ptr);
+       if (callback_conv.free == LDKFutureCallback_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFutureCallback_JCalls_cloned(&callback_conv);
+       }
+       Future_register_callback_fn(&this_arg_conv, callback_conv);
+}
+
+void  CS_LDK_Future_wait(int64_t this_arg) {
+       LDKFuture 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 = Future_clone(&this_arg_conv);
+       Future_wait(this_arg_conv);
+}
+
+jboolean  CS_LDK_Future_wait_timeout(int64_t this_arg, int64_t max_wait) {
+       LDKFuture 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 = Future_clone(&this_arg_conv);
+       jboolean ret_conv = Future_wait_timeout(this_arg_conv, max_wait);
+       return ret_conv;
+}
+
+void  CS_LDK_Sleeper_free(int64_t this_obj) {
+       LDKSleeper 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);
+       Sleeper_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_Sleeper_from_single_future(int64_t future) {
+       LDKFuture future_conv;
+       future_conv.inner = untag_ptr(future);
+       future_conv.is_owned = ptr_is_owned(future);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(future_conv);
+       future_conv = Future_clone(&future_conv);
+       LDKSleeper ret_var = Sleeper_from_single_future(future_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_Sleeper_from_two_futures(int64_t fut_a, int64_t fut_b) {
+       LDKFuture fut_a_conv;
+       fut_a_conv.inner = untag_ptr(fut_a);
+       fut_a_conv.is_owned = ptr_is_owned(fut_a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(fut_a_conv);
+       fut_a_conv = Future_clone(&fut_a_conv);
+       LDKFuture fut_b_conv;
+       fut_b_conv.inner = untag_ptr(fut_b);
+       fut_b_conv.is_owned = ptr_is_owned(fut_b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(fut_b_conv);
+       fut_b_conv = Future_clone(&fut_b_conv);
+       LDKSleeper ret_var = Sleeper_from_two_futures(fut_a_conv, fut_b_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_Sleeper_new(int64_tArray futures) {
+       LDKCVec_FutureZ futures_constr;
+       futures_constr.datalen = futures->arr_len;
+       if (futures_constr.datalen > 0)
+               futures_constr.data = MALLOC(futures_constr.datalen * sizeof(LDKFuture), "LDKCVec_FutureZ Elements");
+       else
+               futures_constr.data = NULL;
+       int64_t* futures_vals = futures->elems;
+       for (size_t i = 0; i < futures_constr.datalen; i++) {
+               int64_t futures_conv_8 = futures_vals[i];
+               LDKFuture futures_conv_8_conv;
+               futures_conv_8_conv.inner = untag_ptr(futures_conv_8);
+               futures_conv_8_conv.is_owned = ptr_is_owned(futures_conv_8);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(futures_conv_8_conv);
+               futures_conv_8_conv = Future_clone(&futures_conv_8_conv);
+               futures_constr.data[i] = futures_conv_8_conv;
+       }
+       FREE(futures);
+       LDKSleeper ret_var = Sleeper_new(futures_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);
+       return ret_ref;
+}
+
+void  CS_LDK_Sleeper_wait(int64_t this_arg) {
+       LDKSleeper 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;
+       Sleeper_wait(&this_arg_conv);
+}
+
+jboolean  CS_LDK_Sleeper_wait_timeout(int64_t this_arg, int64_t max_wait) {
+       LDKSleeper 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 = Sleeper_wait_timeout(&this_arg_conv, max_wait);
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Level_clone(int64_t orig) {
+       LDKLevel* orig_conv = (LDKLevel*)untag_ptr(orig);
+       int32_t ret_conv = LDKLevel_to_cs(Level_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Level_gossip() {
+       int32_t ret_conv = LDKLevel_to_cs(Level_gossip());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Level_trace() {
+       int32_t ret_conv = LDKLevel_to_cs(Level_trace());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Level_debug() {
+       int32_t ret_conv = LDKLevel_to_cs(Level_debug());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Level_info() {
+       int32_t ret_conv = LDKLevel_to_cs(Level_info());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Level_warn() {
+       int32_t ret_conv = LDKLevel_to_cs(Level_warn());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Level_error() {
+       int32_t ret_conv = LDKLevel_to_cs(Level_error());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Level_eq(int64_t a, int64_t b) {
+       LDKLevel* a_conv = (LDKLevel*)untag_ptr(a);
+       LDKLevel* b_conv = (LDKLevel*)untag_ptr(b);
+       jboolean ret_conv = Level_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Level_hash(int64_t o) {
+       LDKLevel* o_conv = (LDKLevel*)untag_ptr(o);
+       int64_t ret_conv = Level_hash(o_conv);
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Level_max() {
+       int32_t ret_conv = LDKLevel_to_cs(Level_max());
+       return ret_conv;
+}
+
+void  CS_LDK_Record_free(int64_t this_obj) {
+       LDKRecord 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);
+       Record_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_Record_get_level(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;
+       int32_t ret_conv = LDKLevel_to_cs(Record_get_level(&this_ptr_conv));
+       return ret_conv;
+}
+
+void  CS_LDK_Record_set_level(int64_t this_ptr, int32_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;
+       LDKLevel val_conv = LDKLevel_from_cs(val);
+       Record_set_level(&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);
+       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 = Record_get_args(&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_Record_set_args(int64_t this_ptr, jstring 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;
+       LDKStr val_conv = str_ref_to_owned_c(val);
+       Record_set_args(&this_ptr_conv, val_conv);
+}
+
+jstring  CS_LDK_Record_get_module_path(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;
+       LDKStr ret_str = Record_get_module_path(&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_Record_set_module_path(int64_t this_ptr, jstring 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;
+       LDKStr val_conv = str_ref_to_owned_c(val);
+       Record_set_module_path(&this_ptr_conv, val_conv);
+}
+
+jstring  CS_LDK_Record_get_file(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;
+       LDKStr ret_str = Record_get_file(&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_Record_set_file(int64_t this_ptr, jstring 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;
+       LDKStr val_conv = str_ref_to_owned_c(val);
+       Record_set_file(&this_ptr_conv, val_conv);
+}
+
+int32_t  CS_LDK_Record_get_line(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;
+       int32_t ret_conv = Record_get_line(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Record_set_line(int64_t this_ptr, int32_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;
+       Record_set_line(&this_ptr_conv, val);
+}
+
+static inline uint64_t Record_clone_ptr(LDKRecord *NONNULL_PTR arg) {
+       LDKRecord ret_var = Record_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_Record_clone_ptr(int64_t arg) {
+       LDKRecord 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 = Record_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Record_clone(int64_t orig) {
+       LDKRecord 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;
+       LDKRecord ret_var = Record_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_Logger_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);
+       LDKLogger this_ptr_conv = *(LDKLogger*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Logger_free(this_ptr_conv);
+}
+
+void  CS_LDK_ChannelHandshakeConfig_free(int64_t this_obj) {
+       LDKChannelHandshakeConfig 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);
+       ChannelHandshakeConfig_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_ChannelHandshakeConfig_get_minimum_depth(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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 = ChannelHandshakeConfig_get_minimum_depth(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_minimum_depth(int64_t this_ptr, int32_t val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_minimum_depth(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_ChannelHandshakeConfig_get_our_to_self_delay(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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 = ChannelHandshakeConfig_get_our_to_self_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_our_to_self_delay(int64_t this_ptr, int16_t val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_our_to_self_delay(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelHandshakeConfig_get_our_htlc_minimum_msat(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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 = ChannelHandshakeConfig_get_our_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_our_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_our_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int8_t  CS_LDK_ChannelHandshakeConfig_get_max_inbound_htlc_value_in_flight_percent_of_channel(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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 = ChannelHandshakeConfig_get_max_inbound_htlc_value_in_flight_percent_of_channel(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_max_inbound_htlc_value_in_flight_percent_of_channel(int64_t this_ptr, int8_t val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_max_inbound_htlc_value_in_flight_percent_of_channel(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelHandshakeConfig_get_negotiate_scid_privacy(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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;
+       jboolean ret_conv = ChannelHandshakeConfig_get_negotiate_scid_privacy(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_negotiate_scid_privacy(int64_t this_ptr, jboolean val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_negotiate_scid_privacy(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelHandshakeConfig_get_announced_channel(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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;
+       jboolean ret_conv = ChannelHandshakeConfig_get_announced_channel(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_announced_channel(int64_t this_ptr, jboolean val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_announced_channel(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelHandshakeConfig_get_commit_upfront_shutdown_pubkey(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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;
+       jboolean ret_conv = ChannelHandshakeConfig_get_commit_upfront_shutdown_pubkey(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_commit_upfront_shutdown_pubkey(int64_t this_ptr, jboolean val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_commit_upfront_shutdown_pubkey(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_ChannelHandshakeConfig_get_their_channel_reserve_proportional_millionths(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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 = ChannelHandshakeConfig_get_their_channel_reserve_proportional_millionths(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_their_channel_reserve_proportional_millionths(int64_t this_ptr, int32_t val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_their_channel_reserve_proportional_millionths(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelHandshakeConfig_get_negotiate_anchors_zero_fee_htlc_tx(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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;
+       jboolean ret_conv = ChannelHandshakeConfig_get_negotiate_anchors_zero_fee_htlc_tx(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_negotiate_anchors_zero_fee_htlc_tx(int64_t this_ptr, jboolean val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_negotiate_anchors_zero_fee_htlc_tx(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_ChannelHandshakeConfig_get_our_max_accepted_htlcs(int64_t this_ptr) {
+       LDKChannelHandshakeConfig 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 = ChannelHandshakeConfig_get_our_max_accepted_htlcs(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeConfig_set_our_max_accepted_htlcs(int64_t this_ptr, int16_t val) {
+       LDKChannelHandshakeConfig 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;
+       ChannelHandshakeConfig_set_our_max_accepted_htlcs(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelHandshakeConfig_new(int32_t minimum_depth_arg, int16_t our_to_self_delay_arg, int64_t our_htlc_minimum_msat_arg, int8_t max_inbound_htlc_value_in_flight_percent_of_channel_arg, jboolean negotiate_scid_privacy_arg, jboolean announced_channel_arg, jboolean commit_upfront_shutdown_pubkey_arg, int32_t their_channel_reserve_proportional_millionths_arg, jboolean negotiate_anchors_zero_fee_htlc_tx_arg, int16_t our_max_accepted_htlcs_arg) {
+       LDKChannelHandshakeConfig ret_var = ChannelHandshakeConfig_new(minimum_depth_arg, our_to_self_delay_arg, our_htlc_minimum_msat_arg, max_inbound_htlc_value_in_flight_percent_of_channel_arg, negotiate_scid_privacy_arg, announced_channel_arg, commit_upfront_shutdown_pubkey_arg, their_channel_reserve_proportional_millionths_arg, negotiate_anchors_zero_fee_htlc_tx_arg, our_max_accepted_htlcs_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 ChannelHandshakeConfig_clone_ptr(LDKChannelHandshakeConfig *NONNULL_PTR arg) {
+       LDKChannelHandshakeConfig ret_var = ChannelHandshakeConfig_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_ChannelHandshakeConfig_clone_ptr(int64_t arg) {
+       LDKChannelHandshakeConfig 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 = ChannelHandshakeConfig_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelHandshakeConfig_clone(int64_t orig) {
+       LDKChannelHandshakeConfig 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;
+       LDKChannelHandshakeConfig ret_var = ChannelHandshakeConfig_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_ChannelHandshakeConfig_default() {
+       LDKChannelHandshakeConfig ret_var = ChannelHandshakeConfig_default();
+       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_ChannelHandshakeLimits_free(int64_t this_obj) {
+       LDKChannelHandshakeLimits 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);
+       ChannelHandshakeLimits_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChannelHandshakeLimits_get_min_funding_satoshis(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_get_min_funding_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_min_funding_satoshis(int64_t this_ptr, int64_t val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_min_funding_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelHandshakeLimits_get_max_funding_satoshis(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_get_max_funding_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_max_funding_satoshis(int64_t this_ptr, int64_t val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_max_funding_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelHandshakeLimits_get_max_htlc_minimum_msat(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_get_max_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_max_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_max_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelHandshakeLimits_get_min_max_htlc_value_in_flight_msat(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_get_min_max_htlc_value_in_flight_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_min_max_htlc_value_in_flight_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_min_max_htlc_value_in_flight_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelHandshakeLimits_get_max_channel_reserve_satoshis(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_get_max_channel_reserve_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_max_channel_reserve_satoshis(int64_t this_ptr, int64_t val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_max_channel_reserve_satoshis(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_ChannelHandshakeLimits_get_min_max_accepted_htlcs(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_get_min_max_accepted_htlcs(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_min_max_accepted_htlcs(int64_t this_ptr, int16_t val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_min_max_accepted_htlcs(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_ChannelHandshakeLimits_get_max_minimum_depth(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_get_max_minimum_depth(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_max_minimum_depth(int64_t this_ptr, int32_t val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_max_minimum_depth(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelHandshakeLimits_get_trust_own_funding_0conf(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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;
+       jboolean ret_conv = ChannelHandshakeLimits_get_trust_own_funding_0conf(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_trust_own_funding_0conf(int64_t this_ptr, jboolean val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_trust_own_funding_0conf(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelHandshakeLimits_get_force_announced_channel_preference(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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;
+       jboolean ret_conv = ChannelHandshakeLimits_get_force_announced_channel_preference(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_force_announced_channel_preference(int64_t this_ptr, jboolean val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_force_announced_channel_preference(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_ChannelHandshakeLimits_get_their_to_self_delay(int64_t this_ptr) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_get_their_to_self_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelHandshakeLimits_set_their_to_self_delay(int64_t this_ptr, int16_t val) {
+       LDKChannelHandshakeLimits 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;
+       ChannelHandshakeLimits_set_their_to_self_delay(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelHandshakeLimits_new(int64_t min_funding_satoshis_arg, int64_t max_funding_satoshis_arg, int64_t max_htlc_minimum_msat_arg, int64_t min_max_htlc_value_in_flight_msat_arg, int64_t max_channel_reserve_satoshis_arg, int16_t min_max_accepted_htlcs_arg, int32_t max_minimum_depth_arg, jboolean trust_own_funding_0conf_arg, jboolean force_announced_channel_preference_arg, int16_t their_to_self_delay_arg) {
+       LDKChannelHandshakeLimits ret_var = ChannelHandshakeLimits_new(min_funding_satoshis_arg, max_funding_satoshis_arg, max_htlc_minimum_msat_arg, min_max_htlc_value_in_flight_msat_arg, max_channel_reserve_satoshis_arg, min_max_accepted_htlcs_arg, max_minimum_depth_arg, trust_own_funding_0conf_arg, force_announced_channel_preference_arg, their_to_self_delay_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 ChannelHandshakeLimits_clone_ptr(LDKChannelHandshakeLimits *NONNULL_PTR arg) {
+       LDKChannelHandshakeLimits ret_var = ChannelHandshakeLimits_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_ChannelHandshakeLimits_clone_ptr(int64_t arg) {
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelHandshakeLimits_clone(int64_t orig) {
+       LDKChannelHandshakeLimits 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;
+       LDKChannelHandshakeLimits ret_var = ChannelHandshakeLimits_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_ChannelHandshakeLimits_default() {
+       LDKChannelHandshakeLimits ret_var = ChannelHandshakeLimits_default();
+       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_MaxDustHTLCExposure_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);
+       LDKMaxDustHTLCExposure this_ptr_conv = *(LDKMaxDustHTLCExposure*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       MaxDustHTLCExposure_free(this_ptr_conv);
+}
+
+static inline uint64_t MaxDustHTLCExposure_clone_ptr(LDKMaxDustHTLCExposure *NONNULL_PTR arg) {
+       LDKMaxDustHTLCExposure *ret_copy = MALLOC(sizeof(LDKMaxDustHTLCExposure), "LDKMaxDustHTLCExposure");
+       *ret_copy = MaxDustHTLCExposure_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_MaxDustHTLCExposure_clone_ptr(int64_t arg) {
+       LDKMaxDustHTLCExposure* arg_conv = (LDKMaxDustHTLCExposure*)untag_ptr(arg);
+       int64_t ret_conv = MaxDustHTLCExposure_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_MaxDustHTLCExposure_clone(int64_t orig) {
+       LDKMaxDustHTLCExposure* orig_conv = (LDKMaxDustHTLCExposure*)untag_ptr(orig);
+       LDKMaxDustHTLCExposure *ret_copy = MALLOC(sizeof(LDKMaxDustHTLCExposure), "LDKMaxDustHTLCExposure");
+       *ret_copy = MaxDustHTLCExposure_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MaxDustHTLCExposure_fixed_limit_msat(int64_t a) {
+       LDKMaxDustHTLCExposure *ret_copy = MALLOC(sizeof(LDKMaxDustHTLCExposure), "LDKMaxDustHTLCExposure");
+       *ret_copy = MaxDustHTLCExposure_fixed_limit_msat(a);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MaxDustHTLCExposure_fee_rate_multiplier(int64_t a) {
+       LDKMaxDustHTLCExposure *ret_copy = MALLOC(sizeof(LDKMaxDustHTLCExposure), "LDKMaxDustHTLCExposure");
+       *ret_copy = MaxDustHTLCExposure_fee_rate_multiplier(a);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_MaxDustHTLCExposure_eq(int64_t a, int64_t b) {
+       LDKMaxDustHTLCExposure* a_conv = (LDKMaxDustHTLCExposure*)untag_ptr(a);
+       LDKMaxDustHTLCExposure* b_conv = (LDKMaxDustHTLCExposure*)untag_ptr(b);
+       jboolean ret_conv = MaxDustHTLCExposure_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_MaxDustHTLCExposure_write(int64_t obj) {
+       LDKMaxDustHTLCExposure* obj_conv = (LDKMaxDustHTLCExposure*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = MaxDustHTLCExposure_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_MaxDustHTLCExposure_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_MaxDustHTLCExposureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_MaxDustHTLCExposureDecodeErrorZ), "LDKCResult_MaxDustHTLCExposureDecodeErrorZ");
+       *ret_conv = MaxDustHTLCExposure_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelConfig_free(int64_t this_obj) {
+       LDKChannelConfig 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);
+       ChannelConfig_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_ChannelConfig_get_forwarding_fee_proportional_millionths(int64_t this_ptr) {
+       LDKChannelConfig 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 = ChannelConfig_get_forwarding_fee_proportional_millionths(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelConfig_set_forwarding_fee_proportional_millionths(int64_t this_ptr, int32_t val) {
+       LDKChannelConfig 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;
+       ChannelConfig_set_forwarding_fee_proportional_millionths(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_ChannelConfig_get_forwarding_fee_base_msat(int64_t this_ptr) {
+       LDKChannelConfig 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 = ChannelConfig_get_forwarding_fee_base_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelConfig_set_forwarding_fee_base_msat(int64_t this_ptr, int32_t val) {
+       LDKChannelConfig 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;
+       ChannelConfig_set_forwarding_fee_base_msat(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_ChannelConfig_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKChannelConfig 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 = ChannelConfig_get_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelConfig_set_cltv_expiry_delta(int64_t this_ptr, int16_t val) {
+       LDKChannelConfig 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;
+       ChannelConfig_set_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelConfig_get_max_dust_htlc_exposure(int64_t this_ptr) {
+       LDKChannelConfig 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;
+       LDKMaxDustHTLCExposure *ret_copy = MALLOC(sizeof(LDKMaxDustHTLCExposure), "LDKMaxDustHTLCExposure");
+       *ret_copy = ChannelConfig_get_max_dust_htlc_exposure(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelConfig_set_max_dust_htlc_exposure(int64_t this_ptr, int64_t val) {
+       LDKChannelConfig 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);
+       LDKMaxDustHTLCExposure val_conv = *(LDKMaxDustHTLCExposure*)(val_ptr);
+       val_conv = MaxDustHTLCExposure_clone((LDKMaxDustHTLCExposure*)untag_ptr(val));
+       ChannelConfig_set_max_dust_htlc_exposure(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelConfig_get_force_close_avoidance_max_fee_satoshis(int64_t this_ptr) {
+       LDKChannelConfig 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 = ChannelConfig_get_force_close_avoidance_max_fee_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelConfig_set_force_close_avoidance_max_fee_satoshis(int64_t this_ptr, int64_t val) {
+       LDKChannelConfig 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;
+       ChannelConfig_set_force_close_avoidance_max_fee_satoshis(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelConfig_get_accept_underpaying_htlcs(int64_t this_ptr) {
+       LDKChannelConfig 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;
+       jboolean ret_conv = ChannelConfig_get_accept_underpaying_htlcs(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelConfig_set_accept_underpaying_htlcs(int64_t this_ptr, jboolean val) {
+       LDKChannelConfig 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;
+       ChannelConfig_set_accept_underpaying_htlcs(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelConfig_new(int32_t forwarding_fee_proportional_millionths_arg, int32_t forwarding_fee_base_msat_arg, int16_t cltv_expiry_delta_arg, int64_t max_dust_htlc_exposure_arg, int64_t force_close_avoidance_max_fee_satoshis_arg, jboolean accept_underpaying_htlcs_arg) {
+       void* max_dust_htlc_exposure_arg_ptr = untag_ptr(max_dust_htlc_exposure_arg);
+       CHECK_ACCESS(max_dust_htlc_exposure_arg_ptr);
+       LDKMaxDustHTLCExposure max_dust_htlc_exposure_arg_conv = *(LDKMaxDustHTLCExposure*)(max_dust_htlc_exposure_arg_ptr);
+       max_dust_htlc_exposure_arg_conv = MaxDustHTLCExposure_clone((LDKMaxDustHTLCExposure*)untag_ptr(max_dust_htlc_exposure_arg));
+       LDKChannelConfig ret_var = ChannelConfig_new(forwarding_fee_proportional_millionths_arg, forwarding_fee_base_msat_arg, cltv_expiry_delta_arg, max_dust_htlc_exposure_arg_conv, force_close_avoidance_max_fee_satoshis_arg, accept_underpaying_htlcs_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 ChannelConfig_clone_ptr(LDKChannelConfig *NONNULL_PTR arg) {
+       LDKChannelConfig ret_var = ChannelConfig_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_ChannelConfig_clone_ptr(int64_t arg) {
+       LDKChannelConfig 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 = ChannelConfig_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelConfig_clone(int64_t orig) {
+       LDKChannelConfig 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;
+       LDKChannelConfig ret_var = ChannelConfig_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_ChannelConfig_eq(int64_t a, int64_t b) {
+       LDKChannelConfig 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;
+       LDKChannelConfig 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 = ChannelConfig_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelConfig_apply(int64_t this_arg, int64_t update) {
+       LDKChannelConfig 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;
+       LDKChannelConfigUpdate update_conv;
+       update_conv.inner = untag_ptr(update);
+       update_conv.is_owned = ptr_is_owned(update);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_conv);
+       update_conv.is_owned = false;
+       ChannelConfig_apply(&this_arg_conv, &update_conv);
+}
+
+int64_t  CS_LDK_ChannelConfig_default() {
+       LDKChannelConfig ret_var = ChannelConfig_default();
+       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_ChannelConfig_write(int64_t obj) {
+       LDKChannelConfig 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 = ChannelConfig_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_ChannelConfig_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelConfigDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelConfigDecodeErrorZ), "LDKCResult_ChannelConfigDecodeErrorZ");
+       *ret_conv = ChannelConfig_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelConfigUpdate_free(int64_t this_obj) {
+       LDKChannelConfigUpdate 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);
+       ChannelConfigUpdate_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChannelConfigUpdate_get_forwarding_fee_proportional_millionths(int64_t this_ptr) {
+       LDKChannelConfigUpdate 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_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = ChannelConfigUpdate_get_forwarding_fee_proportional_millionths(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelConfigUpdate_set_forwarding_fee_proportional_millionths(int64_t this_ptr, int64_t val) {
+       LDKChannelConfigUpdate 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_u32Z val_conv = *(LDKCOption_u32Z*)(val_ptr);
+       val_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(val));
+       ChannelConfigUpdate_set_forwarding_fee_proportional_millionths(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelConfigUpdate_get_forwarding_fee_base_msat(int64_t this_ptr) {
+       LDKChannelConfigUpdate 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_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = ChannelConfigUpdate_get_forwarding_fee_base_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelConfigUpdate_set_forwarding_fee_base_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelConfigUpdate 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_u32Z val_conv = *(LDKCOption_u32Z*)(val_ptr);
+       val_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(val));
+       ChannelConfigUpdate_set_forwarding_fee_base_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelConfigUpdate_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKChannelConfigUpdate 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_u16Z *ret_copy = MALLOC(sizeof(LDKCOption_u16Z), "LDKCOption_u16Z");
+       *ret_copy = ChannelConfigUpdate_get_cltv_expiry_delta(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelConfigUpdate_set_cltv_expiry_delta(int64_t this_ptr, int64_t val) {
+       LDKChannelConfigUpdate 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_u16Z val_conv = *(LDKCOption_u16Z*)(val_ptr);
+       val_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(val));
+       ChannelConfigUpdate_set_cltv_expiry_delta(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelConfigUpdate_get_max_dust_htlc_exposure_msat(int64_t this_ptr) {
+       LDKChannelConfigUpdate 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_MaxDustHTLCExposureZ *ret_copy = MALLOC(sizeof(LDKCOption_MaxDustHTLCExposureZ), "LDKCOption_MaxDustHTLCExposureZ");
+       *ret_copy = ChannelConfigUpdate_get_max_dust_htlc_exposure_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelConfigUpdate_set_max_dust_htlc_exposure_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelConfigUpdate 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_MaxDustHTLCExposureZ val_conv = *(LDKCOption_MaxDustHTLCExposureZ*)(val_ptr);
+       val_conv = COption_MaxDustHTLCExposureZ_clone((LDKCOption_MaxDustHTLCExposureZ*)untag_ptr(val));
+       ChannelConfigUpdate_set_max_dust_htlc_exposure_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelConfigUpdate_get_force_close_avoidance_max_fee_satoshis(int64_t this_ptr) {
+       LDKChannelConfigUpdate 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 = ChannelConfigUpdate_get_force_close_avoidance_max_fee_satoshis(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelConfigUpdate_set_force_close_avoidance_max_fee_satoshis(int64_t this_ptr, int64_t val) {
+       LDKChannelConfigUpdate 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));
+       ChannelConfigUpdate_set_force_close_avoidance_max_fee_satoshis(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelConfigUpdate_new(int64_t forwarding_fee_proportional_millionths_arg, int64_t forwarding_fee_base_msat_arg, int64_t cltv_expiry_delta_arg, int64_t max_dust_htlc_exposure_msat_arg, int64_t force_close_avoidance_max_fee_satoshis_arg) {
+       void* forwarding_fee_proportional_millionths_arg_ptr = untag_ptr(forwarding_fee_proportional_millionths_arg);
+       CHECK_ACCESS(forwarding_fee_proportional_millionths_arg_ptr);
+       LDKCOption_u32Z forwarding_fee_proportional_millionths_arg_conv = *(LDKCOption_u32Z*)(forwarding_fee_proportional_millionths_arg_ptr);
+       forwarding_fee_proportional_millionths_arg_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(forwarding_fee_proportional_millionths_arg));
+       void* forwarding_fee_base_msat_arg_ptr = untag_ptr(forwarding_fee_base_msat_arg);
+       CHECK_ACCESS(forwarding_fee_base_msat_arg_ptr);
+       LDKCOption_u32Z forwarding_fee_base_msat_arg_conv = *(LDKCOption_u32Z*)(forwarding_fee_base_msat_arg_ptr);
+       forwarding_fee_base_msat_arg_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(forwarding_fee_base_msat_arg));
+       void* cltv_expiry_delta_arg_ptr = untag_ptr(cltv_expiry_delta_arg);
+       CHECK_ACCESS(cltv_expiry_delta_arg_ptr);
+       LDKCOption_u16Z cltv_expiry_delta_arg_conv = *(LDKCOption_u16Z*)(cltv_expiry_delta_arg_ptr);
+       cltv_expiry_delta_arg_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(cltv_expiry_delta_arg));
+       void* max_dust_htlc_exposure_msat_arg_ptr = untag_ptr(max_dust_htlc_exposure_msat_arg);
+       CHECK_ACCESS(max_dust_htlc_exposure_msat_arg_ptr);
+       LDKCOption_MaxDustHTLCExposureZ max_dust_htlc_exposure_msat_arg_conv = *(LDKCOption_MaxDustHTLCExposureZ*)(max_dust_htlc_exposure_msat_arg_ptr);
+       max_dust_htlc_exposure_msat_arg_conv = COption_MaxDustHTLCExposureZ_clone((LDKCOption_MaxDustHTLCExposureZ*)untag_ptr(max_dust_htlc_exposure_msat_arg));
+       void* force_close_avoidance_max_fee_satoshis_arg_ptr = untag_ptr(force_close_avoidance_max_fee_satoshis_arg);
+       CHECK_ACCESS(force_close_avoidance_max_fee_satoshis_arg_ptr);
+       LDKCOption_u64Z force_close_avoidance_max_fee_satoshis_arg_conv = *(LDKCOption_u64Z*)(force_close_avoidance_max_fee_satoshis_arg_ptr);
+       force_close_avoidance_max_fee_satoshis_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(force_close_avoidance_max_fee_satoshis_arg));
+       LDKChannelConfigUpdate ret_var = ChannelConfigUpdate_new(forwarding_fee_proportional_millionths_arg_conv, forwarding_fee_base_msat_arg_conv, cltv_expiry_delta_arg_conv, max_dust_htlc_exposure_msat_arg_conv, force_close_avoidance_max_fee_satoshis_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_ChannelConfigUpdate_default() {
+       LDKChannelConfigUpdate ret_var = ChannelConfigUpdate_default();
+       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_UserConfig_free(int64_t this_obj) {
+       LDKUserConfig 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);
+       UserConfig_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_UserConfig_get_channel_handshake_config(int64_t this_ptr) {
+       LDKUserConfig 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;
+       LDKChannelHandshakeConfig ret_var = UserConfig_get_channel_handshake_config(&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_UserConfig_set_channel_handshake_config(int64_t this_ptr, int64_t val) {
+       LDKUserConfig 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;
+       LDKChannelHandshakeConfig 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 = ChannelHandshakeConfig_clone(&val_conv);
+       UserConfig_set_channel_handshake_config(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_UserConfig_get_channel_handshake_limits(int64_t this_ptr) {
+       LDKUserConfig 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;
+       LDKChannelHandshakeLimits ret_var = UserConfig_get_channel_handshake_limits(&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_UserConfig_set_channel_handshake_limits(int64_t this_ptr, int64_t val) {
+       LDKUserConfig 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;
+       LDKChannelHandshakeLimits 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 = ChannelHandshakeLimits_clone(&val_conv);
+       UserConfig_set_channel_handshake_limits(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_UserConfig_get_channel_config(int64_t this_ptr) {
+       LDKUserConfig 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;
+       LDKChannelConfig ret_var = UserConfig_get_channel_config(&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_UserConfig_set_channel_config(int64_t this_ptr, int64_t val) {
+       LDKUserConfig 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;
+       LDKChannelConfig 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 = ChannelConfig_clone(&val_conv);
+       UserConfig_set_channel_config(&this_ptr_conv, val_conv);
+}
+
+jboolean  CS_LDK_UserConfig_get_accept_forwards_to_priv_channels(int64_t this_ptr) {
+       LDKUserConfig 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;
+       jboolean ret_conv = UserConfig_get_accept_forwards_to_priv_channels(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UserConfig_set_accept_forwards_to_priv_channels(int64_t this_ptr, jboolean val) {
+       LDKUserConfig 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;
+       UserConfig_set_accept_forwards_to_priv_channels(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_UserConfig_get_accept_inbound_channels(int64_t this_ptr) {
+       LDKUserConfig 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;
+       jboolean ret_conv = UserConfig_get_accept_inbound_channels(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UserConfig_set_accept_inbound_channels(int64_t this_ptr, jboolean val) {
+       LDKUserConfig 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;
+       UserConfig_set_accept_inbound_channels(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_UserConfig_get_manually_accept_inbound_channels(int64_t this_ptr) {
+       LDKUserConfig 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;
+       jboolean ret_conv = UserConfig_get_manually_accept_inbound_channels(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UserConfig_set_manually_accept_inbound_channels(int64_t this_ptr, jboolean val) {
+       LDKUserConfig 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;
+       UserConfig_set_manually_accept_inbound_channels(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_UserConfig_get_accept_intercept_htlcs(int64_t this_ptr) {
+       LDKUserConfig 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;
+       jboolean ret_conv = UserConfig_get_accept_intercept_htlcs(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UserConfig_set_accept_intercept_htlcs(int64_t this_ptr, jboolean val) {
+       LDKUserConfig 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;
+       UserConfig_set_accept_intercept_htlcs(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_UserConfig_get_accept_mpp_keysend(int64_t this_ptr) {
+       LDKUserConfig 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;
+       jboolean ret_conv = UserConfig_get_accept_mpp_keysend(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UserConfig_set_accept_mpp_keysend(int64_t this_ptr, jboolean val) {
+       LDKUserConfig 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;
+       UserConfig_set_accept_mpp_keysend(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_UserConfig_new(int64_t channel_handshake_config_arg, int64_t channel_handshake_limits_arg, int64_t channel_config_arg, jboolean accept_forwards_to_priv_channels_arg, jboolean accept_inbound_channels_arg, jboolean manually_accept_inbound_channels_arg, jboolean accept_intercept_htlcs_arg, jboolean accept_mpp_keysend_arg) {
+       LDKChannelHandshakeConfig channel_handshake_config_arg_conv;
+       channel_handshake_config_arg_conv.inner = untag_ptr(channel_handshake_config_arg);
+       channel_handshake_config_arg_conv.is_owned = ptr_is_owned(channel_handshake_config_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_handshake_config_arg_conv);
+       channel_handshake_config_arg_conv = ChannelHandshakeConfig_clone(&channel_handshake_config_arg_conv);
+       LDKChannelHandshakeLimits channel_handshake_limits_arg_conv;
+       channel_handshake_limits_arg_conv.inner = untag_ptr(channel_handshake_limits_arg);
+       channel_handshake_limits_arg_conv.is_owned = ptr_is_owned(channel_handshake_limits_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_handshake_limits_arg_conv);
+       channel_handshake_limits_arg_conv = ChannelHandshakeLimits_clone(&channel_handshake_limits_arg_conv);
+       LDKChannelConfig channel_config_arg_conv;
+       channel_config_arg_conv.inner = untag_ptr(channel_config_arg);
+       channel_config_arg_conv.is_owned = ptr_is_owned(channel_config_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_config_arg_conv);
+       channel_config_arg_conv = ChannelConfig_clone(&channel_config_arg_conv);
+       LDKUserConfig ret_var = UserConfig_new(channel_handshake_config_arg_conv, channel_handshake_limits_arg_conv, channel_config_arg_conv, accept_forwards_to_priv_channels_arg, accept_inbound_channels_arg, manually_accept_inbound_channels_arg, accept_intercept_htlcs_arg, accept_mpp_keysend_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 UserConfig_clone_ptr(LDKUserConfig *NONNULL_PTR arg) {
+       LDKUserConfig ret_var = UserConfig_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_UserConfig_clone_ptr(int64_t arg) {
+       LDKUserConfig 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 = UserConfig_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UserConfig_clone(int64_t orig) {
+       LDKUserConfig 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;
+       LDKUserConfig ret_var = UserConfig_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_UserConfig_default() {
+       LDKUserConfig ret_var = UserConfig_default();
+       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_BestBlock_free(int64_t this_obj) {
+       LDKBestBlock 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);
+       BestBlock_free(this_obj_conv);
+}
+
+static inline uint64_t BestBlock_clone_ptr(LDKBestBlock *NONNULL_PTR arg) {
+       LDKBestBlock ret_var = BestBlock_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_BestBlock_clone_ptr(int64_t arg) {
+       LDKBestBlock 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 = BestBlock_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BestBlock_clone(int64_t orig) {
+       LDKBestBlock 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;
+       LDKBestBlock ret_var = BestBlock_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_BestBlock_eq(int64_t a, int64_t b) {
+       LDKBestBlock 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;
+       LDKBestBlock 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 = BestBlock_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BestBlock_from_network(int32_t network) {
+       LDKNetwork network_conv = LDKNetwork_from_cs(network);
+       LDKBestBlock ret_var = BestBlock_from_network(network_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_BestBlock_new(int8_tArray block_hash, int32_t height) {
+       LDKThirtyTwoBytes block_hash_ref;
+       CHECK(block_hash->arr_len == 32);
+       memcpy(block_hash_ref.data, block_hash->elems, 32); FREE(block_hash);
+       LDKBestBlock ret_var = BestBlock_new(block_hash_ref, height);
+       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_BestBlock_block_hash(int64_t this_arg) {
+       LDKBestBlock 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, BestBlock_block_hash(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int32_t  CS_LDK_BestBlock_height(int64_t this_arg) {
+       LDKBestBlock 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;
+       int32_t ret_conv = BestBlock_height(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Listen_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);
+       LDKListen this_ptr_conv = *(LDKListen*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Listen_free(this_ptr_conv);
+}
+
+void  CS_LDK_Confirm_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);
+       LDKConfirm this_ptr_conv = *(LDKConfirm*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Confirm_free(this_ptr_conv);
+}
+
+int32_t  CS_LDK_ChannelMonitorUpdateStatus_clone(int64_t orig) {
+       LDKChannelMonitorUpdateStatus* orig_conv = (LDKChannelMonitorUpdateStatus*)untag_ptr(orig);
+       int32_t ret_conv = LDKChannelMonitorUpdateStatus_to_cs(ChannelMonitorUpdateStatus_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ChannelMonitorUpdateStatus_completed() {
+       int32_t ret_conv = LDKChannelMonitorUpdateStatus_to_cs(ChannelMonitorUpdateStatus_completed());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ChannelMonitorUpdateStatus_in_progress() {
+       int32_t ret_conv = LDKChannelMonitorUpdateStatus_to_cs(ChannelMonitorUpdateStatus_in_progress());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ChannelMonitorUpdateStatus_unrecoverable_error() {
+       int32_t ret_conv = LDKChannelMonitorUpdateStatus_to_cs(ChannelMonitorUpdateStatus_unrecoverable_error());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelMonitorUpdateStatus_eq(int64_t a, int64_t b) {
+       LDKChannelMonitorUpdateStatus* a_conv = (LDKChannelMonitorUpdateStatus*)untag_ptr(a);
+       LDKChannelMonitorUpdateStatus* b_conv = (LDKChannelMonitorUpdateStatus*)untag_ptr(b);
+       jboolean ret_conv = ChannelMonitorUpdateStatus_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Watch_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);
+       LDKWatch this_ptr_conv = *(LDKWatch*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Watch_free(this_ptr_conv);
+}
+
+void  CS_LDK_Filter_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);
+       LDKFilter this_ptr_conv = *(LDKFilter*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Filter_free(this_ptr_conv);
+}
+
+void  CS_LDK_WatchedOutput_free(int64_t this_obj) {
+       LDKWatchedOutput 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);
+       WatchedOutput_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_WatchedOutput_get_block_hash(int64_t this_ptr) {
+       LDKWatchedOutput 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 = WatchedOutput_get_block_hash(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_WatchedOutput_set_block_hash(int64_t this_ptr, int64_t val) {
+       LDKWatchedOutput 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));
+       WatchedOutput_set_block_hash(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_WatchedOutput_get_outpoint(int64_t this_ptr) {
+       LDKWatchedOutput 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;
+       LDKOutPoint ret_var = WatchedOutput_get_outpoint(&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_WatchedOutput_set_outpoint(int64_t this_ptr, int64_t val) {
+       LDKWatchedOutput 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;
+       LDKOutPoint 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 = OutPoint_clone(&val_conv);
+       WatchedOutput_set_outpoint(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_WatchedOutput_get_script_pubkey(int64_t this_ptr) {
+       LDKWatchedOutput 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;
+       LDKu8slice 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);
+       return ret_arr;
+}
+
+void  CS_LDK_WatchedOutput_set_script_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKWatchedOutput 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);
+       WatchedOutput_set_script_pubkey(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_WatchedOutput_new(int64_t block_hash_arg, int64_t outpoint_arg, int8_tArray script_pubkey_arg) {
+       void* block_hash_arg_ptr = untag_ptr(block_hash_arg);
+       CHECK_ACCESS(block_hash_arg_ptr);
+       LDKCOption_ThirtyTwoBytesZ block_hash_arg_conv = *(LDKCOption_ThirtyTwoBytesZ*)(block_hash_arg_ptr);
+       block_hash_arg_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(block_hash_arg));
+       LDKOutPoint outpoint_arg_conv;
+       outpoint_arg_conv.inner = untag_ptr(outpoint_arg);
+       outpoint_arg_conv.is_owned = ptr_is_owned(outpoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_arg_conv);
+       outpoint_arg_conv = OutPoint_clone(&outpoint_arg_conv);
+       LDKCVec_u8Z script_pubkey_arg_ref;
+       script_pubkey_arg_ref.datalen = script_pubkey_arg->arr_len;
+       script_pubkey_arg_ref.data = MALLOC(script_pubkey_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(script_pubkey_arg_ref.data, script_pubkey_arg->elems, script_pubkey_arg_ref.datalen); FREE(script_pubkey_arg);
+       LDKWatchedOutput ret_var = WatchedOutput_new(block_hash_arg_conv, outpoint_arg_conv, script_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 WatchedOutput_clone_ptr(LDKWatchedOutput *NONNULL_PTR arg) {
+       LDKWatchedOutput ret_var = WatchedOutput_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_WatchedOutput_clone_ptr(int64_t arg) {
+       LDKWatchedOutput 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 = WatchedOutput_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_WatchedOutput_clone(int64_t orig) {
+       LDKWatchedOutput 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;
+       LDKWatchedOutput ret_var = WatchedOutput_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_WatchedOutput_eq(int64_t a, int64_t b) {
+       LDKWatchedOutput 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;
+       LDKWatchedOutput 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 = WatchedOutput_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_WatchedOutput_hash(int64_t o) {
+       LDKWatchedOutput 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 = WatchedOutput_hash(&o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BroadcasterInterface_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);
+       LDKBroadcasterInterface this_ptr_conv = *(LDKBroadcasterInterface*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       BroadcasterInterface_free(this_ptr_conv);
+}
+
+int32_t  CS_LDK_ConfirmationTarget_clone(int64_t orig) {
+       LDKConfirmationTarget* orig_conv = (LDKConfirmationTarget*)untag_ptr(orig);
+       int32_t ret_conv = LDKConfirmationTarget_to_cs(ConfirmationTarget_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ConfirmationTarget_on_chain_sweep() {
+       int32_t ret_conv = LDKConfirmationTarget_to_cs(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;
+}
+
+int32_t  CS_LDK_ConfirmationTarget_min_allowed_non_anchor_channel_remote_fee() {
+       int32_t ret_conv = LDKConfirmationTarget_to_cs(ConfirmationTarget_min_allowed_non_anchor_channel_remote_fee());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ConfirmationTarget_anchor_channel_fee() {
+       int32_t ret_conv = LDKConfirmationTarget_to_cs(ConfirmationTarget_anchor_channel_fee());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ConfirmationTarget_non_anchor_channel_fee() {
+       int32_t ret_conv = LDKConfirmationTarget_to_cs(ConfirmationTarget_non_anchor_channel_fee());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ConfirmationTarget_channel_close_minimum() {
+       int32_t ret_conv = LDKConfirmationTarget_to_cs(ConfirmationTarget_channel_close_minimum());
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ConfirmationTarget_hash(int64_t o) {
+       LDKConfirmationTarget* o_conv = (LDKConfirmationTarget*)untag_ptr(o);
+       int64_t ret_conv = ConfirmationTarget_hash(o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ConfirmationTarget_eq(int64_t a, int64_t b) {
+       LDKConfirmationTarget* a_conv = (LDKConfirmationTarget*)untag_ptr(a);
+       LDKConfirmationTarget* b_conv = (LDKConfirmationTarget*)untag_ptr(b);
+       jboolean ret_conv = ConfirmationTarget_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_FeeEstimator_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);
+       LDKFeeEstimator this_ptr_conv = *(LDKFeeEstimator*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       FeeEstimator_free(this_ptr_conv);
+}
+
+void  CS_LDK_MonitorUpdateId_free(int64_t this_obj) {
+       LDKMonitorUpdateId 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);
+       MonitorUpdateId_free(this_obj_conv);
+}
+
+static inline uint64_t MonitorUpdateId_clone_ptr(LDKMonitorUpdateId *NONNULL_PTR arg) {
+       LDKMonitorUpdateId ret_var = MonitorUpdateId_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_MonitorUpdateId_clone_ptr(int64_t arg) {
+       LDKMonitorUpdateId 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 = MonitorUpdateId_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_MonitorUpdateId_clone(int64_t orig) {
+       LDKMonitorUpdateId 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;
+       LDKMonitorUpdateId ret_var = MonitorUpdateId_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_MonitorUpdateId_hash(int64_t o) {
+       LDKMonitorUpdateId 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 = MonitorUpdateId_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_MonitorUpdateId_eq(int64_t a, int64_t b) {
+       LDKMonitorUpdateId 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;
+       LDKMonitorUpdateId 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 = MonitorUpdateId_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Persist_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);
+       LDKPersist this_ptr_conv = *(LDKPersist*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Persist_free(this_ptr_conv);
+}
+
+void  CS_LDK_LockedChannelMonitor_free(int64_t this_obj) {
+       LDKLockedChannelMonitor 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);
+       LockedChannelMonitor_free(this_obj_conv);
+}
+
+void  CS_LDK_ChainMonitor_free(int64_t this_obj) {
+       LDKChainMonitor 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);
+       ChainMonitor_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChainMonitor_new(int64_t chain_source, int64_t broadcaster, int64_t logger, int64_t feeest, int64_t persister) {
+       void* chain_source_ptr = untag_ptr(chain_source);
+       CHECK_ACCESS(chain_source_ptr);
+       LDKCOption_FilterZ chain_source_conv = *(LDKCOption_FilterZ*)(chain_source_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKCOption_FilterZ
+       if (chain_source_conv.tag == LDKCOption_FilterZ_Some) {
+               // Manually implement clone for Java trait instances
+               if (chain_source_conv.some.free == LDKFilter_JCalls_free) {
+                       // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                       LDKFilter_JCalls_cloned(&chain_source_conv.some);
+               }
+       }
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       CHECK_ACCESS(broadcaster_ptr);
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(broadcaster_ptr);
+       if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&broadcaster_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);
+       }
+       void* feeest_ptr = untag_ptr(feeest);
+       CHECK_ACCESS(feeest_ptr);
+       LDKFeeEstimator feeest_conv = *(LDKFeeEstimator*)(feeest_ptr);
+       if (feeest_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_cloned(&feeest_conv);
+       }
+       void* persister_ptr = untag_ptr(persister);
+       CHECK_ACCESS(persister_ptr);
+       LDKPersist persister_conv = *(LDKPersist*)(persister_ptr);
+       if (persister_conv.free == LDKPersist_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKPersist_JCalls_cloned(&persister_conv);
+       }
+       LDKChainMonitor ret_var = ChainMonitor_new(chain_source_conv, broadcaster_conv, logger_conv, feeest_conv, persister_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_tArray  CS_LDK_ChainMonitor_get_claimable_balances(int64_t this_arg, int64_tArray ignored_channels) {
+       LDKChainMonitor 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;
+       LDKCVec_ChannelDetailsZ ignored_channels_constr;
+       ignored_channels_constr.datalen = ignored_channels->arr_len;
+       if (ignored_channels_constr.datalen > 0)
+               ignored_channels_constr.data = MALLOC(ignored_channels_constr.datalen * sizeof(LDKChannelDetails), "LDKCVec_ChannelDetailsZ Elements");
+       else
+               ignored_channels_constr.data = NULL;
+       int64_t* ignored_channels_vals = ignored_channels->elems;
+       for (size_t q = 0; q < ignored_channels_constr.datalen; q++) {
+               int64_t ignored_channels_conv_16 = ignored_channels_vals[q];
+               LDKChannelDetails ignored_channels_conv_16_conv;
+               ignored_channels_conv_16_conv.inner = untag_ptr(ignored_channels_conv_16);
+               ignored_channels_conv_16_conv.is_owned = ptr_is_owned(ignored_channels_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ignored_channels_conv_16_conv);
+               ignored_channels_conv_16_conv = ChannelDetails_clone(&ignored_channels_conv_16_conv);
+               ignored_channels_constr.data[q] = ignored_channels_conv_16_conv;
+       }
+       FREE(ignored_channels);
+       LDKCVec_BalanceZ ret_var = ChainMonitor_get_claimable_balances(&this_arg_conv, ignored_channels_constr);
+       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 j = 0; j < ret_var.datalen; j++) {
+               LDKBalance *ret_conv_9_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+               *ret_conv_9_copy = ret_var.data[j];
+               int64_t ret_conv_9_ref = tag_ptr(ret_conv_9_copy, true);
+               ret_arr_ptr[j] = ret_conv_9_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_ChainMonitor_get_monitor(int64_t this_arg, int64_t funding_txo) {
+       LDKChainMonitor 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;
+       LDKOutPoint funding_txo_conv;
+       funding_txo_conv.inner = untag_ptr(funding_txo);
+       funding_txo_conv.is_owned = ptr_is_owned(funding_txo);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       LDKCResult_LockedChannelMonitorNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_LockedChannelMonitorNoneZ), "LDKCResult_LockedChannelMonitorNoneZ");
+       *ret_conv = ChainMonitor_get_monitor(&this_arg_conv, funding_txo_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_tArray  CS_LDK_ChainMonitor_list_monitors(int64_t this_arg) {
+       LDKChainMonitor 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;
+       LDKCVec_OutPointZ ret_var = ChainMonitor_list_monitors(&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 k = 0; k < ret_var.datalen; k++) {
+               LDKOutPoint ret_conv_10_var = ret_var.data[k];
+               int64_t ret_conv_10_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_10_var);
+               ret_conv_10_ref = tag_ptr(ret_conv_10_var.inner, ret_conv_10_var.is_owned);
+               ret_arr_ptr[k] = ret_conv_10_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_ChainMonitor_list_pending_monitor_updates(int64_t this_arg) {
+       LDKChainMonitor 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;
+       LDKCVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ ret_var = ChainMonitor_list_pending_monitor_updates(&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 p = 0; p < ret_var.datalen; p++) {
+               LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ* ret_conv_41_conv = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ), "LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ");
+               *ret_conv_41_conv = ret_var.data[p];
+               ret_arr_ptr[p] = tag_ptr(ret_conv_41_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_ChainMonitor_channel_monitor_updated(int64_t this_arg, int64_t funding_txo, int64_t completed_update_id) {
+       LDKChainMonitor 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;
+       LDKOutPoint funding_txo_conv;
+       funding_txo_conv.inner = untag_ptr(funding_txo);
+       funding_txo_conv.is_owned = ptr_is_owned(funding_txo);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       LDKMonitorUpdateId completed_update_id_conv;
+       completed_update_id_conv.inner = untag_ptr(completed_update_id);
+       completed_update_id_conv.is_owned = ptr_is_owned(completed_update_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(completed_update_id_conv);
+       completed_update_id_conv = MonitorUpdateId_clone(&completed_update_id_conv);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChainMonitor_channel_monitor_updated(&this_arg_conv, funding_txo_conv, completed_update_id_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChainMonitor_get_update_future(int64_t this_arg) {
+       LDKChainMonitor 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;
+       LDKFuture ret_var = ChainMonitor_get_update_future(&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;
+}
+
+void  CS_LDK_ChainMonitor_rebroadcast_pending_claims(int64_t this_arg) {
+       LDKChainMonitor 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;
+       ChainMonitor_rebroadcast_pending_claims(&this_arg_conv);
+}
+
+int64_t  CS_LDK_ChainMonitor_as_Listen(int64_t this_arg) {
+       LDKChainMonitor 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;
+       LDKListen* ret_ret = MALLOC(sizeof(LDKListen), "LDKListen");
+       *ret_ret = ChainMonitor_as_Listen(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ChainMonitor_as_Confirm(int64_t this_arg) {
+       LDKChainMonitor 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;
+       LDKConfirm* ret_ret = MALLOC(sizeof(LDKConfirm), "LDKConfirm");
+       *ret_ret = ChainMonitor_as_Confirm(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ChainMonitor_as_Watch(int64_t this_arg) {
+       LDKChainMonitor 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;
+       LDKWatch* ret_ret = MALLOC(sizeof(LDKWatch), "LDKWatch");
+       *ret_ret = ChainMonitor_as_Watch(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ChainMonitor_as_EventsProvider(int64_t this_arg) {
+       LDKChainMonitor 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 = ChainMonitor_as_EventsProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_ChannelMonitorUpdate_free(int64_t this_obj) {
+       LDKChannelMonitorUpdate 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);
+       ChannelMonitorUpdate_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChannelMonitorUpdate_get_update_id(int64_t this_ptr) {
+       LDKChannelMonitorUpdate 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 = ChannelMonitorUpdate_get_update_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelMonitorUpdate_set_update_id(int64_t this_ptr, int64_t val) {
+       LDKChannelMonitorUpdate 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;
+       ChannelMonitorUpdate_set_update_id(&this_ptr_conv, val);
+}
+
+static inline uint64_t ChannelMonitorUpdate_clone_ptr(LDKChannelMonitorUpdate *NONNULL_PTR arg) {
+       LDKChannelMonitorUpdate ret_var = ChannelMonitorUpdate_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_ChannelMonitorUpdate_clone_ptr(int64_t arg) {
+       LDKChannelMonitorUpdate 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 = ChannelMonitorUpdate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelMonitorUpdate_clone(int64_t orig) {
+       LDKChannelMonitorUpdate 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;
+       LDKChannelMonitorUpdate ret_var = ChannelMonitorUpdate_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_ChannelMonitorUpdate_eq(int64_t a, int64_t b) {
+       LDKChannelMonitorUpdate 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;
+       LDKChannelMonitorUpdate 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 = ChannelMonitorUpdate_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_ChannelMonitorUpdate_write(int64_t obj) {
+       LDKChannelMonitorUpdate 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 = ChannelMonitorUpdate_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_ChannelMonitorUpdate_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateDecodeErrorZ), "LDKCResult_ChannelMonitorUpdateDecodeErrorZ");
+       *ret_conv = ChannelMonitorUpdate_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_MonitorEvent_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);
+       LDKMonitorEvent this_ptr_conv = *(LDKMonitorEvent*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       MonitorEvent_free(this_ptr_conv);
+}
+
+static inline uint64_t MonitorEvent_clone_ptr(LDKMonitorEvent *NONNULL_PTR arg) {
+       LDKMonitorEvent *ret_copy = MALLOC(sizeof(LDKMonitorEvent), "LDKMonitorEvent");
+       *ret_copy = MonitorEvent_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_MonitorEvent_clone_ptr(int64_t arg) {
+       LDKMonitorEvent* arg_conv = (LDKMonitorEvent*)untag_ptr(arg);
+       int64_t ret_conv = MonitorEvent_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_MonitorEvent_clone(int64_t orig) {
+       LDKMonitorEvent* orig_conv = (LDKMonitorEvent*)untag_ptr(orig);
+       LDKMonitorEvent *ret_copy = MALLOC(sizeof(LDKMonitorEvent), "LDKMonitorEvent");
+       *ret_copy = MonitorEvent_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MonitorEvent_htlcevent(int64_t a) {
+       LDKHTLCUpdate 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 = HTLCUpdate_clone(&a_conv);
+       LDKMonitorEvent *ret_copy = MALLOC(sizeof(LDKMonitorEvent), "LDKMonitorEvent");
+       *ret_copy = MonitorEvent_htlcevent(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MonitorEvent_holder_force_closed(int64_t a) {
+       LDKOutPoint 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 = OutPoint_clone(&a_conv);
+       LDKMonitorEvent *ret_copy = MALLOC(sizeof(LDKMonitorEvent), "LDKMonitorEvent");
+       *ret_copy = MonitorEvent_holder_force_closed(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MonitorEvent_completed(int64_t funding_txo, int64_t monitor_update_id) {
+       LDKOutPoint funding_txo_conv;
+       funding_txo_conv.inner = untag_ptr(funding_txo);
+       funding_txo_conv.is_owned = ptr_is_owned(funding_txo);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       LDKMonitorEvent *ret_copy = MALLOC(sizeof(LDKMonitorEvent), "LDKMonitorEvent");
+       *ret_copy = MonitorEvent_completed(funding_txo_conv, monitor_update_id);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_MonitorEvent_eq(int64_t a, int64_t b) {
+       LDKMonitorEvent* a_conv = (LDKMonitorEvent*)untag_ptr(a);
+       LDKMonitorEvent* b_conv = (LDKMonitorEvent*)untag_ptr(b);
+       jboolean ret_conv = MonitorEvent_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_MonitorEvent_write(int64_t obj) {
+       LDKMonitorEvent* obj_conv = (LDKMonitorEvent*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = MonitorEvent_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_MonitorEvent_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_COption_MonitorEventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_MonitorEventZDecodeErrorZ), "LDKCResult_COption_MonitorEventZDecodeErrorZ");
+       *ret_conv = MonitorEvent_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_HTLCUpdate_free(int64_t this_obj) {
+       LDKHTLCUpdate 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);
+       HTLCUpdate_free(this_obj_conv);
+}
+
+static inline uint64_t HTLCUpdate_clone_ptr(LDKHTLCUpdate *NONNULL_PTR arg) {
+       LDKHTLCUpdate ret_var = HTLCUpdate_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_HTLCUpdate_clone_ptr(int64_t arg) {
+       LDKHTLCUpdate 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 = HTLCUpdate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_HTLCUpdate_clone(int64_t orig) {
+       LDKHTLCUpdate 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;
+       LDKHTLCUpdate ret_var = HTLCUpdate_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_HTLCUpdate_eq(int64_t a, int64_t b) {
+       LDKHTLCUpdate 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;
+       LDKHTLCUpdate 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 = HTLCUpdate_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_HTLCUpdate_write(int64_t obj) {
+       LDKHTLCUpdate 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 = HTLCUpdate_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_HTLCUpdate_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_HTLCUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCUpdateDecodeErrorZ), "LDKCResult_HTLCUpdateDecodeErrorZ");
+       *ret_conv = HTLCUpdate_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_Balance_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);
+       LDKBalance this_ptr_conv = *(LDKBalance*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Balance_free(this_ptr_conv);
+}
+
+static inline uint64_t Balance_clone_ptr(LDKBalance *NONNULL_PTR arg) {
+       LDKBalance *ret_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+       *ret_copy = Balance_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_Balance_clone_ptr(int64_t arg) {
+       LDKBalance* arg_conv = (LDKBalance*)untag_ptr(arg);
+       int64_t ret_conv = Balance_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Balance_clone(int64_t orig) {
+       LDKBalance* orig_conv = (LDKBalance*)untag_ptr(orig);
+       LDKBalance *ret_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+       *ret_copy = Balance_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Balance_claimable_on_channel_close(int64_t amount_satoshis) {
+       LDKBalance *ret_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+       *ret_copy = Balance_claimable_on_channel_close(amount_satoshis);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Balance_claimable_awaiting_confirmations(int64_t amount_satoshis, int32_t confirmation_height) {
+       LDKBalance *ret_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+       *ret_copy = Balance_claimable_awaiting_confirmations(amount_satoshis, confirmation_height);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Balance_contentious_claimable(int64_t amount_satoshis, int32_t timeout_height, int8_tArray payment_hash, int8_tArray payment_preimage) {
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKThirtyTwoBytes payment_preimage_ref;
+       CHECK(payment_preimage->arr_len == 32);
+       memcpy(payment_preimage_ref.data, payment_preimage->elems, 32); FREE(payment_preimage);
+       LDKBalance *ret_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+       *ret_copy = Balance_contentious_claimable(amount_satoshis, timeout_height, payment_hash_ref, payment_preimage_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Balance_maybe_timeout_claimable_htlc(int64_t amount_satoshis, int32_t claimable_height, int8_tArray payment_hash) {
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKBalance *ret_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+       *ret_copy = Balance_maybe_timeout_claimable_htlc(amount_satoshis, claimable_height, payment_hash_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Balance_maybe_preimage_claimable_htlc(int64_t amount_satoshis, int32_t expiry_height, int8_tArray payment_hash) {
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKBalance *ret_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+       *ret_copy = Balance_maybe_preimage_claimable_htlc(amount_satoshis, expiry_height, payment_hash_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Balance_counterparty_revoked_output_claimable(int64_t amount_satoshis) {
+       LDKBalance *ret_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+       *ret_copy = Balance_counterparty_revoked_output_claimable(amount_satoshis);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_Balance_eq(int64_t a, int64_t b) {
+       LDKBalance* a_conv = (LDKBalance*)untag_ptr(a);
+       LDKBalance* b_conv = (LDKBalance*)untag_ptr(b);
+       jboolean ret_conv = Balance_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Balance_claimable_amount_satoshis(int64_t this_arg) {
+       LDKBalance* this_arg_conv = (LDKBalance*)untag_ptr(this_arg);
+       int64_t ret_conv = Balance_claimable_amount_satoshis(this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelMonitor_free(int64_t this_obj) {
+       LDKChannelMonitor 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);
+       ChannelMonitor_free(this_obj_conv);
+}
+
+static inline uint64_t ChannelMonitor_clone_ptr(LDKChannelMonitor *NONNULL_PTR arg) {
+       LDKChannelMonitor ret_var = ChannelMonitor_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_ChannelMonitor_clone_ptr(int64_t arg) {
+       LDKChannelMonitor 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 = ChannelMonitor_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelMonitor_clone(int64_t orig) {
+       LDKChannelMonitor 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;
+       LDKChannelMonitor ret_var = ChannelMonitor_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_ChannelMonitor_write(int64_t obj) {
+       LDKChannelMonitor 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 = ChannelMonitor_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_ChannelMonitor_update_monitor(int64_t this_arg, int64_t updates, int64_t broadcaster, int64_t fee_estimator, 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);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       LDKChannelMonitorUpdate updates_conv;
+       updates_conv.inner = untag_ptr(updates);
+       updates_conv.is_owned = ptr_is_owned(updates);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(updates_conv);
+       updates_conv.is_owned = false;
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       if (ptr_is_owned(broadcaster)) { CHECK_ACCESS(broadcaster_ptr); }
+       LDKBroadcasterInterface* broadcaster_conv = (LDKBroadcasterInterface*)broadcaster_ptr;
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       if (ptr_is_owned(fee_estimator)) { CHECK_ACCESS(fee_estimator_ptr); }
+       LDKFeeEstimator* fee_estimator_conv = (LDKFeeEstimator*)fee_estimator_ptr;
+       void* logger_ptr = untag_ptr(logger);
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelMonitor_update_monitor(&this_arg_conv, &updates_conv, broadcaster_conv, fee_estimator_conv, logger_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelMonitor_get_latest_update_id(int64_t this_arg) {
+       LDKChannelMonitor 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 = ChannelMonitor_get_latest_update_id(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelMonitor_get_funding_txo(int64_t this_arg) {
+       LDKChannelMonitor 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;
+       LDKC2Tuple_OutPointCVec_u8ZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_OutPointCVec_u8ZZ), "LDKC2Tuple_OutPointCVec_u8ZZ");
+       *ret_conv = ChannelMonitor_get_funding_txo(&this_arg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_tArray  CS_LDK_ChannelMonitor_get_outputs_to_watch(int64_t this_arg) {
+       LDKChannelMonitor 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;
+       LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ ret_var = ChannelMonitor_get_outputs_to_watch(&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 a = 0; a < ret_var.datalen; a++) {
+               LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ* ret_conv_52_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ");
+               *ret_conv_52_conv = ret_var.data[a];
+               ret_arr_ptr[a] = tag_ptr(ret_conv_52_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelMonitor_load_outputs_to_watch(int64_t this_arg, int64_t filter) {
+       LDKChannelMonitor 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;
+       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);
+}
+
+int64_tArray  CS_LDK_ChannelMonitor_get_and_clear_pending_monitor_events(int64_t this_arg) {
+       LDKChannelMonitor 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;
+       LDKCVec_MonitorEventZ ret_var = ChannelMonitor_get_and_clear_pending_monitor_events(&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 o = 0; o < ret_var.datalen; o++) {
+               LDKMonitorEvent *ret_conv_14_copy = MALLOC(sizeof(LDKMonitorEvent), "LDKMonitorEvent");
+               *ret_conv_14_copy = ret_var.data[o];
+               int64_t ret_conv_14_ref = tag_ptr(ret_conv_14_copy, true);
+               ret_arr_ptr[o] = ret_conv_14_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelMonitor_process_pending_events(int64_t this_arg, int64_t handler) {
+       LDKChannelMonitor 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;
+       void* handler_ptr = untag_ptr(handler);
+       if (ptr_is_owned(handler)) { CHECK_ACCESS(handler_ptr); }
+       LDKEventHandler* handler_conv = (LDKEventHandler*)handler_ptr;
+       ChannelMonitor_process_pending_events(&this_arg_conv, handler_conv);
+}
+
+int64_t  CS_LDK_ChannelMonitor_initial_counterparty_commitment_tx(int64_t this_arg) {
+       LDKChannelMonitor 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;
+       LDKCommitmentTransaction ret_var = ChannelMonitor_initial_counterparty_commitment_tx(&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_tArray  CS_LDK_ChannelMonitor_counterparty_commitment_txs_from_update(int64_t this_arg, int64_t update) {
+       LDKChannelMonitor 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;
+       LDKChannelMonitorUpdate update_conv;
+       update_conv.inner = untag_ptr(update);
+       update_conv.is_owned = ptr_is_owned(update);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_conv);
+       update_conv.is_owned = false;
+       LDKCVec_CommitmentTransactionZ ret_var = ChannelMonitor_counterparty_commitment_txs_from_update(&this_arg_conv, &update_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++) {
+               LDKCommitmentTransaction ret_conv_23_var = ret_var.data[x];
+               int64_t ret_conv_23_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_23_var);
+               ret_conv_23_ref = tag_ptr(ret_conv_23_var.inner, ret_conv_23_var.is_owned);
+               ret_arr_ptr[x] = ret_conv_23_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_ChannelMonitor_sign_to_local_justice_tx(int64_t this_arg, int8_tArray justice_tx, int64_t input_idx, int64_t value, int64_t commitment_number) {
+       LDKChannelMonitor 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;
+       LDKTransaction justice_tx_ref;
+       justice_tx_ref.datalen = justice_tx->arr_len;
+       justice_tx_ref.data = MALLOC(justice_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(justice_tx_ref.data, justice_tx->elems, justice_tx_ref.datalen); FREE(justice_tx);
+       justice_tx_ref.data_is_owned = true;
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = ChannelMonitor_sign_to_local_justice_tx(&this_arg_conv, justice_tx_ref, input_idx, value, commitment_number);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelMonitor_get_counterparty_node_id(int64_t this_arg) {
+       LDKChannelMonitor 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, ChannelMonitor_get_counterparty_node_id(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+ptrArray  CS_LDK_ChannelMonitor_get_latest_holder_commitment_txn(int64_t this_arg, 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);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       void* logger_ptr = untag_ptr(logger);
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
+       LDKCVec_TransactionZ ret_var = ChannelMonitor_get_latest_holder_commitment_txn(&this_arg_conv, logger_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++) {
+               LDKTransaction 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);
+               Transaction_free(ret_conv_8_var);
+               ret_arr_ptr[i] = ret_conv_8_arr;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_ChannelMonitor_block_connected(int64_t this_arg, int8_tArray header, int64_tArray txdata, int32_t height, int64_t broadcaster, int64_t fee_estimator, 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);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       uint8_t header_arr[80];
+       CHECK(header->arr_len == 80);
+       memcpy(header_arr, header->elems, 80); FREE(header);
+       uint8_t (*header_ref)[80] = &header_arr;
+       LDKCVec_C2Tuple_usizeTransactionZZ txdata_constr;
+       txdata_constr.datalen = txdata->arr_len;
+       if (txdata_constr.datalen > 0)
+               txdata_constr.data = MALLOC(txdata_constr.datalen * sizeof(LDKC2Tuple_usizeTransactionZ), "LDKCVec_C2Tuple_usizeTransactionZZ Elements");
+       else
+               txdata_constr.data = NULL;
+       int64_t* txdata_vals = txdata->elems;
+       for (size_t c = 0; c < txdata_constr.datalen; c++) {
+               int64_t txdata_conv_28 = txdata_vals[c];
+               void* txdata_conv_28_ptr = untag_ptr(txdata_conv_28);
+               CHECK_ACCESS(txdata_conv_28_ptr);
+               LDKC2Tuple_usizeTransactionZ txdata_conv_28_conv = *(LDKC2Tuple_usizeTransactionZ*)(txdata_conv_28_ptr);
+               txdata_conv_28_conv = C2Tuple_usizeTransactionZ_clone((LDKC2Tuple_usizeTransactionZ*)untag_ptr(txdata_conv_28));
+               txdata_constr.data[c] = txdata_conv_28_conv;
+       }
+       FREE(txdata);
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       CHECK_ACCESS(broadcaster_ptr);
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(broadcaster_ptr);
+       if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&broadcaster_conv);
+       }
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       CHECK_ACCESS(fee_estimator_ptr);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(fee_estimator_ptr);
+       if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_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);
+       }
+       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__);
+       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
+       for (size_t x = 0; x < ret_var.datalen; x++) {
+               LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* ret_conv_49_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ");
+               *ret_conv_49_conv = ret_var.data[x];
+               ret_arr_ptr[x] = tag_ptr(ret_conv_49_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelMonitor_block_disconnected(int64_t this_arg, int8_tArray header, int32_t height, int64_t broadcaster, int64_t fee_estimator, 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);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       uint8_t header_arr[80];
+       CHECK(header->arr_len == 80);
+       memcpy(header_arr, header->elems, 80); FREE(header);
+       uint8_t (*header_ref)[80] = &header_arr;
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       CHECK_ACCESS(broadcaster_ptr);
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(broadcaster_ptr);
+       if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&broadcaster_conv);
+       }
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       CHECK_ACCESS(fee_estimator_ptr);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(fee_estimator_ptr);
+       if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_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);
+       }
+       ChannelMonitor_block_disconnected(&this_arg_conv, header_ref, height, broadcaster_conv, fee_estimator_conv, logger_conv);
+}
+
+int64_tArray  CS_LDK_ChannelMonitor_transactions_confirmed(int64_t this_arg, int8_tArray header, int64_tArray txdata, int32_t height, int64_t broadcaster, int64_t fee_estimator, 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);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       uint8_t header_arr[80];
+       CHECK(header->arr_len == 80);
+       memcpy(header_arr, header->elems, 80); FREE(header);
+       uint8_t (*header_ref)[80] = &header_arr;
+       LDKCVec_C2Tuple_usizeTransactionZZ txdata_constr;
+       txdata_constr.datalen = txdata->arr_len;
+       if (txdata_constr.datalen > 0)
+               txdata_constr.data = MALLOC(txdata_constr.datalen * sizeof(LDKC2Tuple_usizeTransactionZ), "LDKCVec_C2Tuple_usizeTransactionZZ Elements");
+       else
+               txdata_constr.data = NULL;
+       int64_t* txdata_vals = txdata->elems;
+       for (size_t c = 0; c < txdata_constr.datalen; c++) {
+               int64_t txdata_conv_28 = txdata_vals[c];
+               void* txdata_conv_28_ptr = untag_ptr(txdata_conv_28);
+               CHECK_ACCESS(txdata_conv_28_ptr);
+               LDKC2Tuple_usizeTransactionZ txdata_conv_28_conv = *(LDKC2Tuple_usizeTransactionZ*)(txdata_conv_28_ptr);
+               txdata_conv_28_conv = C2Tuple_usizeTransactionZ_clone((LDKC2Tuple_usizeTransactionZ*)untag_ptr(txdata_conv_28));
+               txdata_constr.data[c] = txdata_conv_28_conv;
+       }
+       FREE(txdata);
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       CHECK_ACCESS(broadcaster_ptr);
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(broadcaster_ptr);
+       if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&broadcaster_conv);
+       }
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       CHECK_ACCESS(fee_estimator_ptr);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(fee_estimator_ptr);
+       if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_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);
+       }
+       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__);
+       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
+       for (size_t x = 0; x < ret_var.datalen; x++) {
+               LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* ret_conv_49_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ");
+               *ret_conv_49_conv = ret_var.data[x];
+               ret_arr_ptr[x] = tag_ptr(ret_conv_49_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelMonitor_transaction_unconfirmed(int64_t this_arg, int8_tArray txid, int64_t broadcaster, int64_t fee_estimator, 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);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       uint8_t txid_arr[32];
+       CHECK(txid->arr_len == 32);
+       memcpy(txid_arr, txid->elems, 32); FREE(txid);
+       uint8_t (*txid_ref)[32] = &txid_arr;
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       CHECK_ACCESS(broadcaster_ptr);
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(broadcaster_ptr);
+       if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&broadcaster_conv);
+       }
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       CHECK_ACCESS(fee_estimator_ptr);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(fee_estimator_ptr);
+       if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_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);
+       }
+       ChannelMonitor_transaction_unconfirmed(&this_arg_conv, txid_ref, broadcaster_conv, fee_estimator_conv, logger_conv);
+}
+
+int64_tArray  CS_LDK_ChannelMonitor_best_block_updated(int64_t this_arg, int8_tArray header, int32_t height, int64_t broadcaster, int64_t fee_estimator, 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);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       uint8_t header_arr[80];
+       CHECK(header->arr_len == 80);
+       memcpy(header_arr, header->elems, 80); FREE(header);
+       uint8_t (*header_ref)[80] = &header_arr;
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       CHECK_ACCESS(broadcaster_ptr);
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(broadcaster_ptr);
+       if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&broadcaster_conv);
+       }
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       CHECK_ACCESS(fee_estimator_ptr);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(fee_estimator_ptr);
+       if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_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);
+       }
+       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__);
+       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
+       for (size_t x = 0; x < ret_var.datalen; x++) {
+               LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ* ret_conv_49_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ), "LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ");
+               *ret_conv_49_conv = ret_var.data[x];
+               ret_arr_ptr[x] = tag_ptr(ret_conv_49_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_ChannelMonitor_get_relevant_txids(int64_t this_arg) {
+       LDKChannelMonitor 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;
+       LDKCVec_C2Tuple_ThirtyTwoBytesCOption_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);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_ChannelMonitor_current_best_block(int64_t this_arg) {
+       LDKChannelMonitor 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;
+       LDKBestBlock ret_var = ChannelMonitor_current_best_block(&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;
+}
+
+void  CS_LDK_ChannelMonitor_rebroadcast_pending_claims(int64_t this_arg, int64_t broadcaster, int64_t fee_estimator, 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);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       CHECK_ACCESS(broadcaster_ptr);
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(broadcaster_ptr);
+       if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&broadcaster_conv);
+       }
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       CHECK_ACCESS(fee_estimator_ptr);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(fee_estimator_ptr);
+       if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_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);
+       }
+       ChannelMonitor_rebroadcast_pending_claims(&this_arg_conv, broadcaster_conv, fee_estimator_conv, logger_conv);
+}
+
+int64_tArray  CS_LDK_ChannelMonitor_get_spendable_outputs(int64_t this_arg, int8_tArray tx, int32_t confirmation_height) {
+       LDKChannelMonitor 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;
+       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_SpendableOutputDescriptorZ ret_var = ChannelMonitor_get_spendable_outputs(&this_arg_conv, tx_ref, confirmation_height);
+       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 b = 0; b < ret_var.datalen; b++) {
+               LDKSpendableOutputDescriptor *ret_conv_27_copy = MALLOC(sizeof(LDKSpendableOutputDescriptor), "LDKSpendableOutputDescriptor");
+               *ret_conv_27_copy = ret_var.data[b];
+               int64_t ret_conv_27_ref = tag_ptr(ret_conv_27_copy, true);
+               ret_arr_ptr[b] = ret_conv_27_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_ChannelMonitor_get_claimable_balances(int64_t this_arg) {
+       LDKChannelMonitor 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;
+       LDKCVec_BalanceZ ret_var = ChannelMonitor_get_claimable_balances(&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 j = 0; j < ret_var.datalen; j++) {
+               LDKBalance *ret_conv_9_copy = MALLOC(sizeof(LDKBalance), "LDKBalance");
+               *ret_conv_9_copy = ret_var.data[j];
+               int64_t ret_conv_9_ref = tag_ptr(ret_conv_9_copy, true);
+               ret_arr_ptr[j] = ret_conv_9_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_read(int8_tArray ser, int64_t arg_a, int64_t arg_b) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       void* arg_a_ptr = untag_ptr(arg_a);
+       if (ptr_is_owned(arg_a)) { CHECK_ACCESS(arg_a_ptr); }
+       LDKEntropySource* arg_a_conv = (LDKEntropySource*)arg_a_ptr;
+       void* arg_b_ptr = untag_ptr(arg_b);
+       if (ptr_is_owned(arg_b)) { CHECK_ACCESS(arg_b_ptr); }
+       LDKSignerProvider* arg_b_conv = (LDKSignerProvider*)arg_b_ptr;
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesChannelMonitorZ_read(ser_ref, arg_a_conv, arg_b_conv);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_OutPoint_free(int64_t this_obj) {
+       LDKOutPoint 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);
+       OutPoint_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_OutPoint_get_txid(int64_t this_ptr) {
+       LDKOutPoint 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, *OutPoint_get_txid(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_OutPoint_set_txid(int64_t this_ptr, int8_tArray val) {
+       LDKOutPoint 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);
+       OutPoint_set_txid(&this_ptr_conv, val_ref);
+}
+
+int16_t  CS_LDK_OutPoint_get_index(int64_t this_ptr) {
+       LDKOutPoint 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 = OutPoint_get_index(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OutPoint_set_index(int64_t this_ptr, int16_t val) {
+       LDKOutPoint 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;
+       OutPoint_set_index(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OutPoint_new(int8_tArray txid_arg, int16_t index_arg) {
+       LDKThirtyTwoBytes txid_arg_ref;
+       CHECK(txid_arg->arr_len == 32);
+       memcpy(txid_arg_ref.data, txid_arg->elems, 32); FREE(txid_arg);
+       LDKOutPoint ret_var = OutPoint_new(txid_arg_ref, index_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 OutPoint_clone_ptr(LDKOutPoint *NONNULL_PTR arg) {
+       LDKOutPoint ret_var = OutPoint_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_OutPoint_clone_ptr(int64_t arg) {
+       LDKOutPoint 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 = OutPoint_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OutPoint_clone(int64_t orig) {
+       LDKOutPoint 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;
+       LDKOutPoint ret_var = OutPoint_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_OutPoint_eq(int64_t a, int64_t b) {
+       LDKOutPoint 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;
+       LDKOutPoint 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 = OutPoint_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OutPoint_hash(int64_t o) {
+       LDKOutPoint 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 = OutPoint_hash(&o_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_OutPoint_to_channel_id(int64_t this_arg) {
+       LDKOutPoint 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, OutPoint_to_channel_id(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_OutPoint_write(int64_t obj) {
+       LDKOutPoint 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 = OutPoint_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_OutPoint_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_OutPointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OutPointDecodeErrorZ), "LDKCResult_OutPointDecodeErrorZ");
+       *ret_conv = OutPoint_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_FailureCode_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);
+       LDKFailureCode this_ptr_conv = *(LDKFailureCode*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       FailureCode_free(this_ptr_conv);
+}
+
+static inline uint64_t FailureCode_clone_ptr(LDKFailureCode *NONNULL_PTR arg) {
+       LDKFailureCode *ret_copy = MALLOC(sizeof(LDKFailureCode), "LDKFailureCode");
+       *ret_copy = FailureCode_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_FailureCode_clone_ptr(int64_t arg) {
+       LDKFailureCode* arg_conv = (LDKFailureCode*)untag_ptr(arg);
+       int64_t ret_conv = FailureCode_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_FailureCode_clone(int64_t orig) {
+       LDKFailureCode* orig_conv = (LDKFailureCode*)untag_ptr(orig);
+       LDKFailureCode *ret_copy = MALLOC(sizeof(LDKFailureCode), "LDKFailureCode");
+       *ret_copy = FailureCode_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_FailureCode_temporary_node_failure() {
+       LDKFailureCode *ret_copy = MALLOC(sizeof(LDKFailureCode), "LDKFailureCode");
+       *ret_copy = FailureCode_temporary_node_failure();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_FailureCode_required_node_feature_missing() {
+       LDKFailureCode *ret_copy = MALLOC(sizeof(LDKFailureCode), "LDKFailureCode");
+       *ret_copy = FailureCode_required_node_feature_missing();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_FailureCode_incorrect_or_unknown_payment_details() {
+       LDKFailureCode *ret_copy = MALLOC(sizeof(LDKFailureCode), "LDKFailureCode");
+       *ret_copy = FailureCode_incorrect_or_unknown_payment_details();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_FailureCode_invalid_onion_payload(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKCOption_C2Tuple_u64u16ZZ a_conv = *(LDKCOption_C2Tuple_u64u16ZZ*)(a_ptr);
+       a_conv = COption_C2Tuple_u64u16ZZ_clone((LDKCOption_C2Tuple_u64u16ZZ*)untag_ptr(a));
+       LDKFailureCode *ret_copy = MALLOC(sizeof(LDKFailureCode), "LDKFailureCode");
+       *ret_copy = FailureCode_invalid_onion_payload(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelManager_free(int64_t this_obj) {
+       LDKChannelManager 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);
+       ChannelManager_free(this_obj_conv);
+}
+
+void  CS_LDK_ChainParameters_free(int64_t this_obj) {
+       LDKChainParameters 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);
+       ChainParameters_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_ChainParameters_get_network(int64_t this_ptr) {
+       LDKChainParameters 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 = LDKNetwork_to_cs(ChainParameters_get_network(&this_ptr_conv));
+       return ret_conv;
+}
+
+void  CS_LDK_ChainParameters_set_network(int64_t this_ptr, int32_t val) {
+       LDKChainParameters 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;
+       LDKNetwork val_conv = LDKNetwork_from_cs(val);
+       ChainParameters_set_network(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChainParameters_get_best_block(int64_t this_ptr) {
+       LDKChainParameters 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;
+       LDKBestBlock ret_var = ChainParameters_get_best_block(&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_ChainParameters_set_best_block(int64_t this_ptr, int64_t val) {
+       LDKChainParameters 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;
+       LDKBestBlock 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 = BestBlock_clone(&val_conv);
+       ChainParameters_set_best_block(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChainParameters_new(int32_t network_arg, int64_t best_block_arg) {
+       LDKNetwork network_arg_conv = LDKNetwork_from_cs(network_arg);
+       LDKBestBlock best_block_arg_conv;
+       best_block_arg_conv.inner = untag_ptr(best_block_arg);
+       best_block_arg_conv.is_owned = ptr_is_owned(best_block_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(best_block_arg_conv);
+       best_block_arg_conv = BestBlock_clone(&best_block_arg_conv);
+       LDKChainParameters ret_var = ChainParameters_new(network_arg_conv, best_block_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 ChainParameters_clone_ptr(LDKChainParameters *NONNULL_PTR arg) {
+       LDKChainParameters ret_var = ChainParameters_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_ChainParameters_clone_ptr(int64_t arg) {
+       LDKChainParameters 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 = ChainParameters_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChainParameters_clone(int64_t orig) {
+       LDKChainParameters 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;
+       LDKChainParameters ret_var = ChainParameters_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_CounterpartyForwardingInfo_free(int64_t this_obj) {
+       LDKCounterpartyForwardingInfo 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);
+       CounterpartyForwardingInfo_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_CounterpartyForwardingInfo_get_fee_base_msat(int64_t this_ptr) {
+       LDKCounterpartyForwardingInfo 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 = CounterpartyForwardingInfo_get_fee_base_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CounterpartyForwardingInfo_set_fee_base_msat(int64_t this_ptr, int32_t val) {
+       LDKCounterpartyForwardingInfo 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;
+       CounterpartyForwardingInfo_set_fee_base_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_CounterpartyForwardingInfo_get_fee_proportional_millionths(int64_t this_ptr) {
+       LDKCounterpartyForwardingInfo 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 = CounterpartyForwardingInfo_get_fee_proportional_millionths(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CounterpartyForwardingInfo_set_fee_proportional_millionths(int64_t this_ptr, int32_t val) {
+       LDKCounterpartyForwardingInfo 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;
+       CounterpartyForwardingInfo_set_fee_proportional_millionths(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_CounterpartyForwardingInfo_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKCounterpartyForwardingInfo 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 = CounterpartyForwardingInfo_get_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CounterpartyForwardingInfo_set_cltv_expiry_delta(int64_t this_ptr, int16_t val) {
+       LDKCounterpartyForwardingInfo 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;
+       CounterpartyForwardingInfo_set_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_CounterpartyForwardingInfo_new(int32_t fee_base_msat_arg, int32_t fee_proportional_millionths_arg, int16_t cltv_expiry_delta_arg) {
+       LDKCounterpartyForwardingInfo ret_var = CounterpartyForwardingInfo_new(fee_base_msat_arg, fee_proportional_millionths_arg, cltv_expiry_delta_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 CounterpartyForwardingInfo_clone_ptr(LDKCounterpartyForwardingInfo *NONNULL_PTR arg) {
+       LDKCounterpartyForwardingInfo ret_var = CounterpartyForwardingInfo_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_CounterpartyForwardingInfo_clone_ptr(int64_t arg) {
+       LDKCounterpartyForwardingInfo 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 = CounterpartyForwardingInfo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CounterpartyForwardingInfo_clone(int64_t orig) {
+       LDKCounterpartyForwardingInfo 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;
+       LDKCounterpartyForwardingInfo ret_var = CounterpartyForwardingInfo_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_ChannelCounterparty_free(int64_t this_obj) {
+       LDKChannelCounterparty 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);
+       ChannelCounterparty_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ChannelCounterparty_get_node_id(int64_t this_ptr) {
+       LDKChannelCounterparty 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, ChannelCounterparty_get_node_id(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelCounterparty_set_node_id(int64_t this_ptr, int8_tArray val) {
+       LDKChannelCounterparty 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);
+       ChannelCounterparty_set_node_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelCounterparty_get_features(int64_t this_ptr) {
+       LDKChannelCounterparty 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;
+       LDKInitFeatures ret_var = ChannelCounterparty_get_features(&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_ChannelCounterparty_set_features(int64_t this_ptr, int64_t val) {
+       LDKChannelCounterparty 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;
+       LDKInitFeatures 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 = InitFeatures_clone(&val_conv);
+       ChannelCounterparty_set_features(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelCounterparty_get_unspendable_punishment_reserve(int64_t this_ptr) {
+       LDKChannelCounterparty 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 = ChannelCounterparty_get_unspendable_punishment_reserve(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelCounterparty_set_unspendable_punishment_reserve(int64_t this_ptr, int64_t val) {
+       LDKChannelCounterparty 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;
+       ChannelCounterparty_set_unspendable_punishment_reserve(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelCounterparty_get_forwarding_info(int64_t this_ptr) {
+       LDKChannelCounterparty 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;
+       LDKCounterpartyForwardingInfo ret_var = ChannelCounterparty_get_forwarding_info(&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_ChannelCounterparty_set_forwarding_info(int64_t this_ptr, int64_t val) {
+       LDKChannelCounterparty 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;
+       LDKCounterpartyForwardingInfo 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 = CounterpartyForwardingInfo_clone(&val_conv);
+       ChannelCounterparty_set_forwarding_info(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelCounterparty_get_outbound_htlc_minimum_msat(int64_t this_ptr) {
+       LDKChannelCounterparty 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 = ChannelCounterparty_get_outbound_htlc_minimum_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelCounterparty_set_outbound_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelCounterparty 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));
+       ChannelCounterparty_set_outbound_htlc_minimum_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelCounterparty_get_outbound_htlc_maximum_msat(int64_t this_ptr) {
+       LDKChannelCounterparty 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 = ChannelCounterparty_get_outbound_htlc_maximum_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelCounterparty_set_outbound_htlc_maximum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelCounterparty 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));
+       ChannelCounterparty_set_outbound_htlc_maximum_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelCounterparty_new(int8_tArray node_id_arg, int64_t features_arg, int64_t unspendable_punishment_reserve_arg, int64_t forwarding_info_arg, int64_t outbound_htlc_minimum_msat_arg, int64_t outbound_htlc_maximum_msat_arg) {
+       LDKPublicKey node_id_arg_ref;
+       CHECK(node_id_arg->arr_len == 33);
+       memcpy(node_id_arg_ref.compressed_form, node_id_arg->elems, 33); FREE(node_id_arg);
+       LDKInitFeatures features_arg_conv;
+       features_arg_conv.inner = untag_ptr(features_arg);
+       features_arg_conv.is_owned = ptr_is_owned(features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_arg_conv);
+       features_arg_conv = InitFeatures_clone(&features_arg_conv);
+       LDKCounterpartyForwardingInfo forwarding_info_arg_conv;
+       forwarding_info_arg_conv.inner = untag_ptr(forwarding_info_arg);
+       forwarding_info_arg_conv.is_owned = ptr_is_owned(forwarding_info_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(forwarding_info_arg_conv);
+       forwarding_info_arg_conv = CounterpartyForwardingInfo_clone(&forwarding_info_arg_conv);
+       void* outbound_htlc_minimum_msat_arg_ptr = untag_ptr(outbound_htlc_minimum_msat_arg);
+       CHECK_ACCESS(outbound_htlc_minimum_msat_arg_ptr);
+       LDKCOption_u64Z outbound_htlc_minimum_msat_arg_conv = *(LDKCOption_u64Z*)(outbound_htlc_minimum_msat_arg_ptr);
+       outbound_htlc_minimum_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(outbound_htlc_minimum_msat_arg));
+       void* outbound_htlc_maximum_msat_arg_ptr = untag_ptr(outbound_htlc_maximum_msat_arg);
+       CHECK_ACCESS(outbound_htlc_maximum_msat_arg_ptr);
+       LDKCOption_u64Z outbound_htlc_maximum_msat_arg_conv = *(LDKCOption_u64Z*)(outbound_htlc_maximum_msat_arg_ptr);
+       outbound_htlc_maximum_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(outbound_htlc_maximum_msat_arg));
+       LDKChannelCounterparty ret_var = ChannelCounterparty_new(node_id_arg_ref, features_arg_conv, unspendable_punishment_reserve_arg, forwarding_info_arg_conv, outbound_htlc_minimum_msat_arg_conv, outbound_htlc_maximum_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 ChannelCounterparty_clone_ptr(LDKChannelCounterparty *NONNULL_PTR arg) {
+       LDKChannelCounterparty ret_var = ChannelCounterparty_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_ChannelCounterparty_clone_ptr(int64_t arg) {
+       LDKChannelCounterparty 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 = ChannelCounterparty_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelCounterparty_clone(int64_t orig) {
+       LDKChannelCounterparty 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;
+       LDKChannelCounterparty ret_var = ChannelCounterparty_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_ChannelDetails_free(int64_t this_obj) {
+       LDKChannelDetails 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);
+       ChannelDetails_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ChannelDetails_get_channel_id(int64_t this_ptr) {
+       LDKChannelDetails 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, *ChannelDetails_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelDetails_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKChannelDetails 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);
+       ChannelDetails_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_counterparty(int64_t this_ptr) {
+       LDKChannelDetails 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;
+       LDKChannelCounterparty ret_var = ChannelDetails_get_counterparty(&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_ChannelDetails_set_counterparty(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       LDKChannelCounterparty 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 = ChannelCounterparty_clone(&val_conv);
+       ChannelDetails_set_counterparty(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_funding_txo(int64_t this_ptr) {
+       LDKChannelDetails 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;
+       LDKOutPoint ret_var = ChannelDetails_get_funding_txo(&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_ChannelDetails_set_funding_txo(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       LDKOutPoint 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 = OutPoint_clone(&val_conv);
+       ChannelDetails_set_funding_txo(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_channel_type(int64_t this_ptr) {
+       LDKChannelDetails 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;
+       LDKChannelTypeFeatures ret_var = ChannelDetails_get_channel_type(&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_ChannelDetails_set_channel_type(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_clone(&val_conv);
+       ChannelDetails_set_channel_type(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_short_channel_id(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_short_channel_id(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_short_channel_id(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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));
+       ChannelDetails_set_short_channel_id(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_outbound_scid_alias(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_outbound_scid_alias(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_outbound_scid_alias(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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));
+       ChannelDetails_set_outbound_scid_alias(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_inbound_scid_alias(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_inbound_scid_alias(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_inbound_scid_alias(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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));
+       ChannelDetails_set_inbound_scid_alias(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_channel_value_satoshis(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_channel_value_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_channel_value_satoshis(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_channel_value_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_unspendable_punishment_reserve(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_unspendable_punishment_reserve(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_unspendable_punishment_reserve(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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));
+       ChannelDetails_set_unspendable_punishment_reserve(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_ChannelDetails_get_user_channel_id(int64_t this_ptr) {
+       LDKChannelDetails 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(16, __LINE__);
+       memcpy(ret_arr->elems, ChannelDetails_get_user_channel_id(&this_ptr_conv).le_bytes, 16);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelDetails_set_user_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKChannelDetails 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;
+       LDKU128 val_ref;
+       CHECK(val->arr_len == 16);
+       memcpy(val_ref.le_bytes, val->elems, 16); FREE(val);
+       ChannelDetails_set_user_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_feerate_sat_per_1000_weight(int64_t this_ptr) {
+       LDKChannelDetails 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_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = ChannelDetails_get_feerate_sat_per_1000_weight(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_feerate_sat_per_1000_weight(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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_u32Z val_conv = *(LDKCOption_u32Z*)(val_ptr);
+       val_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(val));
+       ChannelDetails_set_feerate_sat_per_1000_weight(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_balance_msat(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_balance_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_balance_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_balance_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_outbound_capacity_msat(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_outbound_capacity_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_outbound_capacity_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_outbound_capacity_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_next_outbound_htlc_limit_msat(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_next_outbound_htlc_limit_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_next_outbound_htlc_limit_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_next_outbound_htlc_limit_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_next_outbound_htlc_minimum_msat(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_next_outbound_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_next_outbound_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_next_outbound_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_inbound_capacity_msat(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_inbound_capacity_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_inbound_capacity_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_inbound_capacity_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_confirmations_required(int64_t this_ptr) {
+       LDKChannelDetails 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_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = ChannelDetails_get_confirmations_required(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_confirmations_required(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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_u32Z val_conv = *(LDKCOption_u32Z*)(val_ptr);
+       val_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(val));
+       ChannelDetails_set_confirmations_required(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_confirmations(int64_t this_ptr) {
+       LDKChannelDetails 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_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = ChannelDetails_get_confirmations(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_confirmations(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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_u32Z val_conv = *(LDKCOption_u32Z*)(val_ptr);
+       val_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(val));
+       ChannelDetails_set_confirmations(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_force_close_spend_delay(int64_t this_ptr) {
+       LDKChannelDetails 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_u16Z *ret_copy = MALLOC(sizeof(LDKCOption_u16Z), "LDKCOption_u16Z");
+       *ret_copy = ChannelDetails_get_force_close_spend_delay(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_force_close_spend_delay(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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_u16Z val_conv = *(LDKCOption_u16Z*)(val_ptr);
+       val_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(val));
+       ChannelDetails_set_force_close_spend_delay(&this_ptr_conv, val_conv);
+}
+
+jboolean  CS_LDK_ChannelDetails_get_is_outbound(int64_t this_ptr) {
+       LDKChannelDetails 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;
+       jboolean ret_conv = ChannelDetails_get_is_outbound(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_is_outbound(int64_t this_ptr, jboolean val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_is_outbound(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelDetails_get_is_channel_ready(int64_t this_ptr) {
+       LDKChannelDetails 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;
+       jboolean ret_conv = ChannelDetails_get_is_channel_ready(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_is_channel_ready(int64_t this_ptr, jboolean val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_is_channel_ready(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_channel_shutdown_state(int64_t this_ptr) {
+       LDKChannelDetails 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_ChannelShutdownStateZ *ret_copy = MALLOC(sizeof(LDKCOption_ChannelShutdownStateZ), "LDKCOption_ChannelShutdownStateZ");
+       *ret_copy = ChannelDetails_get_channel_shutdown_state(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_channel_shutdown_state(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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_ChannelShutdownStateZ val_conv = *(LDKCOption_ChannelShutdownStateZ*)(val_ptr);
+       val_conv = COption_ChannelShutdownStateZ_clone((LDKCOption_ChannelShutdownStateZ*)untag_ptr(val));
+       ChannelDetails_set_channel_shutdown_state(&this_ptr_conv, val_conv);
+}
+
+jboolean  CS_LDK_ChannelDetails_get_is_usable(int64_t this_ptr) {
+       LDKChannelDetails 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;
+       jboolean ret_conv = ChannelDetails_get_is_usable(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_is_usable(int64_t this_ptr, jboolean val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_is_usable(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelDetails_get_is_public(int64_t this_ptr) {
+       LDKChannelDetails 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;
+       jboolean ret_conv = ChannelDetails_get_is_public(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDetails_set_is_public(int64_t this_ptr, jboolean val) {
+       LDKChannelDetails 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;
+       ChannelDetails_set_is_public(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_inbound_htlc_minimum_msat(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_inbound_htlc_minimum_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_inbound_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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));
+       ChannelDetails_set_inbound_htlc_minimum_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_inbound_htlc_maximum_msat(int64_t this_ptr) {
+       LDKChannelDetails 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 = ChannelDetails_get_inbound_htlc_maximum_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelDetails_set_inbound_htlc_maximum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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));
+       ChannelDetails_set_inbound_htlc_maximum_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_get_config(int64_t this_ptr) {
+       LDKChannelDetails 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;
+       LDKChannelConfig ret_var = ChannelDetails_get_config(&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_ChannelDetails_set_config(int64_t this_ptr, int64_t val) {
+       LDKChannelDetails 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;
+       LDKChannelConfig 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 = ChannelConfig_clone(&val_conv);
+       ChannelDetails_set_config(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDetails_new(int8_tArray channel_id_arg, int64_t counterparty_arg, int64_t funding_txo_arg, int64_t channel_type_arg, int64_t short_channel_id_arg, int64_t outbound_scid_alias_arg, int64_t inbound_scid_alias_arg, int64_t channel_value_satoshis_arg, int64_t unspendable_punishment_reserve_arg, int8_tArray user_channel_id_arg, int64_t feerate_sat_per_1000_weight_arg, int64_t balance_msat_arg, int64_t outbound_capacity_msat_arg, int64_t next_outbound_htlc_limit_msat_arg, int64_t next_outbound_htlc_minimum_msat_arg, int64_t inbound_capacity_msat_arg, int64_t confirmations_required_arg, int64_t confirmations_arg, int64_t force_close_spend_delay_arg, jboolean is_outbound_arg, jboolean is_channel_ready_arg, int64_t channel_shutdown_state_arg, jboolean is_usable_arg, jboolean is_public_arg, int64_t inbound_htlc_minimum_msat_arg, int64_t inbound_htlc_maximum_msat_arg, int64_t config_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);
+       LDKChannelCounterparty counterparty_arg_conv;
+       counterparty_arg_conv.inner = untag_ptr(counterparty_arg);
+       counterparty_arg_conv.is_owned = ptr_is_owned(counterparty_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(counterparty_arg_conv);
+       counterparty_arg_conv = ChannelCounterparty_clone(&counterparty_arg_conv);
+       LDKOutPoint funding_txo_arg_conv;
+       funding_txo_arg_conv.inner = untag_ptr(funding_txo_arg);
+       funding_txo_arg_conv.is_owned = ptr_is_owned(funding_txo_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_arg_conv);
+       funding_txo_arg_conv = OutPoint_clone(&funding_txo_arg_conv);
+       LDKChannelTypeFeatures channel_type_arg_conv;
+       channel_type_arg_conv.inner = untag_ptr(channel_type_arg);
+       channel_type_arg_conv.is_owned = ptr_is_owned(channel_type_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_arg_conv);
+       channel_type_arg_conv = ChannelTypeFeatures_clone(&channel_type_arg_conv);
+       void* short_channel_id_arg_ptr = untag_ptr(short_channel_id_arg);
+       CHECK_ACCESS(short_channel_id_arg_ptr);
+       LDKCOption_u64Z short_channel_id_arg_conv = *(LDKCOption_u64Z*)(short_channel_id_arg_ptr);
+       short_channel_id_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(short_channel_id_arg));
+       void* outbound_scid_alias_arg_ptr = untag_ptr(outbound_scid_alias_arg);
+       CHECK_ACCESS(outbound_scid_alias_arg_ptr);
+       LDKCOption_u64Z outbound_scid_alias_arg_conv = *(LDKCOption_u64Z*)(outbound_scid_alias_arg_ptr);
+       outbound_scid_alias_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(outbound_scid_alias_arg));
+       void* inbound_scid_alias_arg_ptr = untag_ptr(inbound_scid_alias_arg);
+       CHECK_ACCESS(inbound_scid_alias_arg_ptr);
+       LDKCOption_u64Z inbound_scid_alias_arg_conv = *(LDKCOption_u64Z*)(inbound_scid_alias_arg_ptr);
+       inbound_scid_alias_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(inbound_scid_alias_arg));
+       void* unspendable_punishment_reserve_arg_ptr = untag_ptr(unspendable_punishment_reserve_arg);
+       CHECK_ACCESS(unspendable_punishment_reserve_arg_ptr);
+       LDKCOption_u64Z unspendable_punishment_reserve_arg_conv = *(LDKCOption_u64Z*)(unspendable_punishment_reserve_arg_ptr);
+       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);
+       void* feerate_sat_per_1000_weight_arg_ptr = untag_ptr(feerate_sat_per_1000_weight_arg);
+       CHECK_ACCESS(feerate_sat_per_1000_weight_arg_ptr);
+       LDKCOption_u32Z feerate_sat_per_1000_weight_arg_conv = *(LDKCOption_u32Z*)(feerate_sat_per_1000_weight_arg_ptr);
+       feerate_sat_per_1000_weight_arg_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(feerate_sat_per_1000_weight_arg));
+       void* confirmations_required_arg_ptr = untag_ptr(confirmations_required_arg);
+       CHECK_ACCESS(confirmations_required_arg_ptr);
+       LDKCOption_u32Z confirmations_required_arg_conv = *(LDKCOption_u32Z*)(confirmations_required_arg_ptr);
+       confirmations_required_arg_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(confirmations_required_arg));
+       void* confirmations_arg_ptr = untag_ptr(confirmations_arg);
+       CHECK_ACCESS(confirmations_arg_ptr);
+       LDKCOption_u32Z confirmations_arg_conv = *(LDKCOption_u32Z*)(confirmations_arg_ptr);
+       confirmations_arg_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(confirmations_arg));
+       void* force_close_spend_delay_arg_ptr = untag_ptr(force_close_spend_delay_arg);
+       CHECK_ACCESS(force_close_spend_delay_arg_ptr);
+       LDKCOption_u16Z force_close_spend_delay_arg_conv = *(LDKCOption_u16Z*)(force_close_spend_delay_arg_ptr);
+       force_close_spend_delay_arg_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(force_close_spend_delay_arg));
+       void* channel_shutdown_state_arg_ptr = untag_ptr(channel_shutdown_state_arg);
+       CHECK_ACCESS(channel_shutdown_state_arg_ptr);
+       LDKCOption_ChannelShutdownStateZ channel_shutdown_state_arg_conv = *(LDKCOption_ChannelShutdownStateZ*)(channel_shutdown_state_arg_ptr);
+       channel_shutdown_state_arg_conv = COption_ChannelShutdownStateZ_clone((LDKCOption_ChannelShutdownStateZ*)untag_ptr(channel_shutdown_state_arg));
+       void* inbound_htlc_minimum_msat_arg_ptr = untag_ptr(inbound_htlc_minimum_msat_arg);
+       CHECK_ACCESS(inbound_htlc_minimum_msat_arg_ptr);
+       LDKCOption_u64Z inbound_htlc_minimum_msat_arg_conv = *(LDKCOption_u64Z*)(inbound_htlc_minimum_msat_arg_ptr);
+       inbound_htlc_minimum_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(inbound_htlc_minimum_msat_arg));
+       void* inbound_htlc_maximum_msat_arg_ptr = untag_ptr(inbound_htlc_maximum_msat_arg);
+       CHECK_ACCESS(inbound_htlc_maximum_msat_arg_ptr);
+       LDKCOption_u64Z inbound_htlc_maximum_msat_arg_conv = *(LDKCOption_u64Z*)(inbound_htlc_maximum_msat_arg_ptr);
+       inbound_htlc_maximum_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(inbound_htlc_maximum_msat_arg));
+       LDKChannelConfig config_arg_conv;
+       config_arg_conv.inner = untag_ptr(config_arg);
+       config_arg_conv.is_owned = ptr_is_owned(config_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(config_arg_conv);
+       config_arg_conv = ChannelConfig_clone(&config_arg_conv);
+       LDKChannelDetails ret_var = ChannelDetails_new(channel_id_arg_ref, counterparty_arg_conv, funding_txo_arg_conv, channel_type_arg_conv, short_channel_id_arg_conv, outbound_scid_alias_arg_conv, inbound_scid_alias_arg_conv, channel_value_satoshis_arg, unspendable_punishment_reserve_arg_conv, user_channel_id_arg_ref, feerate_sat_per_1000_weight_arg_conv, balance_msat_arg, outbound_capacity_msat_arg, next_outbound_htlc_limit_msat_arg, next_outbound_htlc_minimum_msat_arg, inbound_capacity_msat_arg, confirmations_required_arg_conv, confirmations_arg_conv, force_close_spend_delay_arg_conv, is_outbound_arg, is_channel_ready_arg, channel_shutdown_state_arg_conv, is_usable_arg, is_public_arg, inbound_htlc_minimum_msat_arg_conv, inbound_htlc_maximum_msat_arg_conv, config_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 ChannelDetails_clone_ptr(LDKChannelDetails *NONNULL_PTR arg) {
+       LDKChannelDetails ret_var = ChannelDetails_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_ChannelDetails_clone_ptr(int64_t arg) {
+       LDKChannelDetails 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 = ChannelDetails_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelDetails_clone(int64_t orig) {
+       LDKChannelDetails 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;
+       LDKChannelDetails ret_var = ChannelDetails_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_ChannelDetails_get_inbound_payment_scid(int64_t this_arg) {
+       LDKChannelDetails 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = ChannelDetails_get_inbound_payment_scid(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ChannelDetails_get_outbound_payment_scid(int64_t this_arg) {
+       LDKChannelDetails 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = ChannelDetails_get_outbound_payment_scid(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int32_t  CS_LDK_ChannelShutdownState_clone(int64_t orig) {
+       LDKChannelShutdownState* orig_conv = (LDKChannelShutdownState*)untag_ptr(orig);
+       int32_t ret_conv = LDKChannelShutdownState_to_cs(ChannelShutdownState_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ChannelShutdownState_not_shutting_down() {
+       int32_t ret_conv = LDKChannelShutdownState_to_cs(ChannelShutdownState_not_shutting_down());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ChannelShutdownState_shutdown_initiated() {
+       int32_t ret_conv = LDKChannelShutdownState_to_cs(ChannelShutdownState_shutdown_initiated());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ChannelShutdownState_resolving_htlcs() {
+       int32_t ret_conv = LDKChannelShutdownState_to_cs(ChannelShutdownState_resolving_htlcs());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ChannelShutdownState_negotiating_closing_fee() {
+       int32_t ret_conv = LDKChannelShutdownState_to_cs(ChannelShutdownState_negotiating_closing_fee());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_ChannelShutdownState_shutdown_complete() {
+       int32_t ret_conv = LDKChannelShutdownState_to_cs(ChannelShutdownState_shutdown_complete());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelShutdownState_eq(int64_t a, int64_t b) {
+       LDKChannelShutdownState* a_conv = (LDKChannelShutdownState*)untag_ptr(a);
+       LDKChannelShutdownState* b_conv = (LDKChannelShutdownState*)untag_ptr(b);
+       jboolean ret_conv = ChannelShutdownState_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RecentPaymentDetails_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);
+       LDKRecentPaymentDetails this_ptr_conv = *(LDKRecentPaymentDetails*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       RecentPaymentDetails_free(this_ptr_conv);
+}
+
+static inline uint64_t RecentPaymentDetails_clone_ptr(LDKRecentPaymentDetails *NONNULL_PTR arg) {
+       LDKRecentPaymentDetails *ret_copy = MALLOC(sizeof(LDKRecentPaymentDetails), "LDKRecentPaymentDetails");
+       *ret_copy = RecentPaymentDetails_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_RecentPaymentDetails_clone_ptr(int64_t arg) {
+       LDKRecentPaymentDetails* arg_conv = (LDKRecentPaymentDetails*)untag_ptr(arg);
+       int64_t ret_conv = RecentPaymentDetails_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RecentPaymentDetails_clone(int64_t orig) {
+       LDKRecentPaymentDetails* orig_conv = (LDKRecentPaymentDetails*)untag_ptr(orig);
+       LDKRecentPaymentDetails *ret_copy = MALLOC(sizeof(LDKRecentPaymentDetails), "LDKRecentPaymentDetails");
+       *ret_copy = RecentPaymentDetails_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RecentPaymentDetails_awaiting_invoice(int8_tArray payment_id) {
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKRecentPaymentDetails *ret_copy = MALLOC(sizeof(LDKRecentPaymentDetails), "LDKRecentPaymentDetails");
+       *ret_copy = RecentPaymentDetails_awaiting_invoice(payment_id_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RecentPaymentDetails_pending(int8_tArray payment_id, int8_tArray payment_hash, int64_t total_msat) {
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKRecentPaymentDetails *ret_copy = MALLOC(sizeof(LDKRecentPaymentDetails), "LDKRecentPaymentDetails");
+       *ret_copy = RecentPaymentDetails_pending(payment_id_ref, payment_hash_ref, total_msat);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RecentPaymentDetails_fulfilled(int8_tArray payment_id, int64_t payment_hash) {
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       void* payment_hash_ptr = untag_ptr(payment_hash);
+       CHECK_ACCESS(payment_hash_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_hash_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_hash_ptr);
+       payment_hash_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_hash));
+       LDKRecentPaymentDetails *ret_copy = MALLOC(sizeof(LDKRecentPaymentDetails), "LDKRecentPaymentDetails");
+       *ret_copy = RecentPaymentDetails_fulfilled(payment_id_ref, payment_hash_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RecentPaymentDetails_abandoned(int8_tArray payment_id, int8_tArray payment_hash) {
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKRecentPaymentDetails *ret_copy = MALLOC(sizeof(LDKRecentPaymentDetails), "LDKRecentPaymentDetails");
+       *ret_copy = RecentPaymentDetails_abandoned(payment_id_ref, payment_hash_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_PhantomRouteHints_free(int64_t this_obj) {
+       LDKPhantomRouteHints 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);
+       PhantomRouteHints_free(this_obj_conv);
+}
+
+int64_tArray  CS_LDK_PhantomRouteHints_get_channels(int64_t this_ptr) {
+       LDKPhantomRouteHints 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_ChannelDetailsZ ret_var = PhantomRouteHints_get_channels(&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 q = 0; q < ret_var.datalen; q++) {
+               LDKChannelDetails ret_conv_16_var = ret_var.data[q];
+               int64_t ret_conv_16_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_16_var);
+               ret_conv_16_ref = tag_ptr(ret_conv_16_var.inner, ret_conv_16_var.is_owned);
+               ret_arr_ptr[q] = ret_conv_16_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_PhantomRouteHints_set_channels(int64_t this_ptr, int64_tArray val) {
+       LDKPhantomRouteHints 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_ChannelDetailsZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKChannelDetails), "LDKCVec_ChannelDetailsZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t q = 0; q < val_constr.datalen; q++) {
+               int64_t val_conv_16 = val_vals[q];
+               LDKChannelDetails val_conv_16_conv;
+               val_conv_16_conv.inner = untag_ptr(val_conv_16);
+               val_conv_16_conv.is_owned = ptr_is_owned(val_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_16_conv);
+               val_conv_16_conv = ChannelDetails_clone(&val_conv_16_conv);
+               val_constr.data[q] = val_conv_16_conv;
+       }
+       FREE(val);
+       PhantomRouteHints_set_channels(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_PhantomRouteHints_get_phantom_scid(int64_t this_ptr) {
+       LDKPhantomRouteHints 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 = PhantomRouteHints_get_phantom_scid(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PhantomRouteHints_set_phantom_scid(int64_t this_ptr, int64_t val) {
+       LDKPhantomRouteHints 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;
+       PhantomRouteHints_set_phantom_scid(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_PhantomRouteHints_get_real_node_pubkey(int64_t this_ptr) {
+       LDKPhantomRouteHints 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, PhantomRouteHints_get_real_node_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_PhantomRouteHints_set_real_node_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKPhantomRouteHints 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);
+       PhantomRouteHints_set_real_node_pubkey(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_PhantomRouteHints_new(int64_tArray channels_arg, int64_t phantom_scid_arg, int8_tArray real_node_pubkey_arg) {
+       LDKCVec_ChannelDetailsZ channels_arg_constr;
+       channels_arg_constr.datalen = channels_arg->arr_len;
+       if (channels_arg_constr.datalen > 0)
+               channels_arg_constr.data = MALLOC(channels_arg_constr.datalen * sizeof(LDKChannelDetails), "LDKCVec_ChannelDetailsZ Elements");
+       else
+               channels_arg_constr.data = NULL;
+       int64_t* channels_arg_vals = channels_arg->elems;
+       for (size_t q = 0; q < channels_arg_constr.datalen; q++) {
+               int64_t channels_arg_conv_16 = channels_arg_vals[q];
+               LDKChannelDetails channels_arg_conv_16_conv;
+               channels_arg_conv_16_conv.inner = untag_ptr(channels_arg_conv_16);
+               channels_arg_conv_16_conv.is_owned = ptr_is_owned(channels_arg_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(channels_arg_conv_16_conv);
+               channels_arg_conv_16_conv = ChannelDetails_clone(&channels_arg_conv_16_conv);
+               channels_arg_constr.data[q] = channels_arg_conv_16_conv;
+       }
+       FREE(channels_arg);
+       LDKPublicKey real_node_pubkey_arg_ref;
+       CHECK(real_node_pubkey_arg->arr_len == 33);
+       memcpy(real_node_pubkey_arg_ref.compressed_form, real_node_pubkey_arg->elems, 33); FREE(real_node_pubkey_arg);
+       LDKPhantomRouteHints ret_var = PhantomRouteHints_new(channels_arg_constr, phantom_scid_arg, real_node_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 PhantomRouteHints_clone_ptr(LDKPhantomRouteHints *NONNULL_PTR arg) {
+       LDKPhantomRouteHints ret_var = PhantomRouteHints_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_PhantomRouteHints_clone_ptr(int64_t arg) {
+       LDKPhantomRouteHints 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 = PhantomRouteHints_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PhantomRouteHints_clone(int64_t orig) {
+       LDKPhantomRouteHints 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;
+       LDKPhantomRouteHints ret_var = PhantomRouteHints_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_ChannelManager_new(int64_t fee_est, int64_t chain_monitor, int64_t tx_broadcaster, int64_t router, int64_t logger, int64_t entropy_source, int64_t node_signer, int64_t signer_provider, int64_t config, int64_t params, int32_t current_timestamp) {
+       void* fee_est_ptr = untag_ptr(fee_est);
+       CHECK_ACCESS(fee_est_ptr);
+       LDKFeeEstimator fee_est_conv = *(LDKFeeEstimator*)(fee_est_ptr);
+       if (fee_est_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_cloned(&fee_est_conv);
+       }
+       void* chain_monitor_ptr = untag_ptr(chain_monitor);
+       CHECK_ACCESS(chain_monitor_ptr);
+       LDKWatch chain_monitor_conv = *(LDKWatch*)(chain_monitor_ptr);
+       if (chain_monitor_conv.free == LDKWatch_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKWatch_JCalls_cloned(&chain_monitor_conv);
+       }
+       void* tx_broadcaster_ptr = untag_ptr(tx_broadcaster);
+       CHECK_ACCESS(tx_broadcaster_ptr);
+       LDKBroadcasterInterface tx_broadcaster_conv = *(LDKBroadcasterInterface*)(tx_broadcaster_ptr);
+       if (tx_broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&tx_broadcaster_conv);
+       }
+       void* router_ptr = untag_ptr(router);
+       CHECK_ACCESS(router_ptr);
+       LDKRouter router_conv = *(LDKRouter*)(router_ptr);
+       if (router_conv.free == LDKRouter_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKRouter_JCalls_cloned(&router_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);
+       }
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_conv);
+       }
+       void* signer_provider_ptr = untag_ptr(signer_provider);
+       CHECK_ACCESS(signer_provider_ptr);
+       LDKSignerProvider signer_provider_conv = *(LDKSignerProvider*)(signer_provider_ptr);
+       if (signer_provider_conv.free == LDKSignerProvider_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKSignerProvider_JCalls_cloned(&signer_provider_conv);
+       }
+       LDKUserConfig config_conv;
+       config_conv.inner = untag_ptr(config);
+       config_conv.is_owned = ptr_is_owned(config);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(config_conv);
+       config_conv = UserConfig_clone(&config_conv);
+       LDKChainParameters params_conv;
+       params_conv.inner = untag_ptr(params);
+       params_conv.is_owned = ptr_is_owned(params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(params_conv);
+       params_conv = ChainParameters_clone(&params_conv);
+       LDKChannelManager ret_var = ChannelManager_new(fee_est_conv, chain_monitor_conv, tx_broadcaster_conv, router_conv, logger_conv, entropy_source_conv, node_signer_conv, signer_provider_conv, config_conv, params_conv, current_timestamp);
+       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_ChannelManager_get_current_default_configuration(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKUserConfig ret_var = ChannelManager_get_current_default_configuration(&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_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) {
+       LDKChannelManager 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;
+       LDKPublicKey their_network_key_ref;
+       CHECK(their_network_key->arr_len == 33);
+       memcpy(their_network_key_ref.compressed_form, their_network_key->elems, 33); FREE(their_network_key);
+       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);
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_tArray  CS_LDK_ChannelManager_list_channels(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKCVec_ChannelDetailsZ ret_var = ChannelManager_list_channels(&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 q = 0; q < ret_var.datalen; q++) {
+               LDKChannelDetails ret_conv_16_var = ret_var.data[q];
+               int64_t ret_conv_16_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_16_var);
+               ret_conv_16_ref = tag_ptr(ret_conv_16_var.inner, ret_conv_16_var.is_owned);
+               ret_arr_ptr[q] = ret_conv_16_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_ChannelManager_list_usable_channels(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKCVec_ChannelDetailsZ ret_var = ChannelManager_list_usable_channels(&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 q = 0; q < ret_var.datalen; q++) {
+               LDKChannelDetails ret_conv_16_var = ret_var.data[q];
+               int64_t ret_conv_16_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_16_var);
+               ret_conv_16_ref = tag_ptr(ret_conv_16_var.inner, ret_conv_16_var.is_owned);
+               ret_arr_ptr[q] = ret_conv_16_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_ChannelManager_list_channels_with_counterparty(int64_t this_arg, int8_tArray counterparty_node_id) {
+       LDKChannelManager 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;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKCVec_ChannelDetailsZ ret_var = ChannelManager_list_channels_with_counterparty(&this_arg_conv, counterparty_node_id_ref);
+       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 q = 0; q < ret_var.datalen; q++) {
+               LDKChannelDetails ret_conv_16_var = ret_var.data[q];
+               int64_t ret_conv_16_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_16_var);
+               ret_conv_16_ref = tag_ptr(ret_conv_16_var.inner, ret_conv_16_var.is_owned);
+               ret_arr_ptr[q] = ret_conv_16_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_ChannelManager_list_recent_payments(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKCVec_RecentPaymentDetailsZ ret_var = ChannelManager_list_recent_payments(&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 w = 0; w < ret_var.datalen; w++) {
+               LDKRecentPaymentDetails *ret_conv_22_copy = MALLOC(sizeof(LDKRecentPaymentDetails), "LDKRecentPaymentDetails");
+               *ret_conv_22_copy = ret_var.data[w];
+               int64_t ret_conv_22_ref = tag_ptr(ret_conv_22_copy, true);
+               ret_arr_ptr[w] = ret_conv_22_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_ChannelManager_close_channel(int64_t this_arg, int8_tArray channel_id, int8_tArray counterparty_node_id) {
+       LDKChannelManager 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;
+       uint8_t channel_id_arr[32];
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_arr, channel_id->elems, 32); FREE(channel_id);
+       uint8_t (*channel_id_ref)[32] = &channel_id_arr;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_close_channel(&this_arg_conv, channel_id_ref, counterparty_node_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_close_channel_with_feerate_and_script(int64_t this_arg, int8_tArray channel_id, int8_tArray counterparty_node_id, int64_t target_feerate_sats_per_1000_weight, int64_t shutdown_script) {
+       LDKChannelManager 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;
+       uint8_t channel_id_arr[32];
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_arr, channel_id->elems, 32); FREE(channel_id);
+       uint8_t (*channel_id_ref)[32] = &channel_id_arr;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       void* target_feerate_sats_per_1000_weight_ptr = untag_ptr(target_feerate_sats_per_1000_weight);
+       CHECK_ACCESS(target_feerate_sats_per_1000_weight_ptr);
+       LDKCOption_u32Z target_feerate_sats_per_1000_weight_conv = *(LDKCOption_u32Z*)(target_feerate_sats_per_1000_weight_ptr);
+       target_feerate_sats_per_1000_weight_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(target_feerate_sats_per_1000_weight));
+       LDKShutdownScript shutdown_script_conv;
+       shutdown_script_conv.inner = untag_ptr(shutdown_script);
+       shutdown_script_conv.is_owned = ptr_is_owned(shutdown_script);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(shutdown_script_conv);
+       shutdown_script_conv = ShutdownScript_clone(&shutdown_script_conv);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_close_channel_with_feerate_and_script(&this_arg_conv, channel_id_ref, counterparty_node_id_ref, target_feerate_sats_per_1000_weight_conv, shutdown_script_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_force_close_broadcasting_latest_txn(int64_t this_arg, int8_tArray channel_id, int8_tArray counterparty_node_id) {
+       LDKChannelManager 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;
+       uint8_t channel_id_arr[32];
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_arr, channel_id->elems, 32); FREE(channel_id);
+       uint8_t (*channel_id_ref)[32] = &channel_id_arr;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_force_close_broadcasting_latest_txn(&this_arg_conv, channel_id_ref, counterparty_node_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_force_close_without_broadcasting_txn(int64_t this_arg, int8_tArray channel_id, int8_tArray counterparty_node_id) {
+       LDKChannelManager 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;
+       uint8_t channel_id_arr[32];
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_arr, channel_id->elems, 32); FREE(channel_id);
+       uint8_t (*channel_id_ref)[32] = &channel_id_arr;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_force_close_without_broadcasting_txn(&this_arg_conv, channel_id_ref, counterparty_node_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelManager_force_close_all_channels_broadcasting_latest_txn(int64_t this_arg) {
+       LDKChannelManager 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;
+       ChannelManager_force_close_all_channels_broadcasting_latest_txn(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelManager_force_close_all_channels_without_broadcasting_txn(int64_t this_arg) {
+       LDKChannelManager 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;
+       ChannelManager_force_close_all_channels_without_broadcasting_txn(&this_arg_conv);
+}
+
+int64_t  CS_LDK_ChannelManager_send_payment_with_route(int64_t this_arg, int64_t route, int8_tArray payment_hash, int64_t recipient_onion, int8_tArray payment_id) {
+       LDKChannelManager 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;
+       LDKRoute route_conv;
+       route_conv.inner = untag_ptr(route);
+       route_conv.is_owned = ptr_is_owned(route);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_conv);
+       route_conv.is_owned = false;
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKRecipientOnionFields recipient_onion_conv;
+       recipient_onion_conv.inner = untag_ptr(recipient_onion);
+       recipient_onion_conv.is_owned = ptr_is_owned(recipient_onion);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(recipient_onion_conv);
+       recipient_onion_conv = RecipientOnionFields_clone(&recipient_onion_conv);
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKCResult_NonePaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentSendFailureZ), "LDKCResult_NonePaymentSendFailureZ");
+       *ret_conv = ChannelManager_send_payment_with_route(&this_arg_conv, &route_conv, payment_hash_ref, recipient_onion_conv, payment_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_send_payment(int64_t this_arg, int8_tArray payment_hash, int64_t recipient_onion, int8_tArray payment_id, int64_t route_params, int64_t retry_strategy) {
+       LDKChannelManager 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;
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKRecipientOnionFields recipient_onion_conv;
+       recipient_onion_conv.inner = untag_ptr(recipient_onion);
+       recipient_onion_conv.is_owned = ptr_is_owned(recipient_onion);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(recipient_onion_conv);
+       recipient_onion_conv = RecipientOnionFields_clone(&recipient_onion_conv);
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKRouteParameters route_params_conv;
+       route_params_conv.inner = untag_ptr(route_params);
+       route_params_conv.is_owned = ptr_is_owned(route_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_conv);
+       route_params_conv = RouteParameters_clone(&route_params_conv);
+       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));
+       LDKCResult_NoneRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneRetryableSendFailureZ), "LDKCResult_NoneRetryableSendFailureZ");
+       *ret_conv = ChannelManager_send_payment(&this_arg_conv, payment_hash_ref, recipient_onion_conv, payment_id_ref, route_params_conv, retry_strategy_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelManager_abandon_payment(int64_t this_arg, int8_tArray payment_id) {
+       LDKChannelManager 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;
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       ChannelManager_abandon_payment(&this_arg_conv, payment_id_ref);
+}
+
+int64_t  CS_LDK_ChannelManager_send_spontaneous_payment(int64_t this_arg, int64_t route, int64_t payment_preimage, int64_t recipient_onion, int8_tArray payment_id) {
+       LDKChannelManager 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;
+       LDKRoute route_conv;
+       route_conv.inner = untag_ptr(route);
+       route_conv.is_owned = ptr_is_owned(route);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_conv);
+       route_conv.is_owned = false;
+       void* payment_preimage_ptr = untag_ptr(payment_preimage);
+       CHECK_ACCESS(payment_preimage_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_preimage_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_preimage_ptr);
+       payment_preimage_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_preimage));
+       LDKRecipientOnionFields recipient_onion_conv;
+       recipient_onion_conv.inner = untag_ptr(recipient_onion);
+       recipient_onion_conv.is_owned = ptr_is_owned(recipient_onion);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(recipient_onion_conv);
+       recipient_onion_conv = RecipientOnionFields_clone(&recipient_onion_conv);
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKCResult_ThirtyTwoBytesPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ), "LDKCResult_ThirtyTwoBytesPaymentSendFailureZ");
+       *ret_conv = ChannelManager_send_spontaneous_payment(&this_arg_conv, &route_conv, payment_preimage_conv, recipient_onion_conv, payment_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_send_spontaneous_payment_with_retry(int64_t this_arg, int64_t payment_preimage, int64_t recipient_onion, int8_tArray payment_id, int64_t route_params, int64_t retry_strategy) {
+       LDKChannelManager 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;
+       void* payment_preimage_ptr = untag_ptr(payment_preimage);
+       CHECK_ACCESS(payment_preimage_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_preimage_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_preimage_ptr);
+       payment_preimage_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_preimage));
+       LDKRecipientOnionFields recipient_onion_conv;
+       recipient_onion_conv.inner = untag_ptr(recipient_onion);
+       recipient_onion_conv.is_owned = ptr_is_owned(recipient_onion);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(recipient_onion_conv);
+       recipient_onion_conv = RecipientOnionFields_clone(&recipient_onion_conv);
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKRouteParameters route_params_conv;
+       route_params_conv.inner = untag_ptr(route_params);
+       route_params_conv.is_owned = ptr_is_owned(route_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_conv);
+       route_params_conv = RouteParameters_clone(&route_params_conv);
+       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));
+       LDKCResult_ThirtyTwoBytesRetryableSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ), "LDKCResult_ThirtyTwoBytesRetryableSendFailureZ");
+       *ret_conv = ChannelManager_send_spontaneous_payment_with_retry(&this_arg_conv, payment_preimage_conv, recipient_onion_conv, payment_id_ref, route_params_conv, retry_strategy_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_send_probe(int64_t this_arg, int64_t path) {
+       LDKChannelManager 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;
+       LDKPath 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 = Path_clone(&path_conv);
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ");
+       *ret_conv = ChannelManager_send_probe(&this_arg_conv, path_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_send_spontaneous_preflight_probes(int64_t this_arg, int8_tArray node_id, int64_t amount_msat, int32_t final_cltv_expiry_delta, int64_t liquidity_limit_multiplier) {
+       LDKChannelManager 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;
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       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_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ");
+       *ret_conv = ChannelManager_send_spontaneous_preflight_probes(&this_arg_conv, node_id_ref, amount_msat, final_cltv_expiry_delta, liquidity_limit_multiplier_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_send_preflight_probes(int64_t this_arg, int64_t route_params, int64_t liquidity_limit_multiplier) {
+       LDKChannelManager 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;
+       LDKRouteParameters route_params_conv;
+       route_params_conv.inner = untag_ptr(route_params);
+       route_params_conv.is_owned = ptr_is_owned(route_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_conv);
+       route_params_conv = RouteParameters_clone(&route_params_conv);
+       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_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ");
+       *ret_conv = ChannelManager_send_preflight_probes(&this_arg_conv, route_params_conv, liquidity_limit_multiplier_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_funding_transaction_generated(int64_t this_arg, int8_tArray temporary_channel_id, int8_tArray counterparty_node_id, int8_tArray funding_transaction) {
+       LDKChannelManager 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;
+       uint8_t temporary_channel_id_arr[32];
+       CHECK(temporary_channel_id->arr_len == 32);
+       memcpy(temporary_channel_id_arr, temporary_channel_id->elems, 32); FREE(temporary_channel_id);
+       uint8_t (*temporary_channel_id_ref)[32] = &temporary_channel_id_arr;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKTransaction funding_transaction_ref;
+       funding_transaction_ref.datalen = funding_transaction->arr_len;
+       funding_transaction_ref.data = MALLOC(funding_transaction_ref.datalen, "LDKTransaction Bytes");
+       memcpy(funding_transaction_ref.data, funding_transaction->elems, funding_transaction_ref.datalen); FREE(funding_transaction);
+       funding_transaction_ref.data_is_owned = true;
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_funding_transaction_generated(&this_arg_conv, temporary_channel_id_ref, counterparty_node_id_ref, funding_transaction_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_batch_funding_transaction_generated(int64_t this_arg, int64_tArray temporary_channels, int8_tArray funding_transaction) {
+       LDKChannelManager 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;
+       LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ temporary_channels_constr;
+       temporary_channels_constr.datalen = temporary_channels->arr_len;
+       if (temporary_channels_constr.datalen > 0)
+               temporary_channels_constr.data = MALLOC(temporary_channels_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ), "LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ Elements");
+       else
+               temporary_channels_constr.data = NULL;
+       int64_t* temporary_channels_vals = temporary_channels->elems;
+       for (size_t j = 0; j < temporary_channels_constr.datalen; j++) {
+               int64_t temporary_channels_conv_35 = temporary_channels_vals[j];
+               void* temporary_channels_conv_35_ptr = untag_ptr(temporary_channels_conv_35);
+               CHECK_ACCESS(temporary_channels_conv_35_ptr);
+               LDKC2Tuple_ThirtyTwoBytesPublicKeyZ temporary_channels_conv_35_conv = *(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ*)(temporary_channels_conv_35_ptr);
+               temporary_channels_conv_35_conv = C2Tuple_ThirtyTwoBytesPublicKeyZ_clone((LDKC2Tuple_ThirtyTwoBytesPublicKeyZ*)untag_ptr(temporary_channels_conv_35));
+               temporary_channels_constr.data[j] = temporary_channels_conv_35_conv;
+       }
+       FREE(temporary_channels);
+       LDKTransaction funding_transaction_ref;
+       funding_transaction_ref.datalen = funding_transaction->arr_len;
+       funding_transaction_ref.data = MALLOC(funding_transaction_ref.datalen, "LDKTransaction Bytes");
+       memcpy(funding_transaction_ref.data, funding_transaction->elems, funding_transaction_ref.datalen); FREE(funding_transaction);
+       funding_transaction_ref.data_is_owned = true;
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_batch_funding_transaction_generated(&this_arg_conv, temporary_channels_constr, funding_transaction_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_update_partial_channel_config(int64_t this_arg, int8_tArray counterparty_node_id, ptrArray channel_ids, int64_t config_update) {
+       LDKChannelManager 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;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKCVec_ThirtyTwoBytesZ channel_ids_constr;
+       channel_ids_constr.datalen = channel_ids->arr_len;
+       if (channel_ids_constr.datalen > 0)
+               channel_ids_constr.data = MALLOC(channel_ids_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ Elements");
+       else
+               channel_ids_constr.data = NULL;
+       int8_tArray* channel_ids_vals = (void*) channel_ids->elems;
+       for (size_t i = 0; i < channel_ids_constr.datalen; i++) {
+               int8_tArray channel_ids_conv_8 = channel_ids_vals[i];
+               LDKThirtyTwoBytes channel_ids_conv_8_ref;
+               CHECK(channel_ids_conv_8->arr_len == 32);
+               memcpy(channel_ids_conv_8_ref.data, channel_ids_conv_8->elems, 32); FREE(channel_ids_conv_8);
+               channel_ids_constr.data[i] = channel_ids_conv_8_ref;
+       }
+       FREE(channel_ids);
+       LDKChannelConfigUpdate config_update_conv;
+       config_update_conv.inner = untag_ptr(config_update);
+       config_update_conv.is_owned = ptr_is_owned(config_update);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(config_update_conv);
+       config_update_conv.is_owned = false;
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_update_partial_channel_config(&this_arg_conv, counterparty_node_id_ref, channel_ids_constr, &config_update_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_update_channel_config(int64_t this_arg, int8_tArray counterparty_node_id, ptrArray channel_ids, int64_t config) {
+       LDKChannelManager 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;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKCVec_ThirtyTwoBytesZ channel_ids_constr;
+       channel_ids_constr.datalen = channel_ids->arr_len;
+       if (channel_ids_constr.datalen > 0)
+               channel_ids_constr.data = MALLOC(channel_ids_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ Elements");
+       else
+               channel_ids_constr.data = NULL;
+       int8_tArray* channel_ids_vals = (void*) channel_ids->elems;
+       for (size_t i = 0; i < channel_ids_constr.datalen; i++) {
+               int8_tArray channel_ids_conv_8 = channel_ids_vals[i];
+               LDKThirtyTwoBytes channel_ids_conv_8_ref;
+               CHECK(channel_ids_conv_8->arr_len == 32);
+               memcpy(channel_ids_conv_8_ref.data, channel_ids_conv_8->elems, 32); FREE(channel_ids_conv_8);
+               channel_ids_constr.data[i] = channel_ids_conv_8_ref;
+       }
+       FREE(channel_ids);
+       LDKChannelConfig config_conv;
+       config_conv.inner = untag_ptr(config);
+       config_conv.is_owned = ptr_is_owned(config);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(config_conv);
+       config_conv.is_owned = false;
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_update_channel_config(&this_arg_conv, counterparty_node_id_ref, channel_ids_constr, &config_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_forward_intercepted_htlc(int64_t this_arg, int8_tArray intercept_id, int8_tArray next_hop_channel_id, int8_tArray next_node_id, int64_t amt_to_forward_msat) {
+       LDKChannelManager 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;
+       LDKThirtyTwoBytes intercept_id_ref;
+       CHECK(intercept_id->arr_len == 32);
+       memcpy(intercept_id_ref.data, intercept_id->elems, 32); FREE(intercept_id);
+       uint8_t next_hop_channel_id_arr[32];
+       CHECK(next_hop_channel_id->arr_len == 32);
+       memcpy(next_hop_channel_id_arr, next_hop_channel_id->elems, 32); FREE(next_hop_channel_id);
+       uint8_t (*next_hop_channel_id_ref)[32] = &next_hop_channel_id_arr;
+       LDKPublicKey next_node_id_ref;
+       CHECK(next_node_id->arr_len == 33);
+       memcpy(next_node_id_ref.compressed_form, next_node_id->elems, 33); FREE(next_node_id);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_forward_intercepted_htlc(&this_arg_conv, intercept_id_ref, next_hop_channel_id_ref, next_node_id_ref, amt_to_forward_msat);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_fail_intercepted_htlc(int64_t this_arg, int8_tArray intercept_id) {
+       LDKChannelManager 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;
+       LDKThirtyTwoBytes intercept_id_ref;
+       CHECK(intercept_id->arr_len == 32);
+       memcpy(intercept_id_ref.data, intercept_id->elems, 32); FREE(intercept_id);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_fail_intercepted_htlc(&this_arg_conv, intercept_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelManager_process_pending_htlc_forwards(int64_t this_arg) {
+       LDKChannelManager 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;
+       ChannelManager_process_pending_htlc_forwards(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelManager_timer_tick_occurred(int64_t this_arg) {
+       LDKChannelManager 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;
+       ChannelManager_timer_tick_occurred(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelManager_fail_htlc_backwards(int64_t this_arg, int8_tArray payment_hash) {
+       LDKChannelManager 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;
+       uint8_t payment_hash_arr[32];
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_arr, payment_hash->elems, 32); FREE(payment_hash);
+       uint8_t (*payment_hash_ref)[32] = &payment_hash_arr;
+       ChannelManager_fail_htlc_backwards(&this_arg_conv, payment_hash_ref);
+}
+
+void  CS_LDK_ChannelManager_fail_htlc_backwards_with_reason(int64_t this_arg, int8_tArray payment_hash, int64_t failure_code) {
+       LDKChannelManager 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;
+       uint8_t payment_hash_arr[32];
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_arr, payment_hash->elems, 32); FREE(payment_hash);
+       uint8_t (*payment_hash_ref)[32] = &payment_hash_arr;
+       void* failure_code_ptr = untag_ptr(failure_code);
+       CHECK_ACCESS(failure_code_ptr);
+       LDKFailureCode failure_code_conv = *(LDKFailureCode*)(failure_code_ptr);
+       failure_code_conv = FailureCode_clone((LDKFailureCode*)untag_ptr(failure_code));
+       ChannelManager_fail_htlc_backwards_with_reason(&this_arg_conv, payment_hash_ref, failure_code_conv);
+}
+
+void  CS_LDK_ChannelManager_claim_funds(int64_t this_arg, int8_tArray payment_preimage) {
+       LDKChannelManager 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;
+       LDKThirtyTwoBytes payment_preimage_ref;
+       CHECK(payment_preimage->arr_len == 32);
+       memcpy(payment_preimage_ref.data, payment_preimage->elems, 32); FREE(payment_preimage);
+       ChannelManager_claim_funds(&this_arg_conv, payment_preimage_ref);
+}
+
+void  CS_LDK_ChannelManager_claim_funds_with_known_custom_tlvs(int64_t this_arg, int8_tArray payment_preimage) {
+       LDKChannelManager 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;
+       LDKThirtyTwoBytes payment_preimage_ref;
+       CHECK(payment_preimage->arr_len == 32);
+       memcpy(payment_preimage_ref.data, payment_preimage->elems, 32); FREE(payment_preimage);
+       ChannelManager_claim_funds_with_known_custom_tlvs(&this_arg_conv, payment_preimage_ref);
+}
+
+int8_tArray  CS_LDK_ChannelManager_get_our_node_id(int64_t this_arg) {
+       LDKChannelManager 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, ChannelManager_get_our_node_id(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_ChannelManager_accept_inbound_channel(int64_t this_arg, int8_tArray temporary_channel_id, int8_tArray counterparty_node_id, int8_tArray user_channel_id) {
+       LDKChannelManager 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;
+       uint8_t temporary_channel_id_arr[32];
+       CHECK(temporary_channel_id->arr_len == 32);
+       memcpy(temporary_channel_id_arr, temporary_channel_id->elems, 32); FREE(temporary_channel_id);
+       uint8_t (*temporary_channel_id_ref)[32] = &temporary_channel_id_arr;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       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);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_accept_inbound_channel(&this_arg_conv, temporary_channel_id_ref, counterparty_node_id_ref, user_channel_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_accept_inbound_channel_from_trusted_peer_0conf(int64_t this_arg, int8_tArray temporary_channel_id, int8_tArray counterparty_node_id, int8_tArray user_channel_id) {
+       LDKChannelManager 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;
+       uint8_t temporary_channel_id_arr[32];
+       CHECK(temporary_channel_id->arr_len == 32);
+       memcpy(temporary_channel_id_arr, temporary_channel_id->elems, 32); FREE(temporary_channel_id);
+       uint8_t (*temporary_channel_id_ref)[32] = &temporary_channel_id_arr;
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       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);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_accept_inbound_channel_from_trusted_peer_0conf(&this_arg_conv, temporary_channel_id_ref, counterparty_node_id_ref, user_channel_id_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_pay_for_offer(int64_t this_arg, int64_t offer, int64_t quantity, int64_t amount_msats, int64_t payer_note, int8_tArray payment_id, int64_t retry_strategy, int64_t max_total_routing_fee_msat) {
+       LDKChannelManager 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;
+       LDKOffer offer_conv;
+       offer_conv.inner = untag_ptr(offer);
+       offer_conv.is_owned = ptr_is_owned(offer);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(offer_conv);
+       offer_conv.is_owned = false;
+       void* quantity_ptr = untag_ptr(quantity);
+       CHECK_ACCESS(quantity_ptr);
+       LDKCOption_u64Z quantity_conv = *(LDKCOption_u64Z*)(quantity_ptr);
+       quantity_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(quantity));
+       void* amount_msats_ptr = untag_ptr(amount_msats);
+       CHECK_ACCESS(amount_msats_ptr);
+       LDKCOption_u64Z amount_msats_conv = *(LDKCOption_u64Z*)(amount_msats_ptr);
+       amount_msats_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(amount_msats));
+       void* payer_note_ptr = untag_ptr(payer_note);
+       CHECK_ACCESS(payer_note_ptr);
+       LDKCOption_StrZ payer_note_conv = *(LDKCOption_StrZ*)(payer_note_ptr);
+       payer_note_conv = COption_StrZ_clone((LDKCOption_StrZ*)untag_ptr(payer_note));
+       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));
+       void* max_total_routing_fee_msat_ptr = untag_ptr(max_total_routing_fee_msat);
+       CHECK_ACCESS(max_total_routing_fee_msat_ptr);
+       LDKCOption_u64Z max_total_routing_fee_msat_conv = *(LDKCOption_u64Z*)(max_total_routing_fee_msat_ptr);
+       max_total_routing_fee_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(max_total_routing_fee_msat));
+       LDKCResult_NoneBolt12SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt12SemanticErrorZ), "LDKCResult_NoneBolt12SemanticErrorZ");
+       *ret_conv = ChannelManager_pay_for_offer(&this_arg_conv, &offer_conv, quantity_conv, amount_msats_conv, payer_note_conv, payment_id_ref, retry_strategy_conv, max_total_routing_fee_msat_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_request_refund_payment(int64_t this_arg, int64_t refund) {
+       LDKChannelManager 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;
+       LDKRefund refund_conv;
+       refund_conv.inner = untag_ptr(refund);
+       refund_conv.is_owned = ptr_is_owned(refund);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(refund_conv);
+       refund_conv.is_owned = false;
+       LDKCResult_NoneBolt12SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt12SemanticErrorZ), "LDKCResult_NoneBolt12SemanticErrorZ");
+       *ret_conv = ChannelManager_request_refund_payment(&this_arg_conv, &refund_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_create_inbound_payment(int64_t this_arg, int64_t min_value_msat, int32_t invoice_expiry_delta_secs, int64_t min_final_cltv_expiry_delta) {
+       LDKChannelManager 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;
+       void* min_value_msat_ptr = untag_ptr(min_value_msat);
+       CHECK_ACCESS(min_value_msat_ptr);
+       LDKCOption_u64Z min_value_msat_conv = *(LDKCOption_u64Z*)(min_value_msat_ptr);
+       min_value_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(min_value_msat));
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ");
+       *ret_conv = ChannelManager_create_inbound_payment(&this_arg_conv, min_value_msat_conv, invoice_expiry_delta_secs, min_final_cltv_expiry_delta_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_create_inbound_payment_for_hash(int64_t this_arg, int8_tArray payment_hash, int64_t min_value_msat, int32_t invoice_expiry_delta_secs, int64_t min_final_cltv_expiry) {
+       LDKChannelManager 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;
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       void* min_value_msat_ptr = untag_ptr(min_value_msat);
+       CHECK_ACCESS(min_value_msat_ptr);
+       LDKCOption_u64Z min_value_msat_conv = *(LDKCOption_u64Z*)(min_value_msat_ptr);
+       min_value_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(min_value_msat));
+       void* min_final_cltv_expiry_ptr = untag_ptr(min_final_cltv_expiry);
+       CHECK_ACCESS(min_final_cltv_expiry_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_ptr);
+       min_final_cltv_expiry_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry));
+       LDKCResult_ThirtyTwoBytesNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesNoneZ), "LDKCResult_ThirtyTwoBytesNoneZ");
+       *ret_conv = ChannelManager_create_inbound_payment_for_hash(&this_arg_conv, payment_hash_ref, min_value_msat_conv, invoice_expiry_delta_secs, min_final_cltv_expiry_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_get_payment_preimage(int64_t this_arg, int8_tArray payment_hash, int8_tArray payment_secret) {
+       LDKChannelManager 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;
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKThirtyTwoBytes payment_secret_ref;
+       CHECK(payment_secret->arr_len == 32);
+       memcpy(payment_secret_ref.data, payment_secret->elems, 32); FREE(payment_secret);
+       LDKCResult_ThirtyTwoBytesAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesAPIErrorZ), "LDKCResult_ThirtyTwoBytesAPIErrorZ");
+       *ret_conv = ChannelManager_get_payment_preimage(&this_arg_conv, payment_hash_ref, payment_secret_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelManager_get_phantom_scid(int64_t this_arg) {
+       LDKChannelManager 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 = ChannelManager_get_phantom_scid(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelManager_get_phantom_route_hints(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKPhantomRouteHints ret_var = ChannelManager_get_phantom_route_hints(&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_ChannelManager_get_intercept_scid(int64_t this_arg) {
+       LDKChannelManager 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 = ChannelManager_get_intercept_scid(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelManager_compute_inflight_htlcs(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKInFlightHtlcs ret_var = ChannelManager_compute_inflight_htlcs(&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_ChannelManager_as_MessageSendEventsProvider(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKMessageSendEventsProvider* ret_ret = MALLOC(sizeof(LDKMessageSendEventsProvider), "LDKMessageSendEventsProvider");
+       *ret_ret = ChannelManager_as_MessageSendEventsProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ChannelManager_as_EventsProvider(int64_t this_arg) {
+       LDKChannelManager 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 = ChannelManager_as_EventsProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ChannelManager_as_Listen(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKListen* ret_ret = MALLOC(sizeof(LDKListen), "LDKListen");
+       *ret_ret = ChannelManager_as_Listen(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ChannelManager_as_Confirm(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKConfirm* ret_ret = MALLOC(sizeof(LDKConfirm), "LDKConfirm");
+       *ret_ret = ChannelManager_as_Confirm(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ChannelManager_get_event_or_persistence_needed_future(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKFuture ret_var = ChannelManager_get_event_or_persistence_needed_future(&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;
+}
+
+jboolean  CS_LDK_ChannelManager_get_and_clear_needs_persistence(int64_t this_arg) {
+       LDKChannelManager 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 = ChannelManager_get_and_clear_needs_persistence(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelManager_current_best_block(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKBestBlock ret_var = ChannelManager_current_best_block(&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_ChannelManager_node_features(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKNodeFeatures ret_var = ChannelManager_node_features(&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_ChannelManager_channel_features(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKChannelFeatures ret_var = ChannelManager_channel_features(&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_ChannelManager_channel_type_features(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKChannelTypeFeatures ret_var = ChannelManager_channel_type_features(&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_ChannelManager_init_features(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKInitFeatures ret_var = ChannelManager_init_features(&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_ChannelManager_as_ChannelMessageHandler(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKChannelMessageHandler* ret_ret = MALLOC(sizeof(LDKChannelMessageHandler), "LDKChannelMessageHandler");
+       *ret_ret = ChannelManager_as_ChannelMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ChannelManager_as_OffersMessageHandler(int64_t this_arg) {
+       LDKChannelManager 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;
+       LDKOffersMessageHandler* ret_ret = MALLOC(sizeof(LDKOffersMessageHandler), "LDKOffersMessageHandler");
+       *ret_ret = ChannelManager_as_OffersMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_provided_init_features(int64_t config) {
+       LDKUserConfig config_conv;
+       config_conv.inner = untag_ptr(config);
+       config_conv.is_owned = ptr_is_owned(config);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(config_conv);
+       config_conv.is_owned = false;
+       LDKInitFeatures ret_var = provided_init_features(&config_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_CounterpartyForwardingInfo_write(int64_t obj) {
+       LDKCounterpartyForwardingInfo 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 = CounterpartyForwardingInfo_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_CounterpartyForwardingInfo_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_CounterpartyForwardingInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ), "LDKCResult_CounterpartyForwardingInfoDecodeErrorZ");
+       *ret_conv = CounterpartyForwardingInfo_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelCounterparty_write(int64_t obj) {
+       LDKChannelCounterparty 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 = ChannelCounterparty_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_ChannelCounterparty_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelCounterpartyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelCounterpartyDecodeErrorZ), "LDKCResult_ChannelCounterpartyDecodeErrorZ");
+       *ret_conv = ChannelCounterparty_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelDetails_write(int64_t obj) {
+       LDKChannelDetails 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 = ChannelDetails_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_ChannelDetails_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelDetailsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDetailsDecodeErrorZ), "LDKCResult_ChannelDetailsDecodeErrorZ");
+       *ret_conv = ChannelDetails_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_PhantomRouteHints_write(int64_t obj) {
+       LDKPhantomRouteHints 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 = PhantomRouteHints_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_PhantomRouteHints_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PhantomRouteHintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PhantomRouteHintsDecodeErrorZ), "LDKCResult_PhantomRouteHintsDecodeErrorZ");
+       *ret_conv = PhantomRouteHints_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);
+       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 = ChannelManager_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;
+}
+
+int8_tArray  CS_LDK_ChannelShutdownState_write(int64_t obj) {
+       LDKChannelShutdownState* obj_conv = (LDKChannelShutdownState*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = ChannelShutdownState_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_ChannelShutdownState_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelShutdownStateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelShutdownStateDecodeErrorZ), "LDKCResult_ChannelShutdownStateDecodeErrorZ");
+       *ret_conv = ChannelShutdownState_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelManagerReadArgs_free(int64_t this_obj) {
+       LDKChannelManagerReadArgs 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);
+       ChannelManagerReadArgs_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_entropy_source(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(ChannelManagerReadArgs_get_entropy_source(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_ChannelManagerReadArgs_set_entropy_source(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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);
+       LDKEntropySource val_conv = *(LDKEntropySource*)(val_ptr);
+       if (val_conv.free == LDKEntropySource_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKEntropySource_JCalls_cloned(&val_conv);
+       }
+       ChannelManagerReadArgs_set_entropy_source(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_node_signer(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(ChannelManagerReadArgs_get_node_signer(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_ChannelManagerReadArgs_set_node_signer(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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);
+       LDKNodeSigner val_conv = *(LDKNodeSigner*)(val_ptr);
+       if (val_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&val_conv);
+       }
+       ChannelManagerReadArgs_set_node_signer(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_signer_provider(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(ChannelManagerReadArgs_get_signer_provider(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_ChannelManagerReadArgs_set_signer_provider(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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);
+       LDKSignerProvider val_conv = *(LDKSignerProvider*)(val_ptr);
+       if (val_conv.free == LDKSignerProvider_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKSignerProvider_JCalls_cloned(&val_conv);
+       }
+       ChannelManagerReadArgs_set_signer_provider(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_fee_estimator(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(ChannelManagerReadArgs_get_fee_estimator(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_ChannelManagerReadArgs_set_fee_estimator(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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);
+       LDKFeeEstimator val_conv = *(LDKFeeEstimator*)(val_ptr);
+       if (val_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_cloned(&val_conv);
+       }
+       ChannelManagerReadArgs_set_fee_estimator(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_chain_monitor(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(ChannelManagerReadArgs_get_chain_monitor(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_ChannelManagerReadArgs_set_chain_monitor(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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);
+       LDKWatch val_conv = *(LDKWatch*)(val_ptr);
+       if (val_conv.free == LDKWatch_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKWatch_JCalls_cloned(&val_conv);
+       }
+       ChannelManagerReadArgs_set_chain_monitor(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_tx_broadcaster(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(ChannelManagerReadArgs_get_tx_broadcaster(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_ChannelManagerReadArgs_set_tx_broadcaster(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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);
+       LDKBroadcasterInterface val_conv = *(LDKBroadcasterInterface*)(val_ptr);
+       if (val_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&val_conv);
+       }
+       ChannelManagerReadArgs_set_tx_broadcaster(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_router(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(ChannelManagerReadArgs_get_router(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_ChannelManagerReadArgs_set_router(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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);
+       LDKRouter val_conv = *(LDKRouter*)(val_ptr);
+       if (val_conv.free == LDKRouter_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKRouter_JCalls_cloned(&val_conv);
+       }
+       ChannelManagerReadArgs_set_router(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_logger(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(ChannelManagerReadArgs_get_logger(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_ChannelManagerReadArgs_set_logger(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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);
+       LDKLogger val_conv = *(LDKLogger*)(val_ptr);
+       if (val_conv.free == LDKLogger_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKLogger_JCalls_cloned(&val_conv);
+       }
+       ChannelManagerReadArgs_set_logger(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_get_default_config(int64_t this_ptr) {
+       LDKChannelManagerReadArgs 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;
+       LDKUserConfig ret_var = ChannelManagerReadArgs_get_default_config(&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_ChannelManagerReadArgs_set_default_config(int64_t this_ptr, int64_t val) {
+       LDKChannelManagerReadArgs 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;
+       LDKUserConfig 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 = UserConfig_clone(&val_conv);
+       ChannelManagerReadArgs_set_default_config(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelManagerReadArgs_new(int64_t entropy_source, int64_t node_signer, int64_t signer_provider, int64_t fee_estimator, int64_t chain_monitor, int64_t tx_broadcaster, int64_t router, int64_t logger, int64_t default_config, int64_tArray channel_monitors) {
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_conv);
+       }
+       void* signer_provider_ptr = untag_ptr(signer_provider);
+       CHECK_ACCESS(signer_provider_ptr);
+       LDKSignerProvider signer_provider_conv = *(LDKSignerProvider*)(signer_provider_ptr);
+       if (signer_provider_conv.free == LDKSignerProvider_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKSignerProvider_JCalls_cloned(&signer_provider_conv);
+       }
+       void* fee_estimator_ptr = untag_ptr(fee_estimator);
+       CHECK_ACCESS(fee_estimator_ptr);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(fee_estimator_ptr);
+       if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKFeeEstimator_JCalls_cloned(&fee_estimator_conv);
+       }
+       void* chain_monitor_ptr = untag_ptr(chain_monitor);
+       CHECK_ACCESS(chain_monitor_ptr);
+       LDKWatch chain_monitor_conv = *(LDKWatch*)(chain_monitor_ptr);
+       if (chain_monitor_conv.free == LDKWatch_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKWatch_JCalls_cloned(&chain_monitor_conv);
+       }
+       void* tx_broadcaster_ptr = untag_ptr(tx_broadcaster);
+       CHECK_ACCESS(tx_broadcaster_ptr);
+       LDKBroadcasterInterface tx_broadcaster_conv = *(LDKBroadcasterInterface*)(tx_broadcaster_ptr);
+       if (tx_broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&tx_broadcaster_conv);
+       }
+       void* router_ptr = untag_ptr(router);
+       CHECK_ACCESS(router_ptr);
+       LDKRouter router_conv = *(LDKRouter*)(router_ptr);
+       if (router_conv.free == LDKRouter_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKRouter_JCalls_cloned(&router_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);
+       }
+       LDKUserConfig default_config_conv;
+       default_config_conv.inner = untag_ptr(default_config);
+       default_config_conv.is_owned = ptr_is_owned(default_config);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(default_config_conv);
+       default_config_conv = UserConfig_clone(&default_config_conv);
+       LDKCVec_ChannelMonitorZ channel_monitors_constr;
+       channel_monitors_constr.datalen = channel_monitors->arr_len;
+       if (channel_monitors_constr.datalen > 0)
+               channel_monitors_constr.data = MALLOC(channel_monitors_constr.datalen * sizeof(LDKChannelMonitor), "LDKCVec_ChannelMonitorZ Elements");
+       else
+               channel_monitors_constr.data = NULL;
+       int64_t* channel_monitors_vals = channel_monitors->elems;
+       for (size_t q = 0; q < channel_monitors_constr.datalen; q++) {
+               int64_t channel_monitors_conv_16 = channel_monitors_vals[q];
+               LDKChannelMonitor channel_monitors_conv_16_conv;
+               channel_monitors_conv_16_conv.inner = untag_ptr(channel_monitors_conv_16);
+               channel_monitors_conv_16_conv.is_owned = ptr_is_owned(channel_monitors_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_monitors_conv_16_conv);
+               channel_monitors_conv_16_conv.is_owned = false;
+               channel_monitors_constr.data[q] = channel_monitors_conv_16_conv;
+       }
+       FREE(channel_monitors);
+       LDKChannelManagerReadArgs ret_var = ChannelManagerReadArgs_new(entropy_source_conv, node_signer_conv, signer_provider_conv, fee_estimator_conv, chain_monitor_conv, tx_broadcaster_conv, router_conv, logger_conv, default_config_conv, channel_monitors_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);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_read(int8_tArray ser, int64_t arg) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKChannelManagerReadArgs arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       // WARNING: we need a move here but no clone is available for LDKChannelManagerReadArgs
+       
+       LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ), "LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ");
+       *ret_conv = C2Tuple_ThirtyTwoBytesChannelManagerZ_read(ser_ref, arg_conv);
+       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);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       ExpandedKey_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ExpandedKey_new(int8_tArray key_material) {
+       uint8_t key_material_arr[32];
+       CHECK(key_material->arr_len == 32);
+       memcpy(key_material_arr, key_material->elems, 32); FREE(key_material);
+       uint8_t (*key_material_ref)[32] = &key_material_arr;
+       LDKExpandedKey ret_var = ExpandedKey_new(key_material_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_create(int64_t keys, int64_t min_value_msat, int32_t invoice_expiry_delta_secs, int64_t entropy_source, int64_t current_time, int64_t min_final_cltv_expiry_delta) {
+       LDKExpandedKey keys_conv;
+       keys_conv.inner = untag_ptr(keys);
+       keys_conv.is_owned = ptr_is_owned(keys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(keys_conv);
+       keys_conv.is_owned = false;
+       void* min_value_msat_ptr = untag_ptr(min_value_msat);
+       CHECK_ACCESS(min_value_msat_ptr);
+       LDKCOption_u64Z min_value_msat_conv = *(LDKCOption_u64Z*)(min_value_msat_ptr);
+       min_value_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(min_value_msat));
+       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;
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ), "LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ");
+       *ret_conv = create(&keys_conv, min_value_msat_conv, invoice_expiry_delta_secs, entropy_source_conv, current_time, min_final_cltv_expiry_delta_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_create_from_hash(int64_t keys, int64_t min_value_msat, int8_tArray payment_hash, int32_t invoice_expiry_delta_secs, int64_t current_time, int64_t min_final_cltv_expiry_delta) {
+       LDKExpandedKey keys_conv;
+       keys_conv.inner = untag_ptr(keys);
+       keys_conv.is_owned = ptr_is_owned(keys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(keys_conv);
+       keys_conv.is_owned = false;
+       void* min_value_msat_ptr = untag_ptr(min_value_msat);
+       CHECK_ACCESS(min_value_msat_ptr);
+       LDKCOption_u64Z min_value_msat_conv = *(LDKCOption_u64Z*)(min_value_msat_ptr);
+       min_value_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(min_value_msat));
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_ThirtyTwoBytesNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesNoneZ), "LDKCResult_ThirtyTwoBytesNoneZ");
+       *ret_conv = create_from_hash(&keys_conv, min_value_msat_conv, payment_hash_ref, invoice_expiry_delta_secs, current_time, min_final_cltv_expiry_delta_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_DecodeError_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);
+       LDKDecodeError this_ptr_conv = *(LDKDecodeError*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       DecodeError_free(this_ptr_conv);
+}
+
+static inline uint64_t DecodeError_clone_ptr(LDKDecodeError *NONNULL_PTR arg) {
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_DecodeError_clone_ptr(int64_t arg) {
+       LDKDecodeError* arg_conv = (LDKDecodeError*)untag_ptr(arg);
+       int64_t ret_conv = DecodeError_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_DecodeError_clone(int64_t orig) {
+       LDKDecodeError* orig_conv = (LDKDecodeError*)untag_ptr(orig);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DecodeError_unknown_version() {
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_unknown_version();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DecodeError_unknown_required_feature() {
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_unknown_required_feature();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DecodeError_invalid_value() {
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_invalid_value();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DecodeError_short_read() {
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_short_read();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DecodeError_bad_length_descriptor() {
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_bad_length_descriptor();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DecodeError_io(int32_t a) {
+       LDKIOError a_conv = LDKIOError_from_cs(a);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_io(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DecodeError_unsupported_compression() {
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = DecodeError_unsupported_compression();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+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);
+       jboolean ret_conv = DecodeError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Init_free(int64_t this_obj) {
+       LDKInit 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);
+       Init_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_Init_get_features(int64_t this_ptr) {
+       LDKInit 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;
+       LDKInitFeatures ret_var = Init_get_features(&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_Init_set_features(int64_t this_ptr, int64_t val) {
+       LDKInit 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;
+       LDKInitFeatures 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 = InitFeatures_clone(&val_conv);
+       Init_set_features(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Init_get_networks(int64_t this_ptr) {
+       LDKInit 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_ThirtyTwoBytesZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_ThirtyTwoBytesZZ), "LDKCOption_CVec_ThirtyTwoBytesZZ");
+       *ret_copy = Init_get_networks(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_Init_set_networks(int64_t this_ptr, int64_t val) {
+       LDKInit 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_ThirtyTwoBytesZZ val_conv = *(LDKCOption_CVec_ThirtyTwoBytesZZ*)(val_ptr);
+       val_conv = COption_CVec_ThirtyTwoBytesZZ_clone((LDKCOption_CVec_ThirtyTwoBytesZZ*)untag_ptr(val));
+       Init_set_networks(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Init_get_remote_network_address(int64_t this_ptr) {
+       LDKInit 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_SocketAddressZ *ret_copy = MALLOC(sizeof(LDKCOption_SocketAddressZ), "LDKCOption_SocketAddressZ");
+       *ret_copy = Init_get_remote_network_address(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_Init_set_remote_network_address(int64_t this_ptr, int64_t val) {
+       LDKInit 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_SocketAddressZ val_conv = *(LDKCOption_SocketAddressZ*)(val_ptr);
+       val_conv = COption_SocketAddressZ_clone((LDKCOption_SocketAddressZ*)untag_ptr(val));
+       Init_set_remote_network_address(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Init_new(int64_t features_arg, int64_t networks_arg, int64_t remote_network_address_arg) {
+       LDKInitFeatures features_arg_conv;
+       features_arg_conv.inner = untag_ptr(features_arg);
+       features_arg_conv.is_owned = ptr_is_owned(features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_arg_conv);
+       features_arg_conv = InitFeatures_clone(&features_arg_conv);
+       void* networks_arg_ptr = untag_ptr(networks_arg);
+       CHECK_ACCESS(networks_arg_ptr);
+       LDKCOption_CVec_ThirtyTwoBytesZZ networks_arg_conv = *(LDKCOption_CVec_ThirtyTwoBytesZZ*)(networks_arg_ptr);
+       networks_arg_conv = COption_CVec_ThirtyTwoBytesZZ_clone((LDKCOption_CVec_ThirtyTwoBytesZZ*)untag_ptr(networks_arg));
+       void* remote_network_address_arg_ptr = untag_ptr(remote_network_address_arg);
+       CHECK_ACCESS(remote_network_address_arg_ptr);
+       LDKCOption_SocketAddressZ remote_network_address_arg_conv = *(LDKCOption_SocketAddressZ*)(remote_network_address_arg_ptr);
+       LDKInit ret_var = Init_new(features_arg_conv, networks_arg_conv, remote_network_address_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 Init_clone_ptr(LDKInit *NONNULL_PTR arg) {
+       LDKInit ret_var = Init_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_Init_clone_ptr(int64_t arg) {
+       LDKInit 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 = Init_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Init_clone(int64_t orig) {
+       LDKInit 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;
+       LDKInit ret_var = Init_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_Init_eq(int64_t a, int64_t b) {
+       LDKInit 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;
+       LDKInit 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 = Init_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ErrorMessage_free(int64_t this_obj) {
+       LDKErrorMessage 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);
+       ErrorMessage_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ErrorMessage_get_channel_id(int64_t this_ptr) {
+       LDKErrorMessage 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, *ErrorMessage_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ErrorMessage_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKErrorMessage 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);
+       ErrorMessage_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+jstring  CS_LDK_ErrorMessage_get_data(int64_t this_ptr) {
+       LDKErrorMessage 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 = ErrorMessage_get_data(&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_ErrorMessage_set_data(int64_t this_ptr, jstring val) {
+       LDKErrorMessage 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);
+       ErrorMessage_set_data(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ErrorMessage_new(int8_tArray channel_id_arg, jstring data_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);
+       LDKStr data_arg_conv = str_ref_to_owned_c(data_arg);
+       LDKErrorMessage ret_var = ErrorMessage_new(channel_id_arg_ref, data_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 ErrorMessage_clone_ptr(LDKErrorMessage *NONNULL_PTR arg) {
+       LDKErrorMessage ret_var = ErrorMessage_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_ErrorMessage_clone_ptr(int64_t arg) {
+       LDKErrorMessage 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 = ErrorMessage_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ErrorMessage_clone(int64_t orig) {
+       LDKErrorMessage 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;
+       LDKErrorMessage ret_var = ErrorMessage_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_ErrorMessage_eq(int64_t a, int64_t b) {
+       LDKErrorMessage 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;
+       LDKErrorMessage 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 = ErrorMessage_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_WarningMessage_free(int64_t this_obj) {
+       LDKWarningMessage 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);
+       WarningMessage_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_WarningMessage_get_channel_id(int64_t this_ptr) {
+       LDKWarningMessage 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, *WarningMessage_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_WarningMessage_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKWarningMessage 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);
+       WarningMessage_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+jstring  CS_LDK_WarningMessage_get_data(int64_t this_ptr) {
+       LDKWarningMessage 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 = WarningMessage_get_data(&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_WarningMessage_set_data(int64_t this_ptr, jstring val) {
+       LDKWarningMessage 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);
+       WarningMessage_set_data(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_WarningMessage_new(int8_tArray channel_id_arg, jstring data_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);
+       LDKStr data_arg_conv = str_ref_to_owned_c(data_arg);
+       LDKWarningMessage ret_var = WarningMessage_new(channel_id_arg_ref, data_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 WarningMessage_clone_ptr(LDKWarningMessage *NONNULL_PTR arg) {
+       LDKWarningMessage ret_var = WarningMessage_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_WarningMessage_clone_ptr(int64_t arg) {
+       LDKWarningMessage 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 = WarningMessage_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_WarningMessage_clone(int64_t orig) {
+       LDKWarningMessage 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;
+       LDKWarningMessage ret_var = WarningMessage_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_WarningMessage_eq(int64_t a, int64_t b) {
+       LDKWarningMessage 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;
+       LDKWarningMessage 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 = WarningMessage_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Ping_free(int64_t this_obj) {
+       LDKPing 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);
+       Ping_free(this_obj_conv);
+}
+
+int16_t  CS_LDK_Ping_get_ponglen(int64_t this_ptr) {
+       LDKPing 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 = Ping_get_ponglen(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Ping_set_ponglen(int64_t this_ptr, int16_t val) {
+       LDKPing 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;
+       Ping_set_ponglen(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_Ping_get_byteslen(int64_t this_ptr) {
+       LDKPing 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 = Ping_get_byteslen(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Ping_set_byteslen(int64_t this_ptr, int16_t val) {
+       LDKPing 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;
+       Ping_set_byteslen(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_Ping_new(int16_t ponglen_arg, int16_t byteslen_arg) {
+       LDKPing ret_var = Ping_new(ponglen_arg, byteslen_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 Ping_clone_ptr(LDKPing *NONNULL_PTR arg) {
+       LDKPing ret_var = Ping_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_Ping_clone_ptr(int64_t arg) {
+       LDKPing 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 = Ping_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Ping_clone(int64_t orig) {
+       LDKPing 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;
+       LDKPing ret_var = Ping_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_Ping_eq(int64_t a, int64_t b) {
+       LDKPing 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;
+       LDKPing 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 = Ping_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Pong_free(int64_t this_obj) {
+       LDKPong 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);
+       Pong_free(this_obj_conv);
+}
+
+int16_t  CS_LDK_Pong_get_byteslen(int64_t this_ptr) {
+       LDKPong 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 = Pong_get_byteslen(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Pong_set_byteslen(int64_t this_ptr, int16_t val) {
+       LDKPong 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;
+       Pong_set_byteslen(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_Pong_new(int16_t byteslen_arg) {
+       LDKPong ret_var = Pong_new(byteslen_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 Pong_clone_ptr(LDKPong *NONNULL_PTR arg) {
+       LDKPong ret_var = Pong_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_Pong_clone_ptr(int64_t arg) {
+       LDKPong 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 = Pong_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Pong_clone(int64_t orig) {
+       LDKPong 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;
+       LDKPong ret_var = Pong_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_Pong_eq(int64_t a, int64_t b) {
+       LDKPong 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;
+       LDKPong 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 = Pong_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_free(int64_t this_obj) {
+       LDKOpenChannel 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);
+       OpenChannel_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_OpenChannel_get_chain_hash(int64_t this_ptr) {
+       LDKOpenChannel 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, *OpenChannel_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannel_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannel 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);
+       OpenChannel_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannel_get_temporary_channel_id(int64_t this_ptr) {
+       LDKOpenChannel 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, *OpenChannel_get_temporary_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannel_set_temporary_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannel 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);
+       OpenChannel_set_temporary_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_OpenChannel_get_funding_satoshis(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_funding_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_funding_satoshis(int64_t this_ptr, int64_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_funding_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannel_get_push_msat(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_push_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_push_msat(int64_t this_ptr, int64_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_push_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannel_get_dust_limit_satoshis(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_dust_limit_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_dust_limit_satoshis(int64_t this_ptr, int64_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_dust_limit_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannel_get_max_htlc_value_in_flight_msat(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_max_htlc_value_in_flight_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_max_htlc_value_in_flight_msat(int64_t this_ptr, int64_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_max_htlc_value_in_flight_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannel_get_channel_reserve_satoshis(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_channel_reserve_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_channel_reserve_satoshis(int64_t this_ptr, int64_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_channel_reserve_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannel_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_OpenChannel_get_feerate_per_kw(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_feerate_per_kw(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_feerate_per_kw(int64_t this_ptr, int32_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_feerate_per_kw(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_OpenChannel_get_to_self_delay(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_to_self_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_to_self_delay(int64_t this_ptr, int16_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_to_self_delay(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_OpenChannel_get_max_accepted_htlcs(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_max_accepted_htlcs(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_max_accepted_htlcs(int64_t this_ptr, int16_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_max_accepted_htlcs(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_OpenChannel_get_funding_pubkey(int64_t this_ptr) {
+       LDKOpenChannel 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, OpenChannel_get_funding_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannel_set_funding_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannel 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);
+       OpenChannel_set_funding_pubkey(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannel_get_revocation_basepoint(int64_t this_ptr) {
+       LDKOpenChannel 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, OpenChannel_get_revocation_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannel_set_revocation_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannel 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);
+       OpenChannel_set_revocation_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannel_get_payment_point(int64_t this_ptr) {
+       LDKOpenChannel 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, OpenChannel_get_payment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannel_set_payment_point(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannel 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);
+       OpenChannel_set_payment_point(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannel_get_delayed_payment_basepoint(int64_t this_ptr) {
+       LDKOpenChannel 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, OpenChannel_get_delayed_payment_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannel_set_delayed_payment_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannel 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);
+       OpenChannel_set_delayed_payment_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannel_get_htlc_basepoint(int64_t this_ptr) {
+       LDKOpenChannel 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, OpenChannel_get_htlc_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannel_set_htlc_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannel 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);
+       OpenChannel_set_htlc_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannel_get_first_per_commitment_point(int64_t this_ptr) {
+       LDKOpenChannel 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, OpenChannel_get_first_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannel_set_first_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannel 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);
+       OpenChannel_set_first_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int8_t  CS_LDK_OpenChannel_get_channel_flags(int64_t this_ptr) {
+       LDKOpenChannel 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 = OpenChannel_get_channel_flags(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannel_set_channel_flags(int64_t this_ptr, int8_t val) {
+       LDKOpenChannel 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;
+       OpenChannel_set_channel_flags(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannel_get_shutdown_scriptpubkey(int64_t this_ptr) {
+       LDKOpenChannel 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_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = OpenChannel_get_shutdown_scriptpubkey(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_OpenChannel_set_shutdown_scriptpubkey(int64_t this_ptr, int64_t val) {
+       LDKOpenChannel 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_u8ZZ val_conv = *(LDKCOption_CVec_u8ZZ*)(val_ptr);
+       val_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(val));
+       OpenChannel_set_shutdown_scriptpubkey(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_OpenChannel_get_channel_type(int64_t this_ptr) {
+       LDKOpenChannel 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;
+       LDKChannelTypeFeatures ret_var = OpenChannel_get_channel_type(&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_OpenChannel_set_channel_type(int64_t this_ptr, int64_t val) {
+       LDKOpenChannel 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;
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_clone(&val_conv);
+       OpenChannel_set_channel_type(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_OpenChannel_new(int8_tArray chain_hash_arg, int8_tArray temporary_channel_id_arg, int64_t funding_satoshis_arg, int64_t push_msat_arg, int64_t dust_limit_satoshis_arg, int64_t max_htlc_value_in_flight_msat_arg, int64_t channel_reserve_satoshis_arg, int64_t htlc_minimum_msat_arg, int32_t feerate_per_kw_arg, int16_t to_self_delay_arg, int16_t max_accepted_htlcs_arg, 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, int8_tArray first_per_commitment_point_arg, int8_t channel_flags_arg, int64_t shutdown_scriptpubkey_arg, int64_t channel_type_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);
+       LDKThirtyTwoBytes temporary_channel_id_arg_ref;
+       CHECK(temporary_channel_id_arg->arr_len == 32);
+       memcpy(temporary_channel_id_arg_ref.data, temporary_channel_id_arg->elems, 32); FREE(temporary_channel_id_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);
+       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);
+       LDKPublicKey first_per_commitment_point_arg_ref;
+       CHECK(first_per_commitment_point_arg->arr_len == 33);
+       memcpy(first_per_commitment_point_arg_ref.compressed_form, first_per_commitment_point_arg->elems, 33); FREE(first_per_commitment_point_arg);
+       void* shutdown_scriptpubkey_arg_ptr = untag_ptr(shutdown_scriptpubkey_arg);
+       CHECK_ACCESS(shutdown_scriptpubkey_arg_ptr);
+       LDKCOption_CVec_u8ZZ shutdown_scriptpubkey_arg_conv = *(LDKCOption_CVec_u8ZZ*)(shutdown_scriptpubkey_arg_ptr);
+       shutdown_scriptpubkey_arg_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(shutdown_scriptpubkey_arg));
+       LDKChannelTypeFeatures channel_type_arg_conv;
+       channel_type_arg_conv.inner = untag_ptr(channel_type_arg);
+       channel_type_arg_conv.is_owned = ptr_is_owned(channel_type_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_arg_conv);
+       channel_type_arg_conv = ChannelTypeFeatures_clone(&channel_type_arg_conv);
+       LDKOpenChannel ret_var = OpenChannel_new(chain_hash_arg_ref, temporary_channel_id_arg_ref, funding_satoshis_arg, push_msat_arg, dust_limit_satoshis_arg, max_htlc_value_in_flight_msat_arg, channel_reserve_satoshis_arg, htlc_minimum_msat_arg, feerate_per_kw_arg, to_self_delay_arg, max_accepted_htlcs_arg, funding_pubkey_arg_ref, revocation_basepoint_arg_ref, payment_point_arg_ref, delayed_payment_basepoint_arg_ref, htlc_basepoint_arg_ref, first_per_commitment_point_arg_ref, channel_flags_arg, shutdown_scriptpubkey_arg_conv, channel_type_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 OpenChannel_clone_ptr(LDKOpenChannel *NONNULL_PTR arg) {
+       LDKOpenChannel ret_var = OpenChannel_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_OpenChannel_clone_ptr(int64_t arg) {
+       LDKOpenChannel 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 = OpenChannel_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OpenChannel_clone(int64_t orig) {
+       LDKOpenChannel 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;
+       LDKOpenChannel ret_var = OpenChannel_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_OpenChannel_eq(int64_t a, int64_t b) {
+       LDKOpenChannel 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;
+       LDKOpenChannel 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 = OpenChannel_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_free(int64_t this_obj) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_chain_hash(int64_t this_ptr) {
+       LDKOpenChannelV2 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, *OpenChannelV2_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_temporary_channel_id(int64_t this_ptr) {
+       LDKOpenChannelV2 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, *OpenChannelV2_get_temporary_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_temporary_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_temporary_channel_id(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_OpenChannelV2_get_funding_feerate_sat_per_1000_weight(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_funding_feerate_sat_per_1000_weight(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_funding_feerate_sat_per_1000_weight(int64_t this_ptr, int32_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_funding_feerate_sat_per_1000_weight(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_OpenChannelV2_get_commitment_feerate_sat_per_1000_weight(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_commitment_feerate_sat_per_1000_weight(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_commitment_feerate_sat_per_1000_weight(int64_t this_ptr, int32_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_commitment_feerate_sat_per_1000_weight(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannelV2_get_funding_satoshis(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_funding_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_funding_satoshis(int64_t this_ptr, int64_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_funding_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannelV2_get_dust_limit_satoshis(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_dust_limit_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_dust_limit_satoshis(int64_t this_ptr, int64_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_dust_limit_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannelV2_get_max_htlc_value_in_flight_msat(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_max_htlc_value_in_flight_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_max_htlc_value_in_flight_msat(int64_t this_ptr, int64_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_max_htlc_value_in_flight_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannelV2_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_OpenChannelV2_get_to_self_delay(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_to_self_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_to_self_delay(int64_t this_ptr, int16_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_to_self_delay(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_OpenChannelV2_get_max_accepted_htlcs(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_max_accepted_htlcs(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_max_accepted_htlcs(int64_t this_ptr, int16_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_max_accepted_htlcs(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_OpenChannelV2_get_locktime(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_locktime(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_locktime(int64_t this_ptr, int32_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_locktime(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_funding_pubkey(int64_t this_ptr) {
+       LDKOpenChannelV2 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, OpenChannelV2_get_funding_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_funding_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_funding_pubkey(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_revocation_basepoint(int64_t this_ptr) {
+       LDKOpenChannelV2 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, OpenChannelV2_get_revocation_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_revocation_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_revocation_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_payment_basepoint(int64_t this_ptr) {
+       LDKOpenChannelV2 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, OpenChannelV2_get_payment_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_payment_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_payment_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_delayed_payment_basepoint(int64_t this_ptr) {
+       LDKOpenChannelV2 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, OpenChannelV2_get_delayed_payment_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_delayed_payment_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_delayed_payment_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_htlc_basepoint(int64_t this_ptr) {
+       LDKOpenChannelV2 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, OpenChannelV2_get_htlc_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_htlc_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_htlc_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_first_per_commitment_point(int64_t this_ptr) {
+       LDKOpenChannelV2 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, OpenChannelV2_get_first_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_first_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_first_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_get_second_per_commitment_point(int64_t this_ptr) {
+       LDKOpenChannelV2 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, OpenChannelV2_get_second_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OpenChannelV2_set_second_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKOpenChannelV2 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);
+       OpenChannelV2_set_second_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int8_t  CS_LDK_OpenChannelV2_get_channel_flags(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = OpenChannelV2_get_channel_flags(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_channel_flags(int64_t this_ptr, int8_t val) {
+       LDKOpenChannelV2 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;
+       OpenChannelV2_set_channel_flags(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OpenChannelV2_get_shutdown_scriptpubkey(int64_t this_ptr) {
+       LDKOpenChannelV2 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_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = OpenChannelV2_get_shutdown_scriptpubkey(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_OpenChannelV2_set_shutdown_scriptpubkey(int64_t this_ptr, int64_t val) {
+       LDKOpenChannelV2 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_u8ZZ val_conv = *(LDKCOption_CVec_u8ZZ*)(val_ptr);
+       val_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(val));
+       OpenChannelV2_set_shutdown_scriptpubkey(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_OpenChannelV2_get_channel_type(int64_t this_ptr) {
+       LDKOpenChannelV2 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;
+       LDKChannelTypeFeatures ret_var = OpenChannelV2_get_channel_type(&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_OpenChannelV2_set_channel_type(int64_t this_ptr, int64_t val) {
+       LDKOpenChannelV2 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;
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_clone(&val_conv);
+       OpenChannelV2_set_channel_type(&this_ptr_conv, val_conv);
+}
+
+int32_t  CS_LDK_OpenChannelV2_get_require_confirmed_inputs(int64_t this_ptr) {
+       LDKOpenChannelV2 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 = LDKCOption_NoneZ_to_cs(OpenChannelV2_get_require_confirmed_inputs(&this_ptr_conv));
+       return ret_conv;
+}
+
+void  CS_LDK_OpenChannelV2_set_require_confirmed_inputs(int64_t this_ptr, int32_t val) {
+       LDKOpenChannelV2 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_NoneZ val_conv = LDKCOption_NoneZ_from_cs(val);
+       OpenChannelV2_set_require_confirmed_inputs(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_OpenChannelV2_new(int8_tArray chain_hash_arg, int8_tArray temporary_channel_id_arg, int32_t funding_feerate_sat_per_1000_weight_arg, int32_t commitment_feerate_sat_per_1000_weight_arg, int64_t funding_satoshis_arg, int64_t dust_limit_satoshis_arg, int64_t max_htlc_value_in_flight_msat_arg, int64_t htlc_minimum_msat_arg, int16_t to_self_delay_arg, int16_t max_accepted_htlcs_arg, int32_t locktime_arg, int8_tArray funding_pubkey_arg, int8_tArray revocation_basepoint_arg, int8_tArray payment_basepoint_arg, int8_tArray delayed_payment_basepoint_arg, int8_tArray htlc_basepoint_arg, int8_tArray first_per_commitment_point_arg, int8_tArray second_per_commitment_point_arg, int8_t channel_flags_arg, int64_t shutdown_scriptpubkey_arg, int64_t channel_type_arg, int32_t require_confirmed_inputs_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);
+       LDKThirtyTwoBytes temporary_channel_id_arg_ref;
+       CHECK(temporary_channel_id_arg->arr_len == 32);
+       memcpy(temporary_channel_id_arg_ref.data, temporary_channel_id_arg->elems, 32); FREE(temporary_channel_id_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);
+       LDKPublicKey payment_basepoint_arg_ref;
+       CHECK(payment_basepoint_arg->arr_len == 33);
+       memcpy(payment_basepoint_arg_ref.compressed_form, payment_basepoint_arg->elems, 33); FREE(payment_basepoint_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);
+       LDKPublicKey first_per_commitment_point_arg_ref;
+       CHECK(first_per_commitment_point_arg->arr_len == 33);
+       memcpy(first_per_commitment_point_arg_ref.compressed_form, first_per_commitment_point_arg->elems, 33); FREE(first_per_commitment_point_arg);
+       LDKPublicKey second_per_commitment_point_arg_ref;
+       CHECK(second_per_commitment_point_arg->arr_len == 33);
+       memcpy(second_per_commitment_point_arg_ref.compressed_form, second_per_commitment_point_arg->elems, 33); FREE(second_per_commitment_point_arg);
+       void* shutdown_scriptpubkey_arg_ptr = untag_ptr(shutdown_scriptpubkey_arg);
+       CHECK_ACCESS(shutdown_scriptpubkey_arg_ptr);
+       LDKCOption_CVec_u8ZZ shutdown_scriptpubkey_arg_conv = *(LDKCOption_CVec_u8ZZ*)(shutdown_scriptpubkey_arg_ptr);
+       shutdown_scriptpubkey_arg_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(shutdown_scriptpubkey_arg));
+       LDKChannelTypeFeatures channel_type_arg_conv;
+       channel_type_arg_conv.inner = untag_ptr(channel_type_arg);
+       channel_type_arg_conv.is_owned = ptr_is_owned(channel_type_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_arg_conv);
+       channel_type_arg_conv = ChannelTypeFeatures_clone(&channel_type_arg_conv);
+       LDKCOption_NoneZ require_confirmed_inputs_arg_conv = LDKCOption_NoneZ_from_cs(require_confirmed_inputs_arg);
+       LDKOpenChannelV2 ret_var = OpenChannelV2_new(chain_hash_arg_ref, temporary_channel_id_arg_ref, funding_feerate_sat_per_1000_weight_arg, commitment_feerate_sat_per_1000_weight_arg, funding_satoshis_arg, dust_limit_satoshis_arg, max_htlc_value_in_flight_msat_arg, htlc_minimum_msat_arg, to_self_delay_arg, max_accepted_htlcs_arg, locktime_arg, funding_pubkey_arg_ref, revocation_basepoint_arg_ref, payment_basepoint_arg_ref, delayed_payment_basepoint_arg_ref, htlc_basepoint_arg_ref, first_per_commitment_point_arg_ref, second_per_commitment_point_arg_ref, channel_flags_arg, shutdown_scriptpubkey_arg_conv, channel_type_arg_conv, require_confirmed_inputs_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 OpenChannelV2_clone_ptr(LDKOpenChannelV2 *NONNULL_PTR arg) {
+       LDKOpenChannelV2 ret_var = OpenChannelV2_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_OpenChannelV2_clone_ptr(int64_t arg) {
+       LDKOpenChannelV2 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 = OpenChannelV2_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OpenChannelV2_clone(int64_t orig) {
+       LDKOpenChannelV2 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;
+       LDKOpenChannelV2 ret_var = OpenChannelV2_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_OpenChannelV2_eq(int64_t a, int64_t b) {
+       LDKOpenChannelV2 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;
+       LDKOpenChannelV2 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 = OpenChannelV2_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannel_free(int64_t this_obj) {
+       LDKAcceptChannel 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);
+       AcceptChannel_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_AcceptChannel_get_temporary_channel_id(int64_t this_ptr) {
+       LDKAcceptChannel 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, *AcceptChannel_get_temporary_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannel_set_temporary_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannel 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);
+       AcceptChannel_set_temporary_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_AcceptChannel_get_dust_limit_satoshis(int64_t this_ptr) {
+       LDKAcceptChannel 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 = AcceptChannel_get_dust_limit_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannel_set_dust_limit_satoshis(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannel 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;
+       AcceptChannel_set_dust_limit_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_AcceptChannel_get_max_htlc_value_in_flight_msat(int64_t this_ptr) {
+       LDKAcceptChannel 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 = AcceptChannel_get_max_htlc_value_in_flight_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannel_set_max_htlc_value_in_flight_msat(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannel 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;
+       AcceptChannel_set_max_htlc_value_in_flight_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_AcceptChannel_get_channel_reserve_satoshis(int64_t this_ptr) {
+       LDKAcceptChannel 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 = AcceptChannel_get_channel_reserve_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannel_set_channel_reserve_satoshis(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannel 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;
+       AcceptChannel_set_channel_reserve_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_AcceptChannel_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKAcceptChannel 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 = AcceptChannel_get_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannel_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannel 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;
+       AcceptChannel_set_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_AcceptChannel_get_minimum_depth(int64_t this_ptr) {
+       LDKAcceptChannel 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 = AcceptChannel_get_minimum_depth(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannel_set_minimum_depth(int64_t this_ptr, int32_t val) {
+       LDKAcceptChannel 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;
+       AcceptChannel_set_minimum_depth(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_AcceptChannel_get_to_self_delay(int64_t this_ptr) {
+       LDKAcceptChannel 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 = AcceptChannel_get_to_self_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannel_set_to_self_delay(int64_t this_ptr, int16_t val) {
+       LDKAcceptChannel 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;
+       AcceptChannel_set_to_self_delay(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_AcceptChannel_get_max_accepted_htlcs(int64_t this_ptr) {
+       LDKAcceptChannel 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 = AcceptChannel_get_max_accepted_htlcs(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannel_set_max_accepted_htlcs(int64_t this_ptr, int16_t val) {
+       LDKAcceptChannel 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;
+       AcceptChannel_set_max_accepted_htlcs(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_AcceptChannel_get_funding_pubkey(int64_t this_ptr) {
+       LDKAcceptChannel 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, AcceptChannel_get_funding_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannel_set_funding_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannel 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);
+       AcceptChannel_set_funding_pubkey(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannel_get_revocation_basepoint(int64_t this_ptr) {
+       LDKAcceptChannel 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, AcceptChannel_get_revocation_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannel_set_revocation_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannel 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);
+       AcceptChannel_set_revocation_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannel_get_payment_point(int64_t this_ptr) {
+       LDKAcceptChannel 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, AcceptChannel_get_payment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannel_set_payment_point(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannel 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);
+       AcceptChannel_set_payment_point(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannel_get_delayed_payment_basepoint(int64_t this_ptr) {
+       LDKAcceptChannel 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, AcceptChannel_get_delayed_payment_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannel_set_delayed_payment_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannel 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);
+       AcceptChannel_set_delayed_payment_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannel_get_htlc_basepoint(int64_t this_ptr) {
+       LDKAcceptChannel 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, AcceptChannel_get_htlc_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannel_set_htlc_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannel 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);
+       AcceptChannel_set_htlc_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannel_get_first_per_commitment_point(int64_t this_ptr) {
+       LDKAcceptChannel 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, AcceptChannel_get_first_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannel_set_first_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannel 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);
+       AcceptChannel_set_first_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_AcceptChannel_get_shutdown_scriptpubkey(int64_t this_ptr) {
+       LDKAcceptChannel 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_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = AcceptChannel_get_shutdown_scriptpubkey(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_AcceptChannel_set_shutdown_scriptpubkey(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannel 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_u8ZZ val_conv = *(LDKCOption_CVec_u8ZZ*)(val_ptr);
+       val_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(val));
+       AcceptChannel_set_shutdown_scriptpubkey(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_AcceptChannel_get_channel_type(int64_t this_ptr) {
+       LDKAcceptChannel 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;
+       LDKChannelTypeFeatures ret_var = AcceptChannel_get_channel_type(&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_AcceptChannel_set_channel_type(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannel 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;
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_clone(&val_conv);
+       AcceptChannel_set_channel_type(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_AcceptChannel_new(int8_tArray temporary_channel_id_arg, int64_t dust_limit_satoshis_arg, int64_t max_htlc_value_in_flight_msat_arg, int64_t channel_reserve_satoshis_arg, int64_t htlc_minimum_msat_arg, int32_t minimum_depth_arg, int16_t to_self_delay_arg, int16_t max_accepted_htlcs_arg, 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, int8_tArray first_per_commitment_point_arg, int64_t shutdown_scriptpubkey_arg, int64_t channel_type_arg) {
+       LDKThirtyTwoBytes temporary_channel_id_arg_ref;
+       CHECK(temporary_channel_id_arg->arr_len == 32);
+       memcpy(temporary_channel_id_arg_ref.data, temporary_channel_id_arg->elems, 32); FREE(temporary_channel_id_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);
+       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);
+       LDKPublicKey first_per_commitment_point_arg_ref;
+       CHECK(first_per_commitment_point_arg->arr_len == 33);
+       memcpy(first_per_commitment_point_arg_ref.compressed_form, first_per_commitment_point_arg->elems, 33); FREE(first_per_commitment_point_arg);
+       void* shutdown_scriptpubkey_arg_ptr = untag_ptr(shutdown_scriptpubkey_arg);
+       CHECK_ACCESS(shutdown_scriptpubkey_arg_ptr);
+       LDKCOption_CVec_u8ZZ shutdown_scriptpubkey_arg_conv = *(LDKCOption_CVec_u8ZZ*)(shutdown_scriptpubkey_arg_ptr);
+       shutdown_scriptpubkey_arg_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(shutdown_scriptpubkey_arg));
+       LDKChannelTypeFeatures channel_type_arg_conv;
+       channel_type_arg_conv.inner = untag_ptr(channel_type_arg);
+       channel_type_arg_conv.is_owned = ptr_is_owned(channel_type_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_arg_conv);
+       channel_type_arg_conv = ChannelTypeFeatures_clone(&channel_type_arg_conv);
+       LDKAcceptChannel ret_var = AcceptChannel_new(temporary_channel_id_arg_ref, dust_limit_satoshis_arg, max_htlc_value_in_flight_msat_arg, channel_reserve_satoshis_arg, htlc_minimum_msat_arg, minimum_depth_arg, to_self_delay_arg, max_accepted_htlcs_arg, funding_pubkey_arg_ref, revocation_basepoint_arg_ref, payment_point_arg_ref, delayed_payment_basepoint_arg_ref, htlc_basepoint_arg_ref, first_per_commitment_point_arg_ref, shutdown_scriptpubkey_arg_conv, channel_type_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 AcceptChannel_clone_ptr(LDKAcceptChannel *NONNULL_PTR arg) {
+       LDKAcceptChannel ret_var = AcceptChannel_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_AcceptChannel_clone_ptr(int64_t arg) {
+       LDKAcceptChannel 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 = AcceptChannel_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_AcceptChannel_clone(int64_t orig) {
+       LDKAcceptChannel 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;
+       LDKAcceptChannel ret_var = AcceptChannel_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_AcceptChannel_eq(int64_t a, int64_t b) {
+       LDKAcceptChannel 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;
+       LDKAcceptChannel 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 = AcceptChannel_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_free(int64_t this_obj) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_get_temporary_channel_id(int64_t this_ptr) {
+       LDKAcceptChannelV2 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, *AcceptChannelV2_get_temporary_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannelV2_set_temporary_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_set_temporary_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_AcceptChannelV2_get_funding_satoshis(int64_t this_ptr) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_get_funding_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_set_funding_satoshis(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannelV2 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;
+       AcceptChannelV2_set_funding_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_AcceptChannelV2_get_dust_limit_satoshis(int64_t this_ptr) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_get_dust_limit_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_set_dust_limit_satoshis(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannelV2 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;
+       AcceptChannelV2_set_dust_limit_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_AcceptChannelV2_get_max_htlc_value_in_flight_msat(int64_t this_ptr) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_get_max_htlc_value_in_flight_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_set_max_htlc_value_in_flight_msat(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannelV2 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;
+       AcceptChannelV2_set_max_htlc_value_in_flight_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_AcceptChannelV2_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_get_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannelV2 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;
+       AcceptChannelV2_set_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_AcceptChannelV2_get_minimum_depth(int64_t this_ptr) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_get_minimum_depth(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_set_minimum_depth(int64_t this_ptr, int32_t val) {
+       LDKAcceptChannelV2 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;
+       AcceptChannelV2_set_minimum_depth(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_AcceptChannelV2_get_to_self_delay(int64_t this_ptr) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_get_to_self_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_set_to_self_delay(int64_t this_ptr, int16_t val) {
+       LDKAcceptChannelV2 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;
+       AcceptChannelV2_set_to_self_delay(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_AcceptChannelV2_get_max_accepted_htlcs(int64_t this_ptr) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_get_max_accepted_htlcs(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_set_max_accepted_htlcs(int64_t this_ptr, int16_t val) {
+       LDKAcceptChannelV2 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;
+       AcceptChannelV2_set_max_accepted_htlcs(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_get_funding_pubkey(int64_t this_ptr) {
+       LDKAcceptChannelV2 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, AcceptChannelV2_get_funding_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannelV2_set_funding_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_set_funding_pubkey(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_get_revocation_basepoint(int64_t this_ptr) {
+       LDKAcceptChannelV2 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, AcceptChannelV2_get_revocation_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannelV2_set_revocation_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_set_revocation_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_get_payment_basepoint(int64_t this_ptr) {
+       LDKAcceptChannelV2 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, AcceptChannelV2_get_payment_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannelV2_set_payment_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_set_payment_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_get_delayed_payment_basepoint(int64_t this_ptr) {
+       LDKAcceptChannelV2 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, AcceptChannelV2_get_delayed_payment_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannelV2_set_delayed_payment_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_set_delayed_payment_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_get_htlc_basepoint(int64_t this_ptr) {
+       LDKAcceptChannelV2 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, AcceptChannelV2_get_htlc_basepoint(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannelV2_set_htlc_basepoint(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_set_htlc_basepoint(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_get_first_per_commitment_point(int64_t this_ptr) {
+       LDKAcceptChannelV2 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, AcceptChannelV2_get_first_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannelV2_set_first_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_set_first_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_get_second_per_commitment_point(int64_t this_ptr) {
+       LDKAcceptChannelV2 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, AcceptChannelV2_get_second_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_AcceptChannelV2_set_second_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKAcceptChannelV2 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);
+       AcceptChannelV2_set_second_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_AcceptChannelV2_get_shutdown_scriptpubkey(int64_t this_ptr) {
+       LDKAcceptChannelV2 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_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = AcceptChannelV2_get_shutdown_scriptpubkey(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_AcceptChannelV2_set_shutdown_scriptpubkey(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannelV2 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_u8ZZ val_conv = *(LDKCOption_CVec_u8ZZ*)(val_ptr);
+       val_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(val));
+       AcceptChannelV2_set_shutdown_scriptpubkey(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_AcceptChannelV2_get_channel_type(int64_t this_ptr) {
+       LDKAcceptChannelV2 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;
+       LDKChannelTypeFeatures ret_var = AcceptChannelV2_get_channel_type(&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_AcceptChannelV2_set_channel_type(int64_t this_ptr, int64_t val) {
+       LDKAcceptChannelV2 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;
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_clone(&val_conv);
+       AcceptChannelV2_set_channel_type(&this_ptr_conv, val_conv);
+}
+
+int32_t  CS_LDK_AcceptChannelV2_get_require_confirmed_inputs(int64_t this_ptr) {
+       LDKAcceptChannelV2 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 = LDKCOption_NoneZ_to_cs(AcceptChannelV2_get_require_confirmed_inputs(&this_ptr_conv));
+       return ret_conv;
+}
+
+void  CS_LDK_AcceptChannelV2_set_require_confirmed_inputs(int64_t this_ptr, int32_t val) {
+       LDKAcceptChannelV2 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_NoneZ val_conv = LDKCOption_NoneZ_from_cs(val);
+       AcceptChannelV2_set_require_confirmed_inputs(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_AcceptChannelV2_new(int8_tArray temporary_channel_id_arg, int64_t funding_satoshis_arg, int64_t dust_limit_satoshis_arg, int64_t max_htlc_value_in_flight_msat_arg, int64_t htlc_minimum_msat_arg, int32_t minimum_depth_arg, int16_t to_self_delay_arg, int16_t max_accepted_htlcs_arg, int8_tArray funding_pubkey_arg, int8_tArray revocation_basepoint_arg, int8_tArray payment_basepoint_arg, int8_tArray delayed_payment_basepoint_arg, int8_tArray htlc_basepoint_arg, int8_tArray first_per_commitment_point_arg, int8_tArray second_per_commitment_point_arg, int64_t shutdown_scriptpubkey_arg, int64_t channel_type_arg, int32_t require_confirmed_inputs_arg) {
+       LDKThirtyTwoBytes temporary_channel_id_arg_ref;
+       CHECK(temporary_channel_id_arg->arr_len == 32);
+       memcpy(temporary_channel_id_arg_ref.data, temporary_channel_id_arg->elems, 32); FREE(temporary_channel_id_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);
+       LDKPublicKey payment_basepoint_arg_ref;
+       CHECK(payment_basepoint_arg->arr_len == 33);
+       memcpy(payment_basepoint_arg_ref.compressed_form, payment_basepoint_arg->elems, 33); FREE(payment_basepoint_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);
+       LDKPublicKey first_per_commitment_point_arg_ref;
+       CHECK(first_per_commitment_point_arg->arr_len == 33);
+       memcpy(first_per_commitment_point_arg_ref.compressed_form, first_per_commitment_point_arg->elems, 33); FREE(first_per_commitment_point_arg);
+       LDKPublicKey second_per_commitment_point_arg_ref;
+       CHECK(second_per_commitment_point_arg->arr_len == 33);
+       memcpy(second_per_commitment_point_arg_ref.compressed_form, second_per_commitment_point_arg->elems, 33); FREE(second_per_commitment_point_arg);
+       void* shutdown_scriptpubkey_arg_ptr = untag_ptr(shutdown_scriptpubkey_arg);
+       CHECK_ACCESS(shutdown_scriptpubkey_arg_ptr);
+       LDKCOption_CVec_u8ZZ shutdown_scriptpubkey_arg_conv = *(LDKCOption_CVec_u8ZZ*)(shutdown_scriptpubkey_arg_ptr);
+       shutdown_scriptpubkey_arg_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(shutdown_scriptpubkey_arg));
+       LDKChannelTypeFeatures channel_type_arg_conv;
+       channel_type_arg_conv.inner = untag_ptr(channel_type_arg);
+       channel_type_arg_conv.is_owned = ptr_is_owned(channel_type_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_arg_conv);
+       channel_type_arg_conv = ChannelTypeFeatures_clone(&channel_type_arg_conv);
+       LDKCOption_NoneZ require_confirmed_inputs_arg_conv = LDKCOption_NoneZ_from_cs(require_confirmed_inputs_arg);
+       LDKAcceptChannelV2 ret_var = AcceptChannelV2_new(temporary_channel_id_arg_ref, funding_satoshis_arg, dust_limit_satoshis_arg, max_htlc_value_in_flight_msat_arg, htlc_minimum_msat_arg, minimum_depth_arg, to_self_delay_arg, max_accepted_htlcs_arg, funding_pubkey_arg_ref, revocation_basepoint_arg_ref, payment_basepoint_arg_ref, delayed_payment_basepoint_arg_ref, htlc_basepoint_arg_ref, first_per_commitment_point_arg_ref, second_per_commitment_point_arg_ref, shutdown_scriptpubkey_arg_conv, channel_type_arg_conv, require_confirmed_inputs_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 AcceptChannelV2_clone_ptr(LDKAcceptChannelV2 *NONNULL_PTR arg) {
+       LDKAcceptChannelV2 ret_var = AcceptChannelV2_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_AcceptChannelV2_clone_ptr(int64_t arg) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_AcceptChannelV2_clone(int64_t orig) {
+       LDKAcceptChannelV2 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;
+       LDKAcceptChannelV2 ret_var = AcceptChannelV2_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_AcceptChannelV2_eq(int64_t a, int64_t b) {
+       LDKAcceptChannelV2 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;
+       LDKAcceptChannelV2 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 = AcceptChannelV2_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_FundingCreated_free(int64_t this_obj) {
+       LDKFundingCreated 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);
+       FundingCreated_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_FundingCreated_get_temporary_channel_id(int64_t this_ptr) {
+       LDKFundingCreated 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, *FundingCreated_get_temporary_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_FundingCreated_set_temporary_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKFundingCreated 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);
+       FundingCreated_set_temporary_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_FundingCreated_get_funding_txid(int64_t this_ptr) {
+       LDKFundingCreated 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, *FundingCreated_get_funding_txid(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_FundingCreated_set_funding_txid(int64_t this_ptr, int8_tArray val) {
+       LDKFundingCreated 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);
+       FundingCreated_set_funding_txid(&this_ptr_conv, val_ref);
+}
+
+int16_t  CS_LDK_FundingCreated_get_funding_output_index(int64_t this_ptr) {
+       LDKFundingCreated 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 = FundingCreated_get_funding_output_index(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_FundingCreated_set_funding_output_index(int64_t this_ptr, int16_t val) {
+       LDKFundingCreated 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;
+       FundingCreated_set_funding_output_index(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_FundingCreated_get_signature(int64_t this_ptr) {
+       LDKFundingCreated 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(64, __LINE__);
+       memcpy(ret_arr->elems, FundingCreated_get_signature(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_FundingCreated_set_signature(int64_t this_ptr, int8_tArray val) {
+       LDKFundingCreated 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       FundingCreated_set_signature(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_FundingCreated_new(int8_tArray temporary_channel_id_arg, int8_tArray funding_txid_arg, int16_t funding_output_index_arg, int8_tArray signature_arg) {
+       LDKThirtyTwoBytes temporary_channel_id_arg_ref;
+       CHECK(temporary_channel_id_arg->arr_len == 32);
+       memcpy(temporary_channel_id_arg_ref.data, temporary_channel_id_arg->elems, 32); FREE(temporary_channel_id_arg);
+       LDKThirtyTwoBytes funding_txid_arg_ref;
+       CHECK(funding_txid_arg->arr_len == 32);
+       memcpy(funding_txid_arg_ref.data, funding_txid_arg->elems, 32); FREE(funding_txid_arg);
+       LDKECDSASignature signature_arg_ref;
+       CHECK(signature_arg->arr_len == 64);
+       memcpy(signature_arg_ref.compact_form, signature_arg->elems, 64); FREE(signature_arg);
+       LDKFundingCreated ret_var = FundingCreated_new(temporary_channel_id_arg_ref, funding_txid_arg_ref, funding_output_index_arg, signature_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 FundingCreated_clone_ptr(LDKFundingCreated *NONNULL_PTR arg) {
+       LDKFundingCreated ret_var = FundingCreated_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_FundingCreated_clone_ptr(int64_t arg) {
+       LDKFundingCreated 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 = FundingCreated_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_FundingCreated_clone(int64_t orig) {
+       LDKFundingCreated 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;
+       LDKFundingCreated ret_var = FundingCreated_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_FundingCreated_eq(int64_t a, int64_t b) {
+       LDKFundingCreated 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;
+       LDKFundingCreated 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 = FundingCreated_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_FundingSigned_free(int64_t this_obj) {
+       LDKFundingSigned 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);
+       FundingSigned_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_FundingSigned_get_channel_id(int64_t this_ptr) {
+       LDKFundingSigned 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, *FundingSigned_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_FundingSigned_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKFundingSigned 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);
+       FundingSigned_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_FundingSigned_get_signature(int64_t this_ptr) {
+       LDKFundingSigned 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(64, __LINE__);
+       memcpy(ret_arr->elems, FundingSigned_get_signature(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_FundingSigned_set_signature(int64_t this_ptr, int8_tArray val) {
+       LDKFundingSigned 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       FundingSigned_set_signature(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_FundingSigned_new(int8_tArray channel_id_arg, int8_tArray signature_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);
+       LDKECDSASignature signature_arg_ref;
+       CHECK(signature_arg->arr_len == 64);
+       memcpy(signature_arg_ref.compact_form, signature_arg->elems, 64); FREE(signature_arg);
+       LDKFundingSigned ret_var = FundingSigned_new(channel_id_arg_ref, signature_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 FundingSigned_clone_ptr(LDKFundingSigned *NONNULL_PTR arg) {
+       LDKFundingSigned ret_var = FundingSigned_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_FundingSigned_clone_ptr(int64_t arg) {
+       LDKFundingSigned 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 = FundingSigned_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_FundingSigned_clone(int64_t orig) {
+       LDKFundingSigned 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;
+       LDKFundingSigned ret_var = FundingSigned_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_FundingSigned_eq(int64_t a, int64_t b) {
+       LDKFundingSigned 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;
+       LDKFundingSigned 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 = FundingSigned_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelReady_free(int64_t this_obj) {
+       LDKChannelReady 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);
+       ChannelReady_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ChannelReady_get_channel_id(int64_t this_ptr) {
+       LDKChannelReady 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, *ChannelReady_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelReady_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKChannelReady 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);
+       ChannelReady_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_ChannelReady_get_next_per_commitment_point(int64_t this_ptr) {
+       LDKChannelReady 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, ChannelReady_get_next_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelReady_set_next_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKChannelReady 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);
+       ChannelReady_set_next_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelReady_get_short_channel_id_alias(int64_t this_ptr) {
+       LDKChannelReady 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 = ChannelReady_get_short_channel_id_alias(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelReady_set_short_channel_id_alias(int64_t this_ptr, int64_t val) {
+       LDKChannelReady 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));
+       ChannelReady_set_short_channel_id_alias(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelReady_new(int8_tArray channel_id_arg, int8_tArray next_per_commitment_point_arg, int64_t short_channel_id_alias_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);
+       LDKPublicKey next_per_commitment_point_arg_ref;
+       CHECK(next_per_commitment_point_arg->arr_len == 33);
+       memcpy(next_per_commitment_point_arg_ref.compressed_form, next_per_commitment_point_arg->elems, 33); FREE(next_per_commitment_point_arg);
+       void* short_channel_id_alias_arg_ptr = untag_ptr(short_channel_id_alias_arg);
+       CHECK_ACCESS(short_channel_id_alias_arg_ptr);
+       LDKCOption_u64Z short_channel_id_alias_arg_conv = *(LDKCOption_u64Z*)(short_channel_id_alias_arg_ptr);
+       short_channel_id_alias_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(short_channel_id_alias_arg));
+       LDKChannelReady ret_var = ChannelReady_new(channel_id_arg_ref, next_per_commitment_point_arg_ref, short_channel_id_alias_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 ChannelReady_clone_ptr(LDKChannelReady *NONNULL_PTR arg) {
+       LDKChannelReady ret_var = ChannelReady_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_ChannelReady_clone_ptr(int64_t arg) {
+       LDKChannelReady 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 = ChannelReady_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelReady_clone(int64_t orig) {
+       LDKChannelReady 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;
+       LDKChannelReady ret_var = ChannelReady_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_ChannelReady_eq(int64_t a, int64_t b) {
+       LDKChannelReady 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;
+       LDKChannelReady 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 = ChannelReady_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);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       TxAddInput_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxAddInput_get_channel_id(int64_t this_ptr) {
+       LDKTxAddInput 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, *TxAddInput_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxAddInput_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxAddInput 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);
+       TxAddInput_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_TxAddInput_get_serial_id(int64_t this_ptr) {
+       LDKTxAddInput 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 = TxAddInput_get_serial_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxAddInput_set_serial_id(int64_t this_ptr, int64_t val) {
+       LDKTxAddInput 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;
+       TxAddInput_set_serial_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_TxAddInput_get_prevtx(int64_t this_ptr) {
+       LDKTxAddInput 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;
+       LDKTransactionU16LenLimited ret_var = TxAddInput_get_prevtx(&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_TxAddInput_set_prevtx(int64_t this_ptr, int64_t val) {
+       LDKTxAddInput 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;
+       LDKTransactionU16LenLimited 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 = TransactionU16LenLimited_clone(&val_conv);
+       TxAddInput_set_prevtx(&this_ptr_conv, val_conv);
+}
+
+int32_t  CS_LDK_TxAddInput_get_prevtx_out(int64_t this_ptr) {
+       LDKTxAddInput 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 = TxAddInput_get_prevtx_out(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxAddInput_set_prevtx_out(int64_t this_ptr, int32_t val) {
+       LDKTxAddInput 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;
+       TxAddInput_set_prevtx_out(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_TxAddInput_get_sequence(int64_t this_ptr) {
+       LDKTxAddInput 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 = TxAddInput_get_sequence(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxAddInput_set_sequence(int64_t this_ptr, int32_t val) {
+       LDKTxAddInput 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;
+       TxAddInput_set_sequence(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_TxAddInput_new(int8_tArray channel_id_arg, int64_t serial_id_arg, int64_t prevtx_arg, int32_t prevtx_out_arg, int32_t sequence_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);
+       LDKTransactionU16LenLimited prevtx_arg_conv;
+       prevtx_arg_conv.inner = untag_ptr(prevtx_arg);
+       prevtx_arg_conv.is_owned = ptr_is_owned(prevtx_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(prevtx_arg_conv);
+       prevtx_arg_conv = TransactionU16LenLimited_clone(&prevtx_arg_conv);
+       LDKTxAddInput ret_var = TxAddInput_new(channel_id_arg_ref, serial_id_arg, prevtx_arg_conv, prevtx_out_arg, sequence_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 TxAddInput_clone_ptr(LDKTxAddInput *NONNULL_PTR arg) {
+       LDKTxAddInput ret_var = TxAddInput_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_TxAddInput_clone_ptr(int64_t arg) {
+       LDKTxAddInput 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 = TxAddInput_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxAddInput_clone(int64_t orig) {
+       LDKTxAddInput 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;
+       LDKTxAddInput ret_var = TxAddInput_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_TxAddInput_eq(int64_t a, int64_t b) {
+       LDKTxAddInput 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;
+       LDKTxAddInput 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 = TxAddInput_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxAddOutput_free(int64_t this_obj) {
+       LDKTxAddOutput 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);
+       TxAddOutput_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxAddOutput_get_channel_id(int64_t this_ptr) {
+       LDKTxAddOutput 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, *TxAddOutput_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxAddOutput_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxAddOutput 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);
+       TxAddOutput_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_TxAddOutput_get_serial_id(int64_t this_ptr) {
+       LDKTxAddOutput 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 = TxAddOutput_get_serial_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxAddOutput_set_serial_id(int64_t this_ptr, int64_t val) {
+       LDKTxAddOutput 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;
+       TxAddOutput_set_serial_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_TxAddOutput_get_sats(int64_t this_ptr) {
+       LDKTxAddOutput 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 = TxAddOutput_get_sats(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxAddOutput_set_sats(int64_t this_ptr, int64_t val) {
+       LDKTxAddOutput 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;
+       TxAddOutput_set_sats(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_TxAddOutput_get_script(int64_t this_ptr) {
+       LDKTxAddOutput 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;
+       LDKu8slice 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);
+       return ret_arr;
+}
+
+void  CS_LDK_TxAddOutput_set_script(int64_t this_ptr, int8_tArray val) {
+       LDKTxAddOutput 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);
+       TxAddOutput_set_script(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_TxAddOutput_new(int8_tArray channel_id_arg, int64_t serial_id_arg, int64_t sats_arg, int8_tArray script_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);
+       LDKCVec_u8Z script_arg_ref;
+       script_arg_ref.datalen = script_arg->arr_len;
+       script_arg_ref.data = MALLOC(script_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(script_arg_ref.data, script_arg->elems, script_arg_ref.datalen); FREE(script_arg);
+       LDKTxAddOutput ret_var = TxAddOutput_new(channel_id_arg_ref, serial_id_arg, sats_arg, script_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 TxAddOutput_clone_ptr(LDKTxAddOutput *NONNULL_PTR arg) {
+       LDKTxAddOutput ret_var = TxAddOutput_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_TxAddOutput_clone_ptr(int64_t arg) {
+       LDKTxAddOutput 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 = TxAddOutput_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxAddOutput_clone(int64_t orig) {
+       LDKTxAddOutput 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;
+       LDKTxAddOutput ret_var = TxAddOutput_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_TxAddOutput_eq(int64_t a, int64_t b) {
+       LDKTxAddOutput 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;
+       LDKTxAddOutput 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 = TxAddOutput_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxRemoveInput_free(int64_t this_obj) {
+       LDKTxRemoveInput 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);
+       TxRemoveInput_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxRemoveInput_get_channel_id(int64_t this_ptr) {
+       LDKTxRemoveInput 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, *TxRemoveInput_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxRemoveInput_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxRemoveInput 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);
+       TxRemoveInput_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_TxRemoveInput_get_serial_id(int64_t this_ptr) {
+       LDKTxRemoveInput 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 = TxRemoveInput_get_serial_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxRemoveInput_set_serial_id(int64_t this_ptr, int64_t val) {
+       LDKTxRemoveInput 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;
+       TxRemoveInput_set_serial_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_TxRemoveInput_new(int8_tArray channel_id_arg, int64_t serial_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);
+       LDKTxRemoveInput ret_var = TxRemoveInput_new(channel_id_arg_ref, serial_id_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 TxRemoveInput_clone_ptr(LDKTxRemoveInput *NONNULL_PTR arg) {
+       LDKTxRemoveInput ret_var = TxRemoveInput_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_TxRemoveInput_clone_ptr(int64_t arg) {
+       LDKTxRemoveInput 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 = TxRemoveInput_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxRemoveInput_clone(int64_t orig) {
+       LDKTxRemoveInput 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;
+       LDKTxRemoveInput ret_var = TxRemoveInput_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_TxRemoveInput_eq(int64_t a, int64_t b) {
+       LDKTxRemoveInput 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;
+       LDKTxRemoveInput 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 = TxRemoveInput_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxRemoveOutput_free(int64_t this_obj) {
+       LDKTxRemoveOutput 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);
+       TxRemoveOutput_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxRemoveOutput_get_channel_id(int64_t this_ptr) {
+       LDKTxRemoveOutput 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, *TxRemoveOutput_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxRemoveOutput_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxRemoveOutput 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);
+       TxRemoveOutput_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_TxRemoveOutput_get_serial_id(int64_t this_ptr) {
+       LDKTxRemoveOutput 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 = TxRemoveOutput_get_serial_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxRemoveOutput_set_serial_id(int64_t this_ptr, int64_t val) {
+       LDKTxRemoveOutput 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;
+       TxRemoveOutput_set_serial_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_TxRemoveOutput_new(int8_tArray channel_id_arg, int64_t serial_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);
+       LDKTxRemoveOutput ret_var = TxRemoveOutput_new(channel_id_arg_ref, serial_id_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 TxRemoveOutput_clone_ptr(LDKTxRemoveOutput *NONNULL_PTR arg) {
+       LDKTxRemoveOutput ret_var = TxRemoveOutput_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_TxRemoveOutput_clone_ptr(int64_t arg) {
+       LDKTxRemoveOutput 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 = TxRemoveOutput_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxRemoveOutput_clone(int64_t orig) {
+       LDKTxRemoveOutput 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;
+       LDKTxRemoveOutput ret_var = TxRemoveOutput_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_TxRemoveOutput_eq(int64_t a, int64_t b) {
+       LDKTxRemoveOutput 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;
+       LDKTxRemoveOutput 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 = TxRemoveOutput_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxComplete_free(int64_t this_obj) {
+       LDKTxComplete 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);
+       TxComplete_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxComplete_get_channel_id(int64_t this_ptr) {
+       LDKTxComplete 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, *TxComplete_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxComplete_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxComplete 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);
+       TxComplete_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_TxComplete_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);
+       LDKTxComplete ret_var = TxComplete_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 TxComplete_clone_ptr(LDKTxComplete *NONNULL_PTR arg) {
+       LDKTxComplete ret_var = TxComplete_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_TxComplete_clone_ptr(int64_t arg) {
+       LDKTxComplete 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 = TxComplete_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxComplete_clone(int64_t orig) {
+       LDKTxComplete 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;
+       LDKTxComplete ret_var = TxComplete_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_TxComplete_eq(int64_t a, int64_t b) {
+       LDKTxComplete 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;
+       LDKTxComplete 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 = TxComplete_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxSignatures_free(int64_t this_obj) {
+       LDKTxSignatures 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);
+       TxSignatures_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxSignatures_get_channel_id(int64_t this_ptr) {
+       LDKTxSignatures 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, *TxSignatures_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxSignatures_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxSignatures 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);
+       TxSignatures_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_TxSignatures_get_tx_hash(int64_t this_ptr) {
+       LDKTxSignatures 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, *TxSignatures_get_tx_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxSignatures_set_tx_hash(int64_t this_ptr, int8_tArray val) {
+       LDKTxSignatures 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);
+       TxSignatures_set_tx_hash(&this_ptr_conv, val_ref);
+}
+
+ptrArray  CS_LDK_TxSignatures_get_witnesses(int64_t this_ptr) {
+       LDKTxSignatures 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_WitnessZ ret_var = TxSignatures_get_witnesses(&this_ptr_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++) {
+               LDKWitness 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);
+               Witness_free(ret_conv_8_var);
+               ret_arr_ptr[i] = ret_conv_8_arr;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_TxSignatures_set_witnesses(int64_t this_ptr, ptrArray val) {
+       LDKTxSignatures 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_WitnessZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKWitness), "LDKCVec_WitnessZ Elements");
+       else
+               val_constr.data = NULL;
+       int8_tArray* val_vals = (void*) val->elems;
+       for (size_t i = 0; i < val_constr.datalen; i++) {
+               int8_tArray val_conv_8 = val_vals[i];
+               LDKWitness val_conv_8_ref;
+               val_conv_8_ref.datalen = val_conv_8->arr_len;
+               val_conv_8_ref.data = MALLOC(val_conv_8_ref.datalen, "LDKWitness Bytes");
+               memcpy(val_conv_8_ref.data, val_conv_8->elems, val_conv_8_ref.datalen); FREE(val_conv_8);
+               val_conv_8_ref.data_is_owned = true;
+               val_constr.data[i] = val_conv_8_ref;
+       }
+       FREE(val);
+       TxSignatures_set_witnesses(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_TxSignatures_new(int8_tArray channel_id_arg, int8_tArray tx_hash_arg, ptrArray witnesses_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 tx_hash_arg_ref;
+       CHECK(tx_hash_arg->arr_len == 32);
+       memcpy(tx_hash_arg_ref.data, tx_hash_arg->elems, 32); FREE(tx_hash_arg);
+       LDKCVec_WitnessZ witnesses_arg_constr;
+       witnesses_arg_constr.datalen = witnesses_arg->arr_len;
+       if (witnesses_arg_constr.datalen > 0)
+               witnesses_arg_constr.data = MALLOC(witnesses_arg_constr.datalen * sizeof(LDKWitness), "LDKCVec_WitnessZ Elements");
+       else
+               witnesses_arg_constr.data = NULL;
+       int8_tArray* witnesses_arg_vals = (void*) witnesses_arg->elems;
+       for (size_t i = 0; i < witnesses_arg_constr.datalen; i++) {
+               int8_tArray witnesses_arg_conv_8 = witnesses_arg_vals[i];
+               LDKWitness witnesses_arg_conv_8_ref;
+               witnesses_arg_conv_8_ref.datalen = witnesses_arg_conv_8->arr_len;
+               witnesses_arg_conv_8_ref.data = MALLOC(witnesses_arg_conv_8_ref.datalen, "LDKWitness Bytes");
+               memcpy(witnesses_arg_conv_8_ref.data, witnesses_arg_conv_8->elems, witnesses_arg_conv_8_ref.datalen); FREE(witnesses_arg_conv_8);
+               witnesses_arg_conv_8_ref.data_is_owned = true;
+               witnesses_arg_constr.data[i] = witnesses_arg_conv_8_ref;
+       }
+       FREE(witnesses_arg);
+       LDKTxSignatures ret_var = TxSignatures_new(channel_id_arg_ref, tx_hash_arg_ref, witnesses_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);
+       return ret_ref;
+}
+
+static inline uint64_t TxSignatures_clone_ptr(LDKTxSignatures *NONNULL_PTR arg) {
+       LDKTxSignatures ret_var = TxSignatures_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_TxSignatures_clone_ptr(int64_t arg) {
+       LDKTxSignatures 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 = TxSignatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxSignatures_clone(int64_t orig) {
+       LDKTxSignatures 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;
+       LDKTxSignatures ret_var = TxSignatures_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_TxSignatures_eq(int64_t a, int64_t b) {
+       LDKTxSignatures 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;
+       LDKTxSignatures 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 = TxSignatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxInitRbf_free(int64_t this_obj) {
+       LDKTxInitRbf 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);
+       TxInitRbf_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxInitRbf_get_channel_id(int64_t this_ptr) {
+       LDKTxInitRbf 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, *TxInitRbf_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxInitRbf_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxInitRbf 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);
+       TxInitRbf_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_TxInitRbf_get_locktime(int64_t this_ptr) {
+       LDKTxInitRbf 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 = TxInitRbf_get_locktime(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxInitRbf_set_locktime(int64_t this_ptr, int32_t val) {
+       LDKTxInitRbf 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;
+       TxInitRbf_set_locktime(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_TxInitRbf_get_feerate_sat_per_1000_weight(int64_t this_ptr) {
+       LDKTxInitRbf 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 = TxInitRbf_get_feerate_sat_per_1000_weight(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxInitRbf_set_feerate_sat_per_1000_weight(int64_t this_ptr, int32_t val) {
+       LDKTxInitRbf 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;
+       TxInitRbf_set_feerate_sat_per_1000_weight(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_TxInitRbf_get_funding_output_contribution(int64_t this_ptr) {
+       LDKTxInitRbf 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_i64Z *ret_copy = MALLOC(sizeof(LDKCOption_i64Z), "LDKCOption_i64Z");
+       *ret_copy = TxInitRbf_get_funding_output_contribution(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_TxInitRbf_set_funding_output_contribution(int64_t this_ptr, int64_t val) {
+       LDKTxInitRbf 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_i64Z val_conv = *(LDKCOption_i64Z*)(val_ptr);
+       val_conv = COption_i64Z_clone((LDKCOption_i64Z*)untag_ptr(val));
+       TxInitRbf_set_funding_output_contribution(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_TxInitRbf_new(int8_tArray channel_id_arg, int32_t locktime_arg, int32_t feerate_sat_per_1000_weight_arg, int64_t funding_output_contribution_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);
+       void* funding_output_contribution_arg_ptr = untag_ptr(funding_output_contribution_arg);
+       CHECK_ACCESS(funding_output_contribution_arg_ptr);
+       LDKCOption_i64Z funding_output_contribution_arg_conv = *(LDKCOption_i64Z*)(funding_output_contribution_arg_ptr);
+       funding_output_contribution_arg_conv = COption_i64Z_clone((LDKCOption_i64Z*)untag_ptr(funding_output_contribution_arg));
+       LDKTxInitRbf ret_var = TxInitRbf_new(channel_id_arg_ref, locktime_arg, feerate_sat_per_1000_weight_arg, funding_output_contribution_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 TxInitRbf_clone_ptr(LDKTxInitRbf *NONNULL_PTR arg) {
+       LDKTxInitRbf ret_var = TxInitRbf_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_TxInitRbf_clone_ptr(int64_t arg) {
+       LDKTxInitRbf 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 = TxInitRbf_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxInitRbf_clone(int64_t orig) {
+       LDKTxInitRbf 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;
+       LDKTxInitRbf ret_var = TxInitRbf_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_TxInitRbf_eq(int64_t a, int64_t b) {
+       LDKTxInitRbf 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;
+       LDKTxInitRbf 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 = TxInitRbf_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxAckRbf_free(int64_t this_obj) {
+       LDKTxAckRbf 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);
+       TxAckRbf_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxAckRbf_get_channel_id(int64_t this_ptr) {
+       LDKTxAckRbf 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, *TxAckRbf_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxAckRbf_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxAckRbf 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);
+       TxAckRbf_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_TxAckRbf_get_funding_output_contribution(int64_t this_ptr) {
+       LDKTxAckRbf 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_i64Z *ret_copy = MALLOC(sizeof(LDKCOption_i64Z), "LDKCOption_i64Z");
+       *ret_copy = TxAckRbf_get_funding_output_contribution(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_TxAckRbf_set_funding_output_contribution(int64_t this_ptr, int64_t val) {
+       LDKTxAckRbf 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_i64Z val_conv = *(LDKCOption_i64Z*)(val_ptr);
+       val_conv = COption_i64Z_clone((LDKCOption_i64Z*)untag_ptr(val));
+       TxAckRbf_set_funding_output_contribution(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_TxAckRbf_new(int8_tArray channel_id_arg, int64_t funding_output_contribution_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);
+       void* funding_output_contribution_arg_ptr = untag_ptr(funding_output_contribution_arg);
+       CHECK_ACCESS(funding_output_contribution_arg_ptr);
+       LDKCOption_i64Z funding_output_contribution_arg_conv = *(LDKCOption_i64Z*)(funding_output_contribution_arg_ptr);
+       funding_output_contribution_arg_conv = COption_i64Z_clone((LDKCOption_i64Z*)untag_ptr(funding_output_contribution_arg));
+       LDKTxAckRbf ret_var = TxAckRbf_new(channel_id_arg_ref, funding_output_contribution_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 TxAckRbf_clone_ptr(LDKTxAckRbf *NONNULL_PTR arg) {
+       LDKTxAckRbf ret_var = TxAckRbf_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_TxAckRbf_clone_ptr(int64_t arg) {
+       LDKTxAckRbf 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 = TxAckRbf_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxAckRbf_clone(int64_t orig) {
+       LDKTxAckRbf 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;
+       LDKTxAckRbf ret_var = TxAckRbf_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_TxAckRbf_eq(int64_t a, int64_t b) {
+       LDKTxAckRbf 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;
+       LDKTxAckRbf 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 = TxAckRbf_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxAbort_free(int64_t this_obj) {
+       LDKTxAbort 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);
+       TxAbort_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxAbort_get_channel_id(int64_t this_ptr) {
+       LDKTxAbort 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, *TxAbort_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_TxAbort_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKTxAbort 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);
+       TxAbort_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_TxAbort_get_data(int64_t this_ptr) {
+       LDKTxAbort 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 = TxAbort_get_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_TxAbort_set_data(int64_t this_ptr, int8_tArray val) {
+       LDKTxAbort 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);
+       TxAbort_set_data(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_TxAbort_new(int8_tArray channel_id_arg, int8_tArray data_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);
+       LDKCVec_u8Z data_arg_ref;
+       data_arg_ref.datalen = data_arg->arr_len;
+       data_arg_ref.data = MALLOC(data_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(data_arg_ref.data, data_arg->elems, data_arg_ref.datalen); FREE(data_arg);
+       LDKTxAbort ret_var = TxAbort_new(channel_id_arg_ref, data_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 TxAbort_clone_ptr(LDKTxAbort *NONNULL_PTR arg) {
+       LDKTxAbort ret_var = TxAbort_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_TxAbort_clone_ptr(int64_t arg) {
+       LDKTxAbort 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 = TxAbort_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxAbort_clone(int64_t orig) {
+       LDKTxAbort 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;
+       LDKTxAbort ret_var = TxAbort_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_TxAbort_eq(int64_t a, int64_t b) {
+       LDKTxAbort 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;
+       LDKTxAbort 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 = TxAbort_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Shutdown_free(int64_t this_obj) {
+       LDKShutdown 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);
+       Shutdown_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_Shutdown_get_channel_id(int64_t this_ptr) {
+       LDKShutdown 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, *Shutdown_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_Shutdown_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKShutdown 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);
+       Shutdown_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_Shutdown_get_scriptpubkey(int64_t this_ptr) {
+       LDKShutdown 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;
+       LDKu8slice 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);
+       return ret_arr;
+}
+
+void  CS_LDK_Shutdown_set_scriptpubkey(int64_t this_ptr, int8_tArray val) {
+       LDKShutdown 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);
+       Shutdown_set_scriptpubkey(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_Shutdown_new(int8_tArray channel_id_arg, int8_tArray scriptpubkey_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);
+       LDKCVec_u8Z scriptpubkey_arg_ref;
+       scriptpubkey_arg_ref.datalen = scriptpubkey_arg->arr_len;
+       scriptpubkey_arg_ref.data = MALLOC(scriptpubkey_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(scriptpubkey_arg_ref.data, scriptpubkey_arg->elems, scriptpubkey_arg_ref.datalen); FREE(scriptpubkey_arg);
+       LDKShutdown ret_var = Shutdown_new(channel_id_arg_ref, scriptpubkey_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 Shutdown_clone_ptr(LDKShutdown *NONNULL_PTR arg) {
+       LDKShutdown ret_var = Shutdown_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_Shutdown_clone_ptr(int64_t arg) {
+       LDKShutdown 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 = Shutdown_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Shutdown_clone(int64_t orig) {
+       LDKShutdown 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;
+       LDKShutdown ret_var = Shutdown_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_Shutdown_eq(int64_t a, int64_t b) {
+       LDKShutdown 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;
+       LDKShutdown 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 = Shutdown_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ClosingSignedFeeRange_free(int64_t this_obj) {
+       LDKClosingSignedFeeRange 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);
+       ClosingSignedFeeRange_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ClosingSignedFeeRange_get_min_fee_satoshis(int64_t this_ptr) {
+       LDKClosingSignedFeeRange 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 = ClosingSignedFeeRange_get_min_fee_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ClosingSignedFeeRange_set_min_fee_satoshis(int64_t this_ptr, int64_t val) {
+       LDKClosingSignedFeeRange 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;
+       ClosingSignedFeeRange_set_min_fee_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ClosingSignedFeeRange_get_max_fee_satoshis(int64_t this_ptr) {
+       LDKClosingSignedFeeRange 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 = ClosingSignedFeeRange_get_max_fee_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ClosingSignedFeeRange_set_max_fee_satoshis(int64_t this_ptr, int64_t val) {
+       LDKClosingSignedFeeRange 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;
+       ClosingSignedFeeRange_set_max_fee_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ClosingSignedFeeRange_new(int64_t min_fee_satoshis_arg, int64_t max_fee_satoshis_arg) {
+       LDKClosingSignedFeeRange ret_var = ClosingSignedFeeRange_new(min_fee_satoshis_arg, max_fee_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);
+       return ret_ref;
+}
+
+static inline uint64_t ClosingSignedFeeRange_clone_ptr(LDKClosingSignedFeeRange *NONNULL_PTR arg) {
+       LDKClosingSignedFeeRange ret_var = ClosingSignedFeeRange_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_ClosingSignedFeeRange_clone_ptr(int64_t arg) {
+       LDKClosingSignedFeeRange 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 = ClosingSignedFeeRange_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ClosingSignedFeeRange_clone(int64_t orig) {
+       LDKClosingSignedFeeRange 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;
+       LDKClosingSignedFeeRange ret_var = ClosingSignedFeeRange_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_ClosingSignedFeeRange_eq(int64_t a, int64_t b) {
+       LDKClosingSignedFeeRange 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;
+       LDKClosingSignedFeeRange 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 = ClosingSignedFeeRange_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ClosingSigned_free(int64_t this_obj) {
+       LDKClosingSigned 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);
+       ClosingSigned_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ClosingSigned_get_channel_id(int64_t this_ptr) {
+       LDKClosingSigned 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, *ClosingSigned_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ClosingSigned_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKClosingSigned 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);
+       ClosingSigned_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ClosingSigned_get_fee_satoshis(int64_t this_ptr) {
+       LDKClosingSigned 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 = ClosingSigned_get_fee_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ClosingSigned_set_fee_satoshis(int64_t this_ptr, int64_t val) {
+       LDKClosingSigned 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;
+       ClosingSigned_set_fee_satoshis(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_ClosingSigned_get_signature(int64_t this_ptr) {
+       LDKClosingSigned 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(64, __LINE__);
+       memcpy(ret_arr->elems, ClosingSigned_get_signature(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_ClosingSigned_set_signature(int64_t this_ptr, int8_tArray val) {
+       LDKClosingSigned 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       ClosingSigned_set_signature(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ClosingSigned_get_fee_range(int64_t this_ptr) {
+       LDKClosingSigned 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;
+       LDKClosingSignedFeeRange ret_var = ClosingSigned_get_fee_range(&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_ClosingSigned_set_fee_range(int64_t this_ptr, int64_t val) {
+       LDKClosingSigned 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;
+       LDKClosingSignedFeeRange 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 = ClosingSignedFeeRange_clone(&val_conv);
+       ClosingSigned_set_fee_range(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ClosingSigned_new(int8_tArray channel_id_arg, int64_t fee_satoshis_arg, int8_tArray signature_arg, int64_t fee_range_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);
+       LDKECDSASignature signature_arg_ref;
+       CHECK(signature_arg->arr_len == 64);
+       memcpy(signature_arg_ref.compact_form, signature_arg->elems, 64); FREE(signature_arg);
+       LDKClosingSignedFeeRange fee_range_arg_conv;
+       fee_range_arg_conv.inner = untag_ptr(fee_range_arg);
+       fee_range_arg_conv.is_owned = ptr_is_owned(fee_range_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(fee_range_arg_conv);
+       fee_range_arg_conv = ClosingSignedFeeRange_clone(&fee_range_arg_conv);
+       LDKClosingSigned ret_var = ClosingSigned_new(channel_id_arg_ref, fee_satoshis_arg, signature_arg_ref, fee_range_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 ClosingSigned_clone_ptr(LDKClosingSigned *NONNULL_PTR arg) {
+       LDKClosingSigned ret_var = ClosingSigned_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_ClosingSigned_clone_ptr(int64_t arg) {
+       LDKClosingSigned 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 = ClosingSigned_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ClosingSigned_clone(int64_t orig) {
+       LDKClosingSigned 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;
+       LDKClosingSigned ret_var = ClosingSigned_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_ClosingSigned_eq(int64_t a, int64_t b) {
+       LDKClosingSigned 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;
+       LDKClosingSigned 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 = ClosingSigned_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateAddHTLC_free(int64_t this_obj) {
+       LDKUpdateAddHTLC 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);
+       UpdateAddHTLC_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_UpdateAddHTLC_get_channel_id(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(32, __LINE__);
+       memcpy(ret_arr->elems, *UpdateAddHTLC_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UpdateAddHTLC_set_channel_id(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;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       UpdateAddHTLC_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UpdateAddHTLC_get_htlc_id(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;
+       int64_t ret_conv = UpdateAddHTLC_get_htlc_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateAddHTLC_set_htlc_id(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;
+       UpdateAddHTLC_set_htlc_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_UpdateAddHTLC_get_amount_msat(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;
+       int64_t ret_conv = UpdateAddHTLC_get_amount_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateAddHTLC_set_amount_msat(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;
+       UpdateAddHTLC_set_amount_msat(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_UpdateAddHTLC_get_payment_hash(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(32, __LINE__);
+       memcpy(ret_arr->elems, *UpdateAddHTLC_get_payment_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UpdateAddHTLC_set_payment_hash(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;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       UpdateAddHTLC_set_payment_hash(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_UpdateAddHTLC_get_cltv_expiry(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;
+       int32_t ret_conv = UpdateAddHTLC_get_cltv_expiry(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateAddHTLC_set_cltv_expiry(int64_t this_ptr, int32_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;
+       UpdateAddHTLC_set_cltv_expiry(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_UpdateAddHTLC_get_skimmed_fee_msat(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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = UpdateAddHTLC_get_skimmed_fee_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_UpdateAddHTLC_set_skimmed_fee_msat(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;
+       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));
+       UpdateAddHTLC_set_skimmed_fee_msat(&this_ptr_conv, val_conv);
+}
+
+static inline uint64_t UpdateAddHTLC_clone_ptr(LDKUpdateAddHTLC *NONNULL_PTR arg) {
+       LDKUpdateAddHTLC ret_var = UpdateAddHTLC_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_UpdateAddHTLC_clone_ptr(int64_t arg) {
+       LDKUpdateAddHTLC 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 = UpdateAddHTLC_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UpdateAddHTLC_clone(int64_t orig) {
+       LDKUpdateAddHTLC 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;
+       LDKUpdateAddHTLC ret_var = UpdateAddHTLC_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_UpdateAddHTLC_eq(int64_t a, int64_t b) {
+       LDKUpdateAddHTLC 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;
+       LDKUpdateAddHTLC 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 = UpdateAddHTLC_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OnionMessage_free(int64_t this_obj) {
+       LDKOnionMessage 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);
+       OnionMessage_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_OnionMessage_get_blinding_point(int64_t this_ptr) {
+       LDKOnionMessage 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, OnionMessage_get_blinding_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_OnionMessage_set_blinding_point(int64_t this_ptr, int8_tArray val) {
+       LDKOnionMessage 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);
+       OnionMessage_set_blinding_point(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_OnionMessage_get_onion_routing_packet(int64_t this_ptr) {
+       LDKOnionMessage 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;
+       LDKPacket ret_var = OnionMessage_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_OnionMessage_set_onion_routing_packet(int64_t this_ptr, int64_t val) {
+       LDKOnionMessage 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;
+       LDKPacket 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 = Packet_clone(&val_conv);
+       OnionMessage_set_onion_routing_packet(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_OnionMessage_new(int8_tArray blinding_point_arg, int64_t onion_routing_packet_arg) {
+       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);
+       LDKPacket 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 = Packet_clone(&onion_routing_packet_arg_conv);
+       LDKOnionMessage ret_var = OnionMessage_new(blinding_point_arg_ref, onion_routing_packet_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 OnionMessage_clone_ptr(LDKOnionMessage *NONNULL_PTR arg) {
+       LDKOnionMessage ret_var = OnionMessage_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_OnionMessage_clone_ptr(int64_t arg) {
+       LDKOnionMessage 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 = OnionMessage_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OnionMessage_clone(int64_t orig) {
+       LDKOnionMessage 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;
+       LDKOnionMessage ret_var = OnionMessage_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_OnionMessage_eq(int64_t a, int64_t b) {
+       LDKOnionMessage 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;
+       LDKOnionMessage 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 = OnionMessage_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFulfillHTLC_free(int64_t this_obj) {
+       LDKUpdateFulfillHTLC 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);
+       UpdateFulfillHTLC_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_UpdateFulfillHTLC_get_channel_id(int64_t this_ptr) {
+       LDKUpdateFulfillHTLC 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, *UpdateFulfillHTLC_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UpdateFulfillHTLC_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKUpdateFulfillHTLC 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);
+       UpdateFulfillHTLC_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UpdateFulfillHTLC_get_htlc_id(int64_t this_ptr) {
+       LDKUpdateFulfillHTLC 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 = UpdateFulfillHTLC_get_htlc_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFulfillHTLC_set_htlc_id(int64_t this_ptr, int64_t val) {
+       LDKUpdateFulfillHTLC 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;
+       UpdateFulfillHTLC_set_htlc_id(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_UpdateFulfillHTLC_get_payment_preimage(int64_t this_ptr) {
+       LDKUpdateFulfillHTLC 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, *UpdateFulfillHTLC_get_payment_preimage(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UpdateFulfillHTLC_set_payment_preimage(int64_t this_ptr, int8_tArray val) {
+       LDKUpdateFulfillHTLC 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);
+       UpdateFulfillHTLC_set_payment_preimage(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UpdateFulfillHTLC_new(int8_tArray channel_id_arg, int64_t htlc_id_arg, int8_tArray payment_preimage_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_preimage_arg_ref;
+       CHECK(payment_preimage_arg->arr_len == 32);
+       memcpy(payment_preimage_arg_ref.data, payment_preimage_arg->elems, 32); FREE(payment_preimage_arg);
+       LDKUpdateFulfillHTLC ret_var = UpdateFulfillHTLC_new(channel_id_arg_ref, htlc_id_arg, payment_preimage_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 UpdateFulfillHTLC_clone_ptr(LDKUpdateFulfillHTLC *NONNULL_PTR arg) {
+       LDKUpdateFulfillHTLC ret_var = UpdateFulfillHTLC_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_UpdateFulfillHTLC_clone_ptr(int64_t arg) {
+       LDKUpdateFulfillHTLC 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 = UpdateFulfillHTLC_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UpdateFulfillHTLC_clone(int64_t orig) {
+       LDKUpdateFulfillHTLC 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;
+       LDKUpdateFulfillHTLC ret_var = UpdateFulfillHTLC_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_UpdateFulfillHTLC_eq(int64_t a, int64_t b) {
+       LDKUpdateFulfillHTLC 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;
+       LDKUpdateFulfillHTLC 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 = UpdateFulfillHTLC_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFailHTLC_free(int64_t this_obj) {
+       LDKUpdateFailHTLC 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);
+       UpdateFailHTLC_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_UpdateFailHTLC_get_channel_id(int64_t this_ptr) {
+       LDKUpdateFailHTLC 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, *UpdateFailHTLC_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UpdateFailHTLC_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKUpdateFailHTLC 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);
+       UpdateFailHTLC_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UpdateFailHTLC_get_htlc_id(int64_t this_ptr) {
+       LDKUpdateFailHTLC 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 = UpdateFailHTLC_get_htlc_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFailHTLC_set_htlc_id(int64_t this_ptr, int64_t val) {
+       LDKUpdateFailHTLC 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;
+       UpdateFailHTLC_set_htlc_id(&this_ptr_conv, val);
+}
+
+static inline uint64_t UpdateFailHTLC_clone_ptr(LDKUpdateFailHTLC *NONNULL_PTR arg) {
+       LDKUpdateFailHTLC ret_var = UpdateFailHTLC_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_UpdateFailHTLC_clone_ptr(int64_t arg) {
+       LDKUpdateFailHTLC 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 = UpdateFailHTLC_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UpdateFailHTLC_clone(int64_t orig) {
+       LDKUpdateFailHTLC 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;
+       LDKUpdateFailHTLC ret_var = UpdateFailHTLC_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_UpdateFailHTLC_eq(int64_t a, int64_t b) {
+       LDKUpdateFailHTLC 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;
+       LDKUpdateFailHTLC 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 = UpdateFailHTLC_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFailMalformedHTLC_free(int64_t this_obj) {
+       LDKUpdateFailMalformedHTLC 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);
+       UpdateFailMalformedHTLC_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_UpdateFailMalformedHTLC_get_channel_id(int64_t this_ptr) {
+       LDKUpdateFailMalformedHTLC 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, *UpdateFailMalformedHTLC_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UpdateFailMalformedHTLC_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKUpdateFailMalformedHTLC 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);
+       UpdateFailMalformedHTLC_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UpdateFailMalformedHTLC_get_htlc_id(int64_t this_ptr) {
+       LDKUpdateFailMalformedHTLC 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 = UpdateFailMalformedHTLC_get_htlc_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFailMalformedHTLC_set_htlc_id(int64_t this_ptr, int64_t val) {
+       LDKUpdateFailMalformedHTLC 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;
+       UpdateFailMalformedHTLC_set_htlc_id(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_UpdateFailMalformedHTLC_get_failure_code(int64_t this_ptr) {
+       LDKUpdateFailMalformedHTLC 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 = UpdateFailMalformedHTLC_get_failure_code(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFailMalformedHTLC_set_failure_code(int64_t this_ptr, int16_t val) {
+       LDKUpdateFailMalformedHTLC 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;
+       UpdateFailMalformedHTLC_set_failure_code(&this_ptr_conv, val);
+}
+
+static inline uint64_t UpdateFailMalformedHTLC_clone_ptr(LDKUpdateFailMalformedHTLC *NONNULL_PTR arg) {
+       LDKUpdateFailMalformedHTLC ret_var = UpdateFailMalformedHTLC_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_UpdateFailMalformedHTLC_clone_ptr(int64_t arg) {
+       LDKUpdateFailMalformedHTLC 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 = UpdateFailMalformedHTLC_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UpdateFailMalformedHTLC_clone(int64_t orig) {
+       LDKUpdateFailMalformedHTLC 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;
+       LDKUpdateFailMalformedHTLC ret_var = UpdateFailMalformedHTLC_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_UpdateFailMalformedHTLC_eq(int64_t a, int64_t b) {
+       LDKUpdateFailMalformedHTLC 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;
+       LDKUpdateFailMalformedHTLC 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 = UpdateFailMalformedHTLC_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CommitmentSigned_free(int64_t this_obj) {
+       LDKCommitmentSigned 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);
+       CommitmentSigned_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_CommitmentSigned_get_channel_id(int64_t this_ptr) {
+       LDKCommitmentSigned 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, *CommitmentSigned_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_CommitmentSigned_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKCommitmentSigned 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);
+       CommitmentSigned_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_CommitmentSigned_get_signature(int64_t this_ptr) {
+       LDKCommitmentSigned 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(64, __LINE__);
+       memcpy(ret_arr->elems, CommitmentSigned_get_signature(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_CommitmentSigned_set_signature(int64_t this_ptr, int8_tArray val) {
+       LDKCommitmentSigned 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       CommitmentSigned_set_signature(&this_ptr_conv, val_ref);
+}
+
+ptrArray  CS_LDK_CommitmentSigned_get_htlc_signatures(int64_t this_ptr) {
+       LDKCommitmentSigned 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_ECDSASignatureZ ret_var = CommitmentSigned_get_htlc_signatures(&this_ptr_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;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_CommitmentSigned_set_htlc_signatures(int64_t this_ptr, ptrArray val) {
+       LDKCommitmentSigned 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_ECDSASignatureZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKECDSASignature), "LDKCVec_ECDSASignatureZ Elements");
+       else
+               val_constr.data = NULL;
+       int8_tArray* val_vals = (void*) val->elems;
+       for (size_t i = 0; i < val_constr.datalen; i++) {
+               int8_tArray val_conv_8 = val_vals[i];
+               LDKECDSASignature val_conv_8_ref;
+               CHECK(val_conv_8->arr_len == 64);
+               memcpy(val_conv_8_ref.compact_form, val_conv_8->elems, 64); FREE(val_conv_8);
+               val_constr.data[i] = val_conv_8_ref;
+       }
+       FREE(val);
+       CommitmentSigned_set_htlc_signatures(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_CommitmentSigned_new(int8_tArray channel_id_arg, int8_tArray signature_arg, ptrArray htlc_signatures_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);
+       LDKECDSASignature signature_arg_ref;
+       CHECK(signature_arg->arr_len == 64);
+       memcpy(signature_arg_ref.compact_form, signature_arg->elems, 64); FREE(signature_arg);
+       LDKCVec_ECDSASignatureZ htlc_signatures_arg_constr;
+       htlc_signatures_arg_constr.datalen = htlc_signatures_arg->arr_len;
+       if (htlc_signatures_arg_constr.datalen > 0)
+               htlc_signatures_arg_constr.data = MALLOC(htlc_signatures_arg_constr.datalen * sizeof(LDKECDSASignature), "LDKCVec_ECDSASignatureZ Elements");
+       else
+               htlc_signatures_arg_constr.data = NULL;
+       int8_tArray* htlc_signatures_arg_vals = (void*) htlc_signatures_arg->elems;
+       for (size_t i = 0; i < htlc_signatures_arg_constr.datalen; i++) {
+               int8_tArray htlc_signatures_arg_conv_8 = htlc_signatures_arg_vals[i];
+               LDKECDSASignature htlc_signatures_arg_conv_8_ref;
+               CHECK(htlc_signatures_arg_conv_8->arr_len == 64);
+               memcpy(htlc_signatures_arg_conv_8_ref.compact_form, htlc_signatures_arg_conv_8->elems, 64); FREE(htlc_signatures_arg_conv_8);
+               htlc_signatures_arg_constr.data[i] = htlc_signatures_arg_conv_8_ref;
+       }
+       FREE(htlc_signatures_arg);
+       LDKCommitmentSigned ret_var = CommitmentSigned_new(channel_id_arg_ref, signature_arg_ref, htlc_signatures_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);
+       return ret_ref;
+}
+
+static inline uint64_t CommitmentSigned_clone_ptr(LDKCommitmentSigned *NONNULL_PTR arg) {
+       LDKCommitmentSigned ret_var = CommitmentSigned_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_CommitmentSigned_clone_ptr(int64_t arg) {
+       LDKCommitmentSigned 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 = CommitmentSigned_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CommitmentSigned_clone(int64_t orig) {
+       LDKCommitmentSigned 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;
+       LDKCommitmentSigned ret_var = CommitmentSigned_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_CommitmentSigned_eq(int64_t a, int64_t b) {
+       LDKCommitmentSigned 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;
+       LDKCommitmentSigned 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 = CommitmentSigned_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RevokeAndACK_free(int64_t this_obj) {
+       LDKRevokeAndACK 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);
+       RevokeAndACK_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_RevokeAndACK_get_channel_id(int64_t this_ptr) {
+       LDKRevokeAndACK 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, *RevokeAndACK_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_RevokeAndACK_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKRevokeAndACK 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);
+       RevokeAndACK_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_RevokeAndACK_get_per_commitment_secret(int64_t this_ptr) {
+       LDKRevokeAndACK 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, *RevokeAndACK_get_per_commitment_secret(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_RevokeAndACK_set_per_commitment_secret(int64_t this_ptr, int8_tArray val) {
+       LDKRevokeAndACK 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);
+       RevokeAndACK_set_per_commitment_secret(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_RevokeAndACK_get_next_per_commitment_point(int64_t this_ptr) {
+       LDKRevokeAndACK 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, RevokeAndACK_get_next_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_RevokeAndACK_set_next_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKRevokeAndACK 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);
+       RevokeAndACK_set_next_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_RevokeAndACK_new(int8_tArray channel_id_arg, int8_tArray per_commitment_secret_arg, int8_tArray next_per_commitment_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 per_commitment_secret_arg_ref;
+       CHECK(per_commitment_secret_arg->arr_len == 32);
+       memcpy(per_commitment_secret_arg_ref.data, per_commitment_secret_arg->elems, 32); FREE(per_commitment_secret_arg);
+       LDKPublicKey next_per_commitment_point_arg_ref;
+       CHECK(next_per_commitment_point_arg->arr_len == 33);
+       memcpy(next_per_commitment_point_arg_ref.compressed_form, next_per_commitment_point_arg->elems, 33); FREE(next_per_commitment_point_arg);
+       LDKRevokeAndACK ret_var = RevokeAndACK_new(channel_id_arg_ref, per_commitment_secret_arg_ref, next_per_commitment_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 RevokeAndACK_clone_ptr(LDKRevokeAndACK *NONNULL_PTR arg) {
+       LDKRevokeAndACK ret_var = RevokeAndACK_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_RevokeAndACK_clone_ptr(int64_t arg) {
+       LDKRevokeAndACK 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 = RevokeAndACK_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RevokeAndACK_clone(int64_t orig) {
+       LDKRevokeAndACK 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;
+       LDKRevokeAndACK ret_var = RevokeAndACK_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_RevokeAndACK_eq(int64_t a, int64_t b) {
+       LDKRevokeAndACK 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;
+       LDKRevokeAndACK 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 = RevokeAndACK_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFee_free(int64_t this_obj) {
+       LDKUpdateFee 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);
+       UpdateFee_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_UpdateFee_get_channel_id(int64_t this_ptr) {
+       LDKUpdateFee 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, *UpdateFee_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UpdateFee_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKUpdateFee 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);
+       UpdateFee_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_UpdateFee_get_feerate_per_kw(int64_t this_ptr) {
+       LDKUpdateFee 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 = UpdateFee_get_feerate_per_kw(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UpdateFee_set_feerate_per_kw(int64_t this_ptr, int32_t val) {
+       LDKUpdateFee 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;
+       UpdateFee_set_feerate_per_kw(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_UpdateFee_new(int8_tArray channel_id_arg, int32_t feerate_per_kw_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);
+       LDKUpdateFee ret_var = UpdateFee_new(channel_id_arg_ref, feerate_per_kw_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 UpdateFee_clone_ptr(LDKUpdateFee *NONNULL_PTR arg) {
+       LDKUpdateFee ret_var = UpdateFee_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_UpdateFee_clone_ptr(int64_t arg) {
+       LDKUpdateFee 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 = UpdateFee_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UpdateFee_clone(int64_t orig) {
+       LDKUpdateFee 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;
+       LDKUpdateFee ret_var = UpdateFee_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_UpdateFee_eq(int64_t a, int64_t b) {
+       LDKUpdateFee 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;
+       LDKUpdateFee 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 = UpdateFee_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelReestablish_free(int64_t this_obj) {
+       LDKChannelReestablish 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);
+       ChannelReestablish_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ChannelReestablish_get_channel_id(int64_t this_ptr) {
+       LDKChannelReestablish 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, *ChannelReestablish_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelReestablish_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKChannelReestablish 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);
+       ChannelReestablish_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelReestablish_get_next_local_commitment_number(int64_t this_ptr) {
+       LDKChannelReestablish 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 = ChannelReestablish_get_next_local_commitment_number(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelReestablish_set_next_local_commitment_number(int64_t this_ptr, int64_t val) {
+       LDKChannelReestablish 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;
+       ChannelReestablish_set_next_local_commitment_number(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelReestablish_get_next_remote_commitment_number(int64_t this_ptr) {
+       LDKChannelReestablish 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 = ChannelReestablish_get_next_remote_commitment_number(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelReestablish_set_next_remote_commitment_number(int64_t this_ptr, int64_t val) {
+       LDKChannelReestablish 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;
+       ChannelReestablish_set_next_remote_commitment_number(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_ChannelReestablish_get_your_last_per_commitment_secret(int64_t this_ptr) {
+       LDKChannelReestablish 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, *ChannelReestablish_get_your_last_per_commitment_secret(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelReestablish_set_your_last_per_commitment_secret(int64_t this_ptr, int8_tArray val) {
+       LDKChannelReestablish 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);
+       ChannelReestablish_set_your_last_per_commitment_secret(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_ChannelReestablish_get_my_current_per_commitment_point(int64_t this_ptr) {
+       LDKChannelReestablish 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, ChannelReestablish_get_my_current_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelReestablish_set_my_current_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKChannelReestablish 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);
+       ChannelReestablish_set_my_current_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelReestablish_get_next_funding_txid(int64_t this_ptr) {
+       LDKChannelReestablish 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 = ChannelReestablish_get_next_funding_txid(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelReestablish_set_next_funding_txid(int64_t this_ptr, int64_t val) {
+       LDKChannelReestablish 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));
+       ChannelReestablish_set_next_funding_txid(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelReestablish_new(int8_tArray channel_id_arg, int64_t next_local_commitment_number_arg, int64_t next_remote_commitment_number_arg, int8_tArray your_last_per_commitment_secret_arg, int8_tArray my_current_per_commitment_point_arg, int64_t next_funding_txid_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 your_last_per_commitment_secret_arg_ref;
+       CHECK(your_last_per_commitment_secret_arg->arr_len == 32);
+       memcpy(your_last_per_commitment_secret_arg_ref.data, your_last_per_commitment_secret_arg->elems, 32); FREE(your_last_per_commitment_secret_arg);
+       LDKPublicKey my_current_per_commitment_point_arg_ref;
+       CHECK(my_current_per_commitment_point_arg->arr_len == 33);
+       memcpy(my_current_per_commitment_point_arg_ref.compressed_form, my_current_per_commitment_point_arg->elems, 33); FREE(my_current_per_commitment_point_arg);
+       void* next_funding_txid_arg_ptr = untag_ptr(next_funding_txid_arg);
+       CHECK_ACCESS(next_funding_txid_arg_ptr);
+       LDKCOption_ThirtyTwoBytesZ next_funding_txid_arg_conv = *(LDKCOption_ThirtyTwoBytesZ*)(next_funding_txid_arg_ptr);
+       next_funding_txid_arg_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(next_funding_txid_arg));
+       LDKChannelReestablish ret_var = ChannelReestablish_new(channel_id_arg_ref, next_local_commitment_number_arg, next_remote_commitment_number_arg, your_last_per_commitment_secret_arg_ref, my_current_per_commitment_point_arg_ref, next_funding_txid_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 ChannelReestablish_clone_ptr(LDKChannelReestablish *NONNULL_PTR arg) {
+       LDKChannelReestablish ret_var = ChannelReestablish_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_ChannelReestablish_clone_ptr(int64_t arg) {
+       LDKChannelReestablish 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 = ChannelReestablish_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelReestablish_clone(int64_t orig) {
+       LDKChannelReestablish 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;
+       LDKChannelReestablish ret_var = ChannelReestablish_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_ChannelReestablish_eq(int64_t a, int64_t b) {
+       LDKChannelReestablish 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;
+       LDKChannelReestablish 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 = ChannelReestablish_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AnnouncementSignatures_free(int64_t this_obj) {
+       LDKAnnouncementSignatures 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);
+       AnnouncementSignatures_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_AnnouncementSignatures_get_channel_id(int64_t this_ptr) {
+       LDKAnnouncementSignatures 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, *AnnouncementSignatures_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_AnnouncementSignatures_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKAnnouncementSignatures 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);
+       AnnouncementSignatures_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_AnnouncementSignatures_get_short_channel_id(int64_t this_ptr) {
+       LDKAnnouncementSignatures 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 = AnnouncementSignatures_get_short_channel_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_AnnouncementSignatures_set_short_channel_id(int64_t this_ptr, int64_t val) {
+       LDKAnnouncementSignatures 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;
+       AnnouncementSignatures_set_short_channel_id(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_AnnouncementSignatures_get_node_signature(int64_t this_ptr) {
+       LDKAnnouncementSignatures 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(64, __LINE__);
+       memcpy(ret_arr->elems, AnnouncementSignatures_get_node_signature(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_AnnouncementSignatures_set_node_signature(int64_t this_ptr, int8_tArray val) {
+       LDKAnnouncementSignatures 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       AnnouncementSignatures_set_node_signature(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_AnnouncementSignatures_get_bitcoin_signature(int64_t this_ptr) {
+       LDKAnnouncementSignatures 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(64, __LINE__);
+       memcpy(ret_arr->elems, AnnouncementSignatures_get_bitcoin_signature(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_AnnouncementSignatures_set_bitcoin_signature(int64_t this_ptr, int8_tArray val) {
+       LDKAnnouncementSignatures 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       AnnouncementSignatures_set_bitcoin_signature(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_AnnouncementSignatures_new(int8_tArray channel_id_arg, int64_t short_channel_id_arg, int8_tArray node_signature_arg, int8_tArray bitcoin_signature_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);
+       LDKECDSASignature node_signature_arg_ref;
+       CHECK(node_signature_arg->arr_len == 64);
+       memcpy(node_signature_arg_ref.compact_form, node_signature_arg->elems, 64); FREE(node_signature_arg);
+       LDKECDSASignature bitcoin_signature_arg_ref;
+       CHECK(bitcoin_signature_arg->arr_len == 64);
+       memcpy(bitcoin_signature_arg_ref.compact_form, bitcoin_signature_arg->elems, 64); FREE(bitcoin_signature_arg);
+       LDKAnnouncementSignatures ret_var = AnnouncementSignatures_new(channel_id_arg_ref, short_channel_id_arg, node_signature_arg_ref, bitcoin_signature_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 AnnouncementSignatures_clone_ptr(LDKAnnouncementSignatures *NONNULL_PTR arg) {
+       LDKAnnouncementSignatures ret_var = AnnouncementSignatures_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_AnnouncementSignatures_clone_ptr(int64_t arg) {
+       LDKAnnouncementSignatures 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 = AnnouncementSignatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_AnnouncementSignatures_clone(int64_t orig) {
+       LDKAnnouncementSignatures 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;
+       LDKAnnouncementSignatures ret_var = AnnouncementSignatures_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_AnnouncementSignatures_eq(int64_t a, int64_t b) {
+       LDKAnnouncementSignatures 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;
+       LDKAnnouncementSignatures 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 = AnnouncementSignatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_SocketAddress_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);
+       LDKSocketAddress this_ptr_conv = *(LDKSocketAddress*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       SocketAddress_free(this_ptr_conv);
+}
+
+static inline uint64_t SocketAddress_clone_ptr(LDKSocketAddress *NONNULL_PTR arg) {
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = SocketAddress_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_SocketAddress_clone_ptr(int64_t arg) {
+       LDKSocketAddress* arg_conv = (LDKSocketAddress*)untag_ptr(arg);
+       int64_t ret_conv = SocketAddress_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SocketAddress_clone(int64_t orig) {
+       LDKSocketAddress* orig_conv = (LDKSocketAddress*)untag_ptr(orig);
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = SocketAddress_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SocketAddress_tcp_ip_v4(int8_tArray addr, int16_t port) {
+       LDKFourBytes addr_ref;
+       CHECK(addr->arr_len == 4);
+       memcpy(addr_ref.data, addr->elems, 4); FREE(addr);
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = SocketAddress_tcp_ip_v4(addr_ref, port);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SocketAddress_tcp_ip_v6(int8_tArray addr, int16_t port) {
+       LDKSixteenBytes addr_ref;
+       CHECK(addr->arr_len == 16);
+       memcpy(addr_ref.data, addr->elems, 16); FREE(addr);
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = SocketAddress_tcp_ip_v6(addr_ref, port);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SocketAddress_onion_v2(int8_tArray a) {
+       LDKTwelveBytes a_ref;
+       CHECK(a->arr_len == 12);
+       memcpy(a_ref.data, a->elems, 12); FREE(a);
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = SocketAddress_onion_v2(a_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SocketAddress_onion_v3(int8_tArray ed25519_pubkey, int16_t checksum, int8_t version, int16_t port) {
+       LDKThirtyTwoBytes ed25519_pubkey_ref;
+       CHECK(ed25519_pubkey->arr_len == 32);
+       memcpy(ed25519_pubkey_ref.data, ed25519_pubkey->elems, 32); FREE(ed25519_pubkey);
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = SocketAddress_onion_v3(ed25519_pubkey_ref, checksum, version, port);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SocketAddress_hostname(int64_t hostname, int16_t port) {
+       LDKHostname hostname_conv;
+       hostname_conv.inner = untag_ptr(hostname);
+       hostname_conv.is_owned = ptr_is_owned(hostname);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(hostname_conv);
+       hostname_conv = Hostname_clone(&hostname_conv);
+       LDKSocketAddress *ret_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+       *ret_copy = SocketAddress_hostname(hostname_conv, port);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+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);
+       jboolean ret_conv = SocketAddress_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_SocketAddress_write(int64_t obj) {
+       LDKSocketAddress* obj_conv = (LDKSocketAddress*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = SocketAddress_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_SocketAddress_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_SocketAddressDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressDecodeErrorZ), "LDKCResult_SocketAddressDecodeErrorZ");
+       *ret_conv = SocketAddress_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int32_t  CS_LDK_SocketAddressParseError_clone(int64_t orig) {
+       LDKSocketAddressParseError* orig_conv = (LDKSocketAddressParseError*)untag_ptr(orig);
+       int32_t ret_conv = LDKSocketAddressParseError_to_cs(SocketAddressParseError_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SocketAddressParseError_socket_addr_parse() {
+       int32_t ret_conv = LDKSocketAddressParseError_to_cs(SocketAddressParseError_socket_addr_parse());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SocketAddressParseError_invalid_input() {
+       int32_t ret_conv = LDKSocketAddressParseError_to_cs(SocketAddressParseError_invalid_input());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SocketAddressParseError_invalid_port() {
+       int32_t ret_conv = LDKSocketAddressParseError_to_cs(SocketAddressParseError_invalid_port());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SocketAddressParseError_invalid_onion_v3() {
+       int32_t ret_conv = LDKSocketAddressParseError_to_cs(SocketAddressParseError_invalid_onion_v3());
+       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);
+       jboolean ret_conv = SocketAddressParseError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_parse_onion_address(jstring host, int16_t port) {
+       LDKStr host_conv = str_ref_to_owned_c(host);
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressSocketAddressParseErrorZ), "LDKCResult_SocketAddressSocketAddressParseErrorZ");
+       *ret_conv = parse_onion_address(host_conv, port);
+       return tag_ptr(ret_conv, true);
+}
+
+jstring  CS_LDK_SocketAddress_to_str(int64_t o) {
+       LDKSocketAddress* o_conv = (LDKSocketAddress*)untag_ptr(o);
+       LDKStr ret_str = SocketAddress_to_str(o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SocketAddress_from_str(jstring s) {
+       LDKStr s_conv = str_ref_to_owned_c(s);
+       LDKCResult_SocketAddressSocketAddressParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SocketAddressSocketAddressParseErrorZ), "LDKCResult_SocketAddressSocketAddressParseErrorZ");
+       *ret_conv = SocketAddress_from_str(s_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_UnsignedGossipMessage_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);
+       LDKUnsignedGossipMessage this_ptr_conv = *(LDKUnsignedGossipMessage*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       UnsignedGossipMessage_free(this_ptr_conv);
+}
+
+static inline uint64_t UnsignedGossipMessage_clone_ptr(LDKUnsignedGossipMessage *NONNULL_PTR arg) {
+       LDKUnsignedGossipMessage *ret_copy = MALLOC(sizeof(LDKUnsignedGossipMessage), "LDKUnsignedGossipMessage");
+       *ret_copy = UnsignedGossipMessage_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_UnsignedGossipMessage_clone_ptr(int64_t arg) {
+       LDKUnsignedGossipMessage* arg_conv = (LDKUnsignedGossipMessage*)untag_ptr(arg);
+       int64_t ret_conv = UnsignedGossipMessage_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UnsignedGossipMessage_clone(int64_t orig) {
+       LDKUnsignedGossipMessage* orig_conv = (LDKUnsignedGossipMessage*)untag_ptr(orig);
+       LDKUnsignedGossipMessage *ret_copy = MALLOC(sizeof(LDKUnsignedGossipMessage), "LDKUnsignedGossipMessage");
+       *ret_copy = UnsignedGossipMessage_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UnsignedGossipMessage_channel_announcement(int64_t a) {
+       LDKUnsignedChannelAnnouncement 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 = UnsignedChannelAnnouncement_clone(&a_conv);
+       LDKUnsignedGossipMessage *ret_copy = MALLOC(sizeof(LDKUnsignedGossipMessage), "LDKUnsignedGossipMessage");
+       *ret_copy = UnsignedGossipMessage_channel_announcement(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UnsignedGossipMessage_channel_update(int64_t a) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_clone(&a_conv);
+       LDKUnsignedGossipMessage *ret_copy = MALLOC(sizeof(LDKUnsignedGossipMessage), "LDKUnsignedGossipMessage");
+       *ret_copy = UnsignedGossipMessage_channel_update(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UnsignedGossipMessage_node_announcement(int64_t a) {
+       LDKUnsignedNodeAnnouncement 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 = UnsignedNodeAnnouncement_clone(&a_conv);
+       LDKUnsignedGossipMessage *ret_copy = MALLOC(sizeof(LDKUnsignedGossipMessage), "LDKUnsignedGossipMessage");
+       *ret_copy = UnsignedGossipMessage_node_announcement(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_UnsignedGossipMessage_write(int64_t obj) {
+       LDKUnsignedGossipMessage* obj_conv = (LDKUnsignedGossipMessage*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = UnsignedGossipMessage_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;
+}
+
+void  CS_LDK_UnsignedNodeAnnouncement_free(int64_t this_obj) {
+       LDKUnsignedNodeAnnouncement 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);
+       UnsignedNodeAnnouncement_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_UnsignedNodeAnnouncement_get_features(int64_t this_ptr) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKNodeFeatures ret_var = UnsignedNodeAnnouncement_get_features(&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_UnsignedNodeAnnouncement_set_features(int64_t this_ptr, int64_t val) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKNodeFeatures 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 = NodeFeatures_clone(&val_conv);
+       UnsignedNodeAnnouncement_set_features(&this_ptr_conv, val_conv);
+}
+
+int32_t  CS_LDK_UnsignedNodeAnnouncement_get_timestamp(int64_t this_ptr) {
+       LDKUnsignedNodeAnnouncement 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 = UnsignedNodeAnnouncement_get_timestamp(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedNodeAnnouncement_set_timestamp(int64_t this_ptr, int32_t val) {
+       LDKUnsignedNodeAnnouncement 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;
+       UnsignedNodeAnnouncement_set_timestamp(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_UnsignedNodeAnnouncement_get_node_id(int64_t this_ptr) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKNodeId ret_var = UnsignedNodeAnnouncement_get_node_id(&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_UnsignedNodeAnnouncement_set_node_id(int64_t this_ptr, int64_t val) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKNodeId 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 = NodeId_clone(&val_conv);
+       UnsignedNodeAnnouncement_set_node_id(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_UnsignedNodeAnnouncement_get_rgb(int64_t this_ptr) {
+       LDKUnsignedNodeAnnouncement 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(3, __LINE__);
+       memcpy(ret_arr->elems, *UnsignedNodeAnnouncement_get_rgb(&this_ptr_conv), 3);
+       return ret_arr;
+}
+
+void  CS_LDK_UnsignedNodeAnnouncement_set_rgb(int64_t this_ptr, int8_tArray val) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKThreeBytes val_ref;
+       CHECK(val->arr_len == 3);
+       memcpy(val_ref.data, val->elems, 3); FREE(val);
+       UnsignedNodeAnnouncement_set_rgb(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UnsignedNodeAnnouncement_get_alias(int64_t this_ptr) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKNodeAlias ret_var = UnsignedNodeAnnouncement_get_alias(&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_UnsignedNodeAnnouncement_set_alias(int64_t this_ptr, int64_t val) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKNodeAlias 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 = NodeAlias_clone(&val_conv);
+       UnsignedNodeAnnouncement_set_alias(&this_ptr_conv, val_conv);
+}
+
+int64_tArray  CS_LDK_UnsignedNodeAnnouncement_get_addresses(int64_t this_ptr) {
+       LDKUnsignedNodeAnnouncement 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_SocketAddressZ ret_var = UnsignedNodeAnnouncement_get_addresses(&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 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;
+}
+
+void  CS_LDK_UnsignedNodeAnnouncement_set_addresses(int64_t this_ptr, int64_tArray val) {
+       LDKUnsignedNodeAnnouncement 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_SocketAddressZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKSocketAddress), "LDKCVec_SocketAddressZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t p = 0; p < val_constr.datalen; p++) {
+               int64_t val_conv_15 = val_vals[p];
+               void* val_conv_15_ptr = untag_ptr(val_conv_15);
+               CHECK_ACCESS(val_conv_15_ptr);
+               LDKSocketAddress val_conv_15_conv = *(LDKSocketAddress*)(val_conv_15_ptr);
+               val_conv_15_conv = SocketAddress_clone((LDKSocketAddress*)untag_ptr(val_conv_15));
+               val_constr.data[p] = val_conv_15_conv;
+       }
+       FREE(val);
+       UnsignedNodeAnnouncement_set_addresses(&this_ptr_conv, val_constr);
+}
+
+static inline uint64_t UnsignedNodeAnnouncement_clone_ptr(LDKUnsignedNodeAnnouncement *NONNULL_PTR arg) {
+       LDKUnsignedNodeAnnouncement ret_var = UnsignedNodeAnnouncement_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_UnsignedNodeAnnouncement_clone_ptr(int64_t arg) {
+       LDKUnsignedNodeAnnouncement 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 = UnsignedNodeAnnouncement_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UnsignedNodeAnnouncement_clone(int64_t orig) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKUnsignedNodeAnnouncement ret_var = UnsignedNodeAnnouncement_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_UnsignedNodeAnnouncement_eq(int64_t a, int64_t b) {
+       LDKUnsignedNodeAnnouncement 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;
+       LDKUnsignedNodeAnnouncement 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 = UnsignedNodeAnnouncement_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeAnnouncement_free(int64_t this_obj) {
+       LDKNodeAnnouncement 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);
+       NodeAnnouncement_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_NodeAnnouncement_get_signature(int64_t this_ptr) {
+       LDKNodeAnnouncement 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(64, __LINE__);
+       memcpy(ret_arr->elems, NodeAnnouncement_get_signature(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_NodeAnnouncement_set_signature(int64_t this_ptr, int8_tArray val) {
+       LDKNodeAnnouncement 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       NodeAnnouncement_set_signature(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_NodeAnnouncement_get_contents(int64_t this_ptr) {
+       LDKNodeAnnouncement 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;
+       LDKUnsignedNodeAnnouncement ret_var = NodeAnnouncement_get_contents(&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_NodeAnnouncement_set_contents(int64_t this_ptr, int64_t val) {
+       LDKNodeAnnouncement 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;
+       LDKUnsignedNodeAnnouncement 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 = UnsignedNodeAnnouncement_clone(&val_conv);
+       NodeAnnouncement_set_contents(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_NodeAnnouncement_new(int8_tArray signature_arg, int64_t contents_arg) {
+       LDKECDSASignature signature_arg_ref;
+       CHECK(signature_arg->arr_len == 64);
+       memcpy(signature_arg_ref.compact_form, signature_arg->elems, 64); FREE(signature_arg);
+       LDKUnsignedNodeAnnouncement contents_arg_conv;
+       contents_arg_conv.inner = untag_ptr(contents_arg);
+       contents_arg_conv.is_owned = ptr_is_owned(contents_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(contents_arg_conv);
+       contents_arg_conv = UnsignedNodeAnnouncement_clone(&contents_arg_conv);
+       LDKNodeAnnouncement ret_var = NodeAnnouncement_new(signature_arg_ref, contents_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 NodeAnnouncement_clone_ptr(LDKNodeAnnouncement *NONNULL_PTR arg) {
+       LDKNodeAnnouncement ret_var = NodeAnnouncement_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_NodeAnnouncement_clone_ptr(int64_t arg) {
+       LDKNodeAnnouncement 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 = NodeAnnouncement_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NodeAnnouncement_clone(int64_t orig) {
+       LDKNodeAnnouncement 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;
+       LDKNodeAnnouncement ret_var = NodeAnnouncement_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_NodeAnnouncement_eq(int64_t a, int64_t b) {
+       LDKNodeAnnouncement 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;
+       LDKNodeAnnouncement 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 = NodeAnnouncement_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelAnnouncement_free(int64_t this_obj) {
+       LDKUnsignedChannelAnnouncement 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);
+       UnsignedChannelAnnouncement_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_UnsignedChannelAnnouncement_get_features(int64_t this_ptr) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKChannelFeatures ret_var = UnsignedChannelAnnouncement_get_features(&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_UnsignedChannelAnnouncement_set_features(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKChannelFeatures 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 = ChannelFeatures_clone(&val_conv);
+       UnsignedChannelAnnouncement_set_features(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_UnsignedChannelAnnouncement_get_chain_hash(int64_t this_ptr) {
+       LDKUnsignedChannelAnnouncement 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, *UnsignedChannelAnnouncement_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UnsignedChannelAnnouncement_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKUnsignedChannelAnnouncement 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);
+       UnsignedChannelAnnouncement_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UnsignedChannelAnnouncement_get_short_channel_id(int64_t this_ptr) {
+       LDKUnsignedChannelAnnouncement 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 = UnsignedChannelAnnouncement_get_short_channel_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelAnnouncement_set_short_channel_id(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelAnnouncement 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;
+       UnsignedChannelAnnouncement_set_short_channel_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_UnsignedChannelAnnouncement_get_node_id_1(int64_t this_ptr) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKNodeId ret_var = UnsignedChannelAnnouncement_get_node_id_1(&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_UnsignedChannelAnnouncement_set_node_id_1(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKNodeId 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 = NodeId_clone(&val_conv);
+       UnsignedChannelAnnouncement_set_node_id_1(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_UnsignedChannelAnnouncement_get_node_id_2(int64_t this_ptr) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKNodeId ret_var = UnsignedChannelAnnouncement_get_node_id_2(&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_UnsignedChannelAnnouncement_set_node_id_2(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKNodeId 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 = NodeId_clone(&val_conv);
+       UnsignedChannelAnnouncement_set_node_id_2(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_UnsignedChannelAnnouncement_get_bitcoin_key_1(int64_t this_ptr) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKNodeId ret_var = UnsignedChannelAnnouncement_get_bitcoin_key_1(&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_UnsignedChannelAnnouncement_set_bitcoin_key_1(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKNodeId 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 = NodeId_clone(&val_conv);
+       UnsignedChannelAnnouncement_set_bitcoin_key_1(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_UnsignedChannelAnnouncement_get_bitcoin_key_2(int64_t this_ptr) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKNodeId ret_var = UnsignedChannelAnnouncement_get_bitcoin_key_2(&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_UnsignedChannelAnnouncement_set_bitcoin_key_2(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKNodeId 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 = NodeId_clone(&val_conv);
+       UnsignedChannelAnnouncement_set_bitcoin_key_2(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_UnsignedChannelAnnouncement_get_excess_data(int64_t this_ptr) {
+       LDKUnsignedChannelAnnouncement 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 = UnsignedChannelAnnouncement_get_excess_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_UnsignedChannelAnnouncement_set_excess_data(int64_t this_ptr, int8_tArray val) {
+       LDKUnsignedChannelAnnouncement 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);
+       UnsignedChannelAnnouncement_set_excess_data(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UnsignedChannelAnnouncement_new(int64_t features_arg, int8_tArray chain_hash_arg, int64_t short_channel_id_arg, int64_t node_id_1_arg, int64_t node_id_2_arg, int64_t bitcoin_key_1_arg, int64_t bitcoin_key_2_arg, int8_tArray excess_data_arg) {
+       LDKChannelFeatures features_arg_conv;
+       features_arg_conv.inner = untag_ptr(features_arg);
+       features_arg_conv.is_owned = ptr_is_owned(features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_arg_conv);
+       features_arg_conv = ChannelFeatures_clone(&features_arg_conv);
+       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);
+       LDKNodeId node_id_1_arg_conv;
+       node_id_1_arg_conv.inner = untag_ptr(node_id_1_arg);
+       node_id_1_arg_conv.is_owned = ptr_is_owned(node_id_1_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_id_1_arg_conv);
+       node_id_1_arg_conv = NodeId_clone(&node_id_1_arg_conv);
+       LDKNodeId node_id_2_arg_conv;
+       node_id_2_arg_conv.inner = untag_ptr(node_id_2_arg);
+       node_id_2_arg_conv.is_owned = ptr_is_owned(node_id_2_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_id_2_arg_conv);
+       node_id_2_arg_conv = NodeId_clone(&node_id_2_arg_conv);
+       LDKNodeId bitcoin_key_1_arg_conv;
+       bitcoin_key_1_arg_conv.inner = untag_ptr(bitcoin_key_1_arg);
+       bitcoin_key_1_arg_conv.is_owned = ptr_is_owned(bitcoin_key_1_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(bitcoin_key_1_arg_conv);
+       bitcoin_key_1_arg_conv = NodeId_clone(&bitcoin_key_1_arg_conv);
+       LDKNodeId bitcoin_key_2_arg_conv;
+       bitcoin_key_2_arg_conv.inner = untag_ptr(bitcoin_key_2_arg);
+       bitcoin_key_2_arg_conv.is_owned = ptr_is_owned(bitcoin_key_2_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(bitcoin_key_2_arg_conv);
+       bitcoin_key_2_arg_conv = NodeId_clone(&bitcoin_key_2_arg_conv);
+       LDKCVec_u8Z excess_data_arg_ref;
+       excess_data_arg_ref.datalen = excess_data_arg->arr_len;
+       excess_data_arg_ref.data = MALLOC(excess_data_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(excess_data_arg_ref.data, excess_data_arg->elems, excess_data_arg_ref.datalen); FREE(excess_data_arg);
+       LDKUnsignedChannelAnnouncement ret_var = UnsignedChannelAnnouncement_new(features_arg_conv, chain_hash_arg_ref, short_channel_id_arg, node_id_1_arg_conv, node_id_2_arg_conv, bitcoin_key_1_arg_conv, bitcoin_key_2_arg_conv, excess_data_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 UnsignedChannelAnnouncement_clone_ptr(LDKUnsignedChannelAnnouncement *NONNULL_PTR arg) {
+       LDKUnsignedChannelAnnouncement ret_var = UnsignedChannelAnnouncement_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_UnsignedChannelAnnouncement_clone_ptr(int64_t arg) {
+       LDKUnsignedChannelAnnouncement 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 = UnsignedChannelAnnouncement_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UnsignedChannelAnnouncement_clone(int64_t orig) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKUnsignedChannelAnnouncement ret_var = UnsignedChannelAnnouncement_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_UnsignedChannelAnnouncement_eq(int64_t a, int64_t b) {
+       LDKUnsignedChannelAnnouncement 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;
+       LDKUnsignedChannelAnnouncement 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 = UnsignedChannelAnnouncement_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelAnnouncement_free(int64_t this_obj) {
+       LDKChannelAnnouncement 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);
+       ChannelAnnouncement_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ChannelAnnouncement_get_node_signature_1(int64_t this_ptr) {
+       LDKChannelAnnouncement 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(64, __LINE__);
+       memcpy(ret_arr->elems, ChannelAnnouncement_get_node_signature_1(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelAnnouncement_set_node_signature_1(int64_t this_ptr, int8_tArray val) {
+       LDKChannelAnnouncement 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       ChannelAnnouncement_set_node_signature_1(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_ChannelAnnouncement_get_node_signature_2(int64_t this_ptr) {
+       LDKChannelAnnouncement 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(64, __LINE__);
+       memcpy(ret_arr->elems, ChannelAnnouncement_get_node_signature_2(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelAnnouncement_set_node_signature_2(int64_t this_ptr, int8_tArray val) {
+       LDKChannelAnnouncement 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       ChannelAnnouncement_set_node_signature_2(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_ChannelAnnouncement_get_bitcoin_signature_1(int64_t this_ptr) {
+       LDKChannelAnnouncement 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(64, __LINE__);
+       memcpy(ret_arr->elems, ChannelAnnouncement_get_bitcoin_signature_1(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelAnnouncement_set_bitcoin_signature_1(int64_t this_ptr, int8_tArray val) {
+       LDKChannelAnnouncement 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       ChannelAnnouncement_set_bitcoin_signature_1(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_ChannelAnnouncement_get_bitcoin_signature_2(int64_t this_ptr) {
+       LDKChannelAnnouncement 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(64, __LINE__);
+       memcpy(ret_arr->elems, ChannelAnnouncement_get_bitcoin_signature_2(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelAnnouncement_set_bitcoin_signature_2(int64_t this_ptr, int8_tArray val) {
+       LDKChannelAnnouncement 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       ChannelAnnouncement_set_bitcoin_signature_2(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelAnnouncement_get_contents(int64_t this_ptr) {
+       LDKChannelAnnouncement 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;
+       LDKUnsignedChannelAnnouncement ret_var = ChannelAnnouncement_get_contents(&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_ChannelAnnouncement_set_contents(int64_t this_ptr, int64_t val) {
+       LDKChannelAnnouncement 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;
+       LDKUnsignedChannelAnnouncement 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 = UnsignedChannelAnnouncement_clone(&val_conv);
+       ChannelAnnouncement_set_contents(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelAnnouncement_new(int8_tArray node_signature_1_arg, int8_tArray node_signature_2_arg, int8_tArray bitcoin_signature_1_arg, int8_tArray bitcoin_signature_2_arg, int64_t contents_arg) {
+       LDKECDSASignature node_signature_1_arg_ref;
+       CHECK(node_signature_1_arg->arr_len == 64);
+       memcpy(node_signature_1_arg_ref.compact_form, node_signature_1_arg->elems, 64); FREE(node_signature_1_arg);
+       LDKECDSASignature node_signature_2_arg_ref;
+       CHECK(node_signature_2_arg->arr_len == 64);
+       memcpy(node_signature_2_arg_ref.compact_form, node_signature_2_arg->elems, 64); FREE(node_signature_2_arg);
+       LDKECDSASignature bitcoin_signature_1_arg_ref;
+       CHECK(bitcoin_signature_1_arg->arr_len == 64);
+       memcpy(bitcoin_signature_1_arg_ref.compact_form, bitcoin_signature_1_arg->elems, 64); FREE(bitcoin_signature_1_arg);
+       LDKECDSASignature bitcoin_signature_2_arg_ref;
+       CHECK(bitcoin_signature_2_arg->arr_len == 64);
+       memcpy(bitcoin_signature_2_arg_ref.compact_form, bitcoin_signature_2_arg->elems, 64); FREE(bitcoin_signature_2_arg);
+       LDKUnsignedChannelAnnouncement contents_arg_conv;
+       contents_arg_conv.inner = untag_ptr(contents_arg);
+       contents_arg_conv.is_owned = ptr_is_owned(contents_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(contents_arg_conv);
+       contents_arg_conv = UnsignedChannelAnnouncement_clone(&contents_arg_conv);
+       LDKChannelAnnouncement ret_var = ChannelAnnouncement_new(node_signature_1_arg_ref, node_signature_2_arg_ref, bitcoin_signature_1_arg_ref, bitcoin_signature_2_arg_ref, contents_arg_conv);
+       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 ChannelAnnouncement_clone_ptr(LDKChannelAnnouncement *NONNULL_PTR arg) {
+       LDKChannelAnnouncement ret_var = ChannelAnnouncement_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_ChannelAnnouncement_clone_ptr(int64_t arg) {
+       LDKChannelAnnouncement 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 = ChannelAnnouncement_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelAnnouncement_clone(int64_t orig) {
+       LDKChannelAnnouncement 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;
+       LDKChannelAnnouncement ret_var = ChannelAnnouncement_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_ChannelAnnouncement_eq(int64_t a, int64_t b) {
+       LDKChannelAnnouncement 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;
+       LDKChannelAnnouncement 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 = ChannelAnnouncement_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_free(int64_t this_obj) {
+       LDKUnsignedChannelUpdate 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);
+       UnsignedChannelUpdate_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_UnsignedChannelUpdate_get_chain_hash(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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, *UnsignedChannelUpdate_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKUnsignedChannelUpdate 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);
+       UnsignedChannelUpdate_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UnsignedChannelUpdate_get_short_channel_id(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_short_channel_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_short_channel_id(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelUpdate 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;
+       UnsignedChannelUpdate_set_short_channel_id(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_UnsignedChannelUpdate_get_timestamp(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_timestamp(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_timestamp(int64_t this_ptr, int32_t val) {
+       LDKUnsignedChannelUpdate 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;
+       UnsignedChannelUpdate_set_timestamp(&this_ptr_conv, val);
+}
+
+int8_t  CS_LDK_UnsignedChannelUpdate_get_flags(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_flags(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_flags(int64_t this_ptr, int8_t val) {
+       LDKUnsignedChannelUpdate 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;
+       UnsignedChannelUpdate_set_flags(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_UnsignedChannelUpdate_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_cltv_expiry_delta(int64_t this_ptr, int16_t val) {
+       LDKUnsignedChannelUpdate 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;
+       UnsignedChannelUpdate_set_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_UnsignedChannelUpdate_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelUpdate 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;
+       UnsignedChannelUpdate_set_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_UnsignedChannelUpdate_get_htlc_maximum_msat(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_htlc_maximum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_htlc_maximum_msat(int64_t this_ptr, int64_t val) {
+       LDKUnsignedChannelUpdate 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;
+       UnsignedChannelUpdate_set_htlc_maximum_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_UnsignedChannelUpdate_get_fee_base_msat(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_fee_base_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_fee_base_msat(int64_t this_ptr, int32_t val) {
+       LDKUnsignedChannelUpdate 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;
+       UnsignedChannelUpdate_set_fee_base_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_UnsignedChannelUpdate_get_fee_proportional_millionths(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_fee_proportional_millionths(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_UnsignedChannelUpdate_set_fee_proportional_millionths(int64_t this_ptr, int32_t val) {
+       LDKUnsignedChannelUpdate 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;
+       UnsignedChannelUpdate_set_fee_proportional_millionths(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_UnsignedChannelUpdate_get_excess_data(int64_t this_ptr) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_get_excess_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_UnsignedChannelUpdate_set_excess_data(int64_t this_ptr, int8_tArray val) {
+       LDKUnsignedChannelUpdate 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);
+       UnsignedChannelUpdate_set_excess_data(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UnsignedChannelUpdate_new(int8_tArray chain_hash_arg, int64_t short_channel_id_arg, int32_t timestamp_arg, int8_t flags_arg, int16_t cltv_expiry_delta_arg, int64_t htlc_minimum_msat_arg, int64_t htlc_maximum_msat_arg, int32_t fee_base_msat_arg, int32_t fee_proportional_millionths_arg, int8_tArray excess_data_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);
+       LDKCVec_u8Z excess_data_arg_ref;
+       excess_data_arg_ref.datalen = excess_data_arg->arr_len;
+       excess_data_arg_ref.data = MALLOC(excess_data_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(excess_data_arg_ref.data, excess_data_arg->elems, excess_data_arg_ref.datalen); FREE(excess_data_arg);
+       LDKUnsignedChannelUpdate ret_var = UnsignedChannelUpdate_new(chain_hash_arg_ref, short_channel_id_arg, timestamp_arg, flags_arg, cltv_expiry_delta_arg, htlc_minimum_msat_arg, htlc_maximum_msat_arg, fee_base_msat_arg, fee_proportional_millionths_arg, excess_data_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 UnsignedChannelUpdate_clone_ptr(LDKUnsignedChannelUpdate *NONNULL_PTR arg) {
+       LDKUnsignedChannelUpdate ret_var = UnsignedChannelUpdate_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_UnsignedChannelUpdate_clone_ptr(int64_t arg) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UnsignedChannelUpdate_clone(int64_t orig) {
+       LDKUnsignedChannelUpdate 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;
+       LDKUnsignedChannelUpdate ret_var = UnsignedChannelUpdate_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_UnsignedChannelUpdate_eq(int64_t a, int64_t b) {
+       LDKUnsignedChannelUpdate 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;
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelUpdate_free(int64_t this_obj) {
+       LDKChannelUpdate 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);
+       ChannelUpdate_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ChannelUpdate_get_signature(int64_t this_ptr) {
+       LDKChannelUpdate 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(64, __LINE__);
+       memcpy(ret_arr->elems, ChannelUpdate_get_signature(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelUpdate_set_signature(int64_t this_ptr, int8_tArray val) {
+       LDKChannelUpdate 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       ChannelUpdate_set_signature(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelUpdate_get_contents(int64_t this_ptr) {
+       LDKChannelUpdate 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;
+       LDKUnsignedChannelUpdate ret_var = ChannelUpdate_get_contents(&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_ChannelUpdate_set_contents(int64_t this_ptr, int64_t val) {
+       LDKChannelUpdate 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;
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_clone(&val_conv);
+       ChannelUpdate_set_contents(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelUpdate_new(int8_tArray signature_arg, int64_t contents_arg) {
+       LDKECDSASignature signature_arg_ref;
+       CHECK(signature_arg->arr_len == 64);
+       memcpy(signature_arg_ref.compact_form, signature_arg->elems, 64); FREE(signature_arg);
+       LDKUnsignedChannelUpdate contents_arg_conv;
+       contents_arg_conv.inner = untag_ptr(contents_arg);
+       contents_arg_conv.is_owned = ptr_is_owned(contents_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(contents_arg_conv);
+       contents_arg_conv = UnsignedChannelUpdate_clone(&contents_arg_conv);
+       LDKChannelUpdate ret_var = ChannelUpdate_new(signature_arg_ref, contents_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 ChannelUpdate_clone_ptr(LDKChannelUpdate *NONNULL_PTR arg) {
+       LDKChannelUpdate ret_var = ChannelUpdate_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_ChannelUpdate_clone_ptr(int64_t arg) {
+       LDKChannelUpdate 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 = ChannelUpdate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelUpdate_clone(int64_t orig) {
+       LDKChannelUpdate 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;
+       LDKChannelUpdate ret_var = ChannelUpdate_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_ChannelUpdate_eq(int64_t a, int64_t b) {
+       LDKChannelUpdate 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;
+       LDKChannelUpdate 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 = ChannelUpdate_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_QueryChannelRange_free(int64_t this_obj) {
+       LDKQueryChannelRange 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);
+       QueryChannelRange_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_QueryChannelRange_get_chain_hash(int64_t this_ptr) {
+       LDKQueryChannelRange 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, *QueryChannelRange_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_QueryChannelRange_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKQueryChannelRange 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);
+       QueryChannelRange_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_QueryChannelRange_get_first_blocknum(int64_t this_ptr) {
+       LDKQueryChannelRange 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 = QueryChannelRange_get_first_blocknum(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_QueryChannelRange_set_first_blocknum(int64_t this_ptr, int32_t val) {
+       LDKQueryChannelRange 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;
+       QueryChannelRange_set_first_blocknum(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_QueryChannelRange_get_number_of_blocks(int64_t this_ptr) {
+       LDKQueryChannelRange 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 = QueryChannelRange_get_number_of_blocks(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_QueryChannelRange_set_number_of_blocks(int64_t this_ptr, int32_t val) {
+       LDKQueryChannelRange 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;
+       QueryChannelRange_set_number_of_blocks(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_QueryChannelRange_new(int8_tArray chain_hash_arg, int32_t first_blocknum_arg, int32_t number_of_blocks_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);
+       LDKQueryChannelRange ret_var = QueryChannelRange_new(chain_hash_arg_ref, first_blocknum_arg, number_of_blocks_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 QueryChannelRange_clone_ptr(LDKQueryChannelRange *NONNULL_PTR arg) {
+       LDKQueryChannelRange ret_var = QueryChannelRange_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_QueryChannelRange_clone_ptr(int64_t arg) {
+       LDKQueryChannelRange 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 = QueryChannelRange_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_QueryChannelRange_clone(int64_t orig) {
+       LDKQueryChannelRange 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;
+       LDKQueryChannelRange ret_var = QueryChannelRange_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_QueryChannelRange_eq(int64_t a, int64_t b) {
+       LDKQueryChannelRange 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;
+       LDKQueryChannelRange 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 = QueryChannelRange_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ReplyChannelRange_free(int64_t this_obj) {
+       LDKReplyChannelRange 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);
+       ReplyChannelRange_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ReplyChannelRange_get_chain_hash(int64_t this_ptr) {
+       LDKReplyChannelRange 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, *ReplyChannelRange_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ReplyChannelRange_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKReplyChannelRange 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);
+       ReplyChannelRange_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_ReplyChannelRange_get_first_blocknum(int64_t this_ptr) {
+       LDKReplyChannelRange 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 = ReplyChannelRange_get_first_blocknum(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ReplyChannelRange_set_first_blocknum(int64_t this_ptr, int32_t val) {
+       LDKReplyChannelRange 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;
+       ReplyChannelRange_set_first_blocknum(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_ReplyChannelRange_get_number_of_blocks(int64_t this_ptr) {
+       LDKReplyChannelRange 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 = ReplyChannelRange_get_number_of_blocks(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ReplyChannelRange_set_number_of_blocks(int64_t this_ptr, int32_t val) {
+       LDKReplyChannelRange 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;
+       ReplyChannelRange_set_number_of_blocks(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ReplyChannelRange_get_sync_complete(int64_t this_ptr) {
+       LDKReplyChannelRange 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;
+       jboolean ret_conv = ReplyChannelRange_get_sync_complete(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ReplyChannelRange_set_sync_complete(int64_t this_ptr, jboolean val) {
+       LDKReplyChannelRange 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;
+       ReplyChannelRange_set_sync_complete(&this_ptr_conv, val);
+}
+
+int64_tArray  CS_LDK_ReplyChannelRange_get_short_channel_ids(int64_t this_ptr) {
+       LDKReplyChannelRange 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 = ReplyChannelRange_get_short_channel_ids(&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_ReplyChannelRange_set_short_channel_ids(int64_t this_ptr, int64_tArray val) {
+       LDKReplyChannelRange 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);
+       ReplyChannelRange_set_short_channel_ids(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_ReplyChannelRange_new(int8_tArray chain_hash_arg, int32_t first_blocknum_arg, int32_t number_of_blocks_arg, jboolean sync_complete_arg, int64_tArray short_channel_ids_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);
+       LDKCVec_u64Z short_channel_ids_arg_constr;
+       short_channel_ids_arg_constr.datalen = short_channel_ids_arg->arr_len;
+       if (short_channel_ids_arg_constr.datalen > 0)
+               short_channel_ids_arg_constr.data = MALLOC(short_channel_ids_arg_constr.datalen * sizeof(int64_t), "LDKCVec_u64Z Elements");
+       else
+               short_channel_ids_arg_constr.data = NULL;
+       int64_t* short_channel_ids_arg_vals = short_channel_ids_arg->elems;
+       for (size_t g = 0; g < short_channel_ids_arg_constr.datalen; g++) {
+               int64_t short_channel_ids_arg_conv_6 = short_channel_ids_arg_vals[g];
+               short_channel_ids_arg_constr.data[g] = short_channel_ids_arg_conv_6;
+       }
+       FREE(short_channel_ids_arg);
+       LDKReplyChannelRange ret_var = ReplyChannelRange_new(chain_hash_arg_ref, first_blocknum_arg, number_of_blocks_arg, sync_complete_arg, short_channel_ids_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);
+       return ret_ref;
+}
+
+static inline uint64_t ReplyChannelRange_clone_ptr(LDKReplyChannelRange *NONNULL_PTR arg) {
+       LDKReplyChannelRange ret_var = ReplyChannelRange_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_ReplyChannelRange_clone_ptr(int64_t arg) {
+       LDKReplyChannelRange 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 = ReplyChannelRange_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ReplyChannelRange_clone(int64_t orig) {
+       LDKReplyChannelRange 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;
+       LDKReplyChannelRange ret_var = ReplyChannelRange_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_ReplyChannelRange_eq(int64_t a, int64_t b) {
+       LDKReplyChannelRange 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;
+       LDKReplyChannelRange 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 = ReplyChannelRange_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_QueryShortChannelIds_free(int64_t this_obj) {
+       LDKQueryShortChannelIds 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);
+       QueryShortChannelIds_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_QueryShortChannelIds_get_chain_hash(int64_t this_ptr) {
+       LDKQueryShortChannelIds 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, *QueryShortChannelIds_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_QueryShortChannelIds_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKQueryShortChannelIds 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);
+       QueryShortChannelIds_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int64_tArray  CS_LDK_QueryShortChannelIds_get_short_channel_ids(int64_t this_ptr) {
+       LDKQueryShortChannelIds 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 = QueryShortChannelIds_get_short_channel_ids(&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_QueryShortChannelIds_set_short_channel_ids(int64_t this_ptr, int64_tArray val) {
+       LDKQueryShortChannelIds 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);
+       QueryShortChannelIds_set_short_channel_ids(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_QueryShortChannelIds_new(int8_tArray chain_hash_arg, int64_tArray short_channel_ids_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);
+       LDKCVec_u64Z short_channel_ids_arg_constr;
+       short_channel_ids_arg_constr.datalen = short_channel_ids_arg->arr_len;
+       if (short_channel_ids_arg_constr.datalen > 0)
+               short_channel_ids_arg_constr.data = MALLOC(short_channel_ids_arg_constr.datalen * sizeof(int64_t), "LDKCVec_u64Z Elements");
+       else
+               short_channel_ids_arg_constr.data = NULL;
+       int64_t* short_channel_ids_arg_vals = short_channel_ids_arg->elems;
+       for (size_t g = 0; g < short_channel_ids_arg_constr.datalen; g++) {
+               int64_t short_channel_ids_arg_conv_6 = short_channel_ids_arg_vals[g];
+               short_channel_ids_arg_constr.data[g] = short_channel_ids_arg_conv_6;
+       }
+       FREE(short_channel_ids_arg);
+       LDKQueryShortChannelIds ret_var = QueryShortChannelIds_new(chain_hash_arg_ref, short_channel_ids_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);
+       return ret_ref;
+}
+
+static inline uint64_t QueryShortChannelIds_clone_ptr(LDKQueryShortChannelIds *NONNULL_PTR arg) {
+       LDKQueryShortChannelIds ret_var = QueryShortChannelIds_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_QueryShortChannelIds_clone_ptr(int64_t arg) {
+       LDKQueryShortChannelIds 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 = QueryShortChannelIds_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_QueryShortChannelIds_clone(int64_t orig) {
+       LDKQueryShortChannelIds 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;
+       LDKQueryShortChannelIds ret_var = QueryShortChannelIds_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_QueryShortChannelIds_eq(int64_t a, int64_t b) {
+       LDKQueryShortChannelIds 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;
+       LDKQueryShortChannelIds 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 = QueryShortChannelIds_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ReplyShortChannelIdsEnd_free(int64_t this_obj) {
+       LDKReplyShortChannelIdsEnd 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);
+       ReplyShortChannelIdsEnd_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ReplyShortChannelIdsEnd_get_chain_hash(int64_t this_ptr) {
+       LDKReplyShortChannelIdsEnd 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, *ReplyShortChannelIdsEnd_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ReplyShortChannelIdsEnd_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKReplyShortChannelIdsEnd 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);
+       ReplyShortChannelIdsEnd_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+jboolean  CS_LDK_ReplyShortChannelIdsEnd_get_full_information(int64_t this_ptr) {
+       LDKReplyShortChannelIdsEnd 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;
+       jboolean ret_conv = ReplyShortChannelIdsEnd_get_full_information(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ReplyShortChannelIdsEnd_set_full_information(int64_t this_ptr, jboolean val) {
+       LDKReplyShortChannelIdsEnd 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;
+       ReplyShortChannelIdsEnd_set_full_information(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ReplyShortChannelIdsEnd_new(int8_tArray chain_hash_arg, jboolean full_information_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);
+       LDKReplyShortChannelIdsEnd ret_var = ReplyShortChannelIdsEnd_new(chain_hash_arg_ref, full_information_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 ReplyShortChannelIdsEnd_clone_ptr(LDKReplyShortChannelIdsEnd *NONNULL_PTR arg) {
+       LDKReplyShortChannelIdsEnd ret_var = ReplyShortChannelIdsEnd_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_ReplyShortChannelIdsEnd_clone_ptr(int64_t arg) {
+       LDKReplyShortChannelIdsEnd 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 = ReplyShortChannelIdsEnd_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ReplyShortChannelIdsEnd_clone(int64_t orig) {
+       LDKReplyShortChannelIdsEnd 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;
+       LDKReplyShortChannelIdsEnd ret_var = ReplyShortChannelIdsEnd_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_ReplyShortChannelIdsEnd_eq(int64_t a, int64_t b) {
+       LDKReplyShortChannelIdsEnd 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;
+       LDKReplyShortChannelIdsEnd 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 = ReplyShortChannelIdsEnd_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_GossipTimestampFilter_free(int64_t this_obj) {
+       LDKGossipTimestampFilter 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);
+       GossipTimestampFilter_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_GossipTimestampFilter_get_chain_hash(int64_t this_ptr) {
+       LDKGossipTimestampFilter 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, *GossipTimestampFilter_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_GossipTimestampFilter_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKGossipTimestampFilter 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);
+       GossipTimestampFilter_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_GossipTimestampFilter_get_first_timestamp(int64_t this_ptr) {
+       LDKGossipTimestampFilter 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 = GossipTimestampFilter_get_first_timestamp(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_GossipTimestampFilter_set_first_timestamp(int64_t this_ptr, int32_t val) {
+       LDKGossipTimestampFilter 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;
+       GossipTimestampFilter_set_first_timestamp(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_GossipTimestampFilter_get_timestamp_range(int64_t this_ptr) {
+       LDKGossipTimestampFilter 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 = GossipTimestampFilter_get_timestamp_range(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_GossipTimestampFilter_set_timestamp_range(int64_t this_ptr, int32_t val) {
+       LDKGossipTimestampFilter 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;
+       GossipTimestampFilter_set_timestamp_range(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_GossipTimestampFilter_new(int8_tArray chain_hash_arg, int32_t first_timestamp_arg, int32_t timestamp_range_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);
+       LDKGossipTimestampFilter ret_var = GossipTimestampFilter_new(chain_hash_arg_ref, first_timestamp_arg, timestamp_range_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 GossipTimestampFilter_clone_ptr(LDKGossipTimestampFilter *NONNULL_PTR arg) {
+       LDKGossipTimestampFilter ret_var = GossipTimestampFilter_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_GossipTimestampFilter_clone_ptr(int64_t arg) {
+       LDKGossipTimestampFilter 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 = GossipTimestampFilter_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_GossipTimestampFilter_clone(int64_t orig) {
+       LDKGossipTimestampFilter 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;
+       LDKGossipTimestampFilter ret_var = GossipTimestampFilter_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_GossipTimestampFilter_eq(int64_t a, int64_t b) {
+       LDKGossipTimestampFilter 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;
+       LDKGossipTimestampFilter 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 = GossipTimestampFilter_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ErrorAction_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);
+       LDKErrorAction this_ptr_conv = *(LDKErrorAction*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       ErrorAction_free(this_ptr_conv);
+}
+
+static inline uint64_t ErrorAction_clone_ptr(LDKErrorAction *NONNULL_PTR arg) {
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_ErrorAction_clone_ptr(int64_t arg) {
+       LDKErrorAction* arg_conv = (LDKErrorAction*)untag_ptr(arg);
+       int64_t ret_conv = ErrorAction_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ErrorAction_clone(int64_t orig) {
+       LDKErrorAction* orig_conv = (LDKErrorAction*)untag_ptr(orig);
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ErrorAction_disconnect_peer(int64_t msg) {
+       LDKErrorMessage 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 = ErrorMessage_clone(&msg_conv);
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_disconnect_peer(msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ErrorAction_disconnect_peer_with_warning(int64_t msg) {
+       LDKWarningMessage 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 = WarningMessage_clone(&msg_conv);
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_disconnect_peer_with_warning(msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ErrorAction_ignore_error() {
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_ignore_error();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ErrorAction_ignore_and_log(int32_t a) {
+       LDKLevel a_conv = LDKLevel_from_cs(a);
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_ignore_and_log(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ErrorAction_ignore_duplicate_gossip() {
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_ignore_duplicate_gossip();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ErrorAction_send_error_message(int64_t msg) {
+       LDKErrorMessage 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 = ErrorMessage_clone(&msg_conv);
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_send_error_message(msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ErrorAction_send_warning_message(int64_t msg, int32_t log_level) {
+       LDKWarningMessage 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 = WarningMessage_clone(&msg_conv);
+       LDKLevel log_level_conv = LDKLevel_from_cs(log_level);
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = ErrorAction_send_warning_message(msg_conv, log_level_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_LightningError_free(int64_t this_obj) {
+       LDKLightningError 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);
+       LightningError_free(this_obj_conv);
+}
+
+jstring  CS_LDK_LightningError_get_err(int64_t this_ptr) {
+       LDKLightningError 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 = LightningError_get_err(&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_LightningError_set_err(int64_t this_ptr, jstring val) {
+       LDKLightningError 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);
+       LightningError_set_err(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_LightningError_get_action(int64_t this_ptr) {
+       LDKLightningError 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;
+       LDKErrorAction *ret_copy = MALLOC(sizeof(LDKErrorAction), "LDKErrorAction");
+       *ret_copy = LightningError_get_action(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_LightningError_set_action(int64_t this_ptr, int64_t val) {
+       LDKLightningError 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);
+       LDKErrorAction val_conv = *(LDKErrorAction*)(val_ptr);
+       val_conv = ErrorAction_clone((LDKErrorAction*)untag_ptr(val));
+       LightningError_set_action(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_LightningError_new(jstring err_arg, int64_t action_arg) {
+       LDKStr err_arg_conv = str_ref_to_owned_c(err_arg);
+       void* action_arg_ptr = untag_ptr(action_arg);
+       CHECK_ACCESS(action_arg_ptr);
+       LDKErrorAction action_arg_conv = *(LDKErrorAction*)(action_arg_ptr);
+       action_arg_conv = ErrorAction_clone((LDKErrorAction*)untag_ptr(action_arg));
+       LDKLightningError ret_var = LightningError_new(err_arg_conv, action_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 LightningError_clone_ptr(LDKLightningError *NONNULL_PTR arg) {
+       LDKLightningError ret_var = LightningError_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_LightningError_clone_ptr(int64_t arg) {
+       LDKLightningError 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 = LightningError_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_LightningError_clone(int64_t orig) {
+       LDKLightningError 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;
+       LDKLightningError ret_var = LightningError_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_CommitmentUpdate_free(int64_t this_obj) {
+       LDKCommitmentUpdate 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);
+       CommitmentUpdate_free(this_obj_conv);
+}
+
+int64_tArray  CS_LDK_CommitmentUpdate_get_update_add_htlcs(int64_t this_ptr) {
+       LDKCommitmentUpdate 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_UpdateAddHTLCZ ret_var = CommitmentUpdate_get_update_add_htlcs(&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 p = 0; p < ret_var.datalen; p++) {
+               LDKUpdateAddHTLC ret_conv_15_var = ret_var.data[p];
+               int64_t ret_conv_15_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_15_var);
+               ret_conv_15_ref = tag_ptr(ret_conv_15_var.inner, ret_conv_15_var.is_owned);
+               ret_arr_ptr[p] = ret_conv_15_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_CommitmentUpdate_set_update_add_htlcs(int64_t this_ptr, int64_tArray val) {
+       LDKCommitmentUpdate 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_UpdateAddHTLCZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKUpdateAddHTLC), "LDKCVec_UpdateAddHTLCZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t p = 0; p < val_constr.datalen; p++) {
+               int64_t val_conv_15 = val_vals[p];
+               LDKUpdateAddHTLC val_conv_15_conv;
+               val_conv_15_conv.inner = untag_ptr(val_conv_15);
+               val_conv_15_conv.is_owned = ptr_is_owned(val_conv_15);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_15_conv);
+               val_conv_15_conv = UpdateAddHTLC_clone(&val_conv_15_conv);
+               val_constr.data[p] = val_conv_15_conv;
+       }
+       FREE(val);
+       CommitmentUpdate_set_update_add_htlcs(&this_ptr_conv, val_constr);
+}
+
+int64_tArray  CS_LDK_CommitmentUpdate_get_update_fulfill_htlcs(int64_t this_ptr) {
+       LDKCommitmentUpdate 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_UpdateFulfillHTLCZ ret_var = CommitmentUpdate_get_update_fulfill_htlcs(&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 t = 0; t < ret_var.datalen; t++) {
+               LDKUpdateFulfillHTLC ret_conv_19_var = ret_var.data[t];
+               int64_t ret_conv_19_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_19_var);
+               ret_conv_19_ref = tag_ptr(ret_conv_19_var.inner, ret_conv_19_var.is_owned);
+               ret_arr_ptr[t] = ret_conv_19_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_CommitmentUpdate_set_update_fulfill_htlcs(int64_t this_ptr, int64_tArray val) {
+       LDKCommitmentUpdate 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_UpdateFulfillHTLCZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKUpdateFulfillHTLC), "LDKCVec_UpdateFulfillHTLCZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t t = 0; t < val_constr.datalen; t++) {
+               int64_t val_conv_19 = val_vals[t];
+               LDKUpdateFulfillHTLC val_conv_19_conv;
+               val_conv_19_conv.inner = untag_ptr(val_conv_19);
+               val_conv_19_conv.is_owned = ptr_is_owned(val_conv_19);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_19_conv);
+               val_conv_19_conv = UpdateFulfillHTLC_clone(&val_conv_19_conv);
+               val_constr.data[t] = val_conv_19_conv;
+       }
+       FREE(val);
+       CommitmentUpdate_set_update_fulfill_htlcs(&this_ptr_conv, val_constr);
+}
+
+int64_tArray  CS_LDK_CommitmentUpdate_get_update_fail_htlcs(int64_t this_ptr) {
+       LDKCommitmentUpdate 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_UpdateFailHTLCZ ret_var = CommitmentUpdate_get_update_fail_htlcs(&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 q = 0; q < ret_var.datalen; q++) {
+               LDKUpdateFailHTLC ret_conv_16_var = ret_var.data[q];
+               int64_t ret_conv_16_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_16_var);
+               ret_conv_16_ref = tag_ptr(ret_conv_16_var.inner, ret_conv_16_var.is_owned);
+               ret_arr_ptr[q] = ret_conv_16_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_CommitmentUpdate_set_update_fail_htlcs(int64_t this_ptr, int64_tArray val) {
+       LDKCommitmentUpdate 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_UpdateFailHTLCZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKUpdateFailHTLC), "LDKCVec_UpdateFailHTLCZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t q = 0; q < val_constr.datalen; q++) {
+               int64_t val_conv_16 = val_vals[q];
+               LDKUpdateFailHTLC val_conv_16_conv;
+               val_conv_16_conv.inner = untag_ptr(val_conv_16);
+               val_conv_16_conv.is_owned = ptr_is_owned(val_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_16_conv);
+               val_conv_16_conv = UpdateFailHTLC_clone(&val_conv_16_conv);
+               val_constr.data[q] = val_conv_16_conv;
+       }
+       FREE(val);
+       CommitmentUpdate_set_update_fail_htlcs(&this_ptr_conv, val_constr);
+}
+
+int64_tArray  CS_LDK_CommitmentUpdate_get_update_fail_malformed_htlcs(int64_t this_ptr) {
+       LDKCommitmentUpdate 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_UpdateFailMalformedHTLCZ ret_var = CommitmentUpdate_get_update_fail_malformed_htlcs(&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 z = 0; z < ret_var.datalen; z++) {
+               LDKUpdateFailMalformedHTLC ret_conv_25_var = ret_var.data[z];
+               int64_t ret_conv_25_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_25_var);
+               ret_conv_25_ref = tag_ptr(ret_conv_25_var.inner, ret_conv_25_var.is_owned);
+               ret_arr_ptr[z] = ret_conv_25_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_CommitmentUpdate_set_update_fail_malformed_htlcs(int64_t this_ptr, int64_tArray val) {
+       LDKCommitmentUpdate 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_UpdateFailMalformedHTLCZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKUpdateFailMalformedHTLC), "LDKCVec_UpdateFailMalformedHTLCZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t z = 0; z < val_constr.datalen; z++) {
+               int64_t val_conv_25 = val_vals[z];
+               LDKUpdateFailMalformedHTLC val_conv_25_conv;
+               val_conv_25_conv.inner = untag_ptr(val_conv_25);
+               val_conv_25_conv.is_owned = ptr_is_owned(val_conv_25);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_25_conv);
+               val_conv_25_conv = UpdateFailMalformedHTLC_clone(&val_conv_25_conv);
+               val_constr.data[z] = val_conv_25_conv;
+       }
+       FREE(val);
+       CommitmentUpdate_set_update_fail_malformed_htlcs(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_CommitmentUpdate_get_update_fee(int64_t this_ptr) {
+       LDKCommitmentUpdate 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;
+       LDKUpdateFee ret_var = CommitmentUpdate_get_update_fee(&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_CommitmentUpdate_set_update_fee(int64_t this_ptr, int64_t val) {
+       LDKCommitmentUpdate 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;
+       LDKUpdateFee 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 = UpdateFee_clone(&val_conv);
+       CommitmentUpdate_set_update_fee(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_CommitmentUpdate_get_commitment_signed(int64_t this_ptr) {
+       LDKCommitmentUpdate 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;
+       LDKCommitmentSigned ret_var = CommitmentUpdate_get_commitment_signed(&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_CommitmentUpdate_set_commitment_signed(int64_t this_ptr, int64_t val) {
+       LDKCommitmentUpdate 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;
+       LDKCommitmentSigned 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 = CommitmentSigned_clone(&val_conv);
+       CommitmentUpdate_set_commitment_signed(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_CommitmentUpdate_new(int64_tArray update_add_htlcs_arg, int64_tArray update_fulfill_htlcs_arg, int64_tArray update_fail_htlcs_arg, int64_tArray update_fail_malformed_htlcs_arg, int64_t update_fee_arg, int64_t commitment_signed_arg) {
+       LDKCVec_UpdateAddHTLCZ update_add_htlcs_arg_constr;
+       update_add_htlcs_arg_constr.datalen = update_add_htlcs_arg->arr_len;
+       if (update_add_htlcs_arg_constr.datalen > 0)
+               update_add_htlcs_arg_constr.data = MALLOC(update_add_htlcs_arg_constr.datalen * sizeof(LDKUpdateAddHTLC), "LDKCVec_UpdateAddHTLCZ Elements");
+       else
+               update_add_htlcs_arg_constr.data = NULL;
+       int64_t* update_add_htlcs_arg_vals = update_add_htlcs_arg->elems;
+       for (size_t p = 0; p < update_add_htlcs_arg_constr.datalen; p++) {
+               int64_t update_add_htlcs_arg_conv_15 = update_add_htlcs_arg_vals[p];
+               LDKUpdateAddHTLC update_add_htlcs_arg_conv_15_conv;
+               update_add_htlcs_arg_conv_15_conv.inner = untag_ptr(update_add_htlcs_arg_conv_15);
+               update_add_htlcs_arg_conv_15_conv.is_owned = ptr_is_owned(update_add_htlcs_arg_conv_15);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(update_add_htlcs_arg_conv_15_conv);
+               update_add_htlcs_arg_conv_15_conv = UpdateAddHTLC_clone(&update_add_htlcs_arg_conv_15_conv);
+               update_add_htlcs_arg_constr.data[p] = update_add_htlcs_arg_conv_15_conv;
+       }
+       FREE(update_add_htlcs_arg);
+       LDKCVec_UpdateFulfillHTLCZ update_fulfill_htlcs_arg_constr;
+       update_fulfill_htlcs_arg_constr.datalen = update_fulfill_htlcs_arg->arr_len;
+       if (update_fulfill_htlcs_arg_constr.datalen > 0)
+               update_fulfill_htlcs_arg_constr.data = MALLOC(update_fulfill_htlcs_arg_constr.datalen * sizeof(LDKUpdateFulfillHTLC), "LDKCVec_UpdateFulfillHTLCZ Elements");
+       else
+               update_fulfill_htlcs_arg_constr.data = NULL;
+       int64_t* update_fulfill_htlcs_arg_vals = update_fulfill_htlcs_arg->elems;
+       for (size_t t = 0; t < update_fulfill_htlcs_arg_constr.datalen; t++) {
+               int64_t update_fulfill_htlcs_arg_conv_19 = update_fulfill_htlcs_arg_vals[t];
+               LDKUpdateFulfillHTLC update_fulfill_htlcs_arg_conv_19_conv;
+               update_fulfill_htlcs_arg_conv_19_conv.inner = untag_ptr(update_fulfill_htlcs_arg_conv_19);
+               update_fulfill_htlcs_arg_conv_19_conv.is_owned = ptr_is_owned(update_fulfill_htlcs_arg_conv_19);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(update_fulfill_htlcs_arg_conv_19_conv);
+               update_fulfill_htlcs_arg_conv_19_conv = UpdateFulfillHTLC_clone(&update_fulfill_htlcs_arg_conv_19_conv);
+               update_fulfill_htlcs_arg_constr.data[t] = update_fulfill_htlcs_arg_conv_19_conv;
+       }
+       FREE(update_fulfill_htlcs_arg);
+       LDKCVec_UpdateFailHTLCZ update_fail_htlcs_arg_constr;
+       update_fail_htlcs_arg_constr.datalen = update_fail_htlcs_arg->arr_len;
+       if (update_fail_htlcs_arg_constr.datalen > 0)
+               update_fail_htlcs_arg_constr.data = MALLOC(update_fail_htlcs_arg_constr.datalen * sizeof(LDKUpdateFailHTLC), "LDKCVec_UpdateFailHTLCZ Elements");
+       else
+               update_fail_htlcs_arg_constr.data = NULL;
+       int64_t* update_fail_htlcs_arg_vals = update_fail_htlcs_arg->elems;
+       for (size_t q = 0; q < update_fail_htlcs_arg_constr.datalen; q++) {
+               int64_t update_fail_htlcs_arg_conv_16 = update_fail_htlcs_arg_vals[q];
+               LDKUpdateFailHTLC update_fail_htlcs_arg_conv_16_conv;
+               update_fail_htlcs_arg_conv_16_conv.inner = untag_ptr(update_fail_htlcs_arg_conv_16);
+               update_fail_htlcs_arg_conv_16_conv.is_owned = ptr_is_owned(update_fail_htlcs_arg_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(update_fail_htlcs_arg_conv_16_conv);
+               update_fail_htlcs_arg_conv_16_conv = UpdateFailHTLC_clone(&update_fail_htlcs_arg_conv_16_conv);
+               update_fail_htlcs_arg_constr.data[q] = update_fail_htlcs_arg_conv_16_conv;
+       }
+       FREE(update_fail_htlcs_arg);
+       LDKCVec_UpdateFailMalformedHTLCZ update_fail_malformed_htlcs_arg_constr;
+       update_fail_malformed_htlcs_arg_constr.datalen = update_fail_malformed_htlcs_arg->arr_len;
+       if (update_fail_malformed_htlcs_arg_constr.datalen > 0)
+               update_fail_malformed_htlcs_arg_constr.data = MALLOC(update_fail_malformed_htlcs_arg_constr.datalen * sizeof(LDKUpdateFailMalformedHTLC), "LDKCVec_UpdateFailMalformedHTLCZ Elements");
+       else
+               update_fail_malformed_htlcs_arg_constr.data = NULL;
+       int64_t* update_fail_malformed_htlcs_arg_vals = update_fail_malformed_htlcs_arg->elems;
+       for (size_t z = 0; z < update_fail_malformed_htlcs_arg_constr.datalen; z++) {
+               int64_t update_fail_malformed_htlcs_arg_conv_25 = update_fail_malformed_htlcs_arg_vals[z];
+               LDKUpdateFailMalformedHTLC update_fail_malformed_htlcs_arg_conv_25_conv;
+               update_fail_malformed_htlcs_arg_conv_25_conv.inner = untag_ptr(update_fail_malformed_htlcs_arg_conv_25);
+               update_fail_malformed_htlcs_arg_conv_25_conv.is_owned = ptr_is_owned(update_fail_malformed_htlcs_arg_conv_25);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(update_fail_malformed_htlcs_arg_conv_25_conv);
+               update_fail_malformed_htlcs_arg_conv_25_conv = UpdateFailMalformedHTLC_clone(&update_fail_malformed_htlcs_arg_conv_25_conv);
+               update_fail_malformed_htlcs_arg_constr.data[z] = update_fail_malformed_htlcs_arg_conv_25_conv;
+       }
+       FREE(update_fail_malformed_htlcs_arg);
+       LDKUpdateFee update_fee_arg_conv;
+       update_fee_arg_conv.inner = untag_ptr(update_fee_arg);
+       update_fee_arg_conv.is_owned = ptr_is_owned(update_fee_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_fee_arg_conv);
+       update_fee_arg_conv = UpdateFee_clone(&update_fee_arg_conv);
+       LDKCommitmentSigned commitment_signed_arg_conv;
+       commitment_signed_arg_conv.inner = untag_ptr(commitment_signed_arg);
+       commitment_signed_arg_conv.is_owned = ptr_is_owned(commitment_signed_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(commitment_signed_arg_conv);
+       commitment_signed_arg_conv = CommitmentSigned_clone(&commitment_signed_arg_conv);
+       LDKCommitmentUpdate ret_var = CommitmentUpdate_new(update_add_htlcs_arg_constr, update_fulfill_htlcs_arg_constr, update_fail_htlcs_arg_constr, update_fail_malformed_htlcs_arg_constr, update_fee_arg_conv, commitment_signed_arg_conv);
+       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 CommitmentUpdate_clone_ptr(LDKCommitmentUpdate *NONNULL_PTR arg) {
+       LDKCommitmentUpdate ret_var = CommitmentUpdate_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_CommitmentUpdate_clone_ptr(int64_t arg) {
+       LDKCommitmentUpdate 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 = CommitmentUpdate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CommitmentUpdate_clone(int64_t orig) {
+       LDKCommitmentUpdate 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;
+       LDKCommitmentUpdate ret_var = CommitmentUpdate_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_CommitmentUpdate_eq(int64_t a, int64_t b) {
+       LDKCommitmentUpdate 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;
+       LDKCommitmentUpdate 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 = CommitmentUpdate_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelMessageHandler_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);
+       LDKChannelMessageHandler this_ptr_conv = *(LDKChannelMessageHandler*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       ChannelMessageHandler_free(this_ptr_conv);
+}
+
+void  CS_LDK_RoutingMessageHandler_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);
+       LDKRoutingMessageHandler this_ptr_conv = *(LDKRoutingMessageHandler*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       RoutingMessageHandler_free(this_ptr_conv);
+}
+
+void  CS_LDK_OnionMessageHandler_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);
+       LDKOnionMessageHandler this_ptr_conv = *(LDKOnionMessageHandler*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       OnionMessageHandler_free(this_ptr_conv);
+}
+
+int8_tArray  CS_LDK_AcceptChannel_write(int64_t obj) {
+       LDKAcceptChannel 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 = AcceptChannel_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_AcceptChannel_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_AcceptChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelDecodeErrorZ), "LDKCResult_AcceptChannelDecodeErrorZ");
+       *ret_conv = AcceptChannel_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_AcceptChannelV2_write(int64_t obj) {
+       LDKAcceptChannelV2 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 = AcceptChannelV2_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_AcceptChannelV2_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_AcceptChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AcceptChannelV2DecodeErrorZ), "LDKCResult_AcceptChannelV2DecodeErrorZ");
+       *ret_conv = AcceptChannelV2_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);
+       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 = TxAddInput_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_TxAddInput_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxAddInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddInputDecodeErrorZ), "LDKCResult_TxAddInputDecodeErrorZ");
+       *ret_conv = TxAddInput_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TxAddOutput_write(int64_t obj) {
+       LDKTxAddOutput 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 = TxAddOutput_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_TxAddOutput_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxAddOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAddOutputDecodeErrorZ), "LDKCResult_TxAddOutputDecodeErrorZ");
+       *ret_conv = TxAddOutput_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TxRemoveInput_write(int64_t obj) {
+       LDKTxRemoveInput 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 = TxRemoveInput_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_TxRemoveInput_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxRemoveInputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveInputDecodeErrorZ), "LDKCResult_TxRemoveInputDecodeErrorZ");
+       *ret_conv = TxRemoveInput_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TxRemoveOutput_write(int64_t obj) {
+       LDKTxRemoveOutput 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 = TxRemoveOutput_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_TxRemoveOutput_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxRemoveOutputDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxRemoveOutputDecodeErrorZ), "LDKCResult_TxRemoveOutputDecodeErrorZ");
+       *ret_conv = TxRemoveOutput_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TxComplete_write(int64_t obj) {
+       LDKTxComplete 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 = TxComplete_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_TxComplete_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxCompleteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCompleteDecodeErrorZ), "LDKCResult_TxCompleteDecodeErrorZ");
+       *ret_conv = TxComplete_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TxSignatures_write(int64_t obj) {
+       LDKTxSignatures 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 = TxSignatures_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_TxSignatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxSignaturesDecodeErrorZ), "LDKCResult_TxSignaturesDecodeErrorZ");
+       *ret_conv = TxSignatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TxInitRbf_write(int64_t obj) {
+       LDKTxInitRbf 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 = TxInitRbf_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_TxInitRbf_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxInitRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxInitRbfDecodeErrorZ), "LDKCResult_TxInitRbfDecodeErrorZ");
+       *ret_conv = TxInitRbf_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TxAckRbf_write(int64_t obj) {
+       LDKTxAckRbf 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 = TxAckRbf_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_TxAckRbf_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxAckRbfDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAckRbfDecodeErrorZ), "LDKCResult_TxAckRbfDecodeErrorZ");
+       *ret_conv = TxAckRbf_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_TxAbort_write(int64_t obj) {
+       LDKTxAbort 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 = TxAbort_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_TxAbort_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxAbortDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxAbortDecodeErrorZ), "LDKCResult_TxAbortDecodeErrorZ");
+       *ret_conv = TxAbort_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_AnnouncementSignatures_write(int64_t obj) {
+       LDKAnnouncementSignatures 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 = AnnouncementSignatures_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_AnnouncementSignatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_AnnouncementSignaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_AnnouncementSignaturesDecodeErrorZ), "LDKCResult_AnnouncementSignaturesDecodeErrorZ");
+       *ret_conv = AnnouncementSignatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelReestablish_write(int64_t obj) {
+       LDKChannelReestablish 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 = ChannelReestablish_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_ChannelReestablish_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelReestablishDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReestablishDecodeErrorZ), "LDKCResult_ChannelReestablishDecodeErrorZ");
+       *ret_conv = ChannelReestablish_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ClosingSigned_write(int64_t obj) {
+       LDKClosingSigned 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 = ClosingSigned_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_ClosingSigned_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ClosingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedDecodeErrorZ), "LDKCResult_ClosingSignedDecodeErrorZ");
+       *ret_conv = ClosingSigned_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ClosingSignedFeeRange_write(int64_t obj) {
+       LDKClosingSignedFeeRange 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 = ClosingSignedFeeRange_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_ClosingSignedFeeRange_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ClosingSignedFeeRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClosingSignedFeeRangeDecodeErrorZ), "LDKCResult_ClosingSignedFeeRangeDecodeErrorZ");
+       *ret_conv = ClosingSignedFeeRange_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_CommitmentSigned_write(int64_t obj) {
+       LDKCommitmentSigned 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 = CommitmentSigned_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_CommitmentSigned_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_CommitmentSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentSignedDecodeErrorZ), "LDKCResult_CommitmentSignedDecodeErrorZ");
+       *ret_conv = CommitmentSigned_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_FundingCreated_write(int64_t obj) {
+       LDKFundingCreated 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 = FundingCreated_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_FundingCreated_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_FundingCreatedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingCreatedDecodeErrorZ), "LDKCResult_FundingCreatedDecodeErrorZ");
+       *ret_conv = FundingCreated_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_FundingSigned_write(int64_t obj) {
+       LDKFundingSigned 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 = FundingSigned_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_FundingSigned_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_FundingSignedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FundingSignedDecodeErrorZ), "LDKCResult_FundingSignedDecodeErrorZ");
+       *ret_conv = FundingSigned_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelReady_write(int64_t obj) {
+       LDKChannelReady 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 = ChannelReady_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_ChannelReady_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelReadyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReadyDecodeErrorZ), "LDKCResult_ChannelReadyDecodeErrorZ");
+       *ret_conv = ChannelReady_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_Init_write(int64_t obj) {
+       LDKInit 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 = Init_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_Init_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_InitDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitDecodeErrorZ), "LDKCResult_InitDecodeErrorZ");
+       *ret_conv = Init_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_OpenChannel_write(int64_t obj) {
+       LDKOpenChannel 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 = OpenChannel_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_OpenChannel_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_OpenChannelDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelDecodeErrorZ), "LDKCResult_OpenChannelDecodeErrorZ");
+       *ret_conv = OpenChannel_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_OpenChannelV2_write(int64_t obj) {
+       LDKOpenChannelV2 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 = OpenChannelV2_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_OpenChannelV2_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_OpenChannelV2DecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OpenChannelV2DecodeErrorZ), "LDKCResult_OpenChannelV2DecodeErrorZ");
+       *ret_conv = OpenChannelV2_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_RevokeAndACK_write(int64_t obj) {
+       LDKRevokeAndACK 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 = RevokeAndACK_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_RevokeAndACK_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RevokeAndACKDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevokeAndACKDecodeErrorZ), "LDKCResult_RevokeAndACKDecodeErrorZ");
+       *ret_conv = RevokeAndACK_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_Shutdown_write(int64_t obj) {
+       LDKShutdown 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 = Shutdown_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_Shutdown_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ShutdownDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownDecodeErrorZ), "LDKCResult_ShutdownDecodeErrorZ");
+       *ret_conv = Shutdown_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_UpdateFailHTLC_write(int64_t obj) {
+       LDKUpdateFailHTLC 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 = UpdateFailHTLC_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_UpdateFailHTLC_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UpdateFailHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailHTLCDecodeErrorZ), "LDKCResult_UpdateFailHTLCDecodeErrorZ");
+       *ret_conv = UpdateFailHTLC_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_UpdateFailMalformedHTLC_write(int64_t obj) {
+       LDKUpdateFailMalformedHTLC 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 = UpdateFailMalformedHTLC_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_UpdateFailMalformedHTLC_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ), "LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ");
+       *ret_conv = UpdateFailMalformedHTLC_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_UpdateFee_write(int64_t obj) {
+       LDKUpdateFee 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 = UpdateFee_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_UpdateFee_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UpdateFeeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFeeDecodeErrorZ), "LDKCResult_UpdateFeeDecodeErrorZ");
+       *ret_conv = UpdateFee_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_UpdateFulfillHTLC_write(int64_t obj) {
+       LDKUpdateFulfillHTLC 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 = UpdateFulfillHTLC_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_UpdateFulfillHTLC_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UpdateFulfillHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateFulfillHTLCDecodeErrorZ), "LDKCResult_UpdateFulfillHTLCDecodeErrorZ");
+       *ret_conv = UpdateFulfillHTLC_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);
+       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 = UpdateAddHTLC_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_UpdateAddHTLC_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UpdateAddHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UpdateAddHTLCDecodeErrorZ), "LDKCResult_UpdateAddHTLCDecodeErrorZ");
+       *ret_conv = UpdateAddHTLC_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_OnionMessage_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_OnionMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessageDecodeErrorZ), "LDKCResult_OnionMessageDecodeErrorZ");
+       *ret_conv = OnionMessage_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_OnionMessage_write(int64_t obj) {
+       LDKOnionMessage 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 = OnionMessage_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;
+}
+
+int8_tArray  CS_LDK_Ping_write(int64_t obj) {
+       LDKPing 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 = Ping_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_Ping_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PingDecodeErrorZ), "LDKCResult_PingDecodeErrorZ");
+       *ret_conv = Ping_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_Pong_write(int64_t obj) {
+       LDKPong 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 = Pong_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_Pong_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PongDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PongDecodeErrorZ), "LDKCResult_PongDecodeErrorZ");
+       *ret_conv = Pong_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_UnsignedChannelAnnouncement_write(int64_t obj) {
+       LDKUnsignedChannelAnnouncement 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 = UnsignedChannelAnnouncement_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_UnsignedChannelAnnouncement_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ), "LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ");
+       *ret_conv = UnsignedChannelAnnouncement_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelAnnouncement_write(int64_t obj) {
+       LDKChannelAnnouncement 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 = ChannelAnnouncement_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_ChannelAnnouncement_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelAnnouncementDecodeErrorZ), "LDKCResult_ChannelAnnouncementDecodeErrorZ");
+       *ret_conv = ChannelAnnouncement_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_UnsignedChannelUpdate_write(int64_t obj) {
+       LDKUnsignedChannelUpdate 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 = UnsignedChannelUpdate_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_UnsignedChannelUpdate_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelUpdateDecodeErrorZ), "LDKCResult_UnsignedChannelUpdateDecodeErrorZ");
+       *ret_conv = UnsignedChannelUpdate_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelUpdate_write(int64_t obj) {
+       LDKChannelUpdate 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 = ChannelUpdate_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_ChannelUpdate_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateDecodeErrorZ), "LDKCResult_ChannelUpdateDecodeErrorZ");
+       *ret_conv = ChannelUpdate_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ErrorMessage_write(int64_t obj) {
+       LDKErrorMessage 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 = ErrorMessage_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_ErrorMessage_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ErrorMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ErrorMessageDecodeErrorZ), "LDKCResult_ErrorMessageDecodeErrorZ");
+       *ret_conv = ErrorMessage_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_WarningMessage_write(int64_t obj) {
+       LDKWarningMessage 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 = WarningMessage_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_WarningMessage_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_WarningMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_WarningMessageDecodeErrorZ), "LDKCResult_WarningMessageDecodeErrorZ");
+       *ret_conv = WarningMessage_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_UnsignedNodeAnnouncement_write(int64_t obj) {
+       LDKUnsignedNodeAnnouncement 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 = UnsignedNodeAnnouncement_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_UnsignedNodeAnnouncement_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ), "LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ");
+       *ret_conv = UnsignedNodeAnnouncement_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_NodeAnnouncement_write(int64_t obj) {
+       LDKNodeAnnouncement 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 = NodeAnnouncement_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_NodeAnnouncement_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_NodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementDecodeErrorZ), "LDKCResult_NodeAnnouncementDecodeErrorZ");
+       *ret_conv = NodeAnnouncement_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_QueryShortChannelIds_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryShortChannelIdsDecodeErrorZ), "LDKCResult_QueryShortChannelIdsDecodeErrorZ");
+       *ret_conv = QueryShortChannelIds_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_QueryShortChannelIds_write(int64_t obj) {
+       LDKQueryShortChannelIds 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 = QueryShortChannelIds_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;
+}
+
+int8_tArray  CS_LDK_ReplyShortChannelIdsEnd_write(int64_t obj) {
+       LDKReplyShortChannelIdsEnd 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 = ReplyShortChannelIdsEnd_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_ReplyShortChannelIdsEnd_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ), "LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ");
+       *ret_conv = ReplyShortChannelIdsEnd_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int32_t  CS_LDK_QueryChannelRange_end_blocknum(int64_t this_arg) {
+       LDKQueryChannelRange 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;
+       int32_t ret_conv = QueryChannelRange_end_blocknum(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_QueryChannelRange_write(int64_t obj) {
+       LDKQueryChannelRange 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 = QueryChannelRange_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_QueryChannelRange_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_QueryChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryChannelRangeDecodeErrorZ), "LDKCResult_QueryChannelRangeDecodeErrorZ");
+       *ret_conv = QueryChannelRange_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ReplyChannelRange_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ReplyChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyChannelRangeDecodeErrorZ), "LDKCResult_ReplyChannelRangeDecodeErrorZ");
+       *ret_conv = ReplyChannelRange_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ReplyChannelRange_write(int64_t obj) {
+       LDKReplyChannelRange 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 = ReplyChannelRange_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;
+}
+
+int8_tArray  CS_LDK_GossipTimestampFilter_write(int64_t obj) {
+       LDKGossipTimestampFilter 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 = GossipTimestampFilter_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_GossipTimestampFilter_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_GossipTimestampFilterDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_GossipTimestampFilterDecodeErrorZ), "LDKCResult_GossipTimestampFilterDecodeErrorZ");
+       *ret_conv = GossipTimestampFilter_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CustomMessageHandler_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);
+       LDKCustomMessageHandler this_ptr_conv = *(LDKCustomMessageHandler*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       CustomMessageHandler_free(this_ptr_conv);
+}
+
+void  CS_LDK_IgnoringMessageHandler_free(int64_t this_obj) {
+       LDKIgnoringMessageHandler 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);
+       IgnoringMessageHandler_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_IgnoringMessageHandler_new() {
+       LDKIgnoringMessageHandler ret_var = IgnoringMessageHandler_new();
+       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_IgnoringMessageHandler_as_MessageSendEventsProvider(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;
+       LDKMessageSendEventsProvider* ret_ret = MALLOC(sizeof(LDKMessageSendEventsProvider), "LDKMessageSendEventsProvider");
+       *ret_ret = IgnoringMessageHandler_as_MessageSendEventsProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_IgnoringMessageHandler_as_RoutingMessageHandler(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;
+       LDKRoutingMessageHandler* ret_ret = MALLOC(sizeof(LDKRoutingMessageHandler), "LDKRoutingMessageHandler");
+       *ret_ret = IgnoringMessageHandler_as_RoutingMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_IgnoringMessageHandler_as_OnionMessageHandler(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;
+       LDKOnionMessageHandler* ret_ret = MALLOC(sizeof(LDKOnionMessageHandler), "LDKOnionMessageHandler");
+       *ret_ret = IgnoringMessageHandler_as_OnionMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_IgnoringMessageHandler_as_OffersMessageHandler(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;
+       LDKOffersMessageHandler* ret_ret = MALLOC(sizeof(LDKOffersMessageHandler), "LDKOffersMessageHandler");
+       *ret_ret = IgnoringMessageHandler_as_OffersMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_IgnoringMessageHandler_as_CustomOnionMessageHandler(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;
+       LDKCustomOnionMessageHandler* ret_ret = MALLOC(sizeof(LDKCustomOnionMessageHandler), "LDKCustomOnionMessageHandler");
+       *ret_ret = IgnoringMessageHandler_as_CustomOnionMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_IgnoringMessageHandler_as_CustomMessageReader(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;
+       LDKCustomMessageReader* ret_ret = MALLOC(sizeof(LDKCustomMessageReader), "LDKCustomMessageReader");
+       *ret_ret = IgnoringMessageHandler_as_CustomMessageReader(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_IgnoringMessageHandler_as_CustomMessageHandler(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;
+       LDKCustomMessageHandler* ret_ret = MALLOC(sizeof(LDKCustomMessageHandler), "LDKCustomMessageHandler");
+       *ret_ret = IgnoringMessageHandler_as_CustomMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_ErroringMessageHandler_free(int64_t this_obj) {
+       LDKErroringMessageHandler 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);
+       ErroringMessageHandler_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ErroringMessageHandler_new() {
+       LDKErroringMessageHandler ret_var = ErroringMessageHandler_new();
+       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_ErroringMessageHandler_as_MessageSendEventsProvider(int64_t this_arg) {
+       LDKErroringMessageHandler 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;
+       LDKMessageSendEventsProvider* ret_ret = MALLOC(sizeof(LDKMessageSendEventsProvider), "LDKMessageSendEventsProvider");
+       *ret_ret = ErroringMessageHandler_as_MessageSendEventsProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ErroringMessageHandler_as_ChannelMessageHandler(int64_t this_arg) {
+       LDKErroringMessageHandler 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;
+       LDKChannelMessageHandler* ret_ret = MALLOC(sizeof(LDKChannelMessageHandler), "LDKChannelMessageHandler");
+       *ret_ret = ErroringMessageHandler_as_ChannelMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_MessageHandler_free(int64_t this_obj) {
+       LDKMessageHandler 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);
+       MessageHandler_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_MessageHandler_get_chan_handler(int64_t this_ptr) {
+       LDKMessageHandler 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(MessageHandler_get_chan_handler(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_MessageHandler_set_chan_handler(int64_t this_ptr, int64_t val) {
+       LDKMessageHandler 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);
+       LDKChannelMessageHandler val_conv = *(LDKChannelMessageHandler*)(val_ptr);
+       if (val_conv.free == LDKChannelMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKChannelMessageHandler_JCalls_cloned(&val_conv);
+       }
+       MessageHandler_set_chan_handler(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_MessageHandler_get_route_handler(int64_t this_ptr) {
+       LDKMessageHandler 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(MessageHandler_get_route_handler(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_MessageHandler_set_route_handler(int64_t this_ptr, int64_t val) {
+       LDKMessageHandler 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);
+       LDKRoutingMessageHandler val_conv = *(LDKRoutingMessageHandler*)(val_ptr);
+       if (val_conv.free == LDKRoutingMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKRoutingMessageHandler_JCalls_cloned(&val_conv);
+       }
+       MessageHandler_set_route_handler(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_MessageHandler_get_onion_message_handler(int64_t this_ptr) {
+       LDKMessageHandler 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(MessageHandler_get_onion_message_handler(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_MessageHandler_set_onion_message_handler(int64_t this_ptr, int64_t val) {
+       LDKMessageHandler 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);
+       LDKOnionMessageHandler val_conv = *(LDKOnionMessageHandler*)(val_ptr);
+       if (val_conv.free == LDKOnionMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOnionMessageHandler_JCalls_cloned(&val_conv);
+       }
+       MessageHandler_set_onion_message_handler(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_MessageHandler_get_custom_message_handler(int64_t this_ptr) {
+       LDKMessageHandler 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;
+       // WARNING: This object doesn't live past this scope, needs clone!
+       int64_t ret_ret = tag_ptr(MessageHandler_get_custom_message_handler(&this_ptr_conv), false);
+       return ret_ret;
+}
+
+void  CS_LDK_MessageHandler_set_custom_message_handler(int64_t this_ptr, int64_t val) {
+       LDKMessageHandler 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);
+       LDKCustomMessageHandler val_conv = *(LDKCustomMessageHandler*)(val_ptr);
+       if (val_conv.free == LDKCustomMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKCustomMessageHandler_JCalls_cloned(&val_conv);
+       }
+       MessageHandler_set_custom_message_handler(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_MessageHandler_new(int64_t chan_handler_arg, int64_t route_handler_arg, int64_t onion_message_handler_arg, int64_t custom_message_handler_arg) {
+       void* chan_handler_arg_ptr = untag_ptr(chan_handler_arg);
+       CHECK_ACCESS(chan_handler_arg_ptr);
+       LDKChannelMessageHandler chan_handler_arg_conv = *(LDKChannelMessageHandler*)(chan_handler_arg_ptr);
+       if (chan_handler_arg_conv.free == LDKChannelMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKChannelMessageHandler_JCalls_cloned(&chan_handler_arg_conv);
+       }
+       void* route_handler_arg_ptr = untag_ptr(route_handler_arg);
+       CHECK_ACCESS(route_handler_arg_ptr);
+       LDKRoutingMessageHandler route_handler_arg_conv = *(LDKRoutingMessageHandler*)(route_handler_arg_ptr);
+       if (route_handler_arg_conv.free == LDKRoutingMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKRoutingMessageHandler_JCalls_cloned(&route_handler_arg_conv);
+       }
+       void* onion_message_handler_arg_ptr = untag_ptr(onion_message_handler_arg);
+       CHECK_ACCESS(onion_message_handler_arg_ptr);
+       LDKOnionMessageHandler onion_message_handler_arg_conv = *(LDKOnionMessageHandler*)(onion_message_handler_arg_ptr);
+       if (onion_message_handler_arg_conv.free == LDKOnionMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOnionMessageHandler_JCalls_cloned(&onion_message_handler_arg_conv);
+       }
+       void* custom_message_handler_arg_ptr = untag_ptr(custom_message_handler_arg);
+       CHECK_ACCESS(custom_message_handler_arg_ptr);
+       LDKCustomMessageHandler custom_message_handler_arg_conv = *(LDKCustomMessageHandler*)(custom_message_handler_arg_ptr);
+       if (custom_message_handler_arg_conv.free == LDKCustomMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKCustomMessageHandler_JCalls_cloned(&custom_message_handler_arg_conv);
+       }
+       LDKMessageHandler ret_var = MessageHandler_new(chan_handler_arg_conv, route_handler_arg_conv, onion_message_handler_arg_conv, custom_message_handler_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 SocketDescriptor_clone_ptr(LDKSocketDescriptor *NONNULL_PTR arg) {
+       LDKSocketDescriptor* ret_ret = MALLOC(sizeof(LDKSocketDescriptor), "LDKSocketDescriptor");
+       *ret_ret = SocketDescriptor_clone(arg);
+       return tag_ptr(ret_ret, true);
+}
+int64_t  CS_LDK_SocketDescriptor_clone_ptr(int64_t arg) {
+       void* arg_ptr = untag_ptr(arg);
+       if (ptr_is_owned(arg)) { CHECK_ACCESS(arg_ptr); }
+       LDKSocketDescriptor* arg_conv = (LDKSocketDescriptor*)arg_ptr;
+       int64_t ret_conv = SocketDescriptor_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SocketDescriptor_clone(int64_t orig) {
+       void* orig_ptr = untag_ptr(orig);
+       if (ptr_is_owned(orig)) { CHECK_ACCESS(orig_ptr); }
+       LDKSocketDescriptor* orig_conv = (LDKSocketDescriptor*)orig_ptr;
+       LDKSocketDescriptor* ret_ret = MALLOC(sizeof(LDKSocketDescriptor), "LDKSocketDescriptor");
+       *ret_ret = SocketDescriptor_clone(orig_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_SocketDescriptor_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);
+       LDKSocketDescriptor this_ptr_conv = *(LDKSocketDescriptor*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       SocketDescriptor_free(this_ptr_conv);
+}
+
+void  CS_LDK_PeerHandleError_free(int64_t this_obj) {
+       LDKPeerHandleError 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);
+       PeerHandleError_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_PeerHandleError_new() {
+       LDKPeerHandleError ret_var = PeerHandleError_new();
+       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 PeerHandleError_clone_ptr(LDKPeerHandleError *NONNULL_PTR arg) {
+       LDKPeerHandleError ret_var = PeerHandleError_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_PeerHandleError_clone_ptr(int64_t arg) {
+       LDKPeerHandleError 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 = PeerHandleError_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PeerHandleError_clone(int64_t orig) {
+       LDKPeerHandleError 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;
+       LDKPeerHandleError ret_var = PeerHandleError_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_PeerManager_free(int64_t this_obj) {
+       LDKPeerManager 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);
+       PeerManager_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_PeerManager_new(int64_t message_handler, int32_t current_time, int8_tArray ephemeral_random_data, int64_t logger, int64_t node_signer) {
+       LDKMessageHandler message_handler_conv;
+       message_handler_conv.inner = untag_ptr(message_handler);
+       message_handler_conv.is_owned = ptr_is_owned(message_handler);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(message_handler_conv);
+       // WARNING: we need a move here but no clone is available for LDKMessageHandler
+       
+       uint8_t ephemeral_random_data_arr[32];
+       CHECK(ephemeral_random_data->arr_len == 32);
+       memcpy(ephemeral_random_data_arr, ephemeral_random_data->elems, 32); FREE(ephemeral_random_data);
+       uint8_t (*ephemeral_random_data_ref)[32] = &ephemeral_random_data_arr;
+       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);
+       }
+       void* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_conv);
+       }
+       LDKPeerManager ret_var = PeerManager_new(message_handler_conv, current_time, ephemeral_random_data_ref, logger_conv, node_signer_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_tArray  CS_LDK_PeerManager_get_peer_node_ids(int64_t this_arg) {
+       LDKPeerManager 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;
+       LDKCVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ ret_var = PeerManager_get_peer_node_ids(&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 r = 0; r < ret_var.datalen; r++) {
+               LDKC2Tuple_PublicKeyCOption_SocketAddressZZ* ret_conv_43_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ), "LDKC2Tuple_PublicKeyCOption_SocketAddressZZ");
+               *ret_conv_43_conv = ret_var.data[r];
+               ret_arr_ptr[r] = tag_ptr(ret_conv_43_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_PeerManager_new_outbound_connection(int64_t this_arg, int8_tArray their_node_id, int64_t descriptor, int64_t remote_network_address) {
+       LDKPeerManager 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;
+       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);
+       void* descriptor_ptr = untag_ptr(descriptor);
+       CHECK_ACCESS(descriptor_ptr);
+       LDKSocketDescriptor descriptor_conv = *(LDKSocketDescriptor*)(descriptor_ptr);
+       if (descriptor_conv.free == LDKSocketDescriptor_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKSocketDescriptor_JCalls_cloned(&descriptor_conv);
+       }
+       void* remote_network_address_ptr = untag_ptr(remote_network_address);
+       CHECK_ACCESS(remote_network_address_ptr);
+       LDKCOption_SocketAddressZ remote_network_address_conv = *(LDKCOption_SocketAddressZ*)(remote_network_address_ptr);
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZPeerHandleErrorZ), "LDKCResult_CVec_u8ZPeerHandleErrorZ");
+       *ret_conv = PeerManager_new_outbound_connection(&this_arg_conv, their_node_id_ref, descriptor_conv, remote_network_address_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PeerManager_new_inbound_connection(int64_t this_arg, int64_t descriptor, int64_t remote_network_address) {
+       LDKPeerManager 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;
+       void* descriptor_ptr = untag_ptr(descriptor);
+       CHECK_ACCESS(descriptor_ptr);
+       LDKSocketDescriptor descriptor_conv = *(LDKSocketDescriptor*)(descriptor_ptr);
+       if (descriptor_conv.free == LDKSocketDescriptor_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKSocketDescriptor_JCalls_cloned(&descriptor_conv);
+       }
+       void* remote_network_address_ptr = untag_ptr(remote_network_address);
+       CHECK_ACCESS(remote_network_address_ptr);
+       LDKCOption_SocketAddressZ remote_network_address_conv = *(LDKCOption_SocketAddressZ*)(remote_network_address_ptr);
+       LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
+       *ret_conv = PeerManager_new_inbound_connection(&this_arg_conv, descriptor_conv, remote_network_address_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PeerManager_write_buffer_space_avail(int64_t this_arg, int64_t descriptor) {
+       LDKPeerManager 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;
+       void* descriptor_ptr = untag_ptr(descriptor);
+       if (ptr_is_owned(descriptor)) { CHECK_ACCESS(descriptor_ptr); }
+       LDKSocketDescriptor* descriptor_conv = (LDKSocketDescriptor*)descriptor_ptr;
+       LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
+       *ret_conv = PeerManager_write_buffer_space_avail(&this_arg_conv, descriptor_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PeerManager_read_event(int64_t this_arg, int64_t peer_descriptor, int8_tArray data) {
+       LDKPeerManager 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;
+       void* peer_descriptor_ptr = untag_ptr(peer_descriptor);
+       if (ptr_is_owned(peer_descriptor)) { CHECK_ACCESS(peer_descriptor_ptr); }
+       LDKSocketDescriptor* peer_descriptor_conv = (LDKSocketDescriptor*)peer_descriptor_ptr;
+       LDKu8slice data_ref;
+       data_ref.datalen = data->arr_len;
+       data_ref.data = data->elems;
+       LDKCResult_boolPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolPeerHandleErrorZ), "LDKCResult_boolPeerHandleErrorZ");
+       *ret_conv = PeerManager_read_event(&this_arg_conv, peer_descriptor_conv, data_ref);
+       FREE(data);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_PeerManager_process_events(int64_t this_arg) {
+       LDKPeerManager 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;
+       PeerManager_process_events(&this_arg_conv);
+}
+
+void  CS_LDK_PeerManager_socket_disconnected(int64_t this_arg, int64_t descriptor) {
+       LDKPeerManager 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;
+       void* descriptor_ptr = untag_ptr(descriptor);
+       if (ptr_is_owned(descriptor)) { CHECK_ACCESS(descriptor_ptr); }
+       LDKSocketDescriptor* descriptor_conv = (LDKSocketDescriptor*)descriptor_ptr;
+       PeerManager_socket_disconnected(&this_arg_conv, descriptor_conv);
+}
+
+void  CS_LDK_PeerManager_disconnect_by_node_id(int64_t this_arg, int8_tArray node_id) {
+       LDKPeerManager 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;
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       PeerManager_disconnect_by_node_id(&this_arg_conv, node_id_ref);
+}
+
+void  CS_LDK_PeerManager_disconnect_all_peers(int64_t this_arg) {
+       LDKPeerManager 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;
+       PeerManager_disconnect_all_peers(&this_arg_conv);
+}
+
+void  CS_LDK_PeerManager_timer_tick_occurred(int64_t this_arg) {
+       LDKPeerManager 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;
+       PeerManager_timer_tick_occurred(&this_arg_conv);
+}
+
+void  CS_LDK_PeerManager_broadcast_node_announcement(int64_t this_arg, int8_tArray rgb, int8_tArray alias, int64_tArray addresses) {
+       LDKPeerManager 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;
+       LDKThreeBytes rgb_ref;
+       CHECK(rgb->arr_len == 3);
+       memcpy(rgb_ref.data, rgb->elems, 3); FREE(rgb);
+       LDKThirtyTwoBytes alias_ref;
+       CHECK(alias->arr_len == 32);
+       memcpy(alias_ref.data, alias->elems, 32); FREE(alias);
+       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);
+       PeerManager_broadcast_node_announcement(&this_arg_conv, rgb_ref, alias_ref, addresses_constr);
+}
+
+int64_t  CS_LDK_htlc_success_tx_weight(int64_t channel_type_features) {
+       LDKChannelTypeFeatures channel_type_features_conv;
+       channel_type_features_conv.inner = untag_ptr(channel_type_features);
+       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;
+       int64_t ret_conv = htlc_success_tx_weight(&channel_type_features_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_htlc_timeout_tx_weight(int64_t channel_type_features) {
+       LDKChannelTypeFeatures channel_type_features_conv;
+       channel_type_features_conv.inner = untag_ptr(channel_type_features);
+       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;
+       int64_t ret_conv = htlc_timeout_tx_weight(&channel_type_features_conv);
+       return ret_conv;
+}
+
+int32_t  CS_LDK_HTLCClaim_clone(int64_t orig) {
+       LDKHTLCClaim* orig_conv = (LDKHTLCClaim*)untag_ptr(orig);
+       int32_t ret_conv = LDKHTLCClaim_to_cs(HTLCClaim_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_HTLCClaim_offered_timeout() {
+       int32_t ret_conv = LDKHTLCClaim_to_cs(HTLCClaim_offered_timeout());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_HTLCClaim_offered_preimage() {
+       int32_t ret_conv = LDKHTLCClaim_to_cs(HTLCClaim_offered_preimage());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_HTLCClaim_accepted_timeout() {
+       int32_t ret_conv = LDKHTLCClaim_to_cs(HTLCClaim_accepted_timeout());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_HTLCClaim_accepted_preimage() {
+       int32_t ret_conv = LDKHTLCClaim_to_cs(HTLCClaim_accepted_preimage());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_HTLCClaim_revocation() {
+       int32_t ret_conv = LDKHTLCClaim_to_cs(HTLCClaim_revocation());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_HTLCClaim_eq(int64_t a, int64_t b) {
+       LDKHTLCClaim* a_conv = (LDKHTLCClaim*)untag_ptr(a);
+       LDKHTLCClaim* b_conv = (LDKHTLCClaim*)untag_ptr(b);
+       jboolean ret_conv = HTLCClaim_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_HTLCClaim_from_witness(int8_tArray witness) {
+       LDKWitness witness_ref;
+       witness_ref.datalen = witness->arr_len;
+       witness_ref.data = MALLOC(witness_ref.datalen, "LDKWitness Bytes");
+       memcpy(witness_ref.data, witness->elems, witness_ref.datalen); FREE(witness);
+       witness_ref.data_is_owned = true;
+       LDKCOption_HTLCClaimZ *ret_copy = MALLOC(sizeof(LDKCOption_HTLCClaimZ), "LDKCOption_HTLCClaimZ");
+       *ret_copy = HTLCClaim_from_witness(witness_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_build_commitment_secret(int8_tArray commitment_seed, int64_t idx) {
+       uint8_t commitment_seed_arr[32];
+       CHECK(commitment_seed->arr_len == 32);
+       memcpy(commitment_seed_arr, commitment_seed->elems, 32); FREE(commitment_seed);
+       uint8_t (*commitment_seed_ref)[32] = &commitment_seed_arr;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, build_commitment_secret(commitment_seed_ref, idx).data, 32);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_build_closing_transaction(int64_t to_holder_value_sat, int64_t to_counterparty_value_sat, int8_tArray to_holder_script, int8_tArray to_counterparty_script, int64_t funding_outpoint) {
+       LDKCVec_u8Z to_holder_script_ref;
+       to_holder_script_ref.datalen = to_holder_script->arr_len;
+       to_holder_script_ref.data = MALLOC(to_holder_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(to_holder_script_ref.data, to_holder_script->elems, to_holder_script_ref.datalen); FREE(to_holder_script);
+       LDKCVec_u8Z to_counterparty_script_ref;
+       to_counterparty_script_ref.datalen = to_counterparty_script->arr_len;
+       to_counterparty_script_ref.data = MALLOC(to_counterparty_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(to_counterparty_script_ref.data, to_counterparty_script->elems, to_counterparty_script_ref.datalen); FREE(to_counterparty_script);
+       LDKOutPoint funding_outpoint_conv;
+       funding_outpoint_conv.inner = untag_ptr(funding_outpoint);
+       funding_outpoint_conv.is_owned = ptr_is_owned(funding_outpoint);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_outpoint_conv);
+       funding_outpoint_conv = OutPoint_clone(&funding_outpoint_conv);
+       LDKTransaction ret_var = build_closing_transaction(to_holder_value_sat, to_counterparty_value_sat, to_holder_script_ref, to_counterparty_script_ref, funding_outpoint_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);
+       return ret_arr;
+}
+
+void  CS_LDK_CounterpartyCommitmentSecrets_free(int64_t this_obj) {
+       LDKCounterpartyCommitmentSecrets 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);
+       CounterpartyCommitmentSecrets_free(this_obj_conv);
+}
+
+static inline uint64_t CounterpartyCommitmentSecrets_clone_ptr(LDKCounterpartyCommitmentSecrets *NONNULL_PTR arg) {
+       LDKCounterpartyCommitmentSecrets ret_var = CounterpartyCommitmentSecrets_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_CounterpartyCommitmentSecrets_clone_ptr(int64_t arg) {
+       LDKCounterpartyCommitmentSecrets 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 = CounterpartyCommitmentSecrets_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CounterpartyCommitmentSecrets_clone(int64_t orig) {
+       LDKCounterpartyCommitmentSecrets 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;
+       LDKCounterpartyCommitmentSecrets ret_var = CounterpartyCommitmentSecrets_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_CounterpartyCommitmentSecrets_new() {
+       LDKCounterpartyCommitmentSecrets ret_var = CounterpartyCommitmentSecrets_new();
+       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_CounterpartyCommitmentSecrets_get_min_seen_secret(int64_t this_arg) {
+       LDKCounterpartyCommitmentSecrets 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 = CounterpartyCommitmentSecrets_get_min_seen_secret(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CounterpartyCommitmentSecrets_provide_secret(int64_t this_arg, int64_t idx, int8_tArray secret) {
+       LDKCounterpartyCommitmentSecrets 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;
+       LDKThirtyTwoBytes secret_ref;
+       CHECK(secret->arr_len == 32);
+       memcpy(secret_ref.data, secret->elems, 32); FREE(secret);
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = CounterpartyCommitmentSecrets_provide_secret(&this_arg_conv, idx, secret_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_CounterpartyCommitmentSecrets_get_secret(int64_t this_arg, int64_t idx) {
+       LDKCounterpartyCommitmentSecrets 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, CounterpartyCommitmentSecrets_get_secret(&this_arg_conv, idx).data, 32);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_CounterpartyCommitmentSecrets_write(int64_t obj) {
+       LDKCounterpartyCommitmentSecrets 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 = CounterpartyCommitmentSecrets_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_CounterpartyCommitmentSecrets_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ), "LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ");
+       *ret_conv = CounterpartyCommitmentSecrets_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_derive_private_key(int8_tArray per_commitment_point, int8_tArray base_secret) {
+       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);
+       uint8_t base_secret_arr[32];
+       CHECK(base_secret->arr_len == 32);
+       memcpy(base_secret_arr, base_secret->elems, 32); FREE(base_secret);
+       uint8_t (*base_secret_ref)[32] = &base_secret_arr;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, derive_private_key(per_commitment_point_ref, base_secret_ref).bytes, 32);
+       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);
+       memcpy(per_commitment_secret_arr, per_commitment_secret->elems, 32); FREE(per_commitment_secret);
+       uint8_t (*per_commitment_secret_ref)[32] = &per_commitment_secret_arr;
+       uint8_t countersignatory_revocation_base_secret_arr[32];
+       CHECK(countersignatory_revocation_base_secret->arr_len == 32);
+       memcpy(countersignatory_revocation_base_secret_arr, countersignatory_revocation_base_secret->elems, 32); FREE(countersignatory_revocation_base_secret);
+       uint8_t (*countersignatory_revocation_base_secret_ref)[32] = &countersignatory_revocation_base_secret_arr;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, derive_private_revocation_key(per_commitment_secret_ref, countersignatory_revocation_base_secret_ref).bytes, 32);
+       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);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       TxCreationKeys_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TxCreationKeys_get_per_commitment_point(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_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_TxCreationKeys_set_per_commitment_point(int64_t this_ptr, int8_tArray 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_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  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;
+}
+
+void  CS_LDK_TxCreationKeys_set_revocation_key(int64_t this_ptr, int8_tArray 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);
+}
+
+int8_tArray  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;
+}
+
+void  CS_LDK_TxCreationKeys_set_broadcaster_htlc_key(int64_t this_ptr, int8_tArray 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);
+}
+
+int8_tArray  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;
+}
+
+void  CS_LDK_TxCreationKeys_set_countersignatory_htlc_key(int64_t this_ptr, int8_tArray 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);
+}
+
+int8_tArray  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;
+}
+
+void  CS_LDK_TxCreationKeys_set_broadcaster_delayed_payment_key(int64_t this_ptr, int8_tArray 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);
+}
+
+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) {
+       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);
+       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_TxCreationKeys_eq(int64_t a, int64_t b) {
+       LDKTxCreationKeys 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;
+       LDKTxCreationKeys 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 = TxCreationKeys_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t TxCreationKeys_clone_ptr(LDKTxCreationKeys *NONNULL_PTR arg) {
+       LDKTxCreationKeys ret_var = TxCreationKeys_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_TxCreationKeys_clone_ptr(int64_t arg) {
+       LDKTxCreationKeys 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 = TxCreationKeys_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TxCreationKeys_clone(int64_t orig) {
+       LDKTxCreationKeys 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;
+       LDKTxCreationKeys ret_var = TxCreationKeys_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_TxCreationKeys_write(int64_t obj) {
+       LDKTxCreationKeys 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 = TxCreationKeys_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_TxCreationKeys_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_TxCreationKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCreationKeysDecodeErrorZ), "LDKCResult_TxCreationKeysDecodeErrorZ");
+       *ret_conv = TxCreationKeys_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelPublicKeys_free(int64_t this_obj) {
+       LDKChannelPublicKeys 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);
+       ChannelPublicKeys_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ChannelPublicKeys_get_funding_pubkey(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_funding_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelPublicKeys_set_funding_pubkey(int64_t this_ptr, int8_tArray 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_funding_pubkey(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  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;
+}
+
+void  CS_LDK_ChannelPublicKeys_set_revocation_basepoint(int64_t this_ptr, int8_tArray 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);
+}
+
+int8_tArray  CS_LDK_ChannelPublicKeys_get_payment_point(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_payment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelPublicKeys_set_payment_point(int64_t this_ptr, int8_tArray 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_payment_point(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  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;
+}
+
+void  CS_LDK_ChannelPublicKeys_set_delayed_payment_basepoint(int64_t this_ptr, int8_tArray 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);
+}
+
+int8_tArray  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;
+}
+
+void  CS_LDK_ChannelPublicKeys_set_htlc_basepoint(int64_t this_ptr, int8_tArray 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);
+}
+
+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) {
+       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);
+       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);
+       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 ChannelPublicKeys_clone_ptr(LDKChannelPublicKeys *NONNULL_PTR arg) {
+       LDKChannelPublicKeys ret_var = ChannelPublicKeys_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_ChannelPublicKeys_clone_ptr(int64_t arg) {
+       LDKChannelPublicKeys 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 = ChannelPublicKeys_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelPublicKeys_clone(int64_t orig) {
+       LDKChannelPublicKeys 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;
+       LDKChannelPublicKeys ret_var = ChannelPublicKeys_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_ChannelPublicKeys_hash(int64_t o) {
+       LDKChannelPublicKeys 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 = ChannelPublicKeys_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelPublicKeys_eq(int64_t a, int64_t b) {
+       LDKChannelPublicKeys 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;
+       LDKChannelPublicKeys 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 = ChannelPublicKeys_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_ChannelPublicKeys_write(int64_t obj) {
+       LDKChannelPublicKeys 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 = ChannelPublicKeys_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_ChannelPublicKeys_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelPublicKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelPublicKeysDecodeErrorZ), "LDKCResult_ChannelPublicKeysDecodeErrorZ");
+       *ret_conv = ChannelPublicKeys_read(ser_ref);
+       FREE(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) {
+       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);
+       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_TxCreationKeys_from_channel_static_keys(int8_tArray per_commitment_point, int64_t broadcaster_keys, int64_t countersignatory_keys) {
+       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);
+       LDKChannelPublicKeys broadcaster_keys_conv;
+       broadcaster_keys_conv.inner = untag_ptr(broadcaster_keys);
+       broadcaster_keys_conv.is_owned = ptr_is_owned(broadcaster_keys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(broadcaster_keys_conv);
+       broadcaster_keys_conv.is_owned = false;
+       LDKChannelPublicKeys countersignatory_keys_conv;
+       countersignatory_keys_conv.inner = untag_ptr(countersignatory_keys);
+       countersignatory_keys_conv.is_owned = ptr_is_owned(countersignatory_keys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(countersignatory_keys_conv);
+       countersignatory_keys_conv.is_owned = false;
+       LDKTxCreationKeys ret_var = TxCreationKeys_from_channel_static_keys(per_commitment_point_ref, &broadcaster_keys_conv, &countersignatory_keys_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_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 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;
+}
+
+int8_tArray  CS_LDK_get_counterparty_payment_script(int64_t channel_type_features, int8_tArray payment_key) {
+       LDKChannelTypeFeatures channel_type_features_conv;
+       channel_type_features_conv.inner = untag_ptr(channel_type_features);
+       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 payment_key_ref;
+       CHECK(payment_key->arr_len == 33);
+       memcpy(payment_key_ref.compressed_form, payment_key->elems, 33); FREE(payment_key);
+       LDKCVec_u8Z ret_var = get_counterparty_payment_script(&channel_type_features_conv, payment_key_ref);
+       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_HTLCOutputInCommitment_free(int64_t this_obj) {
+       LDKHTLCOutputInCommitment 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);
+       HTLCOutputInCommitment_free(this_obj_conv);
+}
+
+jboolean  CS_LDK_HTLCOutputInCommitment_get_offered(int64_t this_ptr) {
+       LDKHTLCOutputInCommitment 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;
+       jboolean ret_conv = HTLCOutputInCommitment_get_offered(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_HTLCOutputInCommitment_set_offered(int64_t this_ptr, jboolean val) {
+       LDKHTLCOutputInCommitment 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;
+       HTLCOutputInCommitment_set_offered(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_HTLCOutputInCommitment_get_amount_msat(int64_t this_ptr) {
+       LDKHTLCOutputInCommitment 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 = HTLCOutputInCommitment_get_amount_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_HTLCOutputInCommitment_set_amount_msat(int64_t this_ptr, int64_t val) {
+       LDKHTLCOutputInCommitment 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;
+       HTLCOutputInCommitment_set_amount_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_HTLCOutputInCommitment_get_cltv_expiry(int64_t this_ptr) {
+       LDKHTLCOutputInCommitment 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 = HTLCOutputInCommitment_get_cltv_expiry(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_HTLCOutputInCommitment_set_cltv_expiry(int64_t this_ptr, int32_t val) {
+       LDKHTLCOutputInCommitment 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;
+       HTLCOutputInCommitment_set_cltv_expiry(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_HTLCOutputInCommitment_get_payment_hash(int64_t this_ptr) {
+       LDKHTLCOutputInCommitment 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, *HTLCOutputInCommitment_get_payment_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_HTLCOutputInCommitment_set_payment_hash(int64_t this_ptr, int8_tArray val) {
+       LDKHTLCOutputInCommitment 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);
+       HTLCOutputInCommitment_set_payment_hash(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_HTLCOutputInCommitment_get_transaction_output_index(int64_t this_ptr) {
+       LDKHTLCOutputInCommitment 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_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = HTLCOutputInCommitment_get_transaction_output_index(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_HTLCOutputInCommitment_set_transaction_output_index(int64_t this_ptr, int64_t val) {
+       LDKHTLCOutputInCommitment 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_u32Z val_conv = *(LDKCOption_u32Z*)(val_ptr);
+       val_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(val));
+       HTLCOutputInCommitment_set_transaction_output_index(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_HTLCOutputInCommitment_new(jboolean offered_arg, int64_t amount_msat_arg, int32_t cltv_expiry_arg, int8_tArray payment_hash_arg, int64_t transaction_output_index_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* transaction_output_index_arg_ptr = untag_ptr(transaction_output_index_arg);
+       CHECK_ACCESS(transaction_output_index_arg_ptr);
+       LDKCOption_u32Z transaction_output_index_arg_conv = *(LDKCOption_u32Z*)(transaction_output_index_arg_ptr);
+       transaction_output_index_arg_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(transaction_output_index_arg));
+       LDKHTLCOutputInCommitment ret_var = HTLCOutputInCommitment_new(offered_arg, amount_msat_arg, cltv_expiry_arg, payment_hash_arg_ref, transaction_output_index_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 HTLCOutputInCommitment_clone_ptr(LDKHTLCOutputInCommitment *NONNULL_PTR arg) {
+       LDKHTLCOutputInCommitment ret_var = HTLCOutputInCommitment_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_HTLCOutputInCommitment_clone_ptr(int64_t arg) {
+       LDKHTLCOutputInCommitment 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 = HTLCOutputInCommitment_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_HTLCOutputInCommitment_clone(int64_t orig) {
+       LDKHTLCOutputInCommitment 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;
+       LDKHTLCOutputInCommitment ret_var = HTLCOutputInCommitment_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_HTLCOutputInCommitment_eq(int64_t a, int64_t b) {
+       LDKHTLCOutputInCommitment 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;
+       LDKHTLCOutputInCommitment 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 = HTLCOutputInCommitment_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_HTLCOutputInCommitment_write(int64_t obj) {
+       LDKHTLCOutputInCommitment 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 = HTLCOutputInCommitment_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_HTLCOutputInCommitment_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_HTLCOutputInCommitmentDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCOutputInCommitmentDecodeErrorZ), "LDKCResult_HTLCOutputInCommitmentDecodeErrorZ");
+       *ret_conv = HTLCOutputInCommitment_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_get_htlc_redeemscript(int64_t htlc, int64_t channel_type_features, int64_t keys) {
+       LDKHTLCOutputInCommitment htlc_conv;
+       htlc_conv.inner = untag_ptr(htlc);
+       htlc_conv.is_owned = ptr_is_owned(htlc);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_conv);
+       htlc_conv.is_owned = false;
+       LDKChannelTypeFeatures channel_type_features_conv;
+       channel_type_features_conv.inner = untag_ptr(channel_type_features);
+       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;
+       LDKTxCreationKeys keys_conv;
+       keys_conv.inner = untag_ptr(keys);
+       keys_conv.is_owned = ptr_is_owned(keys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(keys_conv);
+       keys_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = get_htlc_redeemscript(&htlc_conv, &channel_type_features_conv, &keys_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;
+}
+
+int8_tArray  CS_LDK_make_funding_redeemscript(int8_tArray broadcaster, int8_tArray countersignatory) {
+       LDKPublicKey broadcaster_ref;
+       CHECK(broadcaster->arr_len == 33);
+       memcpy(broadcaster_ref.compressed_form, broadcaster->elems, 33); FREE(broadcaster);
+       LDKPublicKey countersignatory_ref;
+       CHECK(countersignatory->arr_len == 33);
+       memcpy(countersignatory_ref.compressed_form, countersignatory->elems, 33); FREE(countersignatory);
+       LDKCVec_u8Z ret_var = make_funding_redeemscript(broadcaster_ref, countersignatory_ref);
+       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;
+}
+
+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) {
+       uint8_t commitment_txid_arr[32];
+       CHECK(commitment_txid->arr_len == 32);
+       memcpy(commitment_txid_arr, commitment_txid->elems, 32); FREE(commitment_txid);
+       uint8_t (*commitment_txid_ref)[32] = &commitment_txid_arr;
+       LDKHTLCOutputInCommitment htlc_conv;
+       htlc_conv.inner = untag_ptr(htlc);
+       htlc_conv.is_owned = ptr_is_owned(htlc);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_conv);
+       htlc_conv.is_owned = false;
+       LDKChannelTypeFeatures channel_type_features_conv;
+       channel_type_features_conv.inner = untag_ptr(channel_type_features);
+       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);
+       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);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_build_htlc_input_witness(int8_tArray local_sig, int8_tArray remote_sig, int64_t preimage, int8_tArray redeem_script, int64_t channel_type_features) {
+       LDKECDSASignature local_sig_ref;
+       CHECK(local_sig->arr_len == 64);
+       memcpy(local_sig_ref.compact_form, local_sig->elems, 64); FREE(local_sig);
+       LDKECDSASignature remote_sig_ref;
+       CHECK(remote_sig->arr_len == 64);
+       memcpy(remote_sig_ref.compact_form, remote_sig->elems, 64); FREE(remote_sig);
+       void* preimage_ptr = untag_ptr(preimage);
+       CHECK_ACCESS(preimage_ptr);
+       LDKCOption_ThirtyTwoBytesZ preimage_conv = *(LDKCOption_ThirtyTwoBytesZ*)(preimage_ptr);
+       preimage_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(preimage));
+       LDKu8slice redeem_script_ref;
+       redeem_script_ref.datalen = redeem_script->arr_len;
+       redeem_script_ref.data = redeem_script->elems;
+       LDKChannelTypeFeatures channel_type_features_conv;
+       channel_type_features_conv.inner = untag_ptr(channel_type_features);
+       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;
+       LDKWitness ret_var = build_htlc_input_witness(local_sig_ref, remote_sig_ref, preimage_conv, redeem_script_ref, &channel_type_features_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);
+       FREE(redeem_script);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_get_to_countersignatory_with_anchors_redeemscript(int8_tArray payment_point) {
+       LDKPublicKey payment_point_ref;
+       CHECK(payment_point->arr_len == 33);
+       memcpy(payment_point_ref.compressed_form, payment_point->elems, 33); FREE(payment_point);
+       LDKCVec_u8Z ret_var = get_to_countersignatory_with_anchors_redeemscript(payment_point_ref);
+       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;
+}
+
+int8_tArray  CS_LDK_get_anchor_redeemscript(int8_tArray funding_pubkey) {
+       LDKPublicKey funding_pubkey_ref;
+       CHECK(funding_pubkey->arr_len == 33);
+       memcpy(funding_pubkey_ref.compressed_form, funding_pubkey->elems, 33); FREE(funding_pubkey);
+       LDKCVec_u8Z ret_var = get_anchor_redeemscript(funding_pubkey_ref);
+       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;
+}
+
+int8_tArray  CS_LDK_build_anchor_input_witness(int8_tArray funding_key, int8_tArray funding_sig) {
+       LDKPublicKey funding_key_ref;
+       CHECK(funding_key->arr_len == 33);
+       memcpy(funding_key_ref.compressed_form, funding_key->elems, 33); FREE(funding_key);
+       LDKECDSASignature funding_sig_ref;
+       CHECK(funding_sig->arr_len == 64);
+       memcpy(funding_sig_ref.compact_form, funding_sig->elems, 64); FREE(funding_sig);
+       LDKWitness ret_var = build_anchor_input_witness(funding_key_ref, funding_sig_ref);
+       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;
+}
+
+void  CS_LDK_ChannelTransactionParameters_free(int64_t this_obj) {
+       LDKChannelTransactionParameters 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);
+       ChannelTransactionParameters_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChannelTransactionParameters_get_holder_pubkeys(int64_t this_ptr) {
+       LDKChannelTransactionParameters 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;
+       LDKChannelPublicKeys ret_var = ChannelTransactionParameters_get_holder_pubkeys(&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_ChannelTransactionParameters_set_holder_pubkeys(int64_t this_ptr, int64_t val) {
+       LDKChannelTransactionParameters 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;
+       LDKChannelPublicKeys 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 = ChannelPublicKeys_clone(&val_conv);
+       ChannelTransactionParameters_set_holder_pubkeys(&this_ptr_conv, val_conv);
+}
+
+int16_t  CS_LDK_ChannelTransactionParameters_get_holder_selected_contest_delay(int64_t this_ptr) {
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_get_holder_selected_contest_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelTransactionParameters_set_holder_selected_contest_delay(int64_t this_ptr, int16_t val) {
+       LDKChannelTransactionParameters 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;
+       ChannelTransactionParameters_set_holder_selected_contest_delay(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelTransactionParameters_get_is_outbound_from_holder(int64_t this_ptr) {
+       LDKChannelTransactionParameters 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;
+       jboolean ret_conv = ChannelTransactionParameters_get_is_outbound_from_holder(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelTransactionParameters_set_is_outbound_from_holder(int64_t this_ptr, jboolean val) {
+       LDKChannelTransactionParameters 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;
+       ChannelTransactionParameters_set_is_outbound_from_holder(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelTransactionParameters_get_counterparty_parameters(int64_t this_ptr) {
+       LDKChannelTransactionParameters 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;
+       LDKCounterpartyChannelTransactionParameters ret_var = ChannelTransactionParameters_get_counterparty_parameters(&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_ChannelTransactionParameters_set_counterparty_parameters(int64_t this_ptr, int64_t val) {
+       LDKChannelTransactionParameters 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;
+       LDKCounterpartyChannelTransactionParameters 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 = CounterpartyChannelTransactionParameters_clone(&val_conv);
+       ChannelTransactionParameters_set_counterparty_parameters(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelTransactionParameters_get_funding_outpoint(int64_t this_ptr) {
+       LDKChannelTransactionParameters 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;
+       LDKOutPoint ret_var = ChannelTransactionParameters_get_funding_outpoint(&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_ChannelTransactionParameters_set_funding_outpoint(int64_t this_ptr, int64_t val) {
+       LDKChannelTransactionParameters 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;
+       LDKOutPoint 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 = OutPoint_clone(&val_conv);
+       ChannelTransactionParameters_set_funding_outpoint(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelTransactionParameters_get_channel_type_features(int64_t this_ptr) {
+       LDKChannelTransactionParameters 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;
+       LDKChannelTypeFeatures ret_var = ChannelTransactionParameters_get_channel_type_features(&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_ChannelTransactionParameters_set_channel_type_features(int64_t this_ptr, int64_t val) {
+       LDKChannelTransactionParameters 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;
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_clone(&val_conv);
+       ChannelTransactionParameters_set_channel_type_features(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelTransactionParameters_new(int64_t holder_pubkeys_arg, int16_t holder_selected_contest_delay_arg, jboolean is_outbound_from_holder_arg, int64_t counterparty_parameters_arg, int64_t funding_outpoint_arg, int64_t channel_type_features_arg) {
+       LDKChannelPublicKeys holder_pubkeys_arg_conv;
+       holder_pubkeys_arg_conv.inner = untag_ptr(holder_pubkeys_arg);
+       holder_pubkeys_arg_conv.is_owned = ptr_is_owned(holder_pubkeys_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(holder_pubkeys_arg_conv);
+       holder_pubkeys_arg_conv = ChannelPublicKeys_clone(&holder_pubkeys_arg_conv);
+       LDKCounterpartyChannelTransactionParameters counterparty_parameters_arg_conv;
+       counterparty_parameters_arg_conv.inner = untag_ptr(counterparty_parameters_arg);
+       counterparty_parameters_arg_conv.is_owned = ptr_is_owned(counterparty_parameters_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(counterparty_parameters_arg_conv);
+       counterparty_parameters_arg_conv = CounterpartyChannelTransactionParameters_clone(&counterparty_parameters_arg_conv);
+       LDKOutPoint funding_outpoint_arg_conv;
+       funding_outpoint_arg_conv.inner = untag_ptr(funding_outpoint_arg);
+       funding_outpoint_arg_conv.is_owned = ptr_is_owned(funding_outpoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_outpoint_arg_conv);
+       funding_outpoint_arg_conv = OutPoint_clone(&funding_outpoint_arg_conv);
+       LDKChannelTypeFeatures channel_type_features_arg_conv;
+       channel_type_features_arg_conv.inner = untag_ptr(channel_type_features_arg);
+       channel_type_features_arg_conv.is_owned = ptr_is_owned(channel_type_features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_features_arg_conv);
+       channel_type_features_arg_conv = ChannelTypeFeatures_clone(&channel_type_features_arg_conv);
+       LDKChannelTransactionParameters ret_var = ChannelTransactionParameters_new(holder_pubkeys_arg_conv, holder_selected_contest_delay_arg, is_outbound_from_holder_arg, counterparty_parameters_arg_conv, funding_outpoint_arg_conv, channel_type_features_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 ChannelTransactionParameters_clone_ptr(LDKChannelTransactionParameters *NONNULL_PTR arg) {
+       LDKChannelTransactionParameters ret_var = ChannelTransactionParameters_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_ChannelTransactionParameters_clone_ptr(int64_t arg) {
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelTransactionParameters_clone(int64_t orig) {
+       LDKChannelTransactionParameters 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;
+       LDKChannelTransactionParameters ret_var = ChannelTransactionParameters_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_ChannelTransactionParameters_hash(int64_t o) {
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTransactionParameters_eq(int64_t a, int64_t b) {
+       LDKChannelTransactionParameters 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;
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CounterpartyChannelTransactionParameters_free(int64_t this_obj) {
+       LDKCounterpartyChannelTransactionParameters 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);
+       CounterpartyChannelTransactionParameters_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_CounterpartyChannelTransactionParameters_get_pubkeys(int64_t this_ptr) {
+       LDKCounterpartyChannelTransactionParameters 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;
+       LDKChannelPublicKeys ret_var = CounterpartyChannelTransactionParameters_get_pubkeys(&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_CounterpartyChannelTransactionParameters_set_pubkeys(int64_t this_ptr, int64_t val) {
+       LDKCounterpartyChannelTransactionParameters 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;
+       LDKChannelPublicKeys 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 = ChannelPublicKeys_clone(&val_conv);
+       CounterpartyChannelTransactionParameters_set_pubkeys(&this_ptr_conv, val_conv);
+}
+
+int16_t  CS_LDK_CounterpartyChannelTransactionParameters_get_selected_contest_delay(int64_t this_ptr) {
+       LDKCounterpartyChannelTransactionParameters 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 = CounterpartyChannelTransactionParameters_get_selected_contest_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CounterpartyChannelTransactionParameters_set_selected_contest_delay(int64_t this_ptr, int16_t val) {
+       LDKCounterpartyChannelTransactionParameters 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;
+       CounterpartyChannelTransactionParameters_set_selected_contest_delay(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_CounterpartyChannelTransactionParameters_new(int64_t pubkeys_arg, int16_t selected_contest_delay_arg) {
+       LDKChannelPublicKeys pubkeys_arg_conv;
+       pubkeys_arg_conv.inner = untag_ptr(pubkeys_arg);
+       pubkeys_arg_conv.is_owned = ptr_is_owned(pubkeys_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(pubkeys_arg_conv);
+       pubkeys_arg_conv = ChannelPublicKeys_clone(&pubkeys_arg_conv);
+       LDKCounterpartyChannelTransactionParameters ret_var = CounterpartyChannelTransactionParameters_new(pubkeys_arg_conv, selected_contest_delay_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 CounterpartyChannelTransactionParameters_clone_ptr(LDKCounterpartyChannelTransactionParameters *NONNULL_PTR arg) {
+       LDKCounterpartyChannelTransactionParameters ret_var = CounterpartyChannelTransactionParameters_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_CounterpartyChannelTransactionParameters_clone_ptr(int64_t arg) {
+       LDKCounterpartyChannelTransactionParameters 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 = CounterpartyChannelTransactionParameters_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CounterpartyChannelTransactionParameters_clone(int64_t orig) {
+       LDKCounterpartyChannelTransactionParameters 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;
+       LDKCounterpartyChannelTransactionParameters ret_var = CounterpartyChannelTransactionParameters_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_CounterpartyChannelTransactionParameters_hash(int64_t o) {
+       LDKCounterpartyChannelTransactionParameters 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 = CounterpartyChannelTransactionParameters_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_CounterpartyChannelTransactionParameters_eq(int64_t a, int64_t b) {
+       LDKCounterpartyChannelTransactionParameters 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;
+       LDKCounterpartyChannelTransactionParameters 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 = CounterpartyChannelTransactionParameters_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTransactionParameters_is_populated(int64_t this_arg) {
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_is_populated(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelTransactionParameters_as_holder_broadcastable(int64_t this_arg) {
+       LDKChannelTransactionParameters 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;
+       LDKDirectedChannelTransactionParameters ret_var = ChannelTransactionParameters_as_holder_broadcastable(&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_ChannelTransactionParameters_as_counterparty_broadcastable(int64_t this_arg) {
+       LDKChannelTransactionParameters 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;
+       LDKDirectedChannelTransactionParameters ret_var = ChannelTransactionParameters_as_counterparty_broadcastable(&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;
+}
+
+int8_tArray  CS_LDK_CounterpartyChannelTransactionParameters_write(int64_t obj) {
+       LDKCounterpartyChannelTransactionParameters 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 = CounterpartyChannelTransactionParameters_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_CounterpartyChannelTransactionParameters_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ), "LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = CounterpartyChannelTransactionParameters_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelTransactionParameters_write(int64_t obj) {
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_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_ChannelTransactionParameters_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelTransactionParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTransactionParametersDecodeErrorZ), "LDKCResult_ChannelTransactionParametersDecodeErrorZ");
+       *ret_conv = ChannelTransactionParameters_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_DirectedChannelTransactionParameters_free(int64_t this_obj) {
+       LDKDirectedChannelTransactionParameters 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);
+       DirectedChannelTransactionParameters_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_DirectedChannelTransactionParameters_broadcaster_pubkeys(int64_t this_arg) {
+       LDKDirectedChannelTransactionParameters 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;
+       LDKChannelPublicKeys ret_var = DirectedChannelTransactionParameters_broadcaster_pubkeys(&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_DirectedChannelTransactionParameters_countersignatory_pubkeys(int64_t this_arg) {
+       LDKDirectedChannelTransactionParameters 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;
+       LDKChannelPublicKeys ret_var = DirectedChannelTransactionParameters_countersignatory_pubkeys(&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;
+}
+
+int16_t  CS_LDK_DirectedChannelTransactionParameters_contest_delay(int64_t this_arg) {
+       LDKDirectedChannelTransactionParameters 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;
+       int16_t ret_conv = DirectedChannelTransactionParameters_contest_delay(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_DirectedChannelTransactionParameters_is_outbound(int64_t this_arg) {
+       LDKDirectedChannelTransactionParameters 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 = DirectedChannelTransactionParameters_is_outbound(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_DirectedChannelTransactionParameters_funding_outpoint(int64_t this_arg) {
+       LDKDirectedChannelTransactionParameters 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;
+       LDKOutPoint ret_var = DirectedChannelTransactionParameters_funding_outpoint(&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_DirectedChannelTransactionParameters_channel_type_features(int64_t this_arg) {
+       LDKDirectedChannelTransactionParameters 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;
+       LDKChannelTypeFeatures ret_var = DirectedChannelTransactionParameters_channel_type_features(&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;
+}
+
+void  CS_LDK_HolderCommitmentTransaction_free(int64_t this_obj) {
+       LDKHolderCommitmentTransaction 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);
+       HolderCommitmentTransaction_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_HolderCommitmentTransaction_get_counterparty_sig(int64_t this_ptr) {
+       LDKHolderCommitmentTransaction 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(64, __LINE__);
+       memcpy(ret_arr->elems, HolderCommitmentTransaction_get_counterparty_sig(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_HolderCommitmentTransaction_set_counterparty_sig(int64_t this_ptr, int8_tArray val) {
+       LDKHolderCommitmentTransaction 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       HolderCommitmentTransaction_set_counterparty_sig(&this_ptr_conv, val_ref);
+}
+
+ptrArray  CS_LDK_HolderCommitmentTransaction_get_counterparty_htlc_sigs(int64_t this_ptr) {
+       LDKHolderCommitmentTransaction 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_ECDSASignatureZ ret_var = HolderCommitmentTransaction_get_counterparty_htlc_sigs(&this_ptr_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;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_HolderCommitmentTransaction_set_counterparty_htlc_sigs(int64_t this_ptr, ptrArray val) {
+       LDKHolderCommitmentTransaction 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_ECDSASignatureZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKECDSASignature), "LDKCVec_ECDSASignatureZ Elements");
+       else
+               val_constr.data = NULL;
+       int8_tArray* val_vals = (void*) val->elems;
+       for (size_t i = 0; i < val_constr.datalen; i++) {
+               int8_tArray val_conv_8 = val_vals[i];
+               LDKECDSASignature val_conv_8_ref;
+               CHECK(val_conv_8->arr_len == 64);
+               memcpy(val_conv_8_ref.compact_form, val_conv_8->elems, 64); FREE(val_conv_8);
+               val_constr.data[i] = val_conv_8_ref;
+       }
+       FREE(val);
+       HolderCommitmentTransaction_set_counterparty_htlc_sigs(&this_ptr_conv, val_constr);
+}
+
+static inline uint64_t HolderCommitmentTransaction_clone_ptr(LDKHolderCommitmentTransaction *NONNULL_PTR arg) {
+       LDKHolderCommitmentTransaction ret_var = HolderCommitmentTransaction_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_HolderCommitmentTransaction_clone_ptr(int64_t arg) {
+       LDKHolderCommitmentTransaction 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 = HolderCommitmentTransaction_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_HolderCommitmentTransaction_clone(int64_t orig) {
+       LDKHolderCommitmentTransaction 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;
+       LDKHolderCommitmentTransaction ret_var = HolderCommitmentTransaction_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_HolderCommitmentTransaction_write(int64_t obj) {
+       LDKHolderCommitmentTransaction 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 = HolderCommitmentTransaction_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_HolderCommitmentTransaction_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_HolderCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HolderCommitmentTransactionDecodeErrorZ), "LDKCResult_HolderCommitmentTransactionDecodeErrorZ");
+       *ret_conv = HolderCommitmentTransaction_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_HolderCommitmentTransaction_new(int64_t commitment_tx, int8_tArray counterparty_sig, ptrArray counterparty_htlc_sigs, int8_tArray holder_funding_key, int8_tArray counterparty_funding_key) {
+       LDKCommitmentTransaction commitment_tx_conv;
+       commitment_tx_conv.inner = untag_ptr(commitment_tx);
+       commitment_tx_conv.is_owned = ptr_is_owned(commitment_tx);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(commitment_tx_conv);
+       commitment_tx_conv = CommitmentTransaction_clone(&commitment_tx_conv);
+       LDKECDSASignature counterparty_sig_ref;
+       CHECK(counterparty_sig->arr_len == 64);
+       memcpy(counterparty_sig_ref.compact_form, counterparty_sig->elems, 64); FREE(counterparty_sig);
+       LDKCVec_ECDSASignatureZ counterparty_htlc_sigs_constr;
+       counterparty_htlc_sigs_constr.datalen = counterparty_htlc_sigs->arr_len;
+       if (counterparty_htlc_sigs_constr.datalen > 0)
+               counterparty_htlc_sigs_constr.data = MALLOC(counterparty_htlc_sigs_constr.datalen * sizeof(LDKECDSASignature), "LDKCVec_ECDSASignatureZ Elements");
+       else
+               counterparty_htlc_sigs_constr.data = NULL;
+       int8_tArray* counterparty_htlc_sigs_vals = (void*) counterparty_htlc_sigs->elems;
+       for (size_t i = 0; i < counterparty_htlc_sigs_constr.datalen; i++) {
+               int8_tArray counterparty_htlc_sigs_conv_8 = counterparty_htlc_sigs_vals[i];
+               LDKECDSASignature counterparty_htlc_sigs_conv_8_ref;
+               CHECK(counterparty_htlc_sigs_conv_8->arr_len == 64);
+               memcpy(counterparty_htlc_sigs_conv_8_ref.compact_form, counterparty_htlc_sigs_conv_8->elems, 64); FREE(counterparty_htlc_sigs_conv_8);
+               counterparty_htlc_sigs_constr.data[i] = counterparty_htlc_sigs_conv_8_ref;
+       }
+       FREE(counterparty_htlc_sigs);
+       LDKPublicKey holder_funding_key_ref;
+       CHECK(holder_funding_key->arr_len == 33);
+       memcpy(holder_funding_key_ref.compressed_form, holder_funding_key->elems, 33); FREE(holder_funding_key);
+       LDKPublicKey counterparty_funding_key_ref;
+       CHECK(counterparty_funding_key->arr_len == 33);
+       memcpy(counterparty_funding_key_ref.compressed_form, counterparty_funding_key->elems, 33); FREE(counterparty_funding_key);
+       LDKHolderCommitmentTransaction ret_var = HolderCommitmentTransaction_new(commitment_tx_conv, counterparty_sig_ref, counterparty_htlc_sigs_constr, holder_funding_key_ref, counterparty_funding_key_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;
+}
+
+void  CS_LDK_BuiltCommitmentTransaction_free(int64_t this_obj) {
+       LDKBuiltCommitmentTransaction 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);
+       BuiltCommitmentTransaction_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_BuiltCommitmentTransaction_get_transaction(int64_t this_ptr) {
+       LDKBuiltCommitmentTransaction 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;
+       LDKTransaction ret_var = BuiltCommitmentTransaction_get_transaction(&this_ptr_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);
+       return ret_arr;
+}
+
+void  CS_LDK_BuiltCommitmentTransaction_set_transaction(int64_t this_ptr, int8_tArray val) {
+       LDKBuiltCommitmentTransaction 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;
+       LDKTransaction val_ref;
+       val_ref.datalen = val->arr_len;
+       val_ref.data = MALLOC(val_ref.datalen, "LDKTransaction Bytes");
+       memcpy(val_ref.data, val->elems, val_ref.datalen); FREE(val);
+       val_ref.data_is_owned = true;
+       BuiltCommitmentTransaction_set_transaction(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_BuiltCommitmentTransaction_get_txid(int64_t this_ptr) {
+       LDKBuiltCommitmentTransaction 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, *BuiltCommitmentTransaction_get_txid(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_BuiltCommitmentTransaction_set_txid(int64_t this_ptr, int8_tArray val) {
+       LDKBuiltCommitmentTransaction 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);
+       BuiltCommitmentTransaction_set_txid(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_BuiltCommitmentTransaction_new(int8_tArray transaction_arg, int8_tArray txid_arg) {
+       LDKTransaction transaction_arg_ref;
+       transaction_arg_ref.datalen = transaction_arg->arr_len;
+       transaction_arg_ref.data = MALLOC(transaction_arg_ref.datalen, "LDKTransaction Bytes");
+       memcpy(transaction_arg_ref.data, transaction_arg->elems, transaction_arg_ref.datalen); FREE(transaction_arg);
+       transaction_arg_ref.data_is_owned = true;
+       LDKThirtyTwoBytes txid_arg_ref;
+       CHECK(txid_arg->arr_len == 32);
+       memcpy(txid_arg_ref.data, txid_arg->elems, 32); FREE(txid_arg);
+       LDKBuiltCommitmentTransaction ret_var = BuiltCommitmentTransaction_new(transaction_arg_ref, txid_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 BuiltCommitmentTransaction_clone_ptr(LDKBuiltCommitmentTransaction *NONNULL_PTR arg) {
+       LDKBuiltCommitmentTransaction ret_var = BuiltCommitmentTransaction_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_BuiltCommitmentTransaction_clone_ptr(int64_t arg) {
+       LDKBuiltCommitmentTransaction 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 = BuiltCommitmentTransaction_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BuiltCommitmentTransaction_clone(int64_t orig) {
+       LDKBuiltCommitmentTransaction 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;
+       LDKBuiltCommitmentTransaction ret_var = BuiltCommitmentTransaction_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_BuiltCommitmentTransaction_write(int64_t obj) {
+       LDKBuiltCommitmentTransaction 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 = BuiltCommitmentTransaction_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_BuiltCommitmentTransaction_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BuiltCommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BuiltCommitmentTransactionDecodeErrorZ), "LDKCResult_BuiltCommitmentTransactionDecodeErrorZ");
+       *ret_conv = BuiltCommitmentTransaction_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_BuiltCommitmentTransaction_get_sighash_all(int64_t this_arg, int8_tArray funding_redeemscript, int64_t channel_value_satoshis) {
+       LDKBuiltCommitmentTransaction 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;
+       LDKu8slice funding_redeemscript_ref;
+       funding_redeemscript_ref.datalen = funding_redeemscript->arr_len;
+       funding_redeemscript_ref.data = funding_redeemscript->elems;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, BuiltCommitmentTransaction_get_sighash_all(&this_arg_conv, funding_redeemscript_ref, channel_value_satoshis).data, 32);
+       FREE(funding_redeemscript);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_BuiltCommitmentTransaction_sign_counterparty_commitment(int64_t this_arg, int8_tArray funding_key, int8_tArray funding_redeemscript, int64_t channel_value_satoshis) {
+       LDKBuiltCommitmentTransaction 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;
+       uint8_t funding_key_arr[32];
+       CHECK(funding_key->arr_len == 32);
+       memcpy(funding_key_arr, funding_key->elems, 32); FREE(funding_key);
+       uint8_t (*funding_key_ref)[32] = &funding_key_arr;
+       LDKu8slice funding_redeemscript_ref;
+       funding_redeemscript_ref.datalen = funding_redeemscript->arr_len;
+       funding_redeemscript_ref.data = funding_redeemscript->elems;
+       int8_tArray ret_arr = init_int8_tArray(64, __LINE__);
+       memcpy(ret_arr->elems, BuiltCommitmentTransaction_sign_counterparty_commitment(&this_arg_conv, funding_key_ref, funding_redeemscript_ref, channel_value_satoshis).compact_form, 64);
+       FREE(funding_redeemscript);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_BuiltCommitmentTransaction_sign_holder_commitment(int64_t this_arg, int8_tArray funding_key, int8_tArray funding_redeemscript, int64_t channel_value_satoshis, int64_t entropy_source) {
+       LDKBuiltCommitmentTransaction 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;
+       uint8_t funding_key_arr[32];
+       CHECK(funding_key->arr_len == 32);
+       memcpy(funding_key_arr, funding_key->elems, 32); FREE(funding_key);
+       uint8_t (*funding_key_ref)[32] = &funding_key_arr;
+       LDKu8slice funding_redeemscript_ref;
+       funding_redeemscript_ref.datalen = funding_redeemscript->arr_len;
+       funding_redeemscript_ref.data = funding_redeemscript->elems;
+       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;
+       int8_tArray ret_arr = init_int8_tArray(64, __LINE__);
+       memcpy(ret_arr->elems, BuiltCommitmentTransaction_sign_holder_commitment(&this_arg_conv, funding_key_ref, funding_redeemscript_ref, channel_value_satoshis, entropy_source_conv).compact_form, 64);
+       FREE(funding_redeemscript);
+       return ret_arr;
+}
+
+void  CS_LDK_ClosingTransaction_free(int64_t this_obj) {
+       LDKClosingTransaction 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);
+       ClosingTransaction_free(this_obj_conv);
+}
+
+static inline uint64_t ClosingTransaction_clone_ptr(LDKClosingTransaction *NONNULL_PTR arg) {
+       LDKClosingTransaction ret_var = ClosingTransaction_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_ClosingTransaction_clone_ptr(int64_t arg) {
+       LDKClosingTransaction 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 = ClosingTransaction_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ClosingTransaction_clone(int64_t orig) {
+       LDKClosingTransaction 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;
+       LDKClosingTransaction ret_var = ClosingTransaction_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_ClosingTransaction_hash(int64_t o) {
+       LDKClosingTransaction 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 = ClosingTransaction_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ClosingTransaction_eq(int64_t a, int64_t b) {
+       LDKClosingTransaction 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;
+       LDKClosingTransaction 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 = ClosingTransaction_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ClosingTransaction_new(int64_t to_holder_value_sat, int64_t to_counterparty_value_sat, int8_tArray to_holder_script, int8_tArray to_counterparty_script, int64_t funding_outpoint) {
+       LDKCVec_u8Z to_holder_script_ref;
+       to_holder_script_ref.datalen = to_holder_script->arr_len;
+       to_holder_script_ref.data = MALLOC(to_holder_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(to_holder_script_ref.data, to_holder_script->elems, to_holder_script_ref.datalen); FREE(to_holder_script);
+       LDKCVec_u8Z to_counterparty_script_ref;
+       to_counterparty_script_ref.datalen = to_counterparty_script->arr_len;
+       to_counterparty_script_ref.data = MALLOC(to_counterparty_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(to_counterparty_script_ref.data, to_counterparty_script->elems, to_counterparty_script_ref.datalen); FREE(to_counterparty_script);
+       LDKOutPoint funding_outpoint_conv;
+       funding_outpoint_conv.inner = untag_ptr(funding_outpoint);
+       funding_outpoint_conv.is_owned = ptr_is_owned(funding_outpoint);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_outpoint_conv);
+       funding_outpoint_conv = OutPoint_clone(&funding_outpoint_conv);
+       LDKClosingTransaction ret_var = ClosingTransaction_new(to_holder_value_sat, to_counterparty_value_sat, to_holder_script_ref, to_counterparty_script_ref, funding_outpoint_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_ClosingTransaction_trust(int64_t this_arg) {
+       LDKClosingTransaction 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;
+       LDKTrustedClosingTransaction ret_var = ClosingTransaction_trust(&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_ClosingTransaction_verify(int64_t this_arg, int64_t funding_outpoint) {
+       LDKClosingTransaction 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;
+       LDKOutPoint funding_outpoint_conv;
+       funding_outpoint_conv.inner = untag_ptr(funding_outpoint);
+       funding_outpoint_conv.is_owned = ptr_is_owned(funding_outpoint);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_outpoint_conv);
+       funding_outpoint_conv = OutPoint_clone(&funding_outpoint_conv);
+       LDKCResult_TrustedClosingTransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TrustedClosingTransactionNoneZ), "LDKCResult_TrustedClosingTransactionNoneZ");
+       *ret_conv = ClosingTransaction_verify(&this_arg_conv, funding_outpoint_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ClosingTransaction_to_holder_value_sat(int64_t this_arg) {
+       LDKClosingTransaction 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 = ClosingTransaction_to_holder_value_sat(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ClosingTransaction_to_counterparty_value_sat(int64_t this_arg) {
+       LDKClosingTransaction 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 = ClosingTransaction_to_counterparty_value_sat(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_ClosingTransaction_to_holder_script(int64_t this_arg) {
+       LDKClosingTransaction 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;
+       LDKu8slice ret_var = ClosingTransaction_to_holder_script(&this_arg_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;
+}
+
+int8_tArray  CS_LDK_ClosingTransaction_to_counterparty_script(int64_t this_arg) {
+       LDKClosingTransaction 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;
+       LDKu8slice ret_var = ClosingTransaction_to_counterparty_script(&this_arg_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;
+}
+
+void  CS_LDK_TrustedClosingTransaction_free(int64_t this_obj) {
+       LDKTrustedClosingTransaction 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);
+       TrustedClosingTransaction_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TrustedClosingTransaction_built_transaction(int64_t this_arg) {
+       LDKTrustedClosingTransaction 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;
+       LDKTransaction ret_var = TrustedClosingTransaction_built_transaction(&this_arg_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);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_TrustedClosingTransaction_get_sighash_all(int64_t this_arg, int8_tArray funding_redeemscript, int64_t channel_value_satoshis) {
+       LDKTrustedClosingTransaction 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;
+       LDKu8slice funding_redeemscript_ref;
+       funding_redeemscript_ref.datalen = funding_redeemscript->arr_len;
+       funding_redeemscript_ref.data = funding_redeemscript->elems;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, TrustedClosingTransaction_get_sighash_all(&this_arg_conv, funding_redeemscript_ref, channel_value_satoshis).data, 32);
+       FREE(funding_redeemscript);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_TrustedClosingTransaction_sign(int64_t this_arg, int8_tArray funding_key, int8_tArray funding_redeemscript, int64_t channel_value_satoshis) {
+       LDKTrustedClosingTransaction 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;
+       uint8_t funding_key_arr[32];
+       CHECK(funding_key->arr_len == 32);
+       memcpy(funding_key_arr, funding_key->elems, 32); FREE(funding_key);
+       uint8_t (*funding_key_ref)[32] = &funding_key_arr;
+       LDKu8slice funding_redeemscript_ref;
+       funding_redeemscript_ref.datalen = funding_redeemscript->arr_len;
+       funding_redeemscript_ref.data = funding_redeemscript->elems;
+       int8_tArray ret_arr = init_int8_tArray(64, __LINE__);
+       memcpy(ret_arr->elems, TrustedClosingTransaction_sign(&this_arg_conv, funding_key_ref, funding_redeemscript_ref, channel_value_satoshis).compact_form, 64);
+       FREE(funding_redeemscript);
+       return ret_arr;
+}
+
+void  CS_LDK_CommitmentTransaction_free(int64_t this_obj) {
+       LDKCommitmentTransaction 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);
+       CommitmentTransaction_free(this_obj_conv);
+}
+
+static inline uint64_t CommitmentTransaction_clone_ptr(LDKCommitmentTransaction *NONNULL_PTR arg) {
+       LDKCommitmentTransaction ret_var = CommitmentTransaction_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_CommitmentTransaction_clone_ptr(int64_t arg) {
+       LDKCommitmentTransaction 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 = CommitmentTransaction_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CommitmentTransaction_clone(int64_t orig) {
+       LDKCommitmentTransaction 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;
+       LDKCommitmentTransaction ret_var = CommitmentTransaction_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_CommitmentTransaction_write(int64_t obj) {
+       LDKCommitmentTransaction 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 = CommitmentTransaction_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_CommitmentTransaction_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_CommitmentTransactionDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CommitmentTransactionDecodeErrorZ), "LDKCResult_CommitmentTransactionDecodeErrorZ");
+       *ret_conv = CommitmentTransaction_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CommitmentTransaction_commitment_number(int64_t this_arg) {
+       LDKCommitmentTransaction 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 = CommitmentTransaction_commitment_number(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_CommitmentTransaction_per_commitment_point(int64_t this_arg) {
+       LDKCommitmentTransaction 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, CommitmentTransaction_per_commitment_point(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_CommitmentTransaction_to_broadcaster_value_sat(int64_t this_arg) {
+       LDKCommitmentTransaction 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 = CommitmentTransaction_to_broadcaster_value_sat(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CommitmentTransaction_to_countersignatory_value_sat(int64_t this_arg) {
+       LDKCommitmentTransaction 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 = CommitmentTransaction_to_countersignatory_value_sat(&this_arg_conv);
+       return ret_conv;
+}
+
+int32_t  CS_LDK_CommitmentTransaction_feerate_per_kw(int64_t this_arg) {
+       LDKCommitmentTransaction 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;
+       int32_t ret_conv = CommitmentTransaction_feerate_per_kw(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CommitmentTransaction_trust(int64_t this_arg) {
+       LDKCommitmentTransaction 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;
+       LDKTrustedCommitmentTransaction ret_var = CommitmentTransaction_trust(&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_CommitmentTransaction_verify(int64_t this_arg, int64_t channel_parameters, int64_t broadcaster_keys, int64_t countersignatory_keys) {
+       LDKCommitmentTransaction 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;
+       LDKDirectedChannelTransactionParameters channel_parameters_conv;
+       channel_parameters_conv.inner = untag_ptr(channel_parameters);
+       channel_parameters_conv.is_owned = ptr_is_owned(channel_parameters);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_parameters_conv);
+       channel_parameters_conv.is_owned = false;
+       LDKChannelPublicKeys broadcaster_keys_conv;
+       broadcaster_keys_conv.inner = untag_ptr(broadcaster_keys);
+       broadcaster_keys_conv.is_owned = ptr_is_owned(broadcaster_keys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(broadcaster_keys_conv);
+       broadcaster_keys_conv.is_owned = false;
+       LDKChannelPublicKeys countersignatory_keys_conv;
+       countersignatory_keys_conv.inner = untag_ptr(countersignatory_keys);
+       countersignatory_keys_conv.is_owned = ptr_is_owned(countersignatory_keys);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(countersignatory_keys_conv);
+       countersignatory_keys_conv.is_owned = false;
+       LDKCResult_TrustedCommitmentTransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TrustedCommitmentTransactionNoneZ), "LDKCResult_TrustedCommitmentTransactionNoneZ");
+       *ret_conv = CommitmentTransaction_verify(&this_arg_conv, &channel_parameters_conv, &broadcaster_keys_conv, &countersignatory_keys_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_TrustedCommitmentTransaction_free(int64_t this_obj) {
+       LDKTrustedCommitmentTransaction 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);
+       TrustedCommitmentTransaction_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_TrustedCommitmentTransaction_txid(int64_t this_arg) {
+       LDKTrustedCommitmentTransaction 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, TrustedCommitmentTransaction_txid(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_TrustedCommitmentTransaction_built_transaction(int64_t this_arg) {
+       LDKTrustedCommitmentTransaction 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;
+       LDKBuiltCommitmentTransaction ret_var = TrustedCommitmentTransaction_built_transaction(&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_TrustedCommitmentTransaction_keys(int64_t this_arg) {
+       LDKTrustedCommitmentTransaction 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;
+       LDKTxCreationKeys ret_var = TrustedCommitmentTransaction_keys(&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_TrustedCommitmentTransaction_channel_type_features(int64_t this_arg) {
+       LDKTrustedCommitmentTransaction 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;
+       LDKChannelTypeFeatures ret_var = TrustedCommitmentTransaction_channel_type_features(&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_TrustedCommitmentTransaction_get_htlc_sigs(int64_t this_arg, int8_tArray htlc_base_key, int64_t channel_parameters, int64_t entropy_source) {
+       LDKTrustedCommitmentTransaction 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;
+       uint8_t htlc_base_key_arr[32];
+       CHECK(htlc_base_key->arr_len == 32);
+       memcpy(htlc_base_key_arr, htlc_base_key->elems, 32); FREE(htlc_base_key);
+       uint8_t (*htlc_base_key_ref)[32] = &htlc_base_key_arr;
+       LDKDirectedChannelTransactionParameters channel_parameters_conv;
+       channel_parameters_conv.inner = untag_ptr(channel_parameters);
+       channel_parameters_conv.is_owned = ptr_is_owned(channel_parameters);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_parameters_conv);
+       channel_parameters_conv.is_owned = false;
+       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_CVec_ECDSASignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_ECDSASignatureZNoneZ), "LDKCResult_CVec_ECDSASignatureZNoneZ");
+       *ret_conv = TrustedCommitmentTransaction_get_htlc_sigs(&this_arg_conv, htlc_base_key_ref, &channel_parameters_conv, entropy_source_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_TrustedCommitmentTransaction_revokeable_output_index(int64_t this_arg) {
+       LDKTrustedCommitmentTransaction 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;
+       LDKCOption_usizeZ *ret_copy = MALLOC(sizeof(LDKCOption_usizeZ), "LDKCOption_usizeZ");
+       *ret_copy = TrustedCommitmentTransaction_revokeable_output_index(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_TrustedCommitmentTransaction_build_to_local_justice_tx(int64_t this_arg, int64_t feerate_per_kw, int8_tArray destination_script) {
+       LDKTrustedCommitmentTransaction 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;
+       LDKCVec_u8Z destination_script_ref;
+       destination_script_ref.datalen = destination_script->arr_len;
+       destination_script_ref.data = MALLOC(destination_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(destination_script_ref.data, destination_script->elems, destination_script_ref.datalen); FREE(destination_script);
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = TrustedCommitmentTransaction_build_to_local_justice_tx(&this_arg_conv, feerate_per_kw, destination_script_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_get_commitment_transaction_number_obscure_factor(int8_tArray broadcaster_payment_basepoint, int8_tArray countersignatory_payment_basepoint, jboolean outbound_from_broadcaster) {
+       LDKPublicKey broadcaster_payment_basepoint_ref;
+       CHECK(broadcaster_payment_basepoint->arr_len == 33);
+       memcpy(broadcaster_payment_basepoint_ref.compressed_form, broadcaster_payment_basepoint->elems, 33); FREE(broadcaster_payment_basepoint);
+       LDKPublicKey countersignatory_payment_basepoint_ref;
+       CHECK(countersignatory_payment_basepoint->arr_len == 33);
+       memcpy(countersignatory_payment_basepoint_ref.compressed_form, countersignatory_payment_basepoint->elems, 33); FREE(countersignatory_payment_basepoint);
+       int64_t ret_conv = get_commitment_transaction_number_obscure_factor(broadcaster_payment_basepoint_ref, countersignatory_payment_basepoint_ref, outbound_from_broadcaster);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_eq(int64_t a, int64_t b) {
+       LDKInitFeatures 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;
+       LDKInitFeatures 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 = InitFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_eq(int64_t a, int64_t b) {
+       LDKNodeFeatures 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;
+       LDKNodeFeatures 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 = NodeFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelFeatures_eq(int64_t a, int64_t b) {
+       LDKChannelFeatures 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;
+       LDKChannelFeatures 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 = ChannelFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_eq(int64_t a, int64_t b) {
+       LDKBolt11InvoiceFeatures 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;
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_OfferFeatures_eq(int64_t a, int64_t b) {
+       LDKOfferFeatures 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;
+       LDKOfferFeatures 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 = OfferFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InvoiceRequestFeatures_eq(int64_t a, int64_t b) {
+       LDKInvoiceRequestFeatures 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;
+       LDKInvoiceRequestFeatures 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 = InvoiceRequestFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt12InvoiceFeatures_eq(int64_t a, int64_t b) {
+       LDKBolt12InvoiceFeatures 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;
+       LDKBolt12InvoiceFeatures 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 = Bolt12InvoiceFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BlindedHopFeatures_eq(int64_t a, int64_t b) {
+       LDKBlindedHopFeatures 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;
+       LDKBlindedHopFeatures 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 = BlindedHopFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_eq(int64_t a, int64_t b) {
+       LDKChannelTypeFeatures 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;
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t InitFeatures_clone_ptr(LDKInitFeatures *NONNULL_PTR arg) {
+       LDKInitFeatures ret_var = InitFeatures_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_InitFeatures_clone_ptr(int64_t arg) {
+       LDKInitFeatures 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 = InitFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InitFeatures_clone(int64_t orig) {
+       LDKInitFeatures 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;
+       LDKInitFeatures ret_var = InitFeatures_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;
+}
+
+static inline uint64_t NodeFeatures_clone_ptr(LDKNodeFeatures *NONNULL_PTR arg) {
+       LDKNodeFeatures ret_var = NodeFeatures_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_NodeFeatures_clone_ptr(int64_t arg) {
+       LDKNodeFeatures 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 = NodeFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NodeFeatures_clone(int64_t orig) {
+       LDKNodeFeatures 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;
+       LDKNodeFeatures ret_var = NodeFeatures_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;
+}
+
+static inline uint64_t ChannelFeatures_clone_ptr(LDKChannelFeatures *NONNULL_PTR arg) {
+       LDKChannelFeatures ret_var = ChannelFeatures_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_ChannelFeatures_clone_ptr(int64_t arg) {
+       LDKChannelFeatures 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 = ChannelFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelFeatures_clone(int64_t orig) {
+       LDKChannelFeatures 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;
+       LDKChannelFeatures ret_var = ChannelFeatures_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;
+}
+
+static inline uint64_t Bolt11InvoiceFeatures_clone_ptr(LDKBolt11InvoiceFeatures *NONNULL_PTR arg) {
+       LDKBolt11InvoiceFeatures ret_var = Bolt11InvoiceFeatures_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_Bolt11InvoiceFeatures_clone_ptr(int64_t arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11InvoiceFeatures_clone(int64_t orig) {
+       LDKBolt11InvoiceFeatures 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;
+       LDKBolt11InvoiceFeatures ret_var = Bolt11InvoiceFeatures_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;
+}
+
+static inline uint64_t OfferFeatures_clone_ptr(LDKOfferFeatures *NONNULL_PTR arg) {
+       LDKOfferFeatures ret_var = OfferFeatures_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_OfferFeatures_clone_ptr(int64_t arg) {
+       LDKOfferFeatures 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 = OfferFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OfferFeatures_clone(int64_t orig) {
+       LDKOfferFeatures 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;
+       LDKOfferFeatures ret_var = OfferFeatures_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;
+}
+
+static inline uint64_t InvoiceRequestFeatures_clone_ptr(LDKInvoiceRequestFeatures *NONNULL_PTR arg) {
+       LDKInvoiceRequestFeatures ret_var = InvoiceRequestFeatures_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_InvoiceRequestFeatures_clone_ptr(int64_t arg) {
+       LDKInvoiceRequestFeatures 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 = InvoiceRequestFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InvoiceRequestFeatures_clone(int64_t orig) {
+       LDKInvoiceRequestFeatures 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;
+       LDKInvoiceRequestFeatures ret_var = InvoiceRequestFeatures_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;
+}
+
+static inline uint64_t Bolt12InvoiceFeatures_clone_ptr(LDKBolt12InvoiceFeatures *NONNULL_PTR arg) {
+       LDKBolt12InvoiceFeatures ret_var = Bolt12InvoiceFeatures_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_Bolt12InvoiceFeatures_clone_ptr(int64_t arg) {
+       LDKBolt12InvoiceFeatures 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 = Bolt12InvoiceFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt12InvoiceFeatures_clone(int64_t orig) {
+       LDKBolt12InvoiceFeatures 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;
+       LDKBolt12InvoiceFeatures ret_var = Bolt12InvoiceFeatures_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;
+}
+
+static inline uint64_t BlindedHopFeatures_clone_ptr(LDKBlindedHopFeatures *NONNULL_PTR arg) {
+       LDKBlindedHopFeatures ret_var = BlindedHopFeatures_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_BlindedHopFeatures_clone_ptr(int64_t arg) {
+       LDKBlindedHopFeatures 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 = BlindedHopFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedHopFeatures_clone(int64_t orig) {
+       LDKBlindedHopFeatures 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;
+       LDKBlindedHopFeatures ret_var = BlindedHopFeatures_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;
+}
+
+static inline uint64_t ChannelTypeFeatures_clone_ptr(LDKChannelTypeFeatures *NONNULL_PTR arg) {
+       LDKChannelTypeFeatures ret_var = ChannelTypeFeatures_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_ChannelTypeFeatures_clone_ptr(int64_t arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelTypeFeatures_clone(int64_t orig) {
+       LDKChannelTypeFeatures 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;
+       LDKChannelTypeFeatures ret_var = ChannelTypeFeatures_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_InitFeatures_free(int64_t this_obj) {
+       LDKInitFeatures 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);
+       InitFeatures_free(this_obj_conv);
+}
+
+void  CS_LDK_NodeFeatures_free(int64_t this_obj) {
+       LDKNodeFeatures 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);
+       NodeFeatures_free(this_obj_conv);
+}
+
+void  CS_LDK_ChannelFeatures_free(int64_t this_obj) {
+       LDKChannelFeatures 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);
+       ChannelFeatures_free(this_obj_conv);
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_free(int64_t this_obj) {
+       LDKBolt11InvoiceFeatures 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);
+       Bolt11InvoiceFeatures_free(this_obj_conv);
+}
+
+void  CS_LDK_OfferFeatures_free(int64_t this_obj) {
+       LDKOfferFeatures 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);
+       OfferFeatures_free(this_obj_conv);
+}
+
+void  CS_LDK_InvoiceRequestFeatures_free(int64_t this_obj) {
+       LDKInvoiceRequestFeatures 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);
+       InvoiceRequestFeatures_free(this_obj_conv);
+}
+
+void  CS_LDK_Bolt12InvoiceFeatures_free(int64_t this_obj) {
+       LDKBolt12InvoiceFeatures 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);
+       Bolt12InvoiceFeatures_free(this_obj_conv);
+}
+
+void  CS_LDK_BlindedHopFeatures_free(int64_t this_obj) {
+       LDKBlindedHopFeatures 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);
+       BlindedHopFeatures_free(this_obj_conv);
+}
+
+void  CS_LDK_ChannelTypeFeatures_free(int64_t this_obj) {
+       LDKChannelTypeFeatures 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);
+       ChannelTypeFeatures_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_InitFeatures_empty() {
+       LDKInitFeatures ret_var = InitFeatures_empty();
+       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_InitFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       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;
+       LDKInitFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = InitFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_unknown_bits(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_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InitFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = InitFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InitFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = InitFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InitFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = InitFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InitFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = InitFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeFeatures_empty() {
+       LDKNodeFeatures ret_var = NodeFeatures_empty();
+       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_NodeFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       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;
+       LDKNodeFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = NodeFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_unknown_bits(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_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NodeFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = NodeFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = NodeFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = NodeFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = NodeFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelFeatures_empty() {
+       LDKChannelFeatures ret_var = ChannelFeatures_empty();
+       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_ChannelFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       LDKChannelFeatures 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;
+       LDKChannelFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = ChannelFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelFeatures_requires_unknown_bits(int64_t this_arg) {
+       LDKChannelFeatures 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 = ChannelFeatures_requires_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKChannelFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKChannelFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKChannelFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKChannelFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt11InvoiceFeatures_empty() {
+       LDKBolt11InvoiceFeatures ret_var = Bolt11InvoiceFeatures_empty();
+       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_Bolt11InvoiceFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       LDKBolt11InvoiceFeatures 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;
+       LDKBolt11InvoiceFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = Bolt11InvoiceFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_requires_unknown_bits(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_requires_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11InvoiceFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKBolt11InvoiceFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = Bolt11InvoiceFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt11InvoiceFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKBolt11InvoiceFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = Bolt11InvoiceFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt11InvoiceFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKBolt11InvoiceFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = Bolt11InvoiceFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt11InvoiceFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKBolt11InvoiceFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = Bolt11InvoiceFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_OfferFeatures_empty() {
+       LDKOfferFeatures ret_var = OfferFeatures_empty();
+       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_OfferFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       LDKOfferFeatures 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;
+       LDKOfferFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = OfferFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_OfferFeatures_requires_unknown_bits(int64_t this_arg) {
+       LDKOfferFeatures 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 = OfferFeatures_requires_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OfferFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKOfferFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = OfferFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_OfferFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKOfferFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = OfferFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_OfferFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKOfferFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = OfferFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_OfferFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKOfferFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = OfferFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InvoiceRequestFeatures_empty() {
+       LDKInvoiceRequestFeatures ret_var = InvoiceRequestFeatures_empty();
+       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_InvoiceRequestFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       LDKInvoiceRequestFeatures 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;
+       LDKInvoiceRequestFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = InvoiceRequestFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InvoiceRequestFeatures_requires_unknown_bits(int64_t this_arg) {
+       LDKInvoiceRequestFeatures 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 = InvoiceRequestFeatures_requires_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InvoiceRequestFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKInvoiceRequestFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = InvoiceRequestFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InvoiceRequestFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKInvoiceRequestFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = InvoiceRequestFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InvoiceRequestFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKInvoiceRequestFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = InvoiceRequestFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InvoiceRequestFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKInvoiceRequestFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = InvoiceRequestFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt12InvoiceFeatures_empty() {
+       LDKBolt12InvoiceFeatures ret_var = Bolt12InvoiceFeatures_empty();
+       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_Bolt12InvoiceFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       LDKBolt12InvoiceFeatures 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;
+       LDKBolt12InvoiceFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = Bolt12InvoiceFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt12InvoiceFeatures_requires_unknown_bits(int64_t this_arg) {
+       LDKBolt12InvoiceFeatures 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 = Bolt12InvoiceFeatures_requires_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt12InvoiceFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKBolt12InvoiceFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = Bolt12InvoiceFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt12InvoiceFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKBolt12InvoiceFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = Bolt12InvoiceFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt12InvoiceFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKBolt12InvoiceFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = Bolt12InvoiceFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt12InvoiceFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKBolt12InvoiceFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = Bolt12InvoiceFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_BlindedHopFeatures_empty() {
+       LDKBlindedHopFeatures ret_var = BlindedHopFeatures_empty();
+       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_BlindedHopFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       LDKBlindedHopFeatures 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;
+       LDKBlindedHopFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = BlindedHopFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BlindedHopFeatures_requires_unknown_bits(int64_t this_arg) {
+       LDKBlindedHopFeatures 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 = BlindedHopFeatures_requires_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedHopFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKBlindedHopFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = BlindedHopFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_BlindedHopFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKBlindedHopFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = BlindedHopFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_BlindedHopFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKBlindedHopFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = BlindedHopFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_BlindedHopFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKBlindedHopFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = BlindedHopFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelTypeFeatures_empty() {
+       LDKChannelTypeFeatures ret_var = ChannelTypeFeatures_empty();
+       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_ChannelTypeFeatures_requires_unknown_bits_from(int64_t this_arg, int64_t other) {
+       LDKChannelTypeFeatures 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;
+       LDKChannelTypeFeatures other_conv;
+       other_conv.inner = untag_ptr(other);
+       other_conv.is_owned = ptr_is_owned(other);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(other_conv);
+       other_conv.is_owned = false;
+       jboolean ret_conv = ChannelTypeFeatures_requires_unknown_bits_from(&this_arg_conv, &other_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_requires_unknown_bits(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_requires_unknown_bits(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelTypeFeatures_set_required_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKChannelTypeFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelTypeFeatures_set_required_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelTypeFeatures_set_optional_feature_bit(int64_t this_arg, int64_t bit) {
+       LDKChannelTypeFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelTypeFeatures_set_optional_feature_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelTypeFeatures_set_required_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKChannelTypeFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelTypeFeatures_set_required_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelTypeFeatures_set_optional_custom_bit(int64_t this_arg, int64_t bit) {
+       LDKChannelTypeFeatures 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;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = ChannelTypeFeatures_set_optional_custom_bit(&this_arg_conv, bit);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_InitFeatures_write(int64_t obj) {
+       LDKInitFeatures 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 = InitFeatures_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_InitFeatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_InitFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitFeaturesDecodeErrorZ), "LDKCResult_InitFeaturesDecodeErrorZ");
+       *ret_conv = InitFeatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelFeatures_write(int64_t obj) {
+       LDKChannelFeatures 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 = ChannelFeatures_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_ChannelFeatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelFeaturesDecodeErrorZ), "LDKCResult_ChannelFeaturesDecodeErrorZ");
+       *ret_conv = ChannelFeatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_NodeFeatures_write(int64_t obj) {
+       LDKNodeFeatures 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 = NodeFeatures_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_NodeFeatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_NodeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeFeaturesDecodeErrorZ), "LDKCResult_NodeFeaturesDecodeErrorZ");
+       *ret_conv = NodeFeatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_Bolt11InvoiceFeatures_write(int64_t obj) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_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_Bolt11InvoiceFeatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = Bolt11InvoiceFeatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_Bolt12InvoiceFeatures_write(int64_t obj) {
+       LDKBolt12InvoiceFeatures 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 = Bolt12InvoiceFeatures_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_Bolt12InvoiceFeatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ), "LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ");
+       *ret_conv = Bolt12InvoiceFeatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_BlindedHopFeatures_write(int64_t obj) {
+       LDKBlindedHopFeatures 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 = BlindedHopFeatures_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_BlindedHopFeatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BlindedHopFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopFeaturesDecodeErrorZ), "LDKCResult_BlindedHopFeaturesDecodeErrorZ");
+       *ret_conv = BlindedHopFeatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ChannelTypeFeatures_write(int64_t obj) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_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_ChannelTypeFeatures_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelTypeFeaturesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelTypeFeaturesDecodeErrorZ), "LDKCResult_ChannelTypeFeaturesDecodeErrorZ");
+       *ret_conv = ChannelTypeFeatures_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_InitFeatures_set_data_loss_protect_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_data_loss_protect_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_data_loss_protect_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_data_loss_protect_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_data_loss_protect(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_data_loss_protect(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_data_loss_protect_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_data_loss_protect_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_data_loss_protect_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_data_loss_protect_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_data_loss_protect(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_data_loss_protect(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_data_loss_protect(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_data_loss_protect(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_data_loss_protect(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_data_loss_protect(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_initial_routing_sync_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_initial_routing_sync_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_initial_routing_sync_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_initial_routing_sync_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_initial_routing_sync(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_initial_routing_sync(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_upfront_shutdown_script_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_upfront_shutdown_script_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_upfront_shutdown_script_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_upfront_shutdown_script_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_upfront_shutdown_script(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_upfront_shutdown_script(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_upfront_shutdown_script_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_upfront_shutdown_script_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_upfront_shutdown_script_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_upfront_shutdown_script_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_upfront_shutdown_script(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_upfront_shutdown_script(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_upfront_shutdown_script(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_upfront_shutdown_script(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_upfront_shutdown_script(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_upfront_shutdown_script(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_gossip_queries_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_gossip_queries_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_gossip_queries_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_gossip_queries_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_gossip_queries(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_gossip_queries(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_gossip_queries_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_gossip_queries_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_gossip_queries_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_gossip_queries_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_gossip_queries(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_gossip_queries(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_gossip_queries(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_gossip_queries(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_gossip_queries(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_gossip_queries(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_variable_length_onion_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_variable_length_onion_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_variable_length_onion_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_variable_length_onion_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_variable_length_onion(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_variable_length_onion(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_variable_length_onion_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_variable_length_onion_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_variable_length_onion_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_variable_length_onion_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_variable_length_onion(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_variable_length_onion(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_set_variable_length_onion_optional(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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;
+       Bolt11InvoiceFeatures_set_variable_length_onion_optional(&this_arg_conv);
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_set_variable_length_onion_required(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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;
+       Bolt11InvoiceFeatures_set_variable_length_onion_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_supports_variable_length_onion(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_supports_variable_length_onion(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_variable_length_onion(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_variable_length_onion(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_variable_length_onion(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_variable_length_onion(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_requires_variable_length_onion(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_requires_variable_length_onion(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_static_remote_key_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_static_remote_key_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_static_remote_key_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_static_remote_key_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_static_remote_key(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_static_remote_key(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_static_remote_key_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_static_remote_key_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_static_remote_key_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_static_remote_key_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_static_remote_key(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_static_remote_key(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_static_remote_key_optional(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_static_remote_key_optional(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_static_remote_key_required(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_static_remote_key_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_supports_static_remote_key(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_supports_static_remote_key(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_static_remote_key(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_static_remote_key(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_static_remote_key(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_static_remote_key(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_requires_static_remote_key(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_requires_static_remote_key(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_payment_secret_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_payment_secret_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_payment_secret_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_payment_secret_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_payment_secret(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_payment_secret(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_payment_secret_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_payment_secret_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_payment_secret_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_payment_secret_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_payment_secret(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_payment_secret(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_set_payment_secret_optional(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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;
+       Bolt11InvoiceFeatures_set_payment_secret_optional(&this_arg_conv);
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_set_payment_secret_required(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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;
+       Bolt11InvoiceFeatures_set_payment_secret_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_supports_payment_secret(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_supports_payment_secret(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_payment_secret(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_payment_secret(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_payment_secret(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_payment_secret(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_requires_payment_secret(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_requires_payment_secret(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_basic_mpp_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_basic_mpp_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_basic_mpp_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_basic_mpp_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_basic_mpp(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_basic_mpp(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_basic_mpp_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_basic_mpp_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_basic_mpp_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_basic_mpp_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_basic_mpp(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_basic_mpp(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_set_basic_mpp_optional(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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;
+       Bolt11InvoiceFeatures_set_basic_mpp_optional(&this_arg_conv);
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_set_basic_mpp_required(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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;
+       Bolt11InvoiceFeatures_set_basic_mpp_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_supports_basic_mpp(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_supports_basic_mpp(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Bolt12InvoiceFeatures_set_basic_mpp_optional(int64_t this_arg) {
+       LDKBolt12InvoiceFeatures 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;
+       Bolt12InvoiceFeatures_set_basic_mpp_optional(&this_arg_conv);
+}
+
+void  CS_LDK_Bolt12InvoiceFeatures_set_basic_mpp_required(int64_t this_arg) {
+       LDKBolt12InvoiceFeatures 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;
+       Bolt12InvoiceFeatures_set_basic_mpp_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_Bolt12InvoiceFeatures_supports_basic_mpp(int64_t this_arg) {
+       LDKBolt12InvoiceFeatures 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 = Bolt12InvoiceFeatures_supports_basic_mpp(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_basic_mpp(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_basic_mpp(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_basic_mpp(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_basic_mpp(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_requires_basic_mpp(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_requires_basic_mpp(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt12InvoiceFeatures_requires_basic_mpp(int64_t this_arg) {
+       LDKBolt12InvoiceFeatures 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 = Bolt12InvoiceFeatures_requires_basic_mpp(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_wumbo_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_wumbo_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_wumbo_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_wumbo_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_wumbo(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_wumbo(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_wumbo_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_wumbo_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_wumbo_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_wumbo_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_wumbo(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_wumbo(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_wumbo(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_wumbo(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_wumbo(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_wumbo(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_anchors_nonzero_fee_htlc_tx_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_anchors_nonzero_fee_htlc_tx_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_anchors_nonzero_fee_htlc_tx_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_anchors_nonzero_fee_htlc_tx_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_anchors_nonzero_fee_htlc_tx(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_anchors_nonzero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_anchors_nonzero_fee_htlc_tx_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_anchors_nonzero_fee_htlc_tx_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_anchors_nonzero_fee_htlc_tx_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_anchors_nonzero_fee_htlc_tx_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_anchors_nonzero_fee_htlc_tx(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_anchors_nonzero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_anchors_nonzero_fee_htlc_tx_optional(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_anchors_nonzero_fee_htlc_tx_optional(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_anchors_nonzero_fee_htlc_tx_required(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_anchors_nonzero_fee_htlc_tx_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_supports_anchors_nonzero_fee_htlc_tx(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_supports_anchors_nonzero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_anchors_nonzero_fee_htlc_tx(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_anchors_nonzero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_anchors_nonzero_fee_htlc_tx(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_anchors_nonzero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_requires_anchors_nonzero_fee_htlc_tx(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_requires_anchors_nonzero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_anchors_zero_fee_htlc_tx_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_anchors_zero_fee_htlc_tx_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_anchors_zero_fee_htlc_tx_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_anchors_zero_fee_htlc_tx_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_anchors_zero_fee_htlc_tx(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_anchors_zero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_anchors_zero_fee_htlc_tx_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_anchors_zero_fee_htlc_tx_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_anchors_zero_fee_htlc_tx_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_anchors_zero_fee_htlc_tx_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_anchors_zero_fee_htlc_tx(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_anchors_zero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_anchors_zero_fee_htlc_tx_optional(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_anchors_zero_fee_htlc_tx_optional(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_anchors_zero_fee_htlc_tx_required(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_anchors_zero_fee_htlc_tx_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_supports_anchors_zero_fee_htlc_tx(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_supports_anchors_zero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_anchors_zero_fee_htlc_tx(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_anchors_zero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_anchors_zero_fee_htlc_tx(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_anchors_zero_fee_htlc_tx(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_requires_anchors_zero_fee_htlc_tx(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_requires_anchors_zero_fee_htlc_tx(&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);
+       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_shutdown_any_segwit_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_shutdown_any_segwit_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_shutdown_any_segwit_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_shutdown_anysegwit(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_shutdown_anysegwit(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_shutdown_any_segwit_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_shutdown_any_segwit_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_shutdown_any_segwit_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_shutdown_any_segwit_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_shutdown_anysegwit(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_shutdown_anysegwit(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_shutdown_anysegwit(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_shutdown_anysegwit(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_shutdown_anysegwit(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_shutdown_anysegwit(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_taproot_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_taproot_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_taproot_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_taproot_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_taproot(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_taproot(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_taproot_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_taproot_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_taproot_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_taproot_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_taproot(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_taproot(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_taproot_optional(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_taproot_optional(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_taproot_required(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_taproot_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_supports_taproot(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_supports_taproot(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_taproot(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_taproot(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_taproot(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_taproot(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_requires_taproot(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_requires_taproot(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_onion_messages_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_onion_messages_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_onion_messages_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_onion_messages_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_onion_messages(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_onion_messages(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_onion_messages_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_onion_messages_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_onion_messages_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_onion_messages_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_onion_messages(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_onion_messages(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_onion_messages(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_onion_messages(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_onion_messages(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_onion_messages(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_channel_type_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_channel_type_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_channel_type_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_channel_type_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_channel_type(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_channel_type(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_channel_type_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_channel_type_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_channel_type_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_channel_type_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_channel_type(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_channel_type(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_channel_type(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_channel_type(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_channel_type(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_channel_type(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_scid_privacy_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_scid_privacy_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_scid_privacy_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_scid_privacy_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_scid_privacy(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_scid_privacy(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_scid_privacy_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_scid_privacy_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_scid_privacy_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_scid_privacy_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_scid_privacy(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_scid_privacy(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_scid_privacy_optional(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_scid_privacy_optional(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_scid_privacy_required(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_scid_privacy_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_supports_scid_privacy(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_supports_scid_privacy(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_scid_privacy(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_scid_privacy(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_scid_privacy(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_scid_privacy(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_requires_scid_privacy(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_requires_scid_privacy(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_set_payment_metadata_optional(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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;
+       Bolt11InvoiceFeatures_set_payment_metadata_optional(&this_arg_conv);
+}
+
+void  CS_LDK_Bolt11InvoiceFeatures_set_payment_metadata_required(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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;
+       Bolt11InvoiceFeatures_set_payment_metadata_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_supports_payment_metadata(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_supports_payment_metadata(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11InvoiceFeatures_requires_payment_metadata(int64_t this_arg) {
+       LDKBolt11InvoiceFeatures 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 = Bolt11InvoiceFeatures_requires_payment_metadata(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InitFeatures_set_zero_conf_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_zero_conf_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_zero_conf_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_zero_conf_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_zero_conf(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_zero_conf(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_zero_conf_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_zero_conf_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_zero_conf_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_zero_conf_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_zero_conf(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_zero_conf(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_zero_conf_optional(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_zero_conf_optional(&this_arg_conv);
+}
+
+void  CS_LDK_ChannelTypeFeatures_set_zero_conf_required(int64_t this_arg) {
+       LDKChannelTypeFeatures 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;
+       ChannelTypeFeatures_set_zero_conf_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_supports_zero_conf(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_supports_zero_conf(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_zero_conf(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_zero_conf(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_zero_conf(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_zero_conf(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ChannelTypeFeatures_requires_zero_conf(int64_t this_arg) {
+       LDKChannelTypeFeatures 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 = ChannelTypeFeatures_requires_zero_conf(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_keysend_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_keysend_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_keysend_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_keysend_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_keysend(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_keysend(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_keysend(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_keysend(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ShutdownScript_free(int64_t this_obj) {
+       LDKShutdownScript 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);
+       ShutdownScript_free(this_obj_conv);
+}
+
+static inline uint64_t ShutdownScript_clone_ptr(LDKShutdownScript *NONNULL_PTR arg) {
+       LDKShutdownScript ret_var = ShutdownScript_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_ShutdownScript_clone_ptr(int64_t arg) {
+       LDKShutdownScript 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 = ShutdownScript_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ShutdownScript_clone(int64_t orig) {
+       LDKShutdownScript 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;
+       LDKShutdownScript ret_var = ShutdownScript_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_ShutdownScript_eq(int64_t a, int64_t b) {
+       LDKShutdownScript 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;
+       LDKShutdownScript 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 = ShutdownScript_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InvalidShutdownScript_free(int64_t this_obj) {
+       LDKInvalidShutdownScript 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);
+       InvalidShutdownScript_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_InvalidShutdownScript_get_script(int64_t this_ptr) {
+       LDKInvalidShutdownScript 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;
+       LDKu8slice 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);
+       return ret_arr;
+}
+
+void  CS_LDK_InvalidShutdownScript_set_script(int64_t this_ptr, int8_tArray val) {
+       LDKInvalidShutdownScript 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);
+       InvalidShutdownScript_set_script(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_InvalidShutdownScript_new(int8_tArray script_arg) {
+       LDKCVec_u8Z script_arg_ref;
+       script_arg_ref.datalen = script_arg->arr_len;
+       script_arg_ref.data = MALLOC(script_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(script_arg_ref.data, script_arg->elems, script_arg_ref.datalen); FREE(script_arg);
+       LDKInvalidShutdownScript ret_var = InvalidShutdownScript_new(script_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 InvalidShutdownScript_clone_ptr(LDKInvalidShutdownScript *NONNULL_PTR arg) {
+       LDKInvalidShutdownScript ret_var = InvalidShutdownScript_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_InvalidShutdownScript_clone_ptr(int64_t arg) {
+       LDKInvalidShutdownScript 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 = InvalidShutdownScript_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InvalidShutdownScript_clone(int64_t orig) {
+       LDKInvalidShutdownScript 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;
+       LDKInvalidShutdownScript ret_var = InvalidShutdownScript_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_ShutdownScript_write(int64_t obj) {
+       LDKShutdownScript 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 = ShutdownScript_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_ShutdownScript_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ShutdownScriptDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptDecodeErrorZ), "LDKCResult_ShutdownScriptDecodeErrorZ");
+       *ret_conv = ShutdownScript_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ShutdownScript_new_p2wpkh(int8_tArray pubkey_hash) {
+       uint8_t pubkey_hash_arr[20];
+       CHECK(pubkey_hash->arr_len == 20);
+       memcpy(pubkey_hash_arr, pubkey_hash->elems, 20); FREE(pubkey_hash);
+       uint8_t (*pubkey_hash_ref)[20] = &pubkey_hash_arr;
+       LDKShutdownScript ret_var = ShutdownScript_new_p2wpkh(pubkey_hash_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_ShutdownScript_new_p2wsh(int8_tArray script_hash) {
+       uint8_t script_hash_arr[32];
+       CHECK(script_hash->arr_len == 32);
+       memcpy(script_hash_arr, script_hash->elems, 32); FREE(script_hash);
+       uint8_t (*script_hash_ref)[32] = &script_hash_arr;
+       LDKShutdownScript ret_var = ShutdownScript_new_p2wsh(script_hash_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_ShutdownScript_new_witness_program(int8_t version, int8_tArray program) {
+       
+       LDKu8slice program_ref;
+       program_ref.datalen = program->arr_len;
+       program_ref.data = program->elems;
+       LDKCResult_ShutdownScriptInvalidShutdownScriptZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptInvalidShutdownScriptZ), "LDKCResult_ShutdownScriptInvalidShutdownScriptZ");
+       *ret_conv = ShutdownScript_new_witness_program((LDKWitnessVersion){ ._0 = version }, program_ref);
+       FREE(program);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_ShutdownScript_into_inner(int64_t this_arg) {
+       LDKShutdownScript 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 = ShutdownScript_clone(&this_arg_conv);
+       LDKCVec_u8Z ret_var = ShutdownScript_into_inner(this_arg_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;
+}
+
+int8_tArray  CS_LDK_ShutdownScript_as_legacy_pubkey(int64_t this_arg) {
+       LDKShutdownScript 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, ShutdownScript_as_legacy_pubkey(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+jboolean  CS_LDK_ShutdownScript_is_compatible(int64_t this_arg, int64_t features) {
+       LDKShutdownScript 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;
+       LDKInitFeatures features_conv;
+       features_conv.inner = untag_ptr(features);
+       features_conv.is_owned = ptr_is_owned(features);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_conv);
+       features_conv.is_owned = false;
+       jboolean ret_conv = ShutdownScript_is_compatible(&this_arg_conv, &features_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Retry_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);
+       LDKRetry this_ptr_conv = *(LDKRetry*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Retry_free(this_ptr_conv);
+}
+
+static inline uint64_t Retry_clone_ptr(LDKRetry *NONNULL_PTR arg) {
+       LDKRetry *ret_copy = MALLOC(sizeof(LDKRetry), "LDKRetry");
+       *ret_copy = Retry_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_Retry_clone_ptr(int64_t arg) {
+       LDKRetry* arg_conv = (LDKRetry*)untag_ptr(arg);
+       int64_t ret_conv = Retry_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Retry_clone(int64_t orig) {
+       LDKRetry* orig_conv = (LDKRetry*)untag_ptr(orig);
+       LDKRetry *ret_copy = MALLOC(sizeof(LDKRetry), "LDKRetry");
+       *ret_copy = Retry_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Retry_attempts(int32_t a) {
+       LDKRetry *ret_copy = MALLOC(sizeof(LDKRetry), "LDKRetry");
+       *ret_copy = Retry_attempts(a);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Retry_timeout(int64_t a) {
+       LDKRetry *ret_copy = MALLOC(sizeof(LDKRetry), "LDKRetry");
+       *ret_copy = Retry_timeout(a);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_Retry_eq(int64_t a, int64_t b) {
+       LDKRetry* a_conv = (LDKRetry*)untag_ptr(a);
+       LDKRetry* b_conv = (LDKRetry*)untag_ptr(b);
+       jboolean ret_conv = Retry_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Retry_hash(int64_t o) {
+       LDKRetry* o_conv = (LDKRetry*)untag_ptr(o);
+       int64_t ret_conv = Retry_hash(o_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Retry_write(int64_t obj) {
+       LDKRetry* obj_conv = (LDKRetry*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = Retry_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_Retry_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RetryDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RetryDecodeErrorZ), "LDKCResult_RetryDecodeErrorZ");
+       *ret_conv = Retry_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int32_t  CS_LDK_RetryableSendFailure_clone(int64_t orig) {
+       LDKRetryableSendFailure* orig_conv = (LDKRetryableSendFailure*)untag_ptr(orig);
+       int32_t ret_conv = LDKRetryableSendFailure_to_cs(RetryableSendFailure_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_RetryableSendFailure_payment_expired() {
+       int32_t ret_conv = LDKRetryableSendFailure_to_cs(RetryableSendFailure_payment_expired());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_RetryableSendFailure_route_not_found() {
+       int32_t ret_conv = LDKRetryableSendFailure_to_cs(RetryableSendFailure_route_not_found());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_RetryableSendFailure_duplicate_payment() {
+       int32_t ret_conv = LDKRetryableSendFailure_to_cs(RetryableSendFailure_duplicate_payment());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_RetryableSendFailure_eq(int64_t a, int64_t b) {
+       LDKRetryableSendFailure* a_conv = (LDKRetryableSendFailure*)untag_ptr(a);
+       LDKRetryableSendFailure* b_conv = (LDKRetryableSendFailure*)untag_ptr(b);
+       jboolean ret_conv = RetryableSendFailure_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentSendFailure_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);
+       LDKPaymentSendFailure this_ptr_conv = *(LDKPaymentSendFailure*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       PaymentSendFailure_free(this_ptr_conv);
+}
+
+static inline uint64_t PaymentSendFailure_clone_ptr(LDKPaymentSendFailure *NONNULL_PTR arg) {
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = PaymentSendFailure_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_PaymentSendFailure_clone_ptr(int64_t arg) {
+       LDKPaymentSendFailure* arg_conv = (LDKPaymentSendFailure*)untag_ptr(arg);
+       int64_t ret_conv = PaymentSendFailure_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PaymentSendFailure_clone(int64_t orig) {
+       LDKPaymentSendFailure* orig_conv = (LDKPaymentSendFailure*)untag_ptr(orig);
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = PaymentSendFailure_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PaymentSendFailure_parameter_error(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKAPIError a_conv = *(LDKAPIError*)(a_ptr);
+       a_conv = APIError_clone((LDKAPIError*)untag_ptr(a));
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = PaymentSendFailure_parameter_error(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PaymentSendFailure_path_parameter_error(int64_tArray a) {
+       LDKCVec_CResult_NoneAPIErrorZZ a_constr;
+       a_constr.datalen = a->arr_len;
+       if (a_constr.datalen > 0)
+               a_constr.data = MALLOC(a_constr.datalen * sizeof(LDKCResult_NoneAPIErrorZ), "LDKCVec_CResult_NoneAPIErrorZZ Elements");
+       else
+               a_constr.data = NULL;
+       int64_t* a_vals = a->elems;
+       for (size_t w = 0; w < a_constr.datalen; w++) {
+               int64_t a_conv_22 = a_vals[w];
+               void* a_conv_22_ptr = untag_ptr(a_conv_22);
+               CHECK_ACCESS(a_conv_22_ptr);
+               LDKCResult_NoneAPIErrorZ a_conv_22_conv = *(LDKCResult_NoneAPIErrorZ*)(a_conv_22_ptr);
+               a_conv_22_conv = CResult_NoneAPIErrorZ_clone((LDKCResult_NoneAPIErrorZ*)untag_ptr(a_conv_22));
+               a_constr.data[w] = a_conv_22_conv;
+       }
+       FREE(a);
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = PaymentSendFailure_path_parameter_error(a_constr);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PaymentSendFailure_all_failed_resend_safe(int64_tArray a) {
+       LDKCVec_APIErrorZ a_constr;
+       a_constr.datalen = a->arr_len;
+       if (a_constr.datalen > 0)
+               a_constr.data = MALLOC(a_constr.datalen * sizeof(LDKAPIError), "LDKCVec_APIErrorZ Elements");
+       else
+               a_constr.data = NULL;
+       int64_t* a_vals = a->elems;
+       for (size_t k = 0; k < a_constr.datalen; k++) {
+               int64_t a_conv_10 = a_vals[k];
+               void* a_conv_10_ptr = untag_ptr(a_conv_10);
+               CHECK_ACCESS(a_conv_10_ptr);
+               LDKAPIError a_conv_10_conv = *(LDKAPIError*)(a_conv_10_ptr);
+               a_conv_10_conv = APIError_clone((LDKAPIError*)untag_ptr(a_conv_10));
+               a_constr.data[k] = a_conv_10_conv;
+       }
+       FREE(a);
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = PaymentSendFailure_all_failed_resend_safe(a_constr);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PaymentSendFailure_duplicate_payment() {
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = PaymentSendFailure_duplicate_payment();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PaymentSendFailure_partial_failure(int64_tArray results, int64_t failed_paths_retry, int8_tArray payment_id) {
+       LDKCVec_CResult_NoneAPIErrorZZ results_constr;
+       results_constr.datalen = results->arr_len;
+       if (results_constr.datalen > 0)
+               results_constr.data = MALLOC(results_constr.datalen * sizeof(LDKCResult_NoneAPIErrorZ), "LDKCVec_CResult_NoneAPIErrorZZ Elements");
+       else
+               results_constr.data = NULL;
+       int64_t* results_vals = results->elems;
+       for (size_t w = 0; w < results_constr.datalen; w++) {
+               int64_t results_conv_22 = results_vals[w];
+               void* results_conv_22_ptr = untag_ptr(results_conv_22);
+               CHECK_ACCESS(results_conv_22_ptr);
+               LDKCResult_NoneAPIErrorZ results_conv_22_conv = *(LDKCResult_NoneAPIErrorZ*)(results_conv_22_ptr);
+               results_constr.data[w] = results_conv_22_conv;
+       }
+       FREE(results);
+       LDKRouteParameters failed_paths_retry_conv;
+       failed_paths_retry_conv.inner = untag_ptr(failed_paths_retry);
+       failed_paths_retry_conv.is_owned = ptr_is_owned(failed_paths_retry);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(failed_paths_retry_conv);
+       failed_paths_retry_conv = RouteParameters_clone(&failed_paths_retry_conv);
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKPaymentSendFailure *ret_copy = MALLOC(sizeof(LDKPaymentSendFailure), "LDKPaymentSendFailure");
+       *ret_copy = PaymentSendFailure_partial_failure(results_constr, failed_paths_retry_conv, payment_id_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_PaymentSendFailure_eq(int64_t a, int64_t b) {
+       LDKPaymentSendFailure* a_conv = (LDKPaymentSendFailure*)untag_ptr(a);
+       LDKPaymentSendFailure* b_conv = (LDKPaymentSendFailure*)untag_ptr(b);
+       jboolean ret_conv = PaymentSendFailure_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbeSendFailure_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);
+       LDKProbeSendFailure this_ptr_conv = *(LDKProbeSendFailure*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       ProbeSendFailure_free(this_ptr_conv);
+}
+
+static inline uint64_t ProbeSendFailure_clone_ptr(LDKProbeSendFailure *NONNULL_PTR arg) {
+       LDKProbeSendFailure *ret_copy = MALLOC(sizeof(LDKProbeSendFailure), "LDKProbeSendFailure");
+       *ret_copy = ProbeSendFailure_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_ProbeSendFailure_clone_ptr(int64_t arg) {
+       LDKProbeSendFailure* arg_conv = (LDKProbeSendFailure*)untag_ptr(arg);
+       int64_t ret_conv = ProbeSendFailure_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ProbeSendFailure_clone(int64_t orig) {
+       LDKProbeSendFailure* orig_conv = (LDKProbeSendFailure*)untag_ptr(orig);
+       LDKProbeSendFailure *ret_copy = MALLOC(sizeof(LDKProbeSendFailure), "LDKProbeSendFailure");
+       *ret_copy = ProbeSendFailure_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ProbeSendFailure_route_not_found() {
+       LDKProbeSendFailure *ret_copy = MALLOC(sizeof(LDKProbeSendFailure), "LDKProbeSendFailure");
+       *ret_copy = ProbeSendFailure_route_not_found();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ProbeSendFailure_sending_failed(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKPaymentSendFailure a_conv = *(LDKPaymentSendFailure*)(a_ptr);
+       a_conv = PaymentSendFailure_clone((LDKPaymentSendFailure*)untag_ptr(a));
+       LDKProbeSendFailure *ret_copy = MALLOC(sizeof(LDKProbeSendFailure), "LDKProbeSendFailure");
+       *ret_copy = ProbeSendFailure_sending_failed(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_ProbeSendFailure_eq(int64_t a, int64_t b) {
+       LDKProbeSendFailure* a_conv = (LDKProbeSendFailure*)untag_ptr(a);
+       LDKProbeSendFailure* b_conv = (LDKProbeSendFailure*)untag_ptr(b);
+       jboolean ret_conv = ProbeSendFailure_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RecipientOnionFields_free(int64_t this_obj) {
+       LDKRecipientOnionFields 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);
+       RecipientOnionFields_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_RecipientOnionFields_get_payment_secret(int64_t this_ptr) {
+       LDKRecipientOnionFields 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 = RecipientOnionFields_get_payment_secret(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_RecipientOnionFields_set_payment_secret(int64_t this_ptr, int64_t val) {
+       LDKRecipientOnionFields 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));
+       RecipientOnionFields_set_payment_secret(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_RecipientOnionFields_get_payment_metadata(int64_t this_ptr) {
+       LDKRecipientOnionFields 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_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = RecipientOnionFields_get_payment_metadata(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_RecipientOnionFields_set_payment_metadata(int64_t this_ptr, int64_t val) {
+       LDKRecipientOnionFields 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_u8ZZ val_conv = *(LDKCOption_CVec_u8ZZ*)(val_ptr);
+       val_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(val));
+       RecipientOnionFields_set_payment_metadata(&this_ptr_conv, val_conv);
+}
+
+static inline uint64_t RecipientOnionFields_clone_ptr(LDKRecipientOnionFields *NONNULL_PTR arg) {
+       LDKRecipientOnionFields ret_var = RecipientOnionFields_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_RecipientOnionFields_clone_ptr(int64_t arg) {
+       LDKRecipientOnionFields 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 = RecipientOnionFields_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RecipientOnionFields_clone(int64_t orig) {
+       LDKRecipientOnionFields 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;
+       LDKRecipientOnionFields ret_var = RecipientOnionFields_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_RecipientOnionFields_eq(int64_t a, int64_t b) {
+       LDKRecipientOnionFields 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;
+       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.is_owned = false;
+       jboolean ret_conv = RecipientOnionFields_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_RecipientOnionFields_write(int64_t obj) {
+       LDKRecipientOnionFields 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 = RecipientOnionFields_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_RecipientOnionFields_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RecipientOnionFieldsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsDecodeErrorZ), "LDKCResult_RecipientOnionFieldsDecodeErrorZ");
+       *ret_conv = RecipientOnionFields_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RecipientOnionFields_secret_only(int8_tArray payment_secret) {
+       LDKThirtyTwoBytes payment_secret_ref;
+       CHECK(payment_secret->arr_len == 32);
+       memcpy(payment_secret_ref.data, payment_secret->elems, 32); FREE(payment_secret);
+       LDKRecipientOnionFields ret_var = RecipientOnionFields_secret_only(payment_secret_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_RecipientOnionFields_spontaneous_empty() {
+       LDKRecipientOnionFields ret_var = RecipientOnionFields_spontaneous_empty();
+       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_RecipientOnionFields_with_custom_tlvs(int64_t this_arg, int64_tArray custom_tlvs) {
+       LDKRecipientOnionFields 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 = RecipientOnionFields_clone(&this_arg_conv);
+       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);
+       LDKCResult_RecipientOnionFieldsNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_RecipientOnionFieldsNoneZ), "LDKCResult_RecipientOnionFieldsNoneZ");
+       *ret_conv = RecipientOnionFields_with_custom_tlvs(this_arg_conv, custom_tlvs_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_tArray  CS_LDK_RecipientOnionFields_custom_tlvs(int64_t this_arg) {
+       LDKRecipientOnionFields 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;
+       LDKCVec_C2Tuple_u64CVec_u8ZZZ ret_var = RecipientOnionFields_custom_tlvs(&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_u64CVec_u8ZZ* ret_conv_23_conv = MALLOC(sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKC2Tuple_u64CVec_u8ZZ");
+               *ret_conv_23_conv = ret_var.data[x];
+               ret_arr_ptr[x] = tag_ptr(ret_conv_23_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_CustomMessageReader_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);
+       LDKCustomMessageReader this_ptr_conv = *(LDKCustomMessageReader*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       CustomMessageReader_free(this_ptr_conv);
+}
+
+static inline uint64_t Type_clone_ptr(LDKType *NONNULL_PTR arg) {
+       LDKType* ret_ret = MALLOC(sizeof(LDKType), "LDKType");
+       *ret_ret = Type_clone(arg);
+       return tag_ptr(ret_ret, true);
+}
+int64_t  CS_LDK_Type_clone_ptr(int64_t arg) {
+       void* arg_ptr = untag_ptr(arg);
+       if (ptr_is_owned(arg)) { CHECK_ACCESS(arg_ptr); }
+       LDKType* arg_conv = (LDKType*)arg_ptr;
+       int64_t ret_conv = Type_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Type_clone(int64_t orig) {
+       void* orig_ptr = untag_ptr(orig);
+       if (ptr_is_owned(orig)) { CHECK_ACCESS(orig_ptr); }
+       LDKType* orig_conv = (LDKType*)orig_ptr;
+       LDKType* ret_ret = MALLOC(sizeof(LDKType), "LDKType");
+       *ret_ret = Type_clone(orig_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_Type_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);
+       LDKType this_ptr_conv = *(LDKType*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Type_free(this_ptr_conv);
+}
+
+void  CS_LDK_Offer_free(int64_t this_obj) {
+       LDKOffer 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);
+       Offer_free(this_obj_conv);
+}
+
+static inline uint64_t Offer_clone_ptr(LDKOffer *NONNULL_PTR arg) {
+       LDKOffer ret_var = Offer_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_Offer_clone_ptr(int64_t arg) {
+       LDKOffer 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 = Offer_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Offer_clone(int64_t orig) {
+       LDKOffer 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;
+       LDKOffer ret_var = Offer_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;
+}
+
+ptrArray  CS_LDK_Offer_chains(int64_t this_arg) {
+       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;
+       LDKCVec_ThirtyTwoBytesZ ret_var = Offer_chains(&this_arg_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(32, __LINE__);
+               memcpy(ret_conv_8_arr->elems, ret_var.data[i].data, 32);
+               ret_arr_ptr[i] = ret_conv_8_arr;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Offer_metadata(int64_t this_arg) {
+       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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = Offer_metadata(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Offer_amount(int64_t this_arg) {
+       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;
+       LDKAmount ret_var = Offer_amount(&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_Offer_description(int64_t this_arg) {
+       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;
+       LDKPrintableString ret_var = Offer_description(&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_Offer_offer_features(int64_t this_arg) {
+       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;
+       LDKOfferFeatures ret_var = Offer_offer_features(&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_Offer_absolute_expiry(int64_t this_arg) {
+       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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = Offer_absolute_expiry(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Offer_issuer(int64_t this_arg) {
+       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;
+       LDKPrintableString ret_var = Offer_issuer(&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_tArray  CS_LDK_Offer_paths(int64_t this_arg) {
+       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;
+       LDKCVec_BlindedPathZ ret_var = Offer_paths(&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 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;
+}
+
+int64_t  CS_LDK_Offer_supported_quantity(int64_t this_arg) {
+       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;
+       LDKQuantity ret_var = Offer_supported_quantity(&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;
+}
+
+int8_tArray  CS_LDK_Offer_signing_pubkey(int64_t this_arg) {
+       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;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, Offer_signing_pubkey(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+jboolean  CS_LDK_Offer_supports_chain(int64_t this_arg, int8_tArray chain) {
+       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;
+       LDKThirtyTwoBytes chain_ref;
+       CHECK(chain->arr_len == 32);
+       memcpy(chain_ref.data, chain->elems, 32); FREE(chain);
+       jboolean ret_conv = Offer_supports_chain(&this_arg_conv, chain_ref);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Offer_is_expired(int64_t this_arg) {
+       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(&this_arg_conv);
+       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);
+       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_valid_quantity(&this_arg_conv, quantity);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Offer_expects_quantity(int64_t this_arg) {
+       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_expects_quantity(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Offer_write(int64_t obj) {
+       LDKOffer 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 = Offer_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;
+}
+
+void  CS_LDK_Amount_free(int64_t this_obj) {
+       LDKAmount 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);
+       Amount_free(this_obj_conv);
+}
+
+static inline uint64_t Amount_clone_ptr(LDKAmount *NONNULL_PTR arg) {
+       LDKAmount ret_var = Amount_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_Amount_clone_ptr(int64_t arg) {
+       LDKAmount 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 = Amount_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Amount_clone(int64_t orig) {
+       LDKAmount 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;
+       LDKAmount ret_var = Amount_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_Quantity_free(int64_t this_obj) {
+       LDKQuantity 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);
+       Quantity_free(this_obj_conv);
+}
+
+static inline uint64_t Quantity_clone_ptr(LDKQuantity *NONNULL_PTR arg) {
+       LDKQuantity ret_var = Quantity_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_Quantity_clone_ptr(int64_t arg) {
+       LDKQuantity 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 = Quantity_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Quantity_clone(int64_t orig) {
+       LDKQuantity 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;
+       LDKQuantity ret_var = Quantity_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_Offer_from_str(jstring s) {
+       LDKStr s_conv = str_ref_to_owned_c(s);
+       LDKCResult_OfferBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OfferBolt12ParseErrorZ), "LDKCResult_OfferBolt12ParseErrorZ");
+       *ret_conv = Offer_from_str(s_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_UnsignedBolt12Invoice_free(int64_t this_obj) {
+       LDKUnsignedBolt12Invoice 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);
+       UnsignedBolt12Invoice_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_tagged_hash(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKTaggedHash ret_var = UnsignedBolt12Invoice_tagged_hash(&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;
+}
+
+void  CS_LDK_Bolt12Invoice_free(int64_t this_obj) {
+       LDKBolt12Invoice 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);
+       Bolt12Invoice_free(this_obj_conv);
+}
+
+static inline uint64_t Bolt12Invoice_clone_ptr(LDKBolt12Invoice *NONNULL_PTR arg) {
+       LDKBolt12Invoice ret_var = Bolt12Invoice_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_Bolt12Invoice_clone_ptr(int64_t arg) {
+       LDKBolt12Invoice 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 = Bolt12Invoice_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_clone(int64_t orig) {
+       LDKBolt12Invoice 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;
+       LDKBolt12Invoice ret_var = Bolt12Invoice_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_UnsignedBolt12Invoice_offer_chains(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKCOption_CVec_ThirtyTwoBytesZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_ThirtyTwoBytesZZ), "LDKCOption_CVec_ThirtyTwoBytesZZ");
+       *ret_copy = UnsignedBolt12Invoice_offer_chains(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_UnsignedBolt12Invoice_chain(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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, UnsignedBolt12Invoice_chain(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_metadata(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = UnsignedBolt12Invoice_metadata(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_amount(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKAmount ret_var = UnsignedBolt12Invoice_amount(&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_UnsignedBolt12Invoice_offer_features(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKOfferFeatures ret_var = UnsignedBolt12Invoice_offer_features(&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_UnsignedBolt12Invoice_description(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKPrintableString ret_var = UnsignedBolt12Invoice_description(&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_UnsignedBolt12Invoice_absolute_expiry(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = UnsignedBolt12Invoice_absolute_expiry(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_issuer(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKPrintableString ret_var = UnsignedBolt12Invoice_issuer(&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_tArray  CS_LDK_UnsignedBolt12Invoice_message_paths(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKCVec_BlindedPathZ ret_var = UnsignedBolt12Invoice_message_paths(&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 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;
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_supported_quantity(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKQuantity ret_var = UnsignedBolt12Invoice_supported_quantity(&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;
+}
+
+int8_tArray  CS_LDK_UnsignedBolt12Invoice_payer_metadata(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKu8slice ret_var = UnsignedBolt12Invoice_payer_metadata(&this_arg_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_UnsignedBolt12Invoice_invoice_request_features(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKInvoiceRequestFeatures ret_var = UnsignedBolt12Invoice_invoice_request_features(&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_UnsignedBolt12Invoice_quantity(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = UnsignedBolt12Invoice_quantity(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_UnsignedBolt12Invoice_payer_id(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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, UnsignedBolt12Invoice_payer_id(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_payer_note(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKPrintableString ret_var = UnsignedBolt12Invoice_payer_note(&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_UnsignedBolt12Invoice_created_at(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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 = UnsignedBolt12Invoice_created_at(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_relative_expiry(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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 = UnsignedBolt12Invoice_relative_expiry(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_UnsignedBolt12Invoice_is_expired(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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 = UnsignedBolt12Invoice_is_expired(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_UnsignedBolt12Invoice_payment_hash(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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, UnsignedBolt12Invoice_payment_hash(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_amount_msats(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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 = UnsignedBolt12Invoice_amount_msats(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UnsignedBolt12Invoice_invoice_features(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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;
+       LDKBolt12InvoiceFeatures ret_var = UnsignedBolt12Invoice_invoice_features(&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;
+}
+
+int8_tArray  CS_LDK_UnsignedBolt12Invoice_signing_pubkey(int64_t this_arg) {
+       LDKUnsignedBolt12Invoice 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, UnsignedBolt12Invoice_signing_pubkey(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_offer_chains(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKCOption_CVec_ThirtyTwoBytesZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_ThirtyTwoBytesZZ), "LDKCOption_CVec_ThirtyTwoBytesZZ");
+       *ret_copy = Bolt12Invoice_offer_chains(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_Bolt12Invoice_chain(int64_t this_arg) {
+       LDKBolt12Invoice 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, Bolt12Invoice_chain(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_metadata(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = Bolt12Invoice_metadata(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_amount(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKAmount ret_var = Bolt12Invoice_amount(&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_Bolt12Invoice_offer_features(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKOfferFeatures ret_var = Bolt12Invoice_offer_features(&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_Bolt12Invoice_description(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKPrintableString ret_var = Bolt12Invoice_description(&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_Bolt12Invoice_absolute_expiry(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = Bolt12Invoice_absolute_expiry(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_issuer(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKPrintableString ret_var = Bolt12Invoice_issuer(&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_tArray  CS_LDK_Bolt12Invoice_message_paths(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKCVec_BlindedPathZ ret_var = Bolt12Invoice_message_paths(&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 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;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_supported_quantity(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKQuantity ret_var = Bolt12Invoice_supported_quantity(&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;
+}
+
+int8_tArray  CS_LDK_Bolt12Invoice_payer_metadata(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKu8slice ret_var = Bolt12Invoice_payer_metadata(&this_arg_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_Bolt12Invoice_invoice_request_features(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKInvoiceRequestFeatures ret_var = Bolt12Invoice_invoice_request_features(&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_Bolt12Invoice_quantity(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = Bolt12Invoice_quantity(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_Bolt12Invoice_payer_id(int64_t this_arg) {
+       LDKBolt12Invoice 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, Bolt12Invoice_payer_id(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_payer_note(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKPrintableString ret_var = Bolt12Invoice_payer_note(&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_Bolt12Invoice_created_at(int64_t this_arg) {
+       LDKBolt12Invoice 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 = Bolt12Invoice_created_at(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_relative_expiry(int64_t this_arg) {
+       LDKBolt12Invoice 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 = Bolt12Invoice_relative_expiry(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt12Invoice_is_expired(int64_t this_arg) {
+       LDKBolt12Invoice 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 = Bolt12Invoice_is_expired(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Bolt12Invoice_payment_hash(int64_t this_arg) {
+       LDKBolt12Invoice 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, Bolt12Invoice_payment_hash(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_amount_msats(int64_t this_arg) {
+       LDKBolt12Invoice 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 = Bolt12Invoice_amount_msats(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_invoice_features(int64_t this_arg) {
+       LDKBolt12Invoice 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;
+       LDKBolt12InvoiceFeatures ret_var = Bolt12Invoice_invoice_features(&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;
+}
+
+int8_tArray  CS_LDK_Bolt12Invoice_signing_pubkey(int64_t this_arg) {
+       LDKBolt12Invoice 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, Bolt12Invoice_signing_pubkey(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_Bolt12Invoice_signature(int64_t this_arg) {
+       LDKBolt12Invoice 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(64, __LINE__);
+       memcpy(ret_arr->elems, Bolt12Invoice_signature(&this_arg_conv).compact_form, 64);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_Bolt12Invoice_signable_hash(int64_t this_arg) {
+       LDKBolt12Invoice 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, Bolt12Invoice_signable_hash(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Bolt12Invoice_verify(int64_t this_arg, int64_t key) {
+       LDKBolt12Invoice 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;
+       LDKExpandedKey key_conv;
+       key_conv.inner = untag_ptr(key);
+       key_conv.is_owned = ptr_is_owned(key);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(key_conv);
+       key_conv.is_owned = false;
+       LDKCResult_ThirtyTwoBytesNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesNoneZ), "LDKCResult_ThirtyTwoBytesNoneZ");
+       *ret_conv = Bolt12Invoice_verify(&this_arg_conv, &key_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_UnsignedBolt12Invoice_write(int64_t obj) {
+       LDKUnsignedBolt12Invoice 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 = UnsignedBolt12Invoice_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;
+}
+
+int8_tArray  CS_LDK_Bolt12Invoice_write(int64_t obj) {
+       LDKBolt12Invoice 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 = Bolt12Invoice_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;
+}
+
+void  CS_LDK_BlindedPayInfo_free(int64_t this_obj) {
+       LDKBlindedPayInfo 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);
+       BlindedPayInfo_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_BlindedPayInfo_get_fee_base_msat(int64_t this_ptr) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_get_fee_base_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedPayInfo_set_fee_base_msat(int64_t this_ptr, int32_t val) {
+       LDKBlindedPayInfo 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;
+       BlindedPayInfo_set_fee_base_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_BlindedPayInfo_get_fee_proportional_millionths(int64_t this_ptr) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_get_fee_proportional_millionths(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedPayInfo_set_fee_proportional_millionths(int64_t this_ptr, int32_t val) {
+       LDKBlindedPayInfo 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;
+       BlindedPayInfo_set_fee_proportional_millionths(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_BlindedPayInfo_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_get_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedPayInfo_set_cltv_expiry_delta(int64_t this_ptr, int16_t val) {
+       LDKBlindedPayInfo 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;
+       BlindedPayInfo_set_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_BlindedPayInfo_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_get_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedPayInfo_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKBlindedPayInfo 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;
+       BlindedPayInfo_set_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_BlindedPayInfo_get_htlc_maximum_msat(int64_t this_ptr) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_get_htlc_maximum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedPayInfo_set_htlc_maximum_msat(int64_t this_ptr, int64_t val) {
+       LDKBlindedPayInfo 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;
+       BlindedPayInfo_set_htlc_maximum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_BlindedPayInfo_get_features(int64_t this_ptr) {
+       LDKBlindedPayInfo 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;
+       LDKBlindedHopFeatures ret_var = BlindedPayInfo_get_features(&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_BlindedPayInfo_set_features(int64_t this_ptr, int64_t val) {
+       LDKBlindedPayInfo 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;
+       LDKBlindedHopFeatures 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 = BlindedHopFeatures_clone(&val_conv);
+       BlindedPayInfo_set_features(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_BlindedPayInfo_new(int32_t fee_base_msat_arg, int32_t fee_proportional_millionths_arg, int16_t cltv_expiry_delta_arg, int64_t htlc_minimum_msat_arg, int64_t htlc_maximum_msat_arg, int64_t features_arg) {
+       LDKBlindedHopFeatures features_arg_conv;
+       features_arg_conv.inner = untag_ptr(features_arg);
+       features_arg_conv.is_owned = ptr_is_owned(features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_arg_conv);
+       features_arg_conv = BlindedHopFeatures_clone(&features_arg_conv);
+       LDKBlindedPayInfo ret_var = BlindedPayInfo_new(fee_base_msat_arg, fee_proportional_millionths_arg, cltv_expiry_delta_arg, htlc_minimum_msat_arg, htlc_maximum_msat_arg, features_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 BlindedPayInfo_clone_ptr(LDKBlindedPayInfo *NONNULL_PTR arg) {
+       LDKBlindedPayInfo ret_var = BlindedPayInfo_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_BlindedPayInfo_clone_ptr(int64_t arg) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedPayInfo_clone(int64_t orig) {
+       LDKBlindedPayInfo 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;
+       LDKBlindedPayInfo ret_var = BlindedPayInfo_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_BlindedPayInfo_hash(int64_t o) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BlindedPayInfo_eq(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.is_owned = false;
+       LDKBlindedPayInfo 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 = BlindedPayInfo_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_BlindedPayInfo_write(int64_t obj) {
+       LDKBlindedPayInfo 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 = BlindedPayInfo_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_BlindedPayInfo_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BlindedPayInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPayInfoDecodeErrorZ), "LDKCResult_BlindedPayInfoDecodeErrorZ");
+       *ret_conv = BlindedPayInfo_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_InvoiceError_free(int64_t this_obj) {
+       LDKInvoiceError 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);
+       InvoiceError_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_InvoiceError_get_erroneous_field(int64_t this_ptr) {
+       LDKInvoiceError 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;
+       LDKErroneousField ret_var = InvoiceError_get_erroneous_field(&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_InvoiceError_set_erroneous_field(int64_t this_ptr, int64_t val) {
+       LDKInvoiceError 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;
+       LDKErroneousField 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 = ErroneousField_clone(&val_conv);
+       InvoiceError_set_erroneous_field(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_InvoiceError_get_message(int64_t this_ptr) {
+       LDKInvoiceError 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;
+       LDKUntrustedString ret_var = InvoiceError_get_message(&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_InvoiceError_set_message(int64_t this_ptr, int64_t val) {
+       LDKInvoiceError 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;
+       LDKUntrustedString 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 = UntrustedString_clone(&val_conv);
+       InvoiceError_set_message(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_InvoiceError_new(int64_t erroneous_field_arg, int64_t message_arg) {
+       LDKErroneousField erroneous_field_arg_conv;
+       erroneous_field_arg_conv.inner = untag_ptr(erroneous_field_arg);
+       erroneous_field_arg_conv.is_owned = ptr_is_owned(erroneous_field_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(erroneous_field_arg_conv);
+       erroneous_field_arg_conv = ErroneousField_clone(&erroneous_field_arg_conv);
+       LDKUntrustedString message_arg_conv;
+       message_arg_conv.inner = untag_ptr(message_arg);
+       message_arg_conv.is_owned = ptr_is_owned(message_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(message_arg_conv);
+       message_arg_conv = UntrustedString_clone(&message_arg_conv);
+       LDKInvoiceError ret_var = InvoiceError_new(erroneous_field_arg_conv, message_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 InvoiceError_clone_ptr(LDKInvoiceError *NONNULL_PTR arg) {
+       LDKInvoiceError ret_var = InvoiceError_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_InvoiceError_clone_ptr(int64_t arg) {
+       LDKInvoiceError 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 = InvoiceError_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InvoiceError_clone(int64_t orig) {
+       LDKInvoiceError 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;
+       LDKInvoiceError ret_var = InvoiceError_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_ErroneousField_free(int64_t this_obj) {
+       LDKErroneousField 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);
+       ErroneousField_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ErroneousField_get_tlv_fieldnum(int64_t this_ptr) {
+       LDKErroneousField 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 = ErroneousField_get_tlv_fieldnum(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ErroneousField_set_tlv_fieldnum(int64_t this_ptr, int64_t val) {
+       LDKErroneousField 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;
+       ErroneousField_set_tlv_fieldnum(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ErroneousField_get_suggested_value(int64_t this_ptr) {
+       LDKErroneousField 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_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = ErroneousField_get_suggested_value(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ErroneousField_set_suggested_value(int64_t this_ptr, int64_t val) {
+       LDKErroneousField 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_u8ZZ val_conv = *(LDKCOption_CVec_u8ZZ*)(val_ptr);
+       val_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(val));
+       ErroneousField_set_suggested_value(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ErroneousField_new(int64_t tlv_fieldnum_arg, int64_t suggested_value_arg) {
+       void* suggested_value_arg_ptr = untag_ptr(suggested_value_arg);
+       CHECK_ACCESS(suggested_value_arg_ptr);
+       LDKCOption_CVec_u8ZZ suggested_value_arg_conv = *(LDKCOption_CVec_u8ZZ*)(suggested_value_arg_ptr);
+       suggested_value_arg_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(suggested_value_arg));
+       LDKErroneousField ret_var = ErroneousField_new(tlv_fieldnum_arg, suggested_value_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 ErroneousField_clone_ptr(LDKErroneousField *NONNULL_PTR arg) {
+       LDKErroneousField ret_var = ErroneousField_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_ErroneousField_clone_ptr(int64_t arg) {
+       LDKErroneousField 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 = ErroneousField_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ErroneousField_clone(int64_t orig) {
+       LDKErroneousField 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;
+       LDKErroneousField ret_var = ErroneousField_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_InvoiceError_from_string(jstring s) {
+       LDKStr s_conv = str_ref_to_owned_c(s);
+       LDKInvoiceError ret_var = InvoiceError_from_string(s_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_InvoiceError_write(int64_t obj) {
+       LDKInvoiceError 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 = InvoiceError_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_InvoiceError_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_InvoiceErrorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InvoiceErrorDecodeErrorZ), "LDKCResult_InvoiceErrorDecodeErrorZ");
+       *ret_conv = InvoiceError_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_UnsignedInvoiceRequest_free(int64_t this_obj) {
+       LDKUnsignedInvoiceRequest 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);
+       UnsignedInvoiceRequest_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_UnsignedInvoiceRequest_tagged_hash(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKTaggedHash ret_var = UnsignedInvoiceRequest_tagged_hash(&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;
+}
+
+void  CS_LDK_InvoiceRequest_free(int64_t this_obj) {
+       LDKInvoiceRequest 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);
+       InvoiceRequest_free(this_obj_conv);
+}
+
+static inline uint64_t InvoiceRequest_clone_ptr(LDKInvoiceRequest *NONNULL_PTR arg) {
+       LDKInvoiceRequest ret_var = InvoiceRequest_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_InvoiceRequest_clone_ptr(int64_t arg) {
+       LDKInvoiceRequest 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 = InvoiceRequest_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InvoiceRequest_clone(int64_t orig) {
+       LDKInvoiceRequest 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;
+       LDKInvoiceRequest ret_var = InvoiceRequest_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_VerifiedInvoiceRequest_free(int64_t this_obj) {
+       LDKVerifiedInvoiceRequest 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);
+       VerifiedInvoiceRequest_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_get_keys(int64_t this_ptr) {
+       LDKVerifiedInvoiceRequest 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_SecretKeyZ *ret_copy = MALLOC(sizeof(LDKCOption_SecretKeyZ), "LDKCOption_SecretKeyZ");
+       *ret_copy = VerifiedInvoiceRequest_get_keys(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_VerifiedInvoiceRequest_set_keys(int64_t this_ptr, int64_t val) {
+       LDKVerifiedInvoiceRequest 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_SecretKeyZ val_conv = *(LDKCOption_SecretKeyZ*)(val_ptr);
+       val_conv = COption_SecretKeyZ_clone((LDKCOption_SecretKeyZ*)untag_ptr(val));
+       VerifiedInvoiceRequest_set_keys(&this_ptr_conv, val_conv);
+}
+
+static inline uint64_t VerifiedInvoiceRequest_clone_ptr(LDKVerifiedInvoiceRequest *NONNULL_PTR arg) {
+       LDKVerifiedInvoiceRequest ret_var = VerifiedInvoiceRequest_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_VerifiedInvoiceRequest_clone_ptr(int64_t arg) {
+       LDKVerifiedInvoiceRequest 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 = VerifiedInvoiceRequest_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_clone(int64_t orig) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKVerifiedInvoiceRequest ret_var = VerifiedInvoiceRequest_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;
+}
+
+ptrArray  CS_LDK_UnsignedInvoiceRequest_chains(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKCVec_ThirtyTwoBytesZ ret_var = UnsignedInvoiceRequest_chains(&this_arg_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(32, __LINE__);
+               memcpy(ret_conv_8_arr->elems, ret_var.data[i].data, 32);
+               ret_arr_ptr[i] = ret_conv_8_arr;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_UnsignedInvoiceRequest_metadata(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = UnsignedInvoiceRequest_metadata(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UnsignedInvoiceRequest_amount(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKAmount ret_var = UnsignedInvoiceRequest_amount(&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_UnsignedInvoiceRequest_description(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKPrintableString ret_var = UnsignedInvoiceRequest_description(&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_UnsignedInvoiceRequest_offer_features(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKOfferFeatures ret_var = UnsignedInvoiceRequest_offer_features(&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_UnsignedInvoiceRequest_absolute_expiry(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = UnsignedInvoiceRequest_absolute_expiry(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UnsignedInvoiceRequest_issuer(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKPrintableString ret_var = UnsignedInvoiceRequest_issuer(&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_tArray  CS_LDK_UnsignedInvoiceRequest_paths(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKCVec_BlindedPathZ ret_var = UnsignedInvoiceRequest_paths(&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 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;
+}
+
+int64_t  CS_LDK_UnsignedInvoiceRequest_supported_quantity(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKQuantity ret_var = UnsignedInvoiceRequest_supported_quantity(&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;
+}
+
+int8_tArray  CS_LDK_UnsignedInvoiceRequest_signing_pubkey(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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, UnsignedInvoiceRequest_signing_pubkey(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_UnsignedInvoiceRequest_payer_metadata(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKu8slice ret_var = UnsignedInvoiceRequest_payer_metadata(&this_arg_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;
+}
+
+int8_tArray  CS_LDK_UnsignedInvoiceRequest_chain(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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, UnsignedInvoiceRequest_chain(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_UnsignedInvoiceRequest_amount_msats(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = UnsignedInvoiceRequest_amount_msats(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UnsignedInvoiceRequest_invoice_request_features(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKInvoiceRequestFeatures ret_var = UnsignedInvoiceRequest_invoice_request_features(&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_UnsignedInvoiceRequest_quantity(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = UnsignedInvoiceRequest_quantity(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_UnsignedInvoiceRequest_payer_id(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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, UnsignedInvoiceRequest_payer_id(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_UnsignedInvoiceRequest_payer_note(int64_t this_arg) {
+       LDKUnsignedInvoiceRequest 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;
+       LDKPrintableString ret_var = UnsignedInvoiceRequest_payer_note(&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;
+}
+
+ptrArray  CS_LDK_InvoiceRequest_chains(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKCVec_ThirtyTwoBytesZ ret_var = InvoiceRequest_chains(&this_arg_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(32, __LINE__);
+               memcpy(ret_conv_8_arr->elems, ret_var.data[i].data, 32);
+               ret_arr_ptr[i] = ret_conv_8_arr;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_InvoiceRequest_metadata(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = InvoiceRequest_metadata(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_InvoiceRequest_amount(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKAmount ret_var = InvoiceRequest_amount(&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_InvoiceRequest_description(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKPrintableString ret_var = InvoiceRequest_description(&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_InvoiceRequest_offer_features(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKOfferFeatures ret_var = InvoiceRequest_offer_features(&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_InvoiceRequest_absolute_expiry(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = InvoiceRequest_absolute_expiry(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_InvoiceRequest_issuer(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKPrintableString ret_var = InvoiceRequest_issuer(&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_tArray  CS_LDK_InvoiceRequest_paths(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKCVec_BlindedPathZ ret_var = InvoiceRequest_paths(&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 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;
+}
+
+int64_t  CS_LDK_InvoiceRequest_supported_quantity(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKQuantity ret_var = InvoiceRequest_supported_quantity(&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;
+}
+
+int8_tArray  CS_LDK_InvoiceRequest_signing_pubkey(int64_t this_arg) {
+       LDKInvoiceRequest 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, InvoiceRequest_signing_pubkey(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_InvoiceRequest_payer_metadata(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKu8slice ret_var = InvoiceRequest_payer_metadata(&this_arg_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;
+}
+
+int8_tArray  CS_LDK_InvoiceRequest_chain(int64_t this_arg) {
+       LDKInvoiceRequest 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, InvoiceRequest_chain(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_InvoiceRequest_amount_msats(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = InvoiceRequest_amount_msats(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_InvoiceRequest_invoice_request_features(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKInvoiceRequestFeatures ret_var = InvoiceRequest_invoice_request_features(&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_InvoiceRequest_quantity(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = InvoiceRequest_quantity(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_InvoiceRequest_payer_id(int64_t this_arg) {
+       LDKInvoiceRequest 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, InvoiceRequest_payer_id(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_InvoiceRequest_payer_note(int64_t this_arg) {
+       LDKInvoiceRequest 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;
+       LDKPrintableString ret_var = InvoiceRequest_payer_note(&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;
+}
+
+int8_tArray  CS_LDK_InvoiceRequest_signature(int64_t this_arg) {
+       LDKInvoiceRequest 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(64, __LINE__);
+       memcpy(ret_arr->elems, InvoiceRequest_signature(&this_arg_conv).compact_form, 64);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_InvoiceRequest_verify(int64_t this_arg, int64_t key) {
+       LDKInvoiceRequest 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 = InvoiceRequest_clone(&this_arg_conv);
+       LDKExpandedKey key_conv;
+       key_conv.inner = untag_ptr(key);
+       key_conv.is_owned = ptr_is_owned(key);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(key_conv);
+       key_conv.is_owned = false;
+       LDKCResult_VerifiedInvoiceRequestNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_VerifiedInvoiceRequestNoneZ), "LDKCResult_VerifiedInvoiceRequestNoneZ");
+       *ret_conv = InvoiceRequest_verify(this_arg_conv, &key_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+ptrArray  CS_LDK_VerifiedInvoiceRequest_chains(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKCVec_ThirtyTwoBytesZ ret_var = VerifiedInvoiceRequest_chains(&this_arg_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(32, __LINE__);
+               memcpy(ret_conv_8_arr->elems, ret_var.data[i].data, 32);
+               ret_arr_ptr[i] = ret_conv_8_arr;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_metadata(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = VerifiedInvoiceRequest_metadata(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_amount(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKAmount ret_var = VerifiedInvoiceRequest_amount(&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_VerifiedInvoiceRequest_description(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKPrintableString ret_var = VerifiedInvoiceRequest_description(&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_VerifiedInvoiceRequest_offer_features(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKOfferFeatures ret_var = VerifiedInvoiceRequest_offer_features(&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_VerifiedInvoiceRequest_absolute_expiry(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = VerifiedInvoiceRequest_absolute_expiry(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_issuer(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKPrintableString ret_var = VerifiedInvoiceRequest_issuer(&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_tArray  CS_LDK_VerifiedInvoiceRequest_paths(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKCVec_BlindedPathZ ret_var = VerifiedInvoiceRequest_paths(&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 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;
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_supported_quantity(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKQuantity ret_var = VerifiedInvoiceRequest_supported_quantity(&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;
+}
+
+int8_tArray  CS_LDK_VerifiedInvoiceRequest_signing_pubkey(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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, VerifiedInvoiceRequest_signing_pubkey(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_VerifiedInvoiceRequest_payer_metadata(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKu8slice ret_var = VerifiedInvoiceRequest_payer_metadata(&this_arg_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;
+}
+
+int8_tArray  CS_LDK_VerifiedInvoiceRequest_chain(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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, VerifiedInvoiceRequest_chain(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_amount_msats(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = VerifiedInvoiceRequest_amount_msats(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_invoice_request_features(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKInvoiceRequestFeatures ret_var = VerifiedInvoiceRequest_invoice_request_features(&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_VerifiedInvoiceRequest_quantity(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = VerifiedInvoiceRequest_quantity(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_VerifiedInvoiceRequest_payer_id(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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, VerifiedInvoiceRequest_payer_id(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_VerifiedInvoiceRequest_payer_note(int64_t this_arg) {
+       LDKVerifiedInvoiceRequest 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;
+       LDKPrintableString ret_var = VerifiedInvoiceRequest_payer_note(&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;
+}
+
+int8_tArray  CS_LDK_UnsignedInvoiceRequest_write(int64_t obj) {
+       LDKUnsignedInvoiceRequest 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 = UnsignedInvoiceRequest_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;
+}
+
+int8_tArray  CS_LDK_InvoiceRequest_write(int64_t obj) {
+       LDKInvoiceRequest 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 = InvoiceRequest_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;
+}
+
+void  CS_LDK_TaggedHash_free(int64_t this_obj) {
+       LDKTaggedHash 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);
+       TaggedHash_free(this_obj_conv);
+}
+
+void  CS_LDK_Bolt12ParseError_free(int64_t this_obj) {
+       LDKBolt12ParseError 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);
+       Bolt12ParseError_free(this_obj_conv);
+}
+
+static inline uint64_t Bolt12ParseError_clone_ptr(LDKBolt12ParseError *NONNULL_PTR arg) {
+       LDKBolt12ParseError ret_var = Bolt12ParseError_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_Bolt12ParseError_clone_ptr(int64_t arg) {
+       LDKBolt12ParseError 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 = Bolt12ParseError_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt12ParseError_clone(int64_t orig) {
+       LDKBolt12ParseError 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;
+       LDKBolt12ParseError ret_var = Bolt12ParseError_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_Bolt12SemanticError_clone(int64_t orig) {
+       LDKBolt12SemanticError* orig_conv = (LDKBolt12SemanticError*)untag_ptr(orig);
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_already_expired() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_already_expired());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unsupported_chain() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unsupported_chain());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unexpected_chain() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unexpected_chain());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_amount() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_amount());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_invalid_amount() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_invalid_amount());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_insufficient_amount() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_insufficient_amount());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unexpected_amount() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unexpected_amount());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unsupported_currency() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unsupported_currency());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unknown_required_features() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unknown_required_features());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unexpected_features() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unexpected_features());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_description() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_description());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_signing_pubkey() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_signing_pubkey());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_invalid_signing_pubkey() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_invalid_signing_pubkey());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unexpected_signing_pubkey() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unexpected_signing_pubkey());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_quantity() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_quantity());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_invalid_quantity() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_invalid_quantity());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unexpected_quantity() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unexpected_quantity());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_invalid_metadata() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_invalid_metadata());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_unexpected_metadata() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_unexpected_metadata());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_payer_metadata() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_payer_metadata());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_payer_id() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_payer_id());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_duplicate_payment_id() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_duplicate_payment_id());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_paths() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_paths());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_invalid_pay_info() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_invalid_pay_info());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_creation_time() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_creation_time());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_payment_hash() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_payment_hash());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt12SemanticError_missing_signature() {
+       int32_t ret_conv = LDKBolt12SemanticError_to_cs(Bolt12SemanticError_missing_signature());
+       return ret_conv;
+}
+
+void  CS_LDK_Refund_free(int64_t this_obj) {
+       LDKRefund 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);
+       Refund_free(this_obj_conv);
+}
+
+static inline uint64_t Refund_clone_ptr(LDKRefund *NONNULL_PTR arg) {
+       LDKRefund ret_var = Refund_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_Refund_clone_ptr(int64_t arg) {
+       LDKRefund 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 = Refund_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Refund_clone(int64_t orig) {
+       LDKRefund 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;
+       LDKRefund ret_var = Refund_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_Refund_description(int64_t this_arg) {
+       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;
+       LDKPrintableString ret_var = Refund_description(&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_Refund_absolute_expiry(int64_t this_arg) {
+       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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = Refund_absolute_expiry(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_Refund_is_expired(int64_t this_arg) {
+       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(&this_arg_conv);
+       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);
+       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;
+       LDKPrintableString ret_var = Refund_issuer(&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_tArray  CS_LDK_Refund_paths(int64_t this_arg) {
+       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;
+       LDKCVec_BlindedPathZ ret_var = Refund_paths(&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 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;
+}
+
+int8_tArray  CS_LDK_Refund_payer_metadata(int64_t this_arg) {
+       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;
+       LDKu8slice ret_var = Refund_payer_metadata(&this_arg_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;
+}
+
+int8_tArray  CS_LDK_Refund_chain(int64_t this_arg) {
+       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;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, Refund_chain(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Refund_amount_msats(int64_t this_arg) {
+       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;
+       int64_t ret_conv = Refund_amount_msats(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Refund_features(int64_t this_arg) {
+       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;
+       LDKInvoiceRequestFeatures ret_var = Refund_features(&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_Refund_quantity(int64_t this_arg) {
+       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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = Refund_quantity(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_Refund_payer_id(int64_t this_arg) {
+       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;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, Refund_payer_id(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Refund_payer_note(int64_t this_arg) {
+       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;
+       LDKPrintableString ret_var = Refund_payer_note(&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;
+}
+
+int8_tArray  CS_LDK_Refund_write(int64_t obj) {
+       LDKRefund 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 = Refund_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_Refund_from_str(jstring s) {
+       LDKStr s_conv = str_ref_to_owned_c(s);
+       LDKCResult_RefundBolt12ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RefundBolt12ParseErrorZ), "LDKCResult_RefundBolt12ParseErrorZ");
+       *ret_conv = Refund_from_str(s_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int32_t  CS_LDK_UtxoLookupError_clone(int64_t orig) {
+       LDKUtxoLookupError* orig_conv = (LDKUtxoLookupError*)untag_ptr(orig);
+       int32_t ret_conv = LDKUtxoLookupError_to_cs(UtxoLookupError_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_UtxoLookupError_unknown_chain() {
+       int32_t ret_conv = LDKUtxoLookupError_to_cs(UtxoLookupError_unknown_chain());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_UtxoLookupError_unknown_tx() {
+       int32_t ret_conv = LDKUtxoLookupError_to_cs(UtxoLookupError_unknown_tx());
+       return ret_conv;
+}
+
+void  CS_LDK_UtxoResult_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);
+       LDKUtxoResult this_ptr_conv = *(LDKUtxoResult*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       UtxoResult_free(this_ptr_conv);
+}
+
+static inline uint64_t UtxoResult_clone_ptr(LDKUtxoResult *NONNULL_PTR arg) {
+       LDKUtxoResult *ret_copy = MALLOC(sizeof(LDKUtxoResult), "LDKUtxoResult");
+       *ret_copy = UtxoResult_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_UtxoResult_clone_ptr(int64_t arg) {
+       LDKUtxoResult* arg_conv = (LDKUtxoResult*)untag_ptr(arg);
+       int64_t ret_conv = UtxoResult_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UtxoResult_clone(int64_t orig) {
+       LDKUtxoResult* orig_conv = (LDKUtxoResult*)untag_ptr(orig);
+       LDKUtxoResult *ret_copy = MALLOC(sizeof(LDKUtxoResult), "LDKUtxoResult");
+       *ret_copy = UtxoResult_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UtxoResult_sync(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKCResult_TxOutUtxoLookupErrorZ a_conv = *(LDKCResult_TxOutUtxoLookupErrorZ*)(a_ptr);
+       a_conv = CResult_TxOutUtxoLookupErrorZ_clone((LDKCResult_TxOutUtxoLookupErrorZ*)untag_ptr(a));
+       LDKUtxoResult *ret_copy = MALLOC(sizeof(LDKUtxoResult), "LDKUtxoResult");
+       *ret_copy = UtxoResult_sync(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_UtxoResult_async(int64_t a) {
+       LDKUtxoFuture 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 = UtxoFuture_clone(&a_conv);
+       LDKUtxoResult *ret_copy = MALLOC(sizeof(LDKUtxoResult), "LDKUtxoResult");
+       *ret_copy = UtxoResult_async(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_UtxoLookup_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);
+       LDKUtxoLookup this_ptr_conv = *(LDKUtxoLookup*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       UtxoLookup_free(this_ptr_conv);
+}
+
+void  CS_LDK_UtxoFuture_free(int64_t this_obj) {
+       LDKUtxoFuture 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);
+       UtxoFuture_free(this_obj_conv);
+}
+
+static inline uint64_t UtxoFuture_clone_ptr(LDKUtxoFuture *NONNULL_PTR arg) {
+       LDKUtxoFuture ret_var = UtxoFuture_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_UtxoFuture_clone_ptr(int64_t arg) {
+       LDKUtxoFuture 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 = UtxoFuture_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_UtxoFuture_clone(int64_t orig) {
+       LDKUtxoFuture 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;
+       LDKUtxoFuture ret_var = UtxoFuture_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_UtxoFuture_new() {
+       LDKUtxoFuture ret_var = UtxoFuture_new();
+       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_UtxoFuture_resolve_without_forwarding(int64_t this_arg, int64_t graph, int64_t result) {
+       LDKUtxoFuture 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;
+       LDKNetworkGraph graph_conv;
+       graph_conv.inner = untag_ptr(graph);
+       graph_conv.is_owned = ptr_is_owned(graph);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(graph_conv);
+       graph_conv.is_owned = false;
+       void* result_ptr = untag_ptr(result);
+       CHECK_ACCESS(result_ptr);
+       LDKCResult_TxOutUtxoLookupErrorZ result_conv = *(LDKCResult_TxOutUtxoLookupErrorZ*)(result_ptr);
+       UtxoFuture_resolve_without_forwarding(&this_arg_conv, &graph_conv, result_conv);
+}
+
+void  CS_LDK_UtxoFuture_resolve(int64_t this_arg, int64_t graph, int64_t gossip, int64_t result) {
+       LDKUtxoFuture 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;
+       LDKNetworkGraph graph_conv;
+       graph_conv.inner = untag_ptr(graph);
+       graph_conv.is_owned = ptr_is_owned(graph);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(graph_conv);
+       graph_conv.is_owned = false;
+       LDKP2PGossipSync gossip_conv;
+       gossip_conv.inner = untag_ptr(gossip);
+       gossip_conv.is_owned = ptr_is_owned(gossip);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(gossip_conv);
+       gossip_conv.is_owned = false;
+       void* result_ptr = untag_ptr(result);
+       CHECK_ACCESS(result_ptr);
+       LDKCResult_TxOutUtxoLookupErrorZ result_conv = *(LDKCResult_TxOutUtxoLookupErrorZ*)(result_ptr);
+       UtxoFuture_resolve(&this_arg_conv, &graph_conv, &gossip_conv, result_conv);
+}
+
+void  CS_LDK_NodeId_free(int64_t this_obj) {
+       LDKNodeId 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);
+       NodeId_free(this_obj_conv);
+}
+
+static inline uint64_t NodeId_clone_ptr(LDKNodeId *NONNULL_PTR arg) {
+       LDKNodeId ret_var = NodeId_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_NodeId_clone_ptr(int64_t arg) {
+       LDKNodeId 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 = NodeId_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NodeId_clone(int64_t orig) {
+       LDKNodeId 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;
+       LDKNodeId ret_var = NodeId_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_NodeId_from_pubkey(int8_tArray pubkey) {
+       LDKPublicKey pubkey_ref;
+       CHECK(pubkey->arr_len == 33);
+       memcpy(pubkey_ref.compressed_form, pubkey->elems, 33); FREE(pubkey);
+       LDKNodeId ret_var = NodeId_from_pubkey(pubkey_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_NodeId_as_slice(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;
+       LDKu8slice ret_var = NodeId_as_slice(&this_arg_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_NodeId_as_pubkey(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;
+       LDKCResult_PublicKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeySecp256k1ErrorZ), "LDKCResult_PublicKeySecp256k1ErrorZ");
+       *ret_conv = NodeId_as_pubkey(&this_arg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NodeId_hash(int64_t o) {
+       LDKNodeId 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 = NodeId_hash(&o_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_NodeId_write(int64_t obj) {
+       LDKNodeId 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 = NodeId_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_NodeId_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_NodeIdDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeIdDecodeErrorZ), "LDKCResult_NodeIdDecodeErrorZ");
+       *ret_conv = NodeId_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_NetworkGraph_free(int64_t this_obj) {
+       LDKNetworkGraph 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);
+       NetworkGraph_free(this_obj_conv);
+}
+
+void  CS_LDK_ReadOnlyNetworkGraph_free(int64_t this_obj) {
+       LDKReadOnlyNetworkGraph 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);
+       ReadOnlyNetworkGraph_free(this_obj_conv);
+}
+
+void  CS_LDK_NetworkUpdate_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);
+       LDKNetworkUpdate this_ptr_conv = *(LDKNetworkUpdate*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       NetworkUpdate_free(this_ptr_conv);
+}
+
+static inline uint64_t NetworkUpdate_clone_ptr(LDKNetworkUpdate *NONNULL_PTR arg) {
+       LDKNetworkUpdate *ret_copy = MALLOC(sizeof(LDKNetworkUpdate), "LDKNetworkUpdate");
+       *ret_copy = NetworkUpdate_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_NetworkUpdate_clone_ptr(int64_t arg) {
+       LDKNetworkUpdate* arg_conv = (LDKNetworkUpdate*)untag_ptr(arg);
+       int64_t ret_conv = NetworkUpdate_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NetworkUpdate_clone(int64_t orig) {
+       LDKNetworkUpdate* orig_conv = (LDKNetworkUpdate*)untag_ptr(orig);
+       LDKNetworkUpdate *ret_copy = MALLOC(sizeof(LDKNetworkUpdate), "LDKNetworkUpdate");
+       *ret_copy = NetworkUpdate_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_NetworkUpdate_channel_update_message(int64_t msg) {
+       LDKChannelUpdate 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 = ChannelUpdate_clone(&msg_conv);
+       LDKNetworkUpdate *ret_copy = MALLOC(sizeof(LDKNetworkUpdate), "LDKNetworkUpdate");
+       *ret_copy = NetworkUpdate_channel_update_message(msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_NetworkUpdate_channel_failure(int64_t short_channel_id, jboolean is_permanent) {
+       LDKNetworkUpdate *ret_copy = MALLOC(sizeof(LDKNetworkUpdate), "LDKNetworkUpdate");
+       *ret_copy = NetworkUpdate_channel_failure(short_channel_id, is_permanent);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_NetworkUpdate_node_failure(int8_tArray node_id, jboolean is_permanent) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKNetworkUpdate *ret_copy = MALLOC(sizeof(LDKNetworkUpdate), "LDKNetworkUpdate");
+       *ret_copy = NetworkUpdate_node_failure(node_id_ref, is_permanent);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_NetworkUpdate_eq(int64_t a, int64_t b) {
+       LDKNetworkUpdate* a_conv = (LDKNetworkUpdate*)untag_ptr(a);
+       LDKNetworkUpdate* b_conv = (LDKNetworkUpdate*)untag_ptr(b);
+       jboolean ret_conv = NetworkUpdate_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_NetworkUpdate_write(int64_t obj) {
+       LDKNetworkUpdate* obj_conv = (LDKNetworkUpdate*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = NetworkUpdate_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_NetworkUpdate_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_COption_NetworkUpdateZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_NetworkUpdateZDecodeErrorZ), "LDKCResult_COption_NetworkUpdateZDecodeErrorZ");
+       *ret_conv = NetworkUpdate_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_P2PGossipSync_free(int64_t this_obj) {
+       LDKP2PGossipSync 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);
+       P2PGossipSync_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_P2PGossipSync_new(int64_t network_graph, int64_t utxo_lookup, int64_t logger) {
+       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* utxo_lookup_ptr = untag_ptr(utxo_lookup);
+       CHECK_ACCESS(utxo_lookup_ptr);
+       LDKCOption_UtxoLookupZ utxo_lookup_conv = *(LDKCOption_UtxoLookupZ*)(utxo_lookup_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKCOption_UtxoLookupZ
+       if (utxo_lookup_conv.tag == LDKCOption_UtxoLookupZ_Some) {
+               // Manually implement clone for Java trait instances
+               if (utxo_lookup_conv.some.free == LDKUtxoLookup_JCalls_free) {
+                       // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                       LDKUtxoLookup_JCalls_cloned(&utxo_lookup_conv.some);
+               }
+       }
+       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);
+       }
+       LDKP2PGossipSync ret_var = P2PGossipSync_new(&network_graph_conv, utxo_lookup_conv, logger_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_P2PGossipSync_add_utxo_lookup(int64_t this_arg, int64_t utxo_lookup) {
+       LDKP2PGossipSync 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;
+       void* utxo_lookup_ptr = untag_ptr(utxo_lookup);
+       CHECK_ACCESS(utxo_lookup_ptr);
+       LDKCOption_UtxoLookupZ utxo_lookup_conv = *(LDKCOption_UtxoLookupZ*)(utxo_lookup_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKCOption_UtxoLookupZ
+       if (utxo_lookup_conv.tag == LDKCOption_UtxoLookupZ_Some) {
+               // Manually implement clone for Java trait instances
+               if (utxo_lookup_conv.some.free == LDKUtxoLookup_JCalls_free) {
+                       // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                       LDKUtxoLookup_JCalls_cloned(&utxo_lookup_conv.some);
+               }
+       }
+       P2PGossipSync_add_utxo_lookup(&this_arg_conv, utxo_lookup_conv);
+}
+
+void  CS_LDK_NetworkGraph_handle_network_update(int64_t this_arg, int64_t network_update) {
+       LDKNetworkGraph 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;
+       LDKNetworkUpdate* network_update_conv = (LDKNetworkUpdate*)untag_ptr(network_update);
+       NetworkGraph_handle_network_update(&this_arg_conv, network_update_conv);
+}
+
+int8_tArray  CS_LDK_NetworkGraph_get_chain_hash(int64_t this_arg) {
+       LDKNetworkGraph 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, NetworkGraph_get_chain_hash(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_verify_node_announcement(int64_t msg) {
+       LDKNodeAnnouncement 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;
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = verify_node_announcement(&msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_verify_channel_announcement(int64_t msg) {
+       LDKChannelAnnouncement 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;
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = verify_channel_announcement(&msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_P2PGossipSync_as_RoutingMessageHandler(int64_t this_arg) {
+       LDKP2PGossipSync 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;
+       LDKRoutingMessageHandler* ret_ret = MALLOC(sizeof(LDKRoutingMessageHandler), "LDKRoutingMessageHandler");
+       *ret_ret = P2PGossipSync_as_RoutingMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_P2PGossipSync_as_MessageSendEventsProvider(int64_t this_arg) {
+       LDKP2PGossipSync 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;
+       LDKMessageSendEventsProvider* ret_ret = MALLOC(sizeof(LDKMessageSendEventsProvider), "LDKMessageSendEventsProvider");
+       *ret_ret = P2PGossipSync_as_MessageSendEventsProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_ChannelUpdateInfo_free(int64_t this_obj) {
+       LDKChannelUpdateInfo 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);
+       ChannelUpdateInfo_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_ChannelUpdateInfo_get_last_update(int64_t this_ptr) {
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_get_last_update(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelUpdateInfo_set_last_update(int64_t this_ptr, int32_t val) {
+       LDKChannelUpdateInfo 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;
+       ChannelUpdateInfo_set_last_update(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ChannelUpdateInfo_get_enabled(int64_t this_ptr) {
+       LDKChannelUpdateInfo 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;
+       jboolean ret_conv = ChannelUpdateInfo_get_enabled(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelUpdateInfo_set_enabled(int64_t this_ptr, jboolean val) {
+       LDKChannelUpdateInfo 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;
+       ChannelUpdateInfo_set_enabled(&this_ptr_conv, val);
+}
+
+int16_t  CS_LDK_ChannelUpdateInfo_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_get_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelUpdateInfo_set_cltv_expiry_delta(int64_t this_ptr, int16_t val) {
+       LDKChannelUpdateInfo 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;
+       ChannelUpdateInfo_set_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelUpdateInfo_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_get_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelUpdateInfo_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelUpdateInfo 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;
+       ChannelUpdateInfo_set_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelUpdateInfo_get_htlc_maximum_msat(int64_t this_ptr) {
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_get_htlc_maximum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelUpdateInfo_set_htlc_maximum_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelUpdateInfo 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;
+       ChannelUpdateInfo_set_htlc_maximum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelUpdateInfo_get_fees(int64_t this_ptr) {
+       LDKChannelUpdateInfo 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;
+       LDKRoutingFees ret_var = ChannelUpdateInfo_get_fees(&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_ChannelUpdateInfo_set_fees(int64_t this_ptr, int64_t val) {
+       LDKChannelUpdateInfo 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;
+       LDKRoutingFees 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 = RoutingFees_clone(&val_conv);
+       ChannelUpdateInfo_set_fees(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelUpdateInfo_get_last_update_message(int64_t this_ptr) {
+       LDKChannelUpdateInfo 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;
+       LDKChannelUpdate ret_var = ChannelUpdateInfo_get_last_update_message(&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_ChannelUpdateInfo_set_last_update_message(int64_t this_ptr, int64_t val) {
+       LDKChannelUpdateInfo 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;
+       LDKChannelUpdate 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 = ChannelUpdate_clone(&val_conv);
+       ChannelUpdateInfo_set_last_update_message(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelUpdateInfo_new(int32_t last_update_arg, jboolean enabled_arg, int16_t cltv_expiry_delta_arg, int64_t htlc_minimum_msat_arg, int64_t htlc_maximum_msat_arg, int64_t fees_arg, int64_t last_update_message_arg) {
+       LDKRoutingFees fees_arg_conv;
+       fees_arg_conv.inner = untag_ptr(fees_arg);
+       fees_arg_conv.is_owned = ptr_is_owned(fees_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(fees_arg_conv);
+       fees_arg_conv = RoutingFees_clone(&fees_arg_conv);
+       LDKChannelUpdate last_update_message_arg_conv;
+       last_update_message_arg_conv.inner = untag_ptr(last_update_message_arg);
+       last_update_message_arg_conv.is_owned = ptr_is_owned(last_update_message_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(last_update_message_arg_conv);
+       last_update_message_arg_conv = ChannelUpdate_clone(&last_update_message_arg_conv);
+       LDKChannelUpdateInfo ret_var = ChannelUpdateInfo_new(last_update_arg, enabled_arg, cltv_expiry_delta_arg, htlc_minimum_msat_arg, htlc_maximum_msat_arg, fees_arg_conv, last_update_message_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 ChannelUpdateInfo_clone_ptr(LDKChannelUpdateInfo *NONNULL_PTR arg) {
+       LDKChannelUpdateInfo ret_var = ChannelUpdateInfo_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_ChannelUpdateInfo_clone_ptr(int64_t arg) {
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelUpdateInfo_clone(int64_t orig) {
+       LDKChannelUpdateInfo 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;
+       LDKChannelUpdateInfo ret_var = ChannelUpdateInfo_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_ChannelUpdateInfo_eq(int64_t a, int64_t b) {
+       LDKChannelUpdateInfo 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;
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_ChannelUpdateInfo_write(int64_t obj) {
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_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_ChannelUpdateInfo_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelUpdateInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelUpdateInfoDecodeErrorZ), "LDKCResult_ChannelUpdateInfoDecodeErrorZ");
+       *ret_conv = ChannelUpdateInfo_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ChannelInfo_free(int64_t this_obj) {
+       LDKChannelInfo 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);
+       ChannelInfo_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChannelInfo_get_features(int64_t this_ptr) {
+       LDKChannelInfo 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;
+       LDKChannelFeatures ret_var = ChannelInfo_get_features(&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_ChannelInfo_set_features(int64_t this_ptr, int64_t val) {
+       LDKChannelInfo 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;
+       LDKChannelFeatures 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 = ChannelFeatures_clone(&val_conv);
+       ChannelInfo_set_features(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelInfo_get_node_one(int64_t this_ptr) {
+       LDKChannelInfo 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;
+       LDKNodeId ret_var = ChannelInfo_get_node_one(&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_ChannelInfo_set_node_one(int64_t this_ptr, int64_t val) {
+       LDKChannelInfo 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;
+       LDKNodeId 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 = NodeId_clone(&val_conv);
+       ChannelInfo_set_node_one(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelInfo_get_one_to_two(int64_t this_ptr) {
+       LDKChannelInfo 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;
+       LDKChannelUpdateInfo ret_var = ChannelInfo_get_one_to_two(&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_ChannelInfo_set_one_to_two(int64_t this_ptr, int64_t val) {
+       LDKChannelInfo 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;
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_clone(&val_conv);
+       ChannelInfo_set_one_to_two(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelInfo_get_node_two(int64_t this_ptr) {
+       LDKChannelInfo 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;
+       LDKNodeId ret_var = ChannelInfo_get_node_two(&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_ChannelInfo_set_node_two(int64_t this_ptr, int64_t val) {
+       LDKChannelInfo 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;
+       LDKNodeId 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 = NodeId_clone(&val_conv);
+       ChannelInfo_set_node_two(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelInfo_get_two_to_one(int64_t this_ptr) {
+       LDKChannelInfo 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;
+       LDKChannelUpdateInfo ret_var = ChannelInfo_get_two_to_one(&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_ChannelInfo_set_two_to_one(int64_t this_ptr, int64_t val) {
+       LDKChannelInfo 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;
+       LDKChannelUpdateInfo 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 = ChannelUpdateInfo_clone(&val_conv);
+       ChannelInfo_set_two_to_one(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelInfo_get_capacity_sats(int64_t this_ptr) {
+       LDKChannelInfo 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 = ChannelInfo_get_capacity_sats(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelInfo_set_capacity_sats(int64_t this_ptr, int64_t val) {
+       LDKChannelInfo 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));
+       ChannelInfo_set_capacity_sats(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelInfo_get_announcement_message(int64_t this_ptr) {
+       LDKChannelInfo 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;
+       LDKChannelAnnouncement ret_var = ChannelInfo_get_announcement_message(&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_ChannelInfo_set_announcement_message(int64_t this_ptr, int64_t val) {
+       LDKChannelInfo 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;
+       LDKChannelAnnouncement 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 = ChannelAnnouncement_clone(&val_conv);
+       ChannelInfo_set_announcement_message(&this_ptr_conv, val_conv);
+}
+
+static inline uint64_t ChannelInfo_clone_ptr(LDKChannelInfo *NONNULL_PTR arg) {
+       LDKChannelInfo ret_var = ChannelInfo_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_ChannelInfo_clone_ptr(int64_t arg) {
+       LDKChannelInfo 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 = ChannelInfo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelInfo_clone(int64_t orig) {
+       LDKChannelInfo 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;
+       LDKChannelInfo ret_var = ChannelInfo_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_ChannelInfo_eq(int64_t a, int64_t b) {
+       LDKChannelInfo 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;
+       LDKChannelInfo 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 = ChannelInfo_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelInfo_get_directional_info(int64_t this_arg, int8_t channel_flags) {
+       LDKChannelInfo 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;
+       LDKChannelUpdateInfo ret_var = ChannelInfo_get_directional_info(&this_arg_conv, channel_flags);
+       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_ChannelInfo_write(int64_t obj) {
+       LDKChannelInfo 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 = ChannelInfo_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_ChannelInfo_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelInfoDecodeErrorZ), "LDKCResult_ChannelInfoDecodeErrorZ");
+       *ret_conv = ChannelInfo_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_DirectedChannelInfo_free(int64_t this_obj) {
+       LDKDirectedChannelInfo 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);
+       DirectedChannelInfo_free(this_obj_conv);
+}
+
+static inline uint64_t DirectedChannelInfo_clone_ptr(LDKDirectedChannelInfo *NONNULL_PTR arg) {
+       LDKDirectedChannelInfo ret_var = DirectedChannelInfo_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_DirectedChannelInfo_clone_ptr(int64_t arg) {
+       LDKDirectedChannelInfo 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 = DirectedChannelInfo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_DirectedChannelInfo_clone(int64_t orig) {
+       LDKDirectedChannelInfo 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;
+       LDKDirectedChannelInfo ret_var = DirectedChannelInfo_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_DirectedChannelInfo_channel(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;
+       LDKChannelInfo ret_var = DirectedChannelInfo_channel(&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_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);
+       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;
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = DirectedChannelInfo_effective_capacity(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_EffectiveCapacity_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);
+       LDKEffectiveCapacity this_ptr_conv = *(LDKEffectiveCapacity*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       EffectiveCapacity_free(this_ptr_conv);
+}
+
+static inline uint64_t EffectiveCapacity_clone_ptr(LDKEffectiveCapacity *NONNULL_PTR arg) {
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = EffectiveCapacity_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_EffectiveCapacity_clone_ptr(int64_t arg) {
+       LDKEffectiveCapacity* arg_conv = (LDKEffectiveCapacity*)untag_ptr(arg);
+       int64_t ret_conv = EffectiveCapacity_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_EffectiveCapacity_clone(int64_t orig) {
+       LDKEffectiveCapacity* orig_conv = (LDKEffectiveCapacity*)untag_ptr(orig);
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = EffectiveCapacity_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_EffectiveCapacity_exact_liquidity(int64_t liquidity_msat) {
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = EffectiveCapacity_exact_liquidity(liquidity_msat);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_EffectiveCapacity_advertised_max_htlc(int64_t amount_msat) {
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = EffectiveCapacity_advertised_max_htlc(amount_msat);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_EffectiveCapacity_total(int64_t capacity_msat, int64_t htlc_maximum_msat) {
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = EffectiveCapacity_total(capacity_msat, htlc_maximum_msat);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_EffectiveCapacity_infinite() {
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = EffectiveCapacity_infinite();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_EffectiveCapacity_hint_max_htlc(int64_t amount_msat) {
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = EffectiveCapacity_hint_max_htlc(amount_msat);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_EffectiveCapacity_unknown() {
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = EffectiveCapacity_unknown();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_EffectiveCapacity_as_msat(int64_t this_arg) {
+       LDKEffectiveCapacity* this_arg_conv = (LDKEffectiveCapacity*)untag_ptr(this_arg);
+       int64_t ret_conv = EffectiveCapacity_as_msat(this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RoutingFees_free(int64_t this_obj) {
+       LDKRoutingFees 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);
+       RoutingFees_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_RoutingFees_get_base_msat(int64_t this_ptr) {
+       LDKRoutingFees 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 = RoutingFees_get_base_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RoutingFees_set_base_msat(int64_t this_ptr, int32_t val) {
+       LDKRoutingFees 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;
+       RoutingFees_set_base_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_RoutingFees_get_proportional_millionths(int64_t this_ptr) {
+       LDKRoutingFees 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 = RoutingFees_get_proportional_millionths(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RoutingFees_set_proportional_millionths(int64_t this_ptr, int32_t val) {
+       LDKRoutingFees 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;
+       RoutingFees_set_proportional_millionths(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_RoutingFees_new(int32_t base_msat_arg, int32_t proportional_millionths_arg) {
+       LDKRoutingFees ret_var = RoutingFees_new(base_msat_arg, proportional_millionths_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;
+}
+
+jboolean  CS_LDK_RoutingFees_eq(int64_t a, int64_t b) {
+       LDKRoutingFees 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;
+       LDKRoutingFees 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 = RoutingFees_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t RoutingFees_clone_ptr(LDKRoutingFees *NONNULL_PTR arg) {
+       LDKRoutingFees ret_var = RoutingFees_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_RoutingFees_clone_ptr(int64_t arg) {
+       LDKRoutingFees 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 = RoutingFees_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RoutingFees_clone(int64_t orig) {
+       LDKRoutingFees 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;
+       LDKRoutingFees ret_var = RoutingFees_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_RoutingFees_hash(int64_t o) {
+       LDKRoutingFees 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 = RoutingFees_hash(&o_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_RoutingFees_write(int64_t obj) {
+       LDKRoutingFees 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 = RoutingFees_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_RoutingFees_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RoutingFeesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RoutingFeesDecodeErrorZ), "LDKCResult_RoutingFeesDecodeErrorZ");
+       *ret_conv = RoutingFees_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_NodeAnnouncementInfo_free(int64_t this_obj) {
+       LDKNodeAnnouncementInfo 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);
+       NodeAnnouncementInfo_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_NodeAnnouncementInfo_get_features(int64_t this_ptr) {
+       LDKNodeAnnouncementInfo 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;
+       LDKNodeFeatures ret_var = NodeAnnouncementInfo_get_features(&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_NodeAnnouncementInfo_set_features(int64_t this_ptr, int64_t val) {
+       LDKNodeAnnouncementInfo 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;
+       LDKNodeFeatures 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 = NodeFeatures_clone(&val_conv);
+       NodeAnnouncementInfo_set_features(&this_ptr_conv, val_conv);
+}
+
+int32_t  CS_LDK_NodeAnnouncementInfo_get_last_update(int64_t this_ptr) {
+       LDKNodeAnnouncementInfo 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 = NodeAnnouncementInfo_get_last_update(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeAnnouncementInfo_set_last_update(int64_t this_ptr, int32_t val) {
+       LDKNodeAnnouncementInfo 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;
+       NodeAnnouncementInfo_set_last_update(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_NodeAnnouncementInfo_get_rgb(int64_t this_ptr) {
+       LDKNodeAnnouncementInfo 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(3, __LINE__);
+       memcpy(ret_arr->elems, *NodeAnnouncementInfo_get_rgb(&this_ptr_conv), 3);
+       return ret_arr;
+}
+
+void  CS_LDK_NodeAnnouncementInfo_set_rgb(int64_t this_ptr, int8_tArray val) {
+       LDKNodeAnnouncementInfo 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;
+       LDKThreeBytes val_ref;
+       CHECK(val->arr_len == 3);
+       memcpy(val_ref.data, val->elems, 3); FREE(val);
+       NodeAnnouncementInfo_set_rgb(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_NodeAnnouncementInfo_get_alias(int64_t this_ptr) {
+       LDKNodeAnnouncementInfo 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;
+       LDKNodeAlias ret_var = NodeAnnouncementInfo_get_alias(&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_NodeAnnouncementInfo_set_alias(int64_t this_ptr, int64_t val) {
+       LDKNodeAnnouncementInfo 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;
+       LDKNodeAlias 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 = NodeAlias_clone(&val_conv);
+       NodeAnnouncementInfo_set_alias(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_NodeAnnouncementInfo_get_announcement_message(int64_t this_ptr) {
+       LDKNodeAnnouncementInfo 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;
+       LDKNodeAnnouncement ret_var = NodeAnnouncementInfo_get_announcement_message(&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_NodeAnnouncementInfo_set_announcement_message(int64_t this_ptr, int64_t val) {
+       LDKNodeAnnouncementInfo 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;
+       LDKNodeAnnouncement 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 = NodeAnnouncement_clone(&val_conv);
+       NodeAnnouncementInfo_set_announcement_message(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_NodeAnnouncementInfo_new(int64_t features_arg, int32_t last_update_arg, int8_tArray rgb_arg, int64_t alias_arg, int64_t announcement_message_arg) {
+       LDKNodeFeatures features_arg_conv;
+       features_arg_conv.inner = untag_ptr(features_arg);
+       features_arg_conv.is_owned = ptr_is_owned(features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_arg_conv);
+       features_arg_conv = NodeFeatures_clone(&features_arg_conv);
+       LDKThreeBytes rgb_arg_ref;
+       CHECK(rgb_arg->arr_len == 3);
+       memcpy(rgb_arg_ref.data, rgb_arg->elems, 3); FREE(rgb_arg);
+       LDKNodeAlias alias_arg_conv;
+       alias_arg_conv.inner = untag_ptr(alias_arg);
+       alias_arg_conv.is_owned = ptr_is_owned(alias_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(alias_arg_conv);
+       alias_arg_conv = NodeAlias_clone(&alias_arg_conv);
+       LDKNodeAnnouncement announcement_message_arg_conv;
+       announcement_message_arg_conv.inner = untag_ptr(announcement_message_arg);
+       announcement_message_arg_conv.is_owned = ptr_is_owned(announcement_message_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(announcement_message_arg_conv);
+       announcement_message_arg_conv = NodeAnnouncement_clone(&announcement_message_arg_conv);
+       LDKNodeAnnouncementInfo ret_var = NodeAnnouncementInfo_new(features_arg_conv, last_update_arg, rgb_arg_ref, alias_arg_conv, announcement_message_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 NodeAnnouncementInfo_clone_ptr(LDKNodeAnnouncementInfo *NONNULL_PTR arg) {
+       LDKNodeAnnouncementInfo ret_var = NodeAnnouncementInfo_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_NodeAnnouncementInfo_clone_ptr(int64_t arg) {
+       LDKNodeAnnouncementInfo 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 = NodeAnnouncementInfo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NodeAnnouncementInfo_clone(int64_t orig) {
+       LDKNodeAnnouncementInfo 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;
+       LDKNodeAnnouncementInfo ret_var = NodeAnnouncementInfo_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_NodeAnnouncementInfo_eq(int64_t a, int64_t b) {
+       LDKNodeAnnouncementInfo 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;
+       LDKNodeAnnouncementInfo 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 = NodeAnnouncementInfo_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_tArray  CS_LDK_NodeAnnouncementInfo_addresses(int64_t this_arg) {
+       LDKNodeAnnouncementInfo 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;
+       LDKCVec_SocketAddressZ ret_var = NodeAnnouncementInfo_addresses(&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 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;
+}
+
+int8_tArray  CS_LDK_NodeAnnouncementInfo_write(int64_t obj) {
+       LDKNodeAnnouncementInfo 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 = NodeAnnouncementInfo_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_NodeAnnouncementInfo_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementInfoDecodeErrorZ), "LDKCResult_NodeAnnouncementInfoDecodeErrorZ");
+       *ret_conv = NodeAnnouncementInfo_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_NodeAlias_free(int64_t this_obj) {
+       LDKNodeAlias 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);
+       NodeAlias_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_NodeAlias_get_a(int64_t this_ptr) {
+       LDKNodeAlias 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, *NodeAlias_get_a(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_NodeAlias_set_a(int64_t this_ptr, int8_tArray val) {
+       LDKNodeAlias 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);
+       NodeAlias_set_a(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_NodeAlias_new(int8_tArray a_arg) {
+       LDKThirtyTwoBytes a_arg_ref;
+       CHECK(a_arg->arr_len == 32);
+       memcpy(a_arg_ref.data, a_arg->elems, 32); FREE(a_arg);
+       LDKNodeAlias ret_var = NodeAlias_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;
+}
+
+static inline uint64_t NodeAlias_clone_ptr(LDKNodeAlias *NONNULL_PTR arg) {
+       LDKNodeAlias ret_var = NodeAlias_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_NodeAlias_clone_ptr(int64_t arg) {
+       LDKNodeAlias 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 = NodeAlias_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NodeAlias_clone(int64_t orig) {
+       LDKNodeAlias 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;
+       LDKNodeAlias ret_var = NodeAlias_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_NodeAlias_eq(int64_t a, int64_t b) {
+       LDKNodeAlias 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;
+       LDKNodeAlias 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 = NodeAlias_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_NodeAlias_write(int64_t obj) {
+       LDKNodeAlias 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 = NodeAlias_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_NodeAlias_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_NodeAliasDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAliasDecodeErrorZ), "LDKCResult_NodeAliasDecodeErrorZ");
+       *ret_conv = NodeAlias_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_NodeInfo_free(int64_t this_obj) {
+       LDKNodeInfo 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);
+       NodeInfo_free(this_obj_conv);
+}
+
+int64_tArray  CS_LDK_NodeInfo_get_channels(int64_t this_ptr) {
+       LDKNodeInfo 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 = NodeInfo_get_channels(&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_NodeInfo_set_channels(int64_t this_ptr, int64_tArray val) {
+       LDKNodeInfo 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);
+       NodeInfo_set_channels(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_NodeInfo_get_announcement_info(int64_t this_ptr) {
+       LDKNodeInfo 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;
+       LDKNodeAnnouncementInfo ret_var = NodeInfo_get_announcement_info(&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_NodeInfo_set_announcement_info(int64_t this_ptr, int64_t val) {
+       LDKNodeInfo 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;
+       LDKNodeAnnouncementInfo 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 = NodeAnnouncementInfo_clone(&val_conv);
+       NodeInfo_set_announcement_info(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_NodeInfo_new(int64_tArray channels_arg, int64_t announcement_info_arg) {
+       LDKCVec_u64Z channels_arg_constr;
+       channels_arg_constr.datalen = channels_arg->arr_len;
+       if (channels_arg_constr.datalen > 0)
+               channels_arg_constr.data = MALLOC(channels_arg_constr.datalen * sizeof(int64_t), "LDKCVec_u64Z Elements");
+       else
+               channels_arg_constr.data = NULL;
+       int64_t* channels_arg_vals = channels_arg->elems;
+       for (size_t g = 0; g < channels_arg_constr.datalen; g++) {
+               int64_t channels_arg_conv_6 = channels_arg_vals[g];
+               channels_arg_constr.data[g] = channels_arg_conv_6;
+       }
+       FREE(channels_arg);
+       LDKNodeAnnouncementInfo announcement_info_arg_conv;
+       announcement_info_arg_conv.inner = untag_ptr(announcement_info_arg);
+       announcement_info_arg_conv.is_owned = ptr_is_owned(announcement_info_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(announcement_info_arg_conv);
+       announcement_info_arg_conv = NodeAnnouncementInfo_clone(&announcement_info_arg_conv);
+       LDKNodeInfo ret_var = NodeInfo_new(channels_arg_constr, announcement_info_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 NodeInfo_clone_ptr(LDKNodeInfo *NONNULL_PTR arg) {
+       LDKNodeInfo ret_var = NodeInfo_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_NodeInfo_clone_ptr(int64_t arg) {
+       LDKNodeInfo 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 = NodeInfo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NodeInfo_clone(int64_t orig) {
+       LDKNodeInfo 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;
+       LDKNodeInfo ret_var = NodeInfo_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_NodeInfo_eq(int64_t a, int64_t b) {
+       LDKNodeInfo 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;
+       LDKNodeInfo 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 = NodeInfo_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_NodeInfo_write(int64_t obj) {
+       LDKNodeInfo 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 = NodeInfo_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_NodeInfo_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_NodeInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeInfoDecodeErrorZ), "LDKCResult_NodeInfoDecodeErrorZ");
+       *ret_conv = NodeInfo_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_NetworkGraph_write(int64_t obj) {
+       LDKNetworkGraph 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 = NetworkGraph_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_NetworkGraph_read(int8_tArray ser, int64_t arg) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       void* arg_ptr = untag_ptr(arg);
+       CHECK_ACCESS(arg_ptr);
+       LDKLogger arg_conv = *(LDKLogger*)(arg_ptr);
+       if (arg_conv.free == LDKLogger_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKLogger_JCalls_cloned(&arg_conv);
+       }
+       LDKCResult_NetworkGraphDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NetworkGraphDecodeErrorZ), "LDKCResult_NetworkGraphDecodeErrorZ");
+       *ret_conv = NetworkGraph_read(ser_ref, arg_conv);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NetworkGraph_new(int32_t network, int64_t logger) {
+       LDKNetwork network_conv = LDKNetwork_from_cs(network);
+       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);
+       }
+       LDKNetworkGraph ret_var = NetworkGraph_new(network_conv, logger_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_NetworkGraph_read_only(int64_t this_arg) {
+       LDKNetworkGraph 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;
+       LDKReadOnlyNetworkGraph ret_var = NetworkGraph_read_only(&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_NetworkGraph_get_last_rapid_gossip_sync_timestamp(int64_t this_arg) {
+       LDKNetworkGraph 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;
+       LDKCOption_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = NetworkGraph_get_last_rapid_gossip_sync_timestamp(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_NetworkGraph_set_last_rapid_gossip_sync_timestamp(int64_t this_arg, int32_t last_rapid_gossip_sync_timestamp) {
+       LDKNetworkGraph 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;
+       NetworkGraph_set_last_rapid_gossip_sync_timestamp(&this_arg_conv, last_rapid_gossip_sync_timestamp);
+}
+
+int64_t  CS_LDK_NetworkGraph_update_node_from_announcement(int64_t this_arg, int64_t msg) {
+       LDKNetworkGraph 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;
+       LDKNodeAnnouncement 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;
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_update_node_from_announcement(&this_arg_conv, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NetworkGraph_update_node_from_unsigned_announcement(int64_t this_arg, int64_t msg) {
+       LDKNetworkGraph 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;
+       LDKUnsignedNodeAnnouncement 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;
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_update_node_from_unsigned_announcement(&this_arg_conv, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NetworkGraph_update_channel_from_announcement(int64_t this_arg, int64_t msg, int64_t utxo_lookup) {
+       LDKNetworkGraph 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;
+       LDKChannelAnnouncement 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* utxo_lookup_ptr = untag_ptr(utxo_lookup);
+       CHECK_ACCESS(utxo_lookup_ptr);
+       LDKCOption_UtxoLookupZ utxo_lookup_conv = *(LDKCOption_UtxoLookupZ*)(utxo_lookup_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKCOption_UtxoLookupZ
+       if (utxo_lookup_conv.tag == LDKCOption_UtxoLookupZ_Some) {
+               // Manually implement clone for Java trait instances
+               if (utxo_lookup_conv.some.free == LDKUtxoLookup_JCalls_free) {
+                       // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                       LDKUtxoLookup_JCalls_cloned(&utxo_lookup_conv.some);
+               }
+       }
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_update_channel_from_announcement(&this_arg_conv, &msg_conv, utxo_lookup_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NetworkGraph_update_channel_from_announcement_no_lookup(int64_t this_arg, int64_t msg) {
+       LDKNetworkGraph 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;
+       LDKChannelAnnouncement 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;
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_update_channel_from_announcement_no_lookup(&this_arg_conv, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NetworkGraph_update_channel_from_unsigned_announcement(int64_t this_arg, int64_t msg, int64_t utxo_lookup) {
+       LDKNetworkGraph 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;
+       LDKUnsignedChannelAnnouncement 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* utxo_lookup_ptr = untag_ptr(utxo_lookup);
+       CHECK_ACCESS(utxo_lookup_ptr);
+       LDKCOption_UtxoLookupZ utxo_lookup_conv = *(LDKCOption_UtxoLookupZ*)(utxo_lookup_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKCOption_UtxoLookupZ
+       if (utxo_lookup_conv.tag == LDKCOption_UtxoLookupZ_Some) {
+               // Manually implement clone for Java trait instances
+               if (utxo_lookup_conv.some.free == LDKUtxoLookup_JCalls_free) {
+                       // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                       LDKUtxoLookup_JCalls_cloned(&utxo_lookup_conv.some);
+               }
+       }
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_update_channel_from_unsigned_announcement(&this_arg_conv, &msg_conv, utxo_lookup_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NetworkGraph_add_channel_from_partial_announcement(int64_t this_arg, int64_t short_channel_id, int64_t timestamp, int64_t features, int8_tArray node_id_1, int8_tArray node_id_2) {
+       LDKNetworkGraph 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;
+       LDKChannelFeatures features_conv;
+       features_conv.inner = untag_ptr(features);
+       features_conv.is_owned = ptr_is_owned(features);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_conv);
+       features_conv = ChannelFeatures_clone(&features_conv);
+       LDKPublicKey node_id_1_ref;
+       CHECK(node_id_1->arr_len == 33);
+       memcpy(node_id_1_ref.compressed_form, node_id_1->elems, 33); FREE(node_id_1);
+       LDKPublicKey node_id_2_ref;
+       CHECK(node_id_2->arr_len == 33);
+       memcpy(node_id_2_ref.compressed_form, node_id_2->elems, 33); FREE(node_id_2);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_add_channel_from_partial_announcement(&this_arg_conv, short_channel_id, timestamp, features_conv, node_id_1_ref, node_id_2_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_NetworkGraph_channel_failed_permanent(int64_t this_arg, int64_t short_channel_id) {
+       LDKNetworkGraph 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;
+       NetworkGraph_channel_failed_permanent(&this_arg_conv, short_channel_id);
+}
+
+void  CS_LDK_NetworkGraph_node_failed_permanent(int64_t this_arg, int8_tArray node_id) {
+       LDKNetworkGraph 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;
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       NetworkGraph_node_failed_permanent(&this_arg_conv, node_id_ref);
+}
+
+void  CS_LDK_NetworkGraph_remove_stale_channels_and_tracking(int64_t this_arg) {
+       LDKNetworkGraph 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;
+       NetworkGraph_remove_stale_channels_and_tracking(&this_arg_conv);
+}
+
+void  CS_LDK_NetworkGraph_remove_stale_channels_and_tracking_with_time(int64_t this_arg, int64_t current_time_unix) {
+       LDKNetworkGraph 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;
+       NetworkGraph_remove_stale_channels_and_tracking_with_time(&this_arg_conv, current_time_unix);
+}
+
+int64_t  CS_LDK_NetworkGraph_update_channel(int64_t this_arg, int64_t msg) {
+       LDKNetworkGraph 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;
+       LDKChannelUpdate 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;
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_update_channel(&this_arg_conv, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NetworkGraph_update_channel_unsigned(int64_t this_arg, int64_t msg) {
+       LDKNetworkGraph 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;
+       LDKUnsignedChannelUpdate 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;
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_update_channel_unsigned(&this_arg_conv, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_NetworkGraph_verify_channel_update(int64_t this_arg, int64_t msg) {
+       LDKNetworkGraph 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;
+       LDKChannelUpdate 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;
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = NetworkGraph_verify_channel_update(&this_arg_conv, &msg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ReadOnlyNetworkGraph_channel(int64_t this_arg, int64_t short_channel_id) {
+       LDKReadOnlyNetworkGraph 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;
+       LDKChannelInfo ret_var = ReadOnlyNetworkGraph_channel(&this_arg_conv, short_channel_id);
+       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_tArray  CS_LDK_ReadOnlyNetworkGraph_list_channels(int64_t this_arg) {
+       LDKReadOnlyNetworkGraph 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;
+       LDKCVec_u64Z ret_var = ReadOnlyNetworkGraph_list_channels(&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 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;
+}
+
+int64_t  CS_LDK_ReadOnlyNetworkGraph_node(int64_t this_arg, int64_t node_id) {
+       LDKReadOnlyNetworkGraph 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;
+       LDKNodeId node_id_conv;
+       node_id_conv.inner = untag_ptr(node_id);
+       node_id_conv.is_owned = ptr_is_owned(node_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_id_conv);
+       node_id_conv.is_owned = false;
+       LDKNodeInfo ret_var = ReadOnlyNetworkGraph_node(&this_arg_conv, &node_id_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_tArray  CS_LDK_ReadOnlyNetworkGraph_list_nodes(int64_t this_arg) {
+       LDKReadOnlyNetworkGraph 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;
+       LDKCVec_NodeIdZ ret_var = ReadOnlyNetworkGraph_list_nodes(&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 i = 0; i < ret_var.datalen; i++) {
+               LDKNodeId ret_conv_8_var = ret_var.data[i];
+               int64_t ret_conv_8_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_8_var);
+               ret_conv_8_ref = tag_ptr(ret_conv_8_var.inner, ret_conv_8_var.is_owned);
+               ret_arr_ptr[i] = ret_conv_8_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_ReadOnlyNetworkGraph_get_addresses(int64_t this_arg, int8_tArray pubkey) {
+       LDKReadOnlyNetworkGraph 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;
+       LDKPublicKey pubkey_ref;
+       CHECK(pubkey->arr_len == 33);
+       memcpy(pubkey_ref.compressed_form, pubkey->elems, 33); FREE(pubkey);
+       LDKCOption_CVec_SocketAddressZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_SocketAddressZZ), "LDKCOption_CVec_SocketAddressZZ");
+       *ret_copy = ReadOnlyNetworkGraph_get_addresses(&this_arg_conv, pubkey_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_DefaultRouter_free(int64_t this_obj) {
+       LDKDefaultRouter 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);
+       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) {
+       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* 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);
+       }
+       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* scorer_ptr = untag_ptr(scorer);
+       CHECK_ACCESS(scorer_ptr);
+       LDKLockableScore scorer_conv = *(LDKLockableScore*)(scorer_ptr);
+       if (scorer_conv.free == LDKLockableScore_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKLockableScore_JCalls_cloned(&scorer_conv);
+       }
+       LDKProbabilisticScoringFeeParameters score_params_conv;
+       score_params_conv.inner = untag_ptr(score_params);
+       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);
+       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_DefaultRouter_as_Router(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;
+       LDKRouter* ret_ret = MALLOC(sizeof(LDKRouter), "LDKRouter");
+       *ret_ret = DefaultRouter_as_Router(&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);
+       CHECK_ACCESS(this_ptr_ptr);
+       LDKRouter this_ptr_conv = *(LDKRouter*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Router_free(this_ptr_conv);
+}
+
+void  CS_LDK_ScorerAccountingForInFlightHtlcs_free(int64_t this_obj) {
+       LDKScorerAccountingForInFlightHtlcs 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);
+       ScorerAccountingForInFlightHtlcs_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ScorerAccountingForInFlightHtlcs_new(int64_t scorer, int64_t inflight_htlcs) {
+       void* scorer_ptr = untag_ptr(scorer);
+       CHECK_ACCESS(scorer_ptr);
+       LDKScoreLookUp scorer_conv = *(LDKScoreLookUp*)(scorer_ptr);
+       if (scorer_conv.free == LDKScoreLookUp_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKScoreLookUp_JCalls_cloned(&scorer_conv);
+       }
+       LDKInFlightHtlcs inflight_htlcs_conv;
+       inflight_htlcs_conv.inner = untag_ptr(inflight_htlcs);
+       inflight_htlcs_conv.is_owned = ptr_is_owned(inflight_htlcs);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(inflight_htlcs_conv);
+       inflight_htlcs_conv.is_owned = false;
+       LDKScorerAccountingForInFlightHtlcs ret_var = ScorerAccountingForInFlightHtlcs_new(scorer_conv, &inflight_htlcs_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_ScorerAccountingForInFlightHtlcs_as_ScoreLookUp(int64_t this_arg) {
+       LDKScorerAccountingForInFlightHtlcs 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;
+       LDKScoreLookUp* ret_ret = MALLOC(sizeof(LDKScoreLookUp), "LDKScoreLookUp");
+       *ret_ret = ScorerAccountingForInFlightHtlcs_as_ScoreLookUp(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_InFlightHtlcs_free(int64_t this_obj) {
+       LDKInFlightHtlcs 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);
+       InFlightHtlcs_free(this_obj_conv);
+}
+
+static inline uint64_t InFlightHtlcs_clone_ptr(LDKInFlightHtlcs *NONNULL_PTR arg) {
+       LDKInFlightHtlcs ret_var = InFlightHtlcs_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_InFlightHtlcs_clone_ptr(int64_t arg) {
+       LDKInFlightHtlcs 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 = InFlightHtlcs_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InFlightHtlcs_clone(int64_t orig) {
+       LDKInFlightHtlcs 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;
+       LDKInFlightHtlcs ret_var = InFlightHtlcs_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_InFlightHtlcs_new() {
+       LDKInFlightHtlcs ret_var = InFlightHtlcs_new();
+       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_InFlightHtlcs_process_path(int64_t this_arg, int64_t path, int8_tArray payer_node_id) {
+       LDKInFlightHtlcs 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;
+       LDKPath 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.is_owned = false;
+       LDKPublicKey payer_node_id_ref;
+       CHECK(payer_node_id->arr_len == 33);
+       memcpy(payer_node_id_ref.compressed_form, payer_node_id->elems, 33); FREE(payer_node_id);
+       InFlightHtlcs_process_path(&this_arg_conv, &path_conv, payer_node_id_ref);
+}
+
+void  CS_LDK_InFlightHtlcs_add_inflight_htlc(int64_t this_arg, int64_t source, int64_t target, int64_t channel_scid, int64_t used_msat) {
+       LDKInFlightHtlcs 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;
+       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;
+       InFlightHtlcs_add_inflight_htlc(&this_arg_conv, &source_conv, &target_conv, channel_scid, used_msat);
+}
+
+int64_t  CS_LDK_InFlightHtlcs_used_liquidity_msat(int64_t this_arg, int64_t source, int64_t target, int64_t channel_scid) {
+       LDKInFlightHtlcs 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;
+       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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = InFlightHtlcs_used_liquidity_msat(&this_arg_conv, &source_conv, &target_conv, channel_scid);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_InFlightHtlcs_write(int64_t obj) {
+       LDKInFlightHtlcs 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 = InFlightHtlcs_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_InFlightHtlcs_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_InFlightHtlcsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InFlightHtlcsDecodeErrorZ), "LDKCResult_InFlightHtlcsDecodeErrorZ");
+       *ret_conv = InFlightHtlcs_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_RouteHop_free(int64_t this_obj) {
+       LDKRouteHop 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);
+       RouteHop_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_RouteHop_get_pubkey(int64_t this_ptr) {
+       LDKRouteHop 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, RouteHop_get_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_RouteHop_set_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKRouteHop 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);
+       RouteHop_set_pubkey(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_RouteHop_get_node_features(int64_t this_ptr) {
+       LDKRouteHop 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;
+       LDKNodeFeatures ret_var = RouteHop_get_node_features(&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_RouteHop_set_node_features(int64_t this_ptr, int64_t val) {
+       LDKRouteHop 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;
+       LDKNodeFeatures 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 = NodeFeatures_clone(&val_conv);
+       RouteHop_set_node_features(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_RouteHop_get_short_channel_id(int64_t this_ptr) {
+       LDKRouteHop 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 = RouteHop_get_short_channel_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RouteHop_set_short_channel_id(int64_t this_ptr, int64_t val) {
+       LDKRouteHop 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;
+       RouteHop_set_short_channel_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_RouteHop_get_channel_features(int64_t this_ptr) {
+       LDKRouteHop 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;
+       LDKChannelFeatures ret_var = RouteHop_get_channel_features(&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_RouteHop_set_channel_features(int64_t this_ptr, int64_t val) {
+       LDKRouteHop 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;
+       LDKChannelFeatures 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 = ChannelFeatures_clone(&val_conv);
+       RouteHop_set_channel_features(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_RouteHop_get_fee_msat(int64_t this_ptr) {
+       LDKRouteHop 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 = RouteHop_get_fee_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RouteHop_set_fee_msat(int64_t this_ptr, int64_t val) {
+       LDKRouteHop 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;
+       RouteHop_set_fee_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_RouteHop_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKRouteHop 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 = RouteHop_get_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RouteHop_set_cltv_expiry_delta(int64_t this_ptr, int32_t val) {
+       LDKRouteHop 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;
+       RouteHop_set_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_RouteHop_get_maybe_announced_channel(int64_t this_ptr) {
+       LDKRouteHop 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;
+       jboolean ret_conv = RouteHop_get_maybe_announced_channel(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RouteHop_set_maybe_announced_channel(int64_t this_ptr, jboolean val) {
+       LDKRouteHop 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;
+       RouteHop_set_maybe_announced_channel(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_RouteHop_new(int8_tArray pubkey_arg, int64_t node_features_arg, int64_t short_channel_id_arg, int64_t channel_features_arg, int64_t fee_msat_arg, int32_t cltv_expiry_delta_arg, jboolean maybe_announced_channel_arg) {
+       LDKPublicKey pubkey_arg_ref;
+       CHECK(pubkey_arg->arr_len == 33);
+       memcpy(pubkey_arg_ref.compressed_form, pubkey_arg->elems, 33); FREE(pubkey_arg);
+       LDKNodeFeatures node_features_arg_conv;
+       node_features_arg_conv.inner = untag_ptr(node_features_arg);
+       node_features_arg_conv.is_owned = ptr_is_owned(node_features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_features_arg_conv);
+       node_features_arg_conv = NodeFeatures_clone(&node_features_arg_conv);
+       LDKChannelFeatures channel_features_arg_conv;
+       channel_features_arg_conv.inner = untag_ptr(channel_features_arg);
+       channel_features_arg_conv.is_owned = ptr_is_owned(channel_features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_features_arg_conv);
+       channel_features_arg_conv = ChannelFeatures_clone(&channel_features_arg_conv);
+       LDKRouteHop ret_var = RouteHop_new(pubkey_arg_ref, node_features_arg_conv, short_channel_id_arg, channel_features_arg_conv, fee_msat_arg, cltv_expiry_delta_arg, maybe_announced_channel_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 RouteHop_clone_ptr(LDKRouteHop *NONNULL_PTR arg) {
+       LDKRouteHop ret_var = RouteHop_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_RouteHop_clone_ptr(int64_t arg) {
+       LDKRouteHop 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 = RouteHop_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RouteHop_clone(int64_t orig) {
+       LDKRouteHop 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;
+       LDKRouteHop ret_var = RouteHop_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_RouteHop_hash(int64_t o) {
+       LDKRouteHop 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 = RouteHop_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_RouteHop_eq(int64_t a, int64_t b) {
+       LDKRouteHop 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;
+       LDKRouteHop 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 = RouteHop_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_RouteHop_write(int64_t obj) {
+       LDKRouteHop 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 = RouteHop_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_RouteHop_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RouteHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHopDecodeErrorZ), "LDKCResult_RouteHopDecodeErrorZ");
+       *ret_conv = RouteHop_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_BlindedTail_free(int64_t this_obj) {
+       LDKBlindedTail 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);
+       BlindedTail_free(this_obj_conv);
+}
+
+int64_tArray  CS_LDK_BlindedTail_get_hops(int64_t this_ptr) {
+       LDKBlindedTail 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_BlindedHopZ ret_var = BlindedTail_get_hops(&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 m = 0; m < ret_var.datalen; m++) {
+               LDKBlindedHop ret_conv_12_var = ret_var.data[m];
+               int64_t ret_conv_12_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_12_var);
+               ret_conv_12_ref = tag_ptr(ret_conv_12_var.inner, ret_conv_12_var.is_owned);
+               ret_arr_ptr[m] = ret_conv_12_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_BlindedTail_set_hops(int64_t this_ptr, int64_tArray val) {
+       LDKBlindedTail 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_BlindedHopZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKBlindedHop), "LDKCVec_BlindedHopZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t m = 0; m < val_constr.datalen; m++) {
+               int64_t val_conv_12 = val_vals[m];
+               LDKBlindedHop val_conv_12_conv;
+               val_conv_12_conv.inner = untag_ptr(val_conv_12);
+               val_conv_12_conv.is_owned = ptr_is_owned(val_conv_12);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_12_conv);
+               val_conv_12_conv = BlindedHop_clone(&val_conv_12_conv);
+               val_constr.data[m] = val_conv_12_conv;
+       }
+       FREE(val);
+       BlindedTail_set_hops(&this_ptr_conv, val_constr);
+}
+
+int8_tArray  CS_LDK_BlindedTail_get_blinding_point(int64_t this_ptr) {
+       LDKBlindedTail 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, BlindedTail_get_blinding_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_BlindedTail_set_blinding_point(int64_t this_ptr, int8_tArray val) {
+       LDKBlindedTail 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);
+       BlindedTail_set_blinding_point(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_BlindedTail_get_excess_final_cltv_expiry_delta(int64_t this_ptr) {
+       LDKBlindedTail 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 = BlindedTail_get_excess_final_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedTail_set_excess_final_cltv_expiry_delta(int64_t this_ptr, int32_t val) {
+       LDKBlindedTail 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;
+       BlindedTail_set_excess_final_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_BlindedTail_get_final_value_msat(int64_t this_ptr) {
+       LDKBlindedTail 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 = BlindedTail_get_final_value_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedTail_set_final_value_msat(int64_t this_ptr, int64_t val) {
+       LDKBlindedTail 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;
+       BlindedTail_set_final_value_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_BlindedTail_new(int64_tArray hops_arg, int8_tArray blinding_point_arg, int32_t excess_final_cltv_expiry_delta_arg, int64_t final_value_msat_arg) {
+       LDKCVec_BlindedHopZ hops_arg_constr;
+       hops_arg_constr.datalen = hops_arg->arr_len;
+       if (hops_arg_constr.datalen > 0)
+               hops_arg_constr.data = MALLOC(hops_arg_constr.datalen * sizeof(LDKBlindedHop), "LDKCVec_BlindedHopZ Elements");
+       else
+               hops_arg_constr.data = NULL;
+       int64_t* hops_arg_vals = hops_arg->elems;
+       for (size_t m = 0; m < hops_arg_constr.datalen; m++) {
+               int64_t hops_arg_conv_12 = hops_arg_vals[m];
+               LDKBlindedHop hops_arg_conv_12_conv;
+               hops_arg_conv_12_conv.inner = untag_ptr(hops_arg_conv_12);
+               hops_arg_conv_12_conv.is_owned = ptr_is_owned(hops_arg_conv_12);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(hops_arg_conv_12_conv);
+               hops_arg_conv_12_conv = BlindedHop_clone(&hops_arg_conv_12_conv);
+               hops_arg_constr.data[m] = hops_arg_conv_12_conv;
+       }
+       FREE(hops_arg);
+       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);
+       LDKBlindedTail ret_var = BlindedTail_new(hops_arg_constr, blinding_point_arg_ref, excess_final_cltv_expiry_delta_arg, final_value_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 BlindedTail_clone_ptr(LDKBlindedTail *NONNULL_PTR arg) {
+       LDKBlindedTail ret_var = BlindedTail_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_BlindedTail_clone_ptr(int64_t arg) {
+       LDKBlindedTail 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 = BlindedTail_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedTail_clone(int64_t orig) {
+       LDKBlindedTail 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;
+       LDKBlindedTail ret_var = BlindedTail_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_BlindedTail_hash(int64_t o) {
+       LDKBlindedTail 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 = BlindedTail_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BlindedTail_eq(int64_t a, int64_t b) {
+       LDKBlindedTail 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;
+       LDKBlindedTail 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 = BlindedTail_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_BlindedTail_write(int64_t obj) {
+       LDKBlindedTail 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 = BlindedTail_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_BlindedTail_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BlindedTailDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedTailDecodeErrorZ), "LDKCResult_BlindedTailDecodeErrorZ");
+       *ret_conv = BlindedTail_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_Path_free(int64_t this_obj) {
+       LDKPath 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);
+       Path_free(this_obj_conv);
+}
+
+int64_tArray  CS_LDK_Path_get_hops(int64_t this_ptr) {
+       LDKPath 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_RouteHopZ ret_var = Path_get_hops(&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 k = 0; k < ret_var.datalen; k++) {
+               LDKRouteHop ret_conv_10_var = ret_var.data[k];
+               int64_t ret_conv_10_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_10_var);
+               ret_conv_10_ref = tag_ptr(ret_conv_10_var.inner, ret_conv_10_var.is_owned);
+               ret_arr_ptr[k] = ret_conv_10_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_Path_set_hops(int64_t this_ptr, int64_tArray val) {
+       LDKPath 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_RouteHopZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKRouteHop), "LDKCVec_RouteHopZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t k = 0; k < val_constr.datalen; k++) {
+               int64_t val_conv_10 = val_vals[k];
+               LDKRouteHop val_conv_10_conv;
+               val_conv_10_conv.inner = untag_ptr(val_conv_10);
+               val_conv_10_conv.is_owned = ptr_is_owned(val_conv_10);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_10_conv);
+               val_conv_10_conv = RouteHop_clone(&val_conv_10_conv);
+               val_constr.data[k] = val_conv_10_conv;
+       }
+       FREE(val);
+       Path_set_hops(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_Path_get_blinded_tail(int64_t this_ptr) {
+       LDKPath 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;
+       LDKBlindedTail ret_var = Path_get_blinded_tail(&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_Path_set_blinded_tail(int64_t this_ptr, int64_t val) {
+       LDKPath 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;
+       LDKBlindedTail 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 = BlindedTail_clone(&val_conv);
+       Path_set_blinded_tail(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Path_new(int64_tArray hops_arg, int64_t blinded_tail_arg) {
+       LDKCVec_RouteHopZ hops_arg_constr;
+       hops_arg_constr.datalen = hops_arg->arr_len;
+       if (hops_arg_constr.datalen > 0)
+               hops_arg_constr.data = MALLOC(hops_arg_constr.datalen * sizeof(LDKRouteHop), "LDKCVec_RouteHopZ Elements");
+       else
+               hops_arg_constr.data = NULL;
+       int64_t* hops_arg_vals = hops_arg->elems;
+       for (size_t k = 0; k < hops_arg_constr.datalen; k++) {
+               int64_t hops_arg_conv_10 = hops_arg_vals[k];
+               LDKRouteHop hops_arg_conv_10_conv;
+               hops_arg_conv_10_conv.inner = untag_ptr(hops_arg_conv_10);
+               hops_arg_conv_10_conv.is_owned = ptr_is_owned(hops_arg_conv_10);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(hops_arg_conv_10_conv);
+               hops_arg_conv_10_conv = RouteHop_clone(&hops_arg_conv_10_conv);
+               hops_arg_constr.data[k] = hops_arg_conv_10_conv;
+       }
+       FREE(hops_arg);
+       LDKBlindedTail blinded_tail_arg_conv;
+       blinded_tail_arg_conv.inner = untag_ptr(blinded_tail_arg);
+       blinded_tail_arg_conv.is_owned = ptr_is_owned(blinded_tail_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(blinded_tail_arg_conv);
+       blinded_tail_arg_conv = BlindedTail_clone(&blinded_tail_arg_conv);
+       LDKPath ret_var = Path_new(hops_arg_constr, blinded_tail_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 Path_clone_ptr(LDKPath *NONNULL_PTR arg) {
+       LDKPath ret_var = Path_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_Path_clone_ptr(int64_t arg) {
+       LDKPath 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 = Path_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Path_clone(int64_t orig) {
+       LDKPath 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;
+       LDKPath ret_var = Path_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_Path_hash(int64_t o) {
+       LDKPath 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 = Path_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Path_eq(int64_t a, int64_t b) {
+       LDKPath 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;
+       LDKPath 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 = Path_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Path_fee_msat(int64_t this_arg) {
+       LDKPath 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 = Path_fee_msat(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Path_final_value_msat(int64_t this_arg) {
+       LDKPath 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 = Path_final_value_msat(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Path_final_cltv_expiry_delta(int64_t this_arg) {
+       LDKPath 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;
+       LDKCOption_u32Z *ret_copy = MALLOC(sizeof(LDKCOption_u32Z), "LDKCOption_u32Z");
+       *ret_copy = Path_final_cltv_expiry_delta(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_Route_free(int64_t this_obj) {
+       LDKRoute 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);
+       Route_free(this_obj_conv);
+}
+
+int64_tArray  CS_LDK_Route_get_paths(int64_t this_ptr) {
+       LDKRoute 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_PathZ ret_var = Route_get_paths(&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++) {
+               LDKPath ret_conv_6_var = ret_var.data[g];
+               int64_t ret_conv_6_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_6_var);
+               ret_conv_6_ref = tag_ptr(ret_conv_6_var.inner, ret_conv_6_var.is_owned);
+               ret_arr_ptr[g] = ret_conv_6_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_Route_set_paths(int64_t this_ptr, int64_tArray val) {
+       LDKRoute 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_PathZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKPath), "LDKCVec_PathZ 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];
+               LDKPath val_conv_6_conv;
+               val_conv_6_conv.inner = untag_ptr(val_conv_6);
+               val_conv_6_conv.is_owned = ptr_is_owned(val_conv_6);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_6_conv);
+               val_conv_6_conv = Path_clone(&val_conv_6_conv);
+               val_constr.data[g] = val_conv_6_conv;
+       }
+       FREE(val);
+       Route_set_paths(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_Route_get_route_params(int64_t this_ptr) {
+       LDKRoute 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;
+       LDKRouteParameters ret_var = Route_get_route_params(&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_Route_set_route_params(int64_t this_ptr, int64_t val) {
+       LDKRoute 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;
+       LDKRouteParameters 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 = RouteParameters_clone(&val_conv);
+       Route_set_route_params(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Route_new(int64_tArray paths_arg, int64_t route_params_arg) {
+       LDKCVec_PathZ paths_arg_constr;
+       paths_arg_constr.datalen = paths_arg->arr_len;
+       if (paths_arg_constr.datalen > 0)
+               paths_arg_constr.data = MALLOC(paths_arg_constr.datalen * sizeof(LDKPath), "LDKCVec_PathZ Elements");
+       else
+               paths_arg_constr.data = NULL;
+       int64_t* paths_arg_vals = paths_arg->elems;
+       for (size_t g = 0; g < paths_arg_constr.datalen; g++) {
+               int64_t paths_arg_conv_6 = paths_arg_vals[g];
+               LDKPath paths_arg_conv_6_conv;
+               paths_arg_conv_6_conv.inner = untag_ptr(paths_arg_conv_6);
+               paths_arg_conv_6_conv.is_owned = ptr_is_owned(paths_arg_conv_6);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(paths_arg_conv_6_conv);
+               paths_arg_conv_6_conv = Path_clone(&paths_arg_conv_6_conv);
+               paths_arg_constr.data[g] = paths_arg_conv_6_conv;
+       }
+       FREE(paths_arg);
+       LDKRouteParameters route_params_arg_conv;
+       route_params_arg_conv.inner = untag_ptr(route_params_arg);
+       route_params_arg_conv.is_owned = ptr_is_owned(route_params_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_arg_conv);
+       route_params_arg_conv = RouteParameters_clone(&route_params_arg_conv);
+       LDKRoute ret_var = Route_new(paths_arg_constr, route_params_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 Route_clone_ptr(LDKRoute *NONNULL_PTR arg) {
+       LDKRoute ret_var = Route_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_Route_clone_ptr(int64_t arg) {
+       LDKRoute 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 = Route_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Route_clone(int64_t orig) {
+       LDKRoute 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;
+       LDKRoute ret_var = Route_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_Route_hash(int64_t o) {
+       LDKRoute 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 = Route_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Route_eq(int64_t a, int64_t b) {
+       LDKRoute 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;
+       LDKRoute 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 = Route_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Route_get_total_fees(int64_t this_arg) {
+       LDKRoute 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 = Route_get_total_fees(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Route_get_total_amount(int64_t this_arg) {
+       LDKRoute 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 = Route_get_total_amount(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Route_write(int64_t obj) {
+       LDKRoute 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 = Route_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_Route_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RouteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteDecodeErrorZ), "LDKCResult_RouteDecodeErrorZ");
+       *ret_conv = Route_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_RouteParameters_free(int64_t this_obj) {
+       LDKRouteParameters 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);
+       RouteParameters_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_RouteParameters_get_payment_params(int64_t this_ptr) {
+       LDKRouteParameters 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;
+       LDKPaymentParameters ret_var = RouteParameters_get_payment_params(&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_RouteParameters_set_payment_params(int64_t this_ptr, int64_t val) {
+       LDKRouteParameters 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;
+       LDKPaymentParameters 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 = PaymentParameters_clone(&val_conv);
+       RouteParameters_set_payment_params(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_RouteParameters_get_final_value_msat(int64_t this_ptr) {
+       LDKRouteParameters 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 = RouteParameters_get_final_value_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RouteParameters_set_final_value_msat(int64_t this_ptr, int64_t val) {
+       LDKRouteParameters 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;
+       RouteParameters_set_final_value_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_RouteParameters_get_max_total_routing_fee_msat(int64_t this_ptr) {
+       LDKRouteParameters 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 = RouteParameters_get_max_total_routing_fee_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_RouteParameters_set_max_total_routing_fee_msat(int64_t this_ptr, int64_t val) {
+       LDKRouteParameters 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));
+       RouteParameters_set_max_total_routing_fee_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_RouteParameters_new(int64_t payment_params_arg, int64_t final_value_msat_arg, int64_t max_total_routing_fee_msat_arg) {
+       LDKPaymentParameters payment_params_arg_conv;
+       payment_params_arg_conv.inner = untag_ptr(payment_params_arg);
+       payment_params_arg_conv.is_owned = ptr_is_owned(payment_params_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_params_arg_conv);
+       payment_params_arg_conv = PaymentParameters_clone(&payment_params_arg_conv);
+       void* max_total_routing_fee_msat_arg_ptr = untag_ptr(max_total_routing_fee_msat_arg);
+       CHECK_ACCESS(max_total_routing_fee_msat_arg_ptr);
+       LDKCOption_u64Z max_total_routing_fee_msat_arg_conv = *(LDKCOption_u64Z*)(max_total_routing_fee_msat_arg_ptr);
+       max_total_routing_fee_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(max_total_routing_fee_msat_arg));
+       LDKRouteParameters ret_var = RouteParameters_new(payment_params_arg_conv, final_value_msat_arg, max_total_routing_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 RouteParameters_clone_ptr(LDKRouteParameters *NONNULL_PTR arg) {
+       LDKRouteParameters ret_var = RouteParameters_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_RouteParameters_clone_ptr(int64_t arg) {
+       LDKRouteParameters 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 = RouteParameters_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RouteParameters_clone(int64_t orig) {
+       LDKRouteParameters 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;
+       LDKRouteParameters ret_var = RouteParameters_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_RouteParameters_hash(int64_t o) {
+       LDKRouteParameters 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 = RouteParameters_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_RouteParameters_eq(int64_t a, int64_t b) {
+       LDKRouteParameters 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;
+       LDKRouteParameters 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 = RouteParameters_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RouteParameters_from_payment_params_and_value(int64_t payment_params, int64_t final_value_msat) {
+       LDKPaymentParameters payment_params_conv;
+       payment_params_conv.inner = untag_ptr(payment_params);
+       payment_params_conv.is_owned = ptr_is_owned(payment_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_params_conv);
+       payment_params_conv = PaymentParameters_clone(&payment_params_conv);
+       LDKRouteParameters ret_var = RouteParameters_from_payment_params_and_value(payment_params_conv, final_value_msat);
+       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_RouteParameters_write(int64_t obj) {
+       LDKRouteParameters 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 = RouteParameters_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_RouteParameters_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RouteParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteParametersDecodeErrorZ), "LDKCResult_RouteParametersDecodeErrorZ");
+       *ret_conv = RouteParameters_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_PaymentParameters_free(int64_t this_obj) {
+       LDKPaymentParameters 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);
+       PaymentParameters_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_PaymentParameters_get_payee(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;
+       LDKPayee *ret_copy = MALLOC(sizeof(LDKPayee), "LDKPayee");
+       *ret_copy = PaymentParameters_get_payee(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_PaymentParameters_set_payee(int64_t this_ptr, int64_t 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;
+       void* val_ptr = untag_ptr(val);
+       CHECK_ACCESS(val_ptr);
+       LDKPayee val_conv = *(LDKPayee*)(val_ptr);
+       val_conv = Payee_clone((LDKPayee*)untag_ptr(val));
+       PaymentParameters_set_payee(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_PaymentParameters_get_expiry_time(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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = PaymentParameters_get_expiry_time(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_PaymentParameters_set_expiry_time(int64_t this_ptr, int64_t 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;
+       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));
+       PaymentParameters_set_expiry_time(&this_ptr_conv, val_conv);
+}
+
+int32_t  CS_LDK_PaymentParameters_get_max_total_cltv_expiry_delta(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;
+       int32_t ret_conv = PaymentParameters_get_max_total_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentParameters_set_max_total_cltv_expiry_delta(int64_t this_ptr, int32_t 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;
+       PaymentParameters_set_max_total_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int8_t  CS_LDK_PaymentParameters_get_max_path_count(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;
+       int8_t ret_conv = PaymentParameters_get_max_path_count(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentParameters_set_max_path_count(int64_t this_ptr, int8_t 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;
+       PaymentParameters_set_max_path_count(&this_ptr_conv, val);
+}
+
+int8_t  CS_LDK_PaymentParameters_get_max_channel_saturation_power_of_half(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;
+       int8_t ret_conv = PaymentParameters_get_max_channel_saturation_power_of_half(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentParameters_set_max_channel_saturation_power_of_half(int64_t this_ptr, int8_t 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;
+       PaymentParameters_set_max_channel_saturation_power_of_half(&this_ptr_conv, val);
+}
+
+int64_tArray  CS_LDK_PaymentParameters_get_previously_failed_channels(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_channels(&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_channels(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_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) {
+       void* payee_arg_ptr = untag_ptr(payee_arg);
+       CHECK_ACCESS(payee_arg_ptr);
+       LDKPayee payee_arg_conv = *(LDKPayee*)(payee_arg_ptr);
+       payee_arg_conv = Payee_clone((LDKPayee*)untag_ptr(payee_arg));
+       void* expiry_time_arg_ptr = untag_ptr(expiry_time_arg);
+       CHECK_ACCESS(expiry_time_arg_ptr);
+       LDKCOption_u64Z expiry_time_arg_conv = *(LDKCOption_u64Z*)(expiry_time_arg_ptr);
+       expiry_time_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(expiry_time_arg));
+       LDKCVec_u64Z previously_failed_channels_arg_constr;
+       previously_failed_channels_arg_constr.datalen = previously_failed_channels_arg->arr_len;
+       if (previously_failed_channels_arg_constr.datalen > 0)
+               previously_failed_channels_arg_constr.data = MALLOC(previously_failed_channels_arg_constr.datalen * sizeof(int64_t), "LDKCVec_u64Z Elements");
+       else
+               previously_failed_channels_arg_constr.data = NULL;
+       int64_t* previously_failed_channels_arg_vals = previously_failed_channels_arg->elems;
+       for (size_t g = 0; g < previously_failed_channels_arg_constr.datalen; g++) {
+               int64_t previously_failed_channels_arg_conv_6 = previously_failed_channels_arg_vals[g];
+               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);
+       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 PaymentParameters_clone_ptr(LDKPaymentParameters *NONNULL_PTR arg) {
+       LDKPaymentParameters ret_var = PaymentParameters_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_PaymentParameters_clone_ptr(int64_t arg) {
+       LDKPaymentParameters 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 = PaymentParameters_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PaymentParameters_clone(int64_t orig) {
+       LDKPaymentParameters 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;
+       LDKPaymentParameters ret_var = PaymentParameters_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_PaymentParameters_hash(int64_t o) {
+       LDKPaymentParameters 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 = PaymentParameters_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_PaymentParameters_eq(int64_t a, int64_t b) {
+       LDKPaymentParameters 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;
+       LDKPaymentParameters 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 = PaymentParameters_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_PaymentParameters_write(int64_t obj) {
+       LDKPaymentParameters 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 = PaymentParameters_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_PaymentParameters_read(int8_tArray ser, int32_t arg) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PaymentParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentParametersDecodeErrorZ), "LDKCResult_PaymentParametersDecodeErrorZ");
+       *ret_conv = PaymentParameters_read(ser_ref, arg);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PaymentParameters_from_node_id(int8_tArray payee_pubkey, int32_t final_cltv_expiry_delta) {
+       LDKPublicKey payee_pubkey_ref;
+       CHECK(payee_pubkey->arr_len == 33);
+       memcpy(payee_pubkey_ref.compressed_form, payee_pubkey->elems, 33); FREE(payee_pubkey);
+       LDKPaymentParameters ret_var = PaymentParameters_from_node_id(payee_pubkey_ref, final_cltv_expiry_delta);
+       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_PaymentParameters_for_keysend(int8_tArray payee_pubkey, int32_t final_cltv_expiry_delta, jboolean allow_mpp) {
+       LDKPublicKey payee_pubkey_ref;
+       CHECK(payee_pubkey->arr_len == 33);
+       memcpy(payee_pubkey_ref.compressed_form, payee_pubkey->elems, 33); FREE(payee_pubkey);
+       LDKPaymentParameters ret_var = PaymentParameters_for_keysend(payee_pubkey_ref, final_cltv_expiry_delta, allow_mpp);
+       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_PaymentParameters_from_bolt12_invoice(int64_t invoice) {
+       LDKBolt12Invoice 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;
+       LDKPaymentParameters ret_var = PaymentParameters_from_bolt12_invoice(&invoice_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_PaymentParameters_blinded(int64_tArray blinded_route_hints) {
+       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ blinded_route_hints_constr;
+       blinded_route_hints_constr.datalen = blinded_route_hints->arr_len;
+       if (blinded_route_hints_constr.datalen > 0)
+               blinded_route_hints_constr.data = MALLOC(blinded_route_hints_constr.datalen * sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ Elements");
+       else
+               blinded_route_hints_constr.data = NULL;
+       int64_t* blinded_route_hints_vals = blinded_route_hints->elems;
+       for (size_t l = 0; l < blinded_route_hints_constr.datalen; l++) {
+               int64_t blinded_route_hints_conv_37 = blinded_route_hints_vals[l];
+               void* blinded_route_hints_conv_37_ptr = untag_ptr(blinded_route_hints_conv_37);
+               CHECK_ACCESS(blinded_route_hints_conv_37_ptr);
+               LDKC2Tuple_BlindedPayInfoBlindedPathZ blinded_route_hints_conv_37_conv = *(LDKC2Tuple_BlindedPayInfoBlindedPathZ*)(blinded_route_hints_conv_37_ptr);
+               blinded_route_hints_conv_37_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone((LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(blinded_route_hints_conv_37));
+               blinded_route_hints_constr.data[l] = blinded_route_hints_conv_37_conv;
+       }
+       FREE(blinded_route_hints);
+       LDKPaymentParameters ret_var = PaymentParameters_blinded(blinded_route_hints_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);
+       return ret_ref;
+}
+
+void  CS_LDK_Payee_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);
+       LDKPayee this_ptr_conv = *(LDKPayee*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Payee_free(this_ptr_conv);
+}
+
+static inline uint64_t Payee_clone_ptr(LDKPayee *NONNULL_PTR arg) {
+       LDKPayee *ret_copy = MALLOC(sizeof(LDKPayee), "LDKPayee");
+       *ret_copy = Payee_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_Payee_clone_ptr(int64_t arg) {
+       LDKPayee* arg_conv = (LDKPayee*)untag_ptr(arg);
+       int64_t ret_conv = Payee_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Payee_clone(int64_t orig) {
+       LDKPayee* orig_conv = (LDKPayee*)untag_ptr(orig);
+       LDKPayee *ret_copy = MALLOC(sizeof(LDKPayee), "LDKPayee");
+       *ret_copy = Payee_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Payee_blinded(int64_tArray route_hints, int64_t features) {
+       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ route_hints_constr;
+       route_hints_constr.datalen = route_hints->arr_len;
+       if (route_hints_constr.datalen > 0)
+               route_hints_constr.data = MALLOC(route_hints_constr.datalen * sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ Elements");
+       else
+               route_hints_constr.data = NULL;
+       int64_t* route_hints_vals = route_hints->elems;
+       for (size_t l = 0; l < route_hints_constr.datalen; l++) {
+               int64_t route_hints_conv_37 = route_hints_vals[l];
+               void* route_hints_conv_37_ptr = untag_ptr(route_hints_conv_37);
+               CHECK_ACCESS(route_hints_conv_37_ptr);
+               LDKC2Tuple_BlindedPayInfoBlindedPathZ route_hints_conv_37_conv = *(LDKC2Tuple_BlindedPayInfoBlindedPathZ*)(route_hints_conv_37_ptr);
+               route_hints_conv_37_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone((LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(route_hints_conv_37));
+               route_hints_constr.data[l] = route_hints_conv_37_conv;
+       }
+       FREE(route_hints);
+       LDKBolt12InvoiceFeatures features_conv;
+       features_conv.inner = untag_ptr(features);
+       features_conv.is_owned = ptr_is_owned(features);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_conv);
+       features_conv = Bolt12InvoiceFeatures_clone(&features_conv);
+       LDKPayee *ret_copy = MALLOC(sizeof(LDKPayee), "LDKPayee");
+       *ret_copy = Payee_blinded(route_hints_constr, features_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Payee_clear(int8_tArray node_id, int64_tArray route_hints, int64_t features, int32_t final_cltv_expiry_delta) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKCVec_RouteHintZ route_hints_constr;
+       route_hints_constr.datalen = route_hints->arr_len;
+       if (route_hints_constr.datalen > 0)
+               route_hints_constr.data = MALLOC(route_hints_constr.datalen * sizeof(LDKRouteHint), "LDKCVec_RouteHintZ Elements");
+       else
+               route_hints_constr.data = NULL;
+       int64_t* route_hints_vals = route_hints->elems;
+       for (size_t l = 0; l < route_hints_constr.datalen; l++) {
+               int64_t route_hints_conv_11 = route_hints_vals[l];
+               LDKRouteHint route_hints_conv_11_conv;
+               route_hints_conv_11_conv.inner = untag_ptr(route_hints_conv_11);
+               route_hints_conv_11_conv.is_owned = ptr_is_owned(route_hints_conv_11);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(route_hints_conv_11_conv);
+               route_hints_conv_11_conv = RouteHint_clone(&route_hints_conv_11_conv);
+               route_hints_constr.data[l] = route_hints_conv_11_conv;
+       }
+       FREE(route_hints);
+       LDKBolt11InvoiceFeatures features_conv;
+       features_conv.inner = untag_ptr(features);
+       features_conv.is_owned = ptr_is_owned(features);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_conv);
+       features_conv = Bolt11InvoiceFeatures_clone(&features_conv);
+       LDKPayee *ret_copy = MALLOC(sizeof(LDKPayee), "LDKPayee");
+       *ret_copy = Payee_clear(node_id_ref, route_hints_constr, features_conv, final_cltv_expiry_delta);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Payee_hash(int64_t o) {
+       LDKPayee* o_conv = (LDKPayee*)untag_ptr(o);
+       int64_t ret_conv = Payee_hash(o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Payee_eq(int64_t a, int64_t b) {
+       LDKPayee* a_conv = (LDKPayee*)untag_ptr(a);
+       LDKPayee* b_conv = (LDKPayee*)untag_ptr(b);
+       jboolean ret_conv = Payee_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RouteHint_free(int64_t this_obj) {
+       LDKRouteHint 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);
+       RouteHint_free(this_obj_conv);
+}
+
+int64_tArray  CS_LDK_RouteHint_get_a(int64_t this_ptr) {
+       LDKRouteHint 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_RouteHintHopZ ret_var = RouteHint_get_a(&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 o = 0; o < ret_var.datalen; o++) {
+               LDKRouteHintHop ret_conv_14_var = ret_var.data[o];
+               int64_t ret_conv_14_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_14_var);
+               ret_conv_14_ref = tag_ptr(ret_conv_14_var.inner, ret_conv_14_var.is_owned);
+               ret_arr_ptr[o] = ret_conv_14_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_RouteHint_set_a(int64_t this_ptr, int64_tArray val) {
+       LDKRouteHint 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_RouteHintHopZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKRouteHintHop), "LDKCVec_RouteHintHopZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t o = 0; o < val_constr.datalen; o++) {
+               int64_t val_conv_14 = val_vals[o];
+               LDKRouteHintHop val_conv_14_conv;
+               val_conv_14_conv.inner = untag_ptr(val_conv_14);
+               val_conv_14_conv.is_owned = ptr_is_owned(val_conv_14);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_14_conv);
+               val_conv_14_conv = RouteHintHop_clone(&val_conv_14_conv);
+               val_constr.data[o] = val_conv_14_conv;
+       }
+       FREE(val);
+       RouteHint_set_a(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_RouteHint_new(int64_tArray a_arg) {
+       LDKCVec_RouteHintHopZ a_arg_constr;
+       a_arg_constr.datalen = a_arg->arr_len;
+       if (a_arg_constr.datalen > 0)
+               a_arg_constr.data = MALLOC(a_arg_constr.datalen * sizeof(LDKRouteHintHop), "LDKCVec_RouteHintHopZ Elements");
+       else
+               a_arg_constr.data = NULL;
+       int64_t* a_arg_vals = a_arg->elems;
+       for (size_t o = 0; o < a_arg_constr.datalen; o++) {
+               int64_t a_arg_conv_14 = a_arg_vals[o];
+               LDKRouteHintHop a_arg_conv_14_conv;
+               a_arg_conv_14_conv.inner = untag_ptr(a_arg_conv_14);
+               a_arg_conv_14_conv.is_owned = ptr_is_owned(a_arg_conv_14);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(a_arg_conv_14_conv);
+               a_arg_conv_14_conv = RouteHintHop_clone(&a_arg_conv_14_conv);
+               a_arg_constr.data[o] = a_arg_conv_14_conv;
+       }
+       FREE(a_arg);
+       LDKRouteHint ret_var = RouteHint_new(a_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);
+       return ret_ref;
+}
+
+static inline uint64_t RouteHint_clone_ptr(LDKRouteHint *NONNULL_PTR arg) {
+       LDKRouteHint ret_var = RouteHint_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_RouteHint_clone_ptr(int64_t arg) {
+       LDKRouteHint 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 = RouteHint_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RouteHint_clone(int64_t orig) {
+       LDKRouteHint 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;
+       LDKRouteHint ret_var = RouteHint_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_RouteHint_hash(int64_t o) {
+       LDKRouteHint 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 = RouteHint_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_RouteHint_eq(int64_t a, int64_t b) {
+       LDKRouteHint 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;
+       LDKRouteHint 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 = RouteHint_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_RouteHint_write(int64_t obj) {
+       LDKRouteHint 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 = RouteHint_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_RouteHint_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RouteHintDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintDecodeErrorZ), "LDKCResult_RouteHintDecodeErrorZ");
+       *ret_conv = RouteHint_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_RouteHintHop_free(int64_t this_obj) {
+       LDKRouteHintHop 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);
+       RouteHintHop_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_RouteHintHop_get_src_node_id(int64_t this_ptr) {
+       LDKRouteHintHop 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, RouteHintHop_get_src_node_id(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_RouteHintHop_set_src_node_id(int64_t this_ptr, int8_tArray val) {
+       LDKRouteHintHop 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);
+       RouteHintHop_set_src_node_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_RouteHintHop_get_short_channel_id(int64_t this_ptr) {
+       LDKRouteHintHop 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 = RouteHintHop_get_short_channel_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RouteHintHop_set_short_channel_id(int64_t this_ptr, int64_t val) {
+       LDKRouteHintHop 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;
+       RouteHintHop_set_short_channel_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_RouteHintHop_get_fees(int64_t this_ptr) {
+       LDKRouteHintHop 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;
+       LDKRoutingFees ret_var = RouteHintHop_get_fees(&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_RouteHintHop_set_fees(int64_t this_ptr, int64_t val) {
+       LDKRouteHintHop 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;
+       LDKRoutingFees 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 = RoutingFees_clone(&val_conv);
+       RouteHintHop_set_fees(&this_ptr_conv, val_conv);
+}
+
+int16_t  CS_LDK_RouteHintHop_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKRouteHintHop 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 = RouteHintHop_get_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RouteHintHop_set_cltv_expiry_delta(int64_t this_ptr, int16_t val) {
+       LDKRouteHintHop 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;
+       RouteHintHop_set_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_RouteHintHop_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKRouteHintHop 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 = RouteHintHop_get_htlc_minimum_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_RouteHintHop_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKRouteHintHop 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));
+       RouteHintHop_set_htlc_minimum_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_RouteHintHop_get_htlc_maximum_msat(int64_t this_ptr) {
+       LDKRouteHintHop 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 = RouteHintHop_get_htlc_maximum_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_RouteHintHop_set_htlc_maximum_msat(int64_t this_ptr, int64_t val) {
+       LDKRouteHintHop 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));
+       RouteHintHop_set_htlc_maximum_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_RouteHintHop_new(int8_tArray src_node_id_arg, int64_t short_channel_id_arg, int64_t fees_arg, int16_t cltv_expiry_delta_arg, int64_t htlc_minimum_msat_arg, int64_t htlc_maximum_msat_arg) {
+       LDKPublicKey src_node_id_arg_ref;
+       CHECK(src_node_id_arg->arr_len == 33);
+       memcpy(src_node_id_arg_ref.compressed_form, src_node_id_arg->elems, 33); FREE(src_node_id_arg);
+       LDKRoutingFees fees_arg_conv;
+       fees_arg_conv.inner = untag_ptr(fees_arg);
+       fees_arg_conv.is_owned = ptr_is_owned(fees_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(fees_arg_conv);
+       fees_arg_conv = RoutingFees_clone(&fees_arg_conv);
+       void* htlc_minimum_msat_arg_ptr = untag_ptr(htlc_minimum_msat_arg);
+       CHECK_ACCESS(htlc_minimum_msat_arg_ptr);
+       LDKCOption_u64Z htlc_minimum_msat_arg_conv = *(LDKCOption_u64Z*)(htlc_minimum_msat_arg_ptr);
+       htlc_minimum_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(htlc_minimum_msat_arg));
+       void* htlc_maximum_msat_arg_ptr = untag_ptr(htlc_maximum_msat_arg);
+       CHECK_ACCESS(htlc_maximum_msat_arg_ptr);
+       LDKCOption_u64Z htlc_maximum_msat_arg_conv = *(LDKCOption_u64Z*)(htlc_maximum_msat_arg_ptr);
+       htlc_maximum_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(htlc_maximum_msat_arg));
+       LDKRouteHintHop ret_var = RouteHintHop_new(src_node_id_arg_ref, short_channel_id_arg, fees_arg_conv, cltv_expiry_delta_arg, htlc_minimum_msat_arg_conv, htlc_maximum_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 RouteHintHop_clone_ptr(LDKRouteHintHop *NONNULL_PTR arg) {
+       LDKRouteHintHop ret_var = RouteHintHop_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_RouteHintHop_clone_ptr(int64_t arg) {
+       LDKRouteHintHop 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 = RouteHintHop_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RouteHintHop_clone(int64_t orig) {
+       LDKRouteHintHop 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;
+       LDKRouteHintHop ret_var = RouteHintHop_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_RouteHintHop_hash(int64_t o) {
+       LDKRouteHintHop 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 = RouteHintHop_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_RouteHintHop_eq(int64_t a, int64_t b) {
+       LDKRouteHintHop 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;
+       LDKRouteHintHop 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 = RouteHintHop_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_RouteHintHop_write(int64_t obj) {
+       LDKRouteHintHop 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 = RouteHintHop_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_RouteHintHop_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RouteHintHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteHintHopDecodeErrorZ), "LDKCResult_RouteHintHopDecodeErrorZ");
+       *ret_conv = RouteHintHop_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+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);
+       memcpy(our_node_pubkey_ref.compressed_form, our_node_pubkey->elems, 33); FREE(our_node_pubkey);
+       LDKRouteParameters route_params_conv;
+       route_params_conv.inner = untag_ptr(route_params);
+       route_params_conv.is_owned = ptr_is_owned(route_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_conv);
+       route_params_conv.is_owned = false;
+       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;
+       LDKCVec_ChannelDetailsZ first_hops_constr;
+       LDKCVec_ChannelDetailsZ *first_hops_ptr = NULL;
+       if (first_hops != NULL) {
+               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.is_owned = false;
+                       first_hops_constr.data[q] = first_hops_conv_16_conv;
+               }
+               FREE(first_hops);
+               first_hops_ptr = &first_hops_constr;
+       }
+       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);
+       }
+       void* scorer_ptr = untag_ptr(scorer);
+       if (ptr_is_owned(scorer)) { CHECK_ACCESS(scorer_ptr); }
+       LDKScoreLookUp* scorer_conv = (LDKScoreLookUp*)scorer_ptr;
+       LDKProbabilisticScoringFeeParameters score_params_conv;
+       score_params_conv.inner = untag_ptr(score_params);
+       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;
+       uint8_t random_seed_bytes_arr[32];
+       CHECK(random_seed_bytes->arr_len == 32);
+       memcpy(random_seed_bytes_arr, random_seed_bytes->elems, 32); FREE(random_seed_bytes);
+       uint8_t (*random_seed_bytes_ref)[32] = &random_seed_bytes_arr;
+       LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
+       *ret_conv = find_route(our_node_pubkey_ref, &route_params_conv, &network_graph_conv, first_hops_ptr, logger_conv, scorer_conv, &score_params_conv, random_seed_bytes_ref);
+       if (first_hops_ptr != NULL) { FREE(first_hops_constr.data); }
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_build_route_from_hops(int8_tArray our_node_pubkey, ptrArray hops, int64_t route_params, int64_t network_graph, int64_t logger, int8_tArray random_seed_bytes) {
+       LDKPublicKey our_node_pubkey_ref;
+       CHECK(our_node_pubkey->arr_len == 33);
+       memcpy(our_node_pubkey_ref.compressed_form, our_node_pubkey->elems, 33); FREE(our_node_pubkey);
+       LDKCVec_PublicKeyZ hops_constr;
+       hops_constr.datalen = hops->arr_len;
+       if (hops_constr.datalen > 0)
+               hops_constr.data = MALLOC(hops_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
+       else
+               hops_constr.data = NULL;
+       int8_tArray* hops_vals = (void*) hops->elems;
+       for (size_t i = 0; i < hops_constr.datalen; i++) {
+               int8_tArray hops_conv_8 = hops_vals[i];
+               LDKPublicKey hops_conv_8_ref;
+               CHECK(hops_conv_8->arr_len == 33);
+               memcpy(hops_conv_8_ref.compressed_form, hops_conv_8->elems, 33); FREE(hops_conv_8);
+               hops_constr.data[i] = hops_conv_8_ref;
+       }
+       FREE(hops);
+       LDKRouteParameters route_params_conv;
+       route_params_conv.inner = untag_ptr(route_params);
+       route_params_conv.is_owned = ptr_is_owned(route_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(route_params_conv);
+       route_params_conv.is_owned = false;
+       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* 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);
+       }
+       uint8_t random_seed_bytes_arr[32];
+       CHECK(random_seed_bytes->arr_len == 32);
+       memcpy(random_seed_bytes_arr, random_seed_bytes->elems, 32); FREE(random_seed_bytes);
+       uint8_t (*random_seed_bytes_ref)[32] = &random_seed_bytes_arr;
+       LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
+       *ret_conv = build_route_from_hops(our_node_pubkey_ref, hops_constr, &route_params_conv, &network_graph_conv, logger_conv, random_seed_bytes_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ScoreLookUp_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);
+       LDKScoreLookUp this_ptr_conv = *(LDKScoreLookUp*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       ScoreLookUp_free(this_ptr_conv);
+}
+
+void  CS_LDK_ScoreUpdate_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);
+       LDKScoreUpdate this_ptr_conv = *(LDKScoreUpdate*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       ScoreUpdate_free(this_ptr_conv);
+}
+
+void  CS_LDK_Score_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);
+       LDKScore this_ptr_conv = *(LDKScore*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Score_free(this_ptr_conv);
+}
+
+void  CS_LDK_LockableScore_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);
+       LDKLockableScore this_ptr_conv = *(LDKLockableScore*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       LockableScore_free(this_ptr_conv);
+}
+
+void  CS_LDK_WriteableScore_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);
+       LDKWriteableScore this_ptr_conv = *(LDKWriteableScore*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       WriteableScore_free(this_ptr_conv);
+}
+
+void  CS_LDK_MultiThreadedLockableScore_free(int64_t this_obj) {
+       LDKMultiThreadedLockableScore 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);
+       MultiThreadedLockableScore_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_MultiThreadedLockableScore_as_LockableScore(int64_t this_arg) {
+       LDKMultiThreadedLockableScore 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;
+       LDKLockableScore* ret_ret = MALLOC(sizeof(LDKLockableScore), "LDKLockableScore");
+       *ret_ret = MultiThreadedLockableScore_as_LockableScore(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int8_tArray  CS_LDK_MultiThreadedLockableScore_write(int64_t obj) {
+       LDKMultiThreadedLockableScore 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 = MultiThreadedLockableScore_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_MultiThreadedLockableScore_as_WriteableScore(int64_t this_arg) {
+       LDKMultiThreadedLockableScore 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;
+       LDKWriteableScore* ret_ret = MALLOC(sizeof(LDKWriteableScore), "LDKWriteableScore");
+       *ret_ret = MultiThreadedLockableScore_as_WriteableScore(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_MultiThreadedLockableScore_new(int64_t score) {
+       void* score_ptr = untag_ptr(score);
+       CHECK_ACCESS(score_ptr);
+       LDKScore score_conv = *(LDKScore*)(score_ptr);
+       if (score_conv.free == LDKScore_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKScore_JCalls_cloned(&score_conv);
+       }
+       LDKMultiThreadedLockableScore ret_var = MultiThreadedLockableScore_new(score_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_MultiThreadedScoreLockRead_free(int64_t this_obj) {
+       LDKMultiThreadedScoreLockRead 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);
+       MultiThreadedScoreLockRead_free(this_obj_conv);
+}
+
+void  CS_LDK_MultiThreadedScoreLockWrite_free(int64_t this_obj) {
+       LDKMultiThreadedScoreLockWrite 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);
+       MultiThreadedScoreLockWrite_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_MultiThreadedScoreLockRead_as_ScoreLookUp(int64_t this_arg) {
+       LDKMultiThreadedScoreLockRead 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;
+       LDKScoreLookUp* ret_ret = MALLOC(sizeof(LDKScoreLookUp), "LDKScoreLookUp");
+       *ret_ret = MultiThreadedScoreLockRead_as_ScoreLookUp(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int8_tArray  CS_LDK_MultiThreadedScoreLockWrite_write(int64_t obj) {
+       LDKMultiThreadedScoreLockWrite 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 = MultiThreadedScoreLockWrite_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_MultiThreadedScoreLockWrite_as_ScoreUpdate(int64_t this_arg) {
+       LDKMultiThreadedScoreLockWrite 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;
+       LDKScoreUpdate* ret_ret = MALLOC(sizeof(LDKScoreUpdate), "LDKScoreUpdate");
+       *ret_ret = MultiThreadedScoreLockWrite_as_ScoreUpdate(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_ChannelUsage_free(int64_t this_obj) {
+       LDKChannelUsage 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);
+       ChannelUsage_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChannelUsage_get_amount_msat(int64_t this_ptr) {
+       LDKChannelUsage 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 = ChannelUsage_get_amount_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelUsage_set_amount_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelUsage 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;
+       ChannelUsage_set_amount_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelUsage_get_inflight_htlc_msat(int64_t this_ptr) {
+       LDKChannelUsage 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 = ChannelUsage_get_inflight_htlc_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelUsage_set_inflight_htlc_msat(int64_t this_ptr, int64_t val) {
+       LDKChannelUsage 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;
+       ChannelUsage_set_inflight_htlc_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ChannelUsage_get_effective_capacity(int64_t this_ptr) {
+       LDKChannelUsage 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;
+       LDKEffectiveCapacity *ret_copy = MALLOC(sizeof(LDKEffectiveCapacity), "LDKEffectiveCapacity");
+       *ret_copy = ChannelUsage_get_effective_capacity(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_ChannelUsage_set_effective_capacity(int64_t this_ptr, int64_t val) {
+       LDKChannelUsage 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);
+       LDKEffectiveCapacity val_conv = *(LDKEffectiveCapacity*)(val_ptr);
+       val_conv = EffectiveCapacity_clone((LDKEffectiveCapacity*)untag_ptr(val));
+       ChannelUsage_set_effective_capacity(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelUsage_new(int64_t amount_msat_arg, int64_t inflight_htlc_msat_arg, int64_t effective_capacity_arg) {
+       void* effective_capacity_arg_ptr = untag_ptr(effective_capacity_arg);
+       CHECK_ACCESS(effective_capacity_arg_ptr);
+       LDKEffectiveCapacity effective_capacity_arg_conv = *(LDKEffectiveCapacity*)(effective_capacity_arg_ptr);
+       effective_capacity_arg_conv = EffectiveCapacity_clone((LDKEffectiveCapacity*)untag_ptr(effective_capacity_arg));
+       LDKChannelUsage ret_var = ChannelUsage_new(amount_msat_arg, inflight_htlc_msat_arg, effective_capacity_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 ChannelUsage_clone_ptr(LDKChannelUsage *NONNULL_PTR arg) {
+       LDKChannelUsage ret_var = ChannelUsage_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_ChannelUsage_clone_ptr(int64_t arg) {
+       LDKChannelUsage 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 = ChannelUsage_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelUsage_clone(int64_t orig) {
+       LDKChannelUsage 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;
+       LDKChannelUsage ret_var = ChannelUsage_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_FixedPenaltyScorer_free(int64_t this_obj) {
+       LDKFixedPenaltyScorer 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);
+       FixedPenaltyScorer_free(this_obj_conv);
+}
+
+static inline uint64_t FixedPenaltyScorer_clone_ptr(LDKFixedPenaltyScorer *NONNULL_PTR arg) {
+       LDKFixedPenaltyScorer ret_var = FixedPenaltyScorer_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_FixedPenaltyScorer_clone_ptr(int64_t arg) {
+       LDKFixedPenaltyScorer 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 = FixedPenaltyScorer_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_FixedPenaltyScorer_clone(int64_t orig) {
+       LDKFixedPenaltyScorer 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;
+       LDKFixedPenaltyScorer ret_var = FixedPenaltyScorer_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_FixedPenaltyScorer_with_penalty(int64_t penalty_msat) {
+       LDKFixedPenaltyScorer ret_var = FixedPenaltyScorer_with_penalty(penalty_msat);
+       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_FixedPenaltyScorer_as_ScoreLookUp(int64_t this_arg) {
+       LDKFixedPenaltyScorer 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;
+       LDKScoreLookUp* ret_ret = MALLOC(sizeof(LDKScoreLookUp), "LDKScoreLookUp");
+       *ret_ret = FixedPenaltyScorer_as_ScoreLookUp(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_FixedPenaltyScorer_as_ScoreUpdate(int64_t this_arg) {
+       LDKFixedPenaltyScorer 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;
+       LDKScoreUpdate* ret_ret = MALLOC(sizeof(LDKScoreUpdate), "LDKScoreUpdate");
+       *ret_ret = FixedPenaltyScorer_as_ScoreUpdate(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int8_tArray  CS_LDK_FixedPenaltyScorer_write(int64_t obj) {
+       LDKFixedPenaltyScorer 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 = FixedPenaltyScorer_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_FixedPenaltyScorer_read(int8_tArray ser, int64_t arg) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_FixedPenaltyScorerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FixedPenaltyScorerDecodeErrorZ), "LDKCResult_FixedPenaltyScorerDecodeErrorZ");
+       *ret_conv = FixedPenaltyScorer_read(ser_ref, arg);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ProbabilisticScorer_free(int64_t this_obj) {
+       LDKProbabilisticScorer 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);
+       ProbabilisticScorer_free(this_obj_conv);
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_free(int64_t this_obj) {
+       LDKProbabilisticScoringFeeParameters 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);
+       ProbabilisticScoringFeeParameters_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_get_base_penalty_msat(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_get_base_penalty_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_base_penalty_msat(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_base_penalty_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_get_base_penalty_amount_multiplier_msat(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_get_base_penalty_amount_multiplier_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_base_penalty_amount_multiplier_msat(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_base_penalty_amount_multiplier_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_get_liquidity_penalty_multiplier_msat(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_get_liquidity_penalty_multiplier_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_liquidity_penalty_multiplier_msat(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_liquidity_penalty_multiplier_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_get_liquidity_penalty_amount_multiplier_msat(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_get_liquidity_penalty_amount_multiplier_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_liquidity_penalty_amount_multiplier_msat(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_liquidity_penalty_amount_multiplier_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_get_historical_liquidity_penalty_multiplier_msat(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_get_historical_liquidity_penalty_multiplier_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_historical_liquidity_penalty_multiplier_msat(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_historical_liquidity_penalty_multiplier_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_get_historical_liquidity_penalty_amount_multiplier_msat(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_get_historical_liquidity_penalty_amount_multiplier_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_historical_liquidity_penalty_amount_multiplier_msat(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_historical_liquidity_penalty_amount_multiplier_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_get_anti_probing_penalty_msat(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_get_anti_probing_penalty_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_anti_probing_penalty_msat(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_anti_probing_penalty_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_get_considered_impossible_penalty_msat(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_get_considered_impossible_penalty_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_considered_impossible_penalty_msat(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_considered_impossible_penalty_msat(&this_ptr_conv, val);
+}
+
+jboolean  CS_LDK_ProbabilisticScoringFeeParameters_get_linear_success_probability(int64_t this_ptr) {
+       LDKProbabilisticScoringFeeParameters 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;
+       jboolean ret_conv = ProbabilisticScoringFeeParameters_get_linear_success_probability(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_linear_success_probability(int64_t this_ptr, jboolean val) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_set_linear_success_probability(&this_ptr_conv, val);
+}
+
+static inline uint64_t ProbabilisticScoringFeeParameters_clone_ptr(LDKProbabilisticScoringFeeParameters *NONNULL_PTR arg) {
+       LDKProbabilisticScoringFeeParameters ret_var = ProbabilisticScoringFeeParameters_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_ProbabilisticScoringFeeParameters_clone_ptr(int64_t arg) {
+       LDKProbabilisticScoringFeeParameters 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 = ProbabilisticScoringFeeParameters_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ProbabilisticScoringFeeParameters_clone(int64_t orig) {
+       LDKProbabilisticScoringFeeParameters 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;
+       LDKProbabilisticScoringFeeParameters ret_var = ProbabilisticScoringFeeParameters_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_ProbabilisticScoringFeeParameters_default() {
+       LDKProbabilisticScoringFeeParameters ret_var = ProbabilisticScoringFeeParameters_default();
+       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_ProbabilisticScoringFeeParameters_add_banned(int64_t this_arg, int64_t node_id) {
+       LDKProbabilisticScoringFeeParameters 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;
+       LDKNodeId node_id_conv;
+       node_id_conv.inner = untag_ptr(node_id);
+       node_id_conv.is_owned = ptr_is_owned(node_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_id_conv);
+       node_id_conv.is_owned = false;
+       ProbabilisticScoringFeeParameters_add_banned(&this_arg_conv, &node_id_conv);
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_add_banned_from_list(int64_t this_arg, int64_tArray node_ids) {
+       LDKProbabilisticScoringFeeParameters 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;
+       LDKCVec_NodeIdZ node_ids_constr;
+       node_ids_constr.datalen = node_ids->arr_len;
+       if (node_ids_constr.datalen > 0)
+               node_ids_constr.data = MALLOC(node_ids_constr.datalen * sizeof(LDKNodeId), "LDKCVec_NodeIdZ Elements");
+       else
+               node_ids_constr.data = NULL;
+       int64_t* node_ids_vals = node_ids->elems;
+       for (size_t i = 0; i < node_ids_constr.datalen; i++) {
+               int64_t node_ids_conv_8 = node_ids_vals[i];
+               LDKNodeId node_ids_conv_8_conv;
+               node_ids_conv_8_conv.inner = untag_ptr(node_ids_conv_8);
+               node_ids_conv_8_conv.is_owned = ptr_is_owned(node_ids_conv_8);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(node_ids_conv_8_conv);
+               node_ids_conv_8_conv = NodeId_clone(&node_ids_conv_8_conv);
+               node_ids_constr.data[i] = node_ids_conv_8_conv;
+       }
+       FREE(node_ids);
+       ProbabilisticScoringFeeParameters_add_banned_from_list(&this_arg_conv, node_ids_constr);
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_remove_banned(int64_t this_arg, int64_t node_id) {
+       LDKProbabilisticScoringFeeParameters 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;
+       LDKNodeId node_id_conv;
+       node_id_conv.inner = untag_ptr(node_id);
+       node_id_conv.is_owned = ptr_is_owned(node_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_id_conv);
+       node_id_conv.is_owned = false;
+       ProbabilisticScoringFeeParameters_remove_banned(&this_arg_conv, &node_id_conv);
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_set_manual_penalty(int64_t this_arg, int64_t node_id, int64_t penalty) {
+       LDKProbabilisticScoringFeeParameters 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;
+       LDKNodeId node_id_conv;
+       node_id_conv.inner = untag_ptr(node_id);
+       node_id_conv.is_owned = ptr_is_owned(node_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_id_conv);
+       node_id_conv.is_owned = false;
+       ProbabilisticScoringFeeParameters_set_manual_penalty(&this_arg_conv, &node_id_conv, penalty);
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_remove_manual_penalty(int64_t this_arg, int64_t node_id) {
+       LDKProbabilisticScoringFeeParameters 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;
+       LDKNodeId node_id_conv;
+       node_id_conv.inner = untag_ptr(node_id);
+       node_id_conv.is_owned = ptr_is_owned(node_id);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(node_id_conv);
+       node_id_conv.is_owned = false;
+       ProbabilisticScoringFeeParameters_remove_manual_penalty(&this_arg_conv, &node_id_conv);
+}
+
+void  CS_LDK_ProbabilisticScoringFeeParameters_clear_manual_penalties(int64_t this_arg) {
+       LDKProbabilisticScoringFeeParameters 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;
+       ProbabilisticScoringFeeParameters_clear_manual_penalties(&this_arg_conv);
+}
+
+void  CS_LDK_ProbabilisticScoringDecayParameters_free(int64_t this_obj) {
+       LDKProbabilisticScoringDecayParameters 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);
+       ProbabilisticScoringDecayParameters_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringDecayParameters_get_historical_no_updates_half_life(int64_t this_ptr) {
+       LDKProbabilisticScoringDecayParameters 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 = ProbabilisticScoringDecayParameters_get_historical_no_updates_half_life(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringDecayParameters_set_historical_no_updates_half_life(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringDecayParameters 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;
+       ProbabilisticScoringDecayParameters_set_historical_no_updates_half_life(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringDecayParameters_get_liquidity_offset_half_life(int64_t this_ptr) {
+       LDKProbabilisticScoringDecayParameters 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 = ProbabilisticScoringDecayParameters_get_liquidity_offset_half_life(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ProbabilisticScoringDecayParameters_set_liquidity_offset_half_life(int64_t this_ptr, int64_t val) {
+       LDKProbabilisticScoringDecayParameters 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;
+       ProbabilisticScoringDecayParameters_set_liquidity_offset_half_life(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ProbabilisticScoringDecayParameters_new(int64_t historical_no_updates_half_life_arg, int64_t liquidity_offset_half_life_arg) {
+       LDKProbabilisticScoringDecayParameters ret_var = ProbabilisticScoringDecayParameters_new(historical_no_updates_half_life_arg, liquidity_offset_half_life_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 ProbabilisticScoringDecayParameters_clone_ptr(LDKProbabilisticScoringDecayParameters *NONNULL_PTR arg) {
+       LDKProbabilisticScoringDecayParameters ret_var = ProbabilisticScoringDecayParameters_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_ProbabilisticScoringDecayParameters_clone_ptr(int64_t arg) {
+       LDKProbabilisticScoringDecayParameters 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 = ProbabilisticScoringDecayParameters_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ProbabilisticScoringDecayParameters_clone(int64_t orig) {
+       LDKProbabilisticScoringDecayParameters 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;
+       LDKProbabilisticScoringDecayParameters ret_var = ProbabilisticScoringDecayParameters_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_ProbabilisticScoringDecayParameters_default() {
+       LDKProbabilisticScoringDecayParameters ret_var = ProbabilisticScoringDecayParameters_default();
+       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_ProbabilisticScorer_new(int64_t decay_params, int64_t network_graph, int64_t logger) {
+       LDKProbabilisticScoringDecayParameters decay_params_conv;
+       decay_params_conv.inner = untag_ptr(decay_params);
+       decay_params_conv.is_owned = ptr_is_owned(decay_params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(decay_params_conv);
+       decay_params_conv = ProbabilisticScoringDecayParameters_clone(&decay_params_conv);
+       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* 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);
+       }
+       LDKProbabilisticScorer ret_var = ProbabilisticScorer_new(decay_params_conv, &network_graph_conv, logger_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_ProbabilisticScorer_debug_log_liquidity_stats(int64_t this_arg) {
+       LDKProbabilisticScorer 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;
+       ProbabilisticScorer_debug_log_liquidity_stats(&this_arg_conv);
+}
+
+int64_t  CS_LDK_ProbabilisticScorer_estimated_channel_liquidity_range(int64_t this_arg, int64_t scid, int64_t target) {
+       LDKProbabilisticScorer 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;
+       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;
+       LDKCOption_C2Tuple_u64u64ZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_u64u64ZZ), "LDKCOption_C2Tuple_u64u64ZZ");
+       *ret_copy = ProbabilisticScorer_estimated_channel_liquidity_range(&this_arg_conv, scid, &target_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ProbabilisticScorer_historical_estimated_channel_liquidity_probabilities(int64_t this_arg, int64_t scid, int64_t target) {
+       LDKProbabilisticScorer 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;
+       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;
+       LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ *ret_copy = MALLOC(sizeof(LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ), "LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ");
+       *ret_copy = ProbabilisticScorer_historical_estimated_channel_liquidity_probabilities(&this_arg_conv, scid, &target_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ProbabilisticScorer_historical_estimated_payment_success_probability(int64_t this_arg, int64_t scid, int64_t target, int64_t amount_msat, int64_t params) {
+       LDKProbabilisticScorer 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;
+       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;
+       LDKProbabilisticScoringFeeParameters params_conv;
+       params_conv.inner = untag_ptr(params);
+       params_conv.is_owned = ptr_is_owned(params);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(params_conv);
+       params_conv.is_owned = false;
+       LDKCOption_f64Z *ret_copy = MALLOC(sizeof(LDKCOption_f64Z), "LDKCOption_f64Z");
+       *ret_copy = ProbabilisticScorer_historical_estimated_payment_success_probability(&this_arg_conv, scid, &target_conv, amount_msat, &params_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ProbabilisticScorer_as_ScoreLookUp(int64_t this_arg) {
+       LDKProbabilisticScorer 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;
+       LDKScoreLookUp* ret_ret = MALLOC(sizeof(LDKScoreLookUp), "LDKScoreLookUp");
+       *ret_ret = ProbabilisticScorer_as_ScoreLookUp(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ProbabilisticScorer_as_ScoreUpdate(int64_t this_arg) {
+       LDKProbabilisticScorer 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;
+       LDKScoreUpdate* ret_ret = MALLOC(sizeof(LDKScoreUpdate), "LDKScoreUpdate");
+       *ret_ret = ProbabilisticScorer_as_ScoreUpdate(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_ProbabilisticScorer_as_Score(int64_t this_arg) {
+       LDKProbabilisticScorer 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;
+       LDKScore* ret_ret = MALLOC(sizeof(LDKScore), "LDKScore");
+       *ret_ret = ProbabilisticScorer_as_Score(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int8_tArray  CS_LDK_ProbabilisticScorer_write(int64_t obj) {
+       LDKProbabilisticScorer 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 = ProbabilisticScorer_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_ProbabilisticScorer_read(int8_tArray ser, int64_t arg_a, int64_t arg_b, int64_t arg_c) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKProbabilisticScoringDecayParameters arg_a_conv;
+       arg_a_conv.inner = untag_ptr(arg_a);
+       arg_a_conv.is_owned = ptr_is_owned(arg_a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_a_conv);
+       arg_a_conv = ProbabilisticScoringDecayParameters_clone(&arg_a_conv);
+       LDKNetworkGraph arg_b_conv;
+       arg_b_conv.inner = untag_ptr(arg_b);
+       arg_b_conv.is_owned = ptr_is_owned(arg_b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_b_conv);
+       arg_b_conv.is_owned = false;
+       void* arg_c_ptr = untag_ptr(arg_c);
+       CHECK_ACCESS(arg_c_ptr);
+       LDKLogger arg_c_conv = *(LDKLogger*)(arg_c_ptr);
+       if (arg_c_conv.free == LDKLogger_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKLogger_JCalls_cloned(&arg_c_conv);
+       }
+       LDKCResult_ProbabilisticScorerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ProbabilisticScorerDecodeErrorZ), "LDKCResult_ProbabilisticScorerDecodeErrorZ");
+       *ret_conv = ProbabilisticScorer_read(ser_ref, arg_a_conv, &arg_b_conv, arg_c_conv);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_DelayedPaymentOutputDescriptor_free(int64_t this_obj) {
+       LDKDelayedPaymentOutputDescriptor 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);
+       DelayedPaymentOutputDescriptor_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_DelayedPaymentOutputDescriptor_get_outpoint(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;
+       LDKOutPoint ret_var = DelayedPaymentOutputDescriptor_get_outpoint(&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_outpoint(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;
+       LDKOutPoint 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 = OutPoint_clone(&val_conv);
+       DelayedPaymentOutputDescriptor_set_outpoint(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_DelayedPaymentOutputDescriptor_get_per_commitment_point(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_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_DelayedPaymentOutputDescriptor_set_per_commitment_point(int64_t this_ptr, int8_tArray 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_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int16_t  CS_LDK_DelayedPaymentOutputDescriptor_get_to_self_delay(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;
+       int16_t ret_conv = DelayedPaymentOutputDescriptor_get_to_self_delay(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_DelayedPaymentOutputDescriptor_set_to_self_delay(int64_t this_ptr, int16_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;
+       DelayedPaymentOutputDescriptor_set_to_self_delay(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_DelayedPaymentOutputDescriptor_get_output(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;
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = DelayedPaymentOutputDescriptor_get_output(&this_ptr_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+void  CS_LDK_DelayedPaymentOutputDescriptor_set_output(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;
+       void* val_ptr = untag_ptr(val);
+       CHECK_ACCESS(val_ptr);
+       LDKTxOut val_conv = *(LDKTxOut*)(val_ptr);
+       val_conv = TxOut_clone((LDKTxOut*)untag_ptr(val));
+       DelayedPaymentOutputDescriptor_set_output(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  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;
+}
+
+void  CS_LDK_DelayedPaymentOutputDescriptor_set_revocation_pubkey(int64_t this_ptr, int8_tArray 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);
+}
+
+int8_tArray  CS_LDK_DelayedPaymentOutputDescriptor_get_channel_keys_id(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(32, __LINE__);
+       memcpy(ret_arr->elems, *DelayedPaymentOutputDescriptor_get_channel_keys_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_DelayedPaymentOutputDescriptor_set_channel_keys_id(int64_t this_ptr, int8_tArray 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;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       DelayedPaymentOutputDescriptor_set_channel_keys_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_DelayedPaymentOutputDescriptor_get_channel_value_satoshis(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;
+       int64_t ret_conv = DelayedPaymentOutputDescriptor_get_channel_value_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_DelayedPaymentOutputDescriptor_set_channel_value_satoshis(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;
+       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) {
+       LDKOutPoint outpoint_arg_conv;
+       outpoint_arg_conv.inner = untag_ptr(outpoint_arg);
+       outpoint_arg_conv.is_owned = ptr_is_owned(outpoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_arg_conv);
+       outpoint_arg_conv = OutPoint_clone(&outpoint_arg_conv);
+       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);
+       void* output_arg_ptr = untag_ptr(output_arg);
+       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);
+       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);
+       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 DelayedPaymentOutputDescriptor_clone_ptr(LDKDelayedPaymentOutputDescriptor *NONNULL_PTR arg) {
+       LDKDelayedPaymentOutputDescriptor ret_var = DelayedPaymentOutputDescriptor_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_DelayedPaymentOutputDescriptor_clone_ptr(int64_t arg) {
+       LDKDelayedPaymentOutputDescriptor 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 = DelayedPaymentOutputDescriptor_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_DelayedPaymentOutputDescriptor_clone(int64_t orig) {
+       LDKDelayedPaymentOutputDescriptor 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;
+       LDKDelayedPaymentOutputDescriptor ret_var = DelayedPaymentOutputDescriptor_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_DelayedPaymentOutputDescriptor_hash(int64_t o) {
+       LDKDelayedPaymentOutputDescriptor 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 = DelayedPaymentOutputDescriptor_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_DelayedPaymentOutputDescriptor_eq(int64_t a, int64_t b) {
+       LDKDelayedPaymentOutputDescriptor 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;
+       LDKDelayedPaymentOutputDescriptor 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 = DelayedPaymentOutputDescriptor_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_DelayedPaymentOutputDescriptor_write(int64_t obj) {
+       LDKDelayedPaymentOutputDescriptor 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 = DelayedPaymentOutputDescriptor_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_DelayedPaymentOutputDescriptor_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = DelayedPaymentOutputDescriptor_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_StaticPaymentOutputDescriptor_free(int64_t this_obj) {
+       LDKStaticPaymentOutputDescriptor 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);
+       StaticPaymentOutputDescriptor_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_StaticPaymentOutputDescriptor_get_outpoint(int64_t this_ptr) {
+       LDKStaticPaymentOutputDescriptor 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;
+       LDKOutPoint ret_var = StaticPaymentOutputDescriptor_get_outpoint(&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_StaticPaymentOutputDescriptor_set_outpoint(int64_t this_ptr, int64_t val) {
+       LDKStaticPaymentOutputDescriptor 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;
+       LDKOutPoint 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 = OutPoint_clone(&val_conv);
+       StaticPaymentOutputDescriptor_set_outpoint(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_StaticPaymentOutputDescriptor_get_output(int64_t this_ptr) {
+       LDKStaticPaymentOutputDescriptor 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;
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = StaticPaymentOutputDescriptor_get_output(&this_ptr_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+void  CS_LDK_StaticPaymentOutputDescriptor_set_output(int64_t this_ptr, int64_t val) {
+       LDKStaticPaymentOutputDescriptor 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);
+       LDKTxOut val_conv = *(LDKTxOut*)(val_ptr);
+       val_conv = TxOut_clone((LDKTxOut*)untag_ptr(val));
+       StaticPaymentOutputDescriptor_set_output(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_StaticPaymentOutputDescriptor_get_channel_keys_id(int64_t this_ptr) {
+       LDKStaticPaymentOutputDescriptor 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, *StaticPaymentOutputDescriptor_get_channel_keys_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_StaticPaymentOutputDescriptor_set_channel_keys_id(int64_t this_ptr, int8_tArray val) {
+       LDKStaticPaymentOutputDescriptor 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);
+       StaticPaymentOutputDescriptor_set_channel_keys_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_StaticPaymentOutputDescriptor_get_channel_value_satoshis(int64_t this_ptr) {
+       LDKStaticPaymentOutputDescriptor 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 = StaticPaymentOutputDescriptor_get_channel_value_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_StaticPaymentOutputDescriptor_set_channel_value_satoshis(int64_t this_ptr, int64_t val) {
+       LDKStaticPaymentOutputDescriptor 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;
+       StaticPaymentOutputDescriptor_set_channel_value_satoshis(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_StaticPaymentOutputDescriptor_get_channel_transaction_parameters(int64_t this_ptr) {
+       LDKStaticPaymentOutputDescriptor 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;
+       LDKChannelTransactionParameters ret_var = StaticPaymentOutputDescriptor_get_channel_transaction_parameters(&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_StaticPaymentOutputDescriptor_set_channel_transaction_parameters(int64_t this_ptr, int64_t val) {
+       LDKStaticPaymentOutputDescriptor 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;
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_clone(&val_conv);
+       StaticPaymentOutputDescriptor_set_channel_transaction_parameters(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_StaticPaymentOutputDescriptor_new(int64_t outpoint_arg, int64_t output_arg, int8_tArray channel_keys_id_arg, int64_t channel_value_satoshis_arg, int64_t channel_transaction_parameters_arg) {
+       LDKOutPoint outpoint_arg_conv;
+       outpoint_arg_conv.inner = untag_ptr(outpoint_arg);
+       outpoint_arg_conv.is_owned = ptr_is_owned(outpoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_arg_conv);
+       outpoint_arg_conv = OutPoint_clone(&outpoint_arg_conv);
+       void* output_arg_ptr = untag_ptr(output_arg);
+       CHECK_ACCESS(output_arg_ptr);
+       LDKTxOut output_arg_conv = *(LDKTxOut*)(output_arg_ptr);
+       output_arg_conv = TxOut_clone((LDKTxOut*)untag_ptr(output_arg));
+       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);
+       LDKChannelTransactionParameters channel_transaction_parameters_arg_conv;
+       channel_transaction_parameters_arg_conv.inner = untag_ptr(channel_transaction_parameters_arg);
+       channel_transaction_parameters_arg_conv.is_owned = ptr_is_owned(channel_transaction_parameters_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_transaction_parameters_arg_conv);
+       channel_transaction_parameters_arg_conv = ChannelTransactionParameters_clone(&channel_transaction_parameters_arg_conv);
+       LDKStaticPaymentOutputDescriptor ret_var = StaticPaymentOutputDescriptor_new(outpoint_arg_conv, output_arg_conv, channel_keys_id_arg_ref, channel_value_satoshis_arg, channel_transaction_parameters_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 StaticPaymentOutputDescriptor_clone_ptr(LDKStaticPaymentOutputDescriptor *NONNULL_PTR arg) {
+       LDKStaticPaymentOutputDescriptor ret_var = StaticPaymentOutputDescriptor_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_StaticPaymentOutputDescriptor_clone_ptr(int64_t arg) {
+       LDKStaticPaymentOutputDescriptor 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 = StaticPaymentOutputDescriptor_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_StaticPaymentOutputDescriptor_clone(int64_t orig) {
+       LDKStaticPaymentOutputDescriptor 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;
+       LDKStaticPaymentOutputDescriptor ret_var = StaticPaymentOutputDescriptor_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_StaticPaymentOutputDescriptor_hash(int64_t o) {
+       LDKStaticPaymentOutputDescriptor 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 = StaticPaymentOutputDescriptor_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_StaticPaymentOutputDescriptor_eq(int64_t a, int64_t b) {
+       LDKStaticPaymentOutputDescriptor 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;
+       LDKStaticPaymentOutputDescriptor 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 = StaticPaymentOutputDescriptor_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_StaticPaymentOutputDescriptor_witness_script(int64_t this_arg) {
+       LDKStaticPaymentOutputDescriptor 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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = StaticPaymentOutputDescriptor_witness_script(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_StaticPaymentOutputDescriptor_max_witness_length(int64_t this_arg) {
+       LDKStaticPaymentOutputDescriptor 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 = StaticPaymentOutputDescriptor_max_witness_length(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_StaticPaymentOutputDescriptor_write(int64_t obj) {
+       LDKStaticPaymentOutputDescriptor 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 = StaticPaymentOutputDescriptor_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_StaticPaymentOutputDescriptor_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ), "LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ");
+       *ret_conv = StaticPaymentOutputDescriptor_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_SpendableOutputDescriptor_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);
+       LDKSpendableOutputDescriptor this_ptr_conv = *(LDKSpendableOutputDescriptor*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       SpendableOutputDescriptor_free(this_ptr_conv);
+}
+
+static inline uint64_t SpendableOutputDescriptor_clone_ptr(LDKSpendableOutputDescriptor *NONNULL_PTR arg) {
+       LDKSpendableOutputDescriptor *ret_copy = MALLOC(sizeof(LDKSpendableOutputDescriptor), "LDKSpendableOutputDescriptor");
+       *ret_copy = SpendableOutputDescriptor_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_SpendableOutputDescriptor_clone_ptr(int64_t arg) {
+       LDKSpendableOutputDescriptor* arg_conv = (LDKSpendableOutputDescriptor*)untag_ptr(arg);
+       int64_t ret_conv = SpendableOutputDescriptor_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SpendableOutputDescriptor_clone(int64_t orig) {
+       LDKSpendableOutputDescriptor* orig_conv = (LDKSpendableOutputDescriptor*)untag_ptr(orig);
+       LDKSpendableOutputDescriptor *ret_copy = MALLOC(sizeof(LDKSpendableOutputDescriptor), "LDKSpendableOutputDescriptor");
+       *ret_copy = SpendableOutputDescriptor_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SpendableOutputDescriptor_static_output(int64_t outpoint, int64_t output) {
+       LDKOutPoint outpoint_conv;
+       outpoint_conv.inner = untag_ptr(outpoint);
+       outpoint_conv.is_owned = ptr_is_owned(outpoint);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_conv);
+       outpoint_conv = OutPoint_clone(&outpoint_conv);
+       void* output_ptr = untag_ptr(output);
+       CHECK_ACCESS(output_ptr);
+       LDKTxOut output_conv = *(LDKTxOut*)(output_ptr);
+       output_conv = TxOut_clone((LDKTxOut*)untag_ptr(output));
+       LDKSpendableOutputDescriptor *ret_copy = MALLOC(sizeof(LDKSpendableOutputDescriptor), "LDKSpendableOutputDescriptor");
+       *ret_copy = SpendableOutputDescriptor_static_output(outpoint_conv, output_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SpendableOutputDescriptor_delayed_payment_output(int64_t a) {
+       LDKDelayedPaymentOutputDescriptor 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 = DelayedPaymentOutputDescriptor_clone(&a_conv);
+       LDKSpendableOutputDescriptor *ret_copy = MALLOC(sizeof(LDKSpendableOutputDescriptor), "LDKSpendableOutputDescriptor");
+       *ret_copy = SpendableOutputDescriptor_delayed_payment_output(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SpendableOutputDescriptor_static_payment_output(int64_t a) {
+       LDKStaticPaymentOutputDescriptor 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 = StaticPaymentOutputDescriptor_clone(&a_conv);
+       LDKSpendableOutputDescriptor *ret_copy = MALLOC(sizeof(LDKSpendableOutputDescriptor), "LDKSpendableOutputDescriptor");
+       *ret_copy = SpendableOutputDescriptor_static_payment_output(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SpendableOutputDescriptor_hash(int64_t o) {
+       LDKSpendableOutputDescriptor* o_conv = (LDKSpendableOutputDescriptor*)untag_ptr(o);
+       int64_t ret_conv = SpendableOutputDescriptor_hash(o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_SpendableOutputDescriptor_eq(int64_t a, int64_t b) {
+       LDKSpendableOutputDescriptor* a_conv = (LDKSpendableOutputDescriptor*)untag_ptr(a);
+       LDKSpendableOutputDescriptor* b_conv = (LDKSpendableOutputDescriptor*)untag_ptr(b);
+       jboolean ret_conv = SpendableOutputDescriptor_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_SpendableOutputDescriptor_write(int64_t obj) {
+       LDKSpendableOutputDescriptor* obj_conv = (LDKSpendableOutputDescriptor*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = SpendableOutputDescriptor_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_SpendableOutputDescriptor_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpendableOutputDescriptorDecodeErrorZ), "LDKCResult_SpendableOutputDescriptorDecodeErrorZ");
+       *ret_conv = SpendableOutputDescriptor_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_SpendableOutputDescriptor_create_spendable_outputs_psbt(int64_tArray descriptors, int64_tArray outputs, int8_tArray change_destination_script, int32_t feerate_sat_per_1000_weight, int64_t locktime) {
+       LDKCVec_SpendableOutputDescriptorZ descriptors_constr;
+       descriptors_constr.datalen = descriptors->arr_len;
+       if (descriptors_constr.datalen > 0)
+               descriptors_constr.data = MALLOC(descriptors_constr.datalen * sizeof(LDKSpendableOutputDescriptor), "LDKCVec_SpendableOutputDescriptorZ Elements");
+       else
+               descriptors_constr.data = NULL;
+       int64_t* descriptors_vals = descriptors->elems;
+       for (size_t b = 0; b < descriptors_constr.datalen; b++) {
+               int64_t descriptors_conv_27 = descriptors_vals[b];
+               void* descriptors_conv_27_ptr = untag_ptr(descriptors_conv_27);
+               CHECK_ACCESS(descriptors_conv_27_ptr);
+               LDKSpendableOutputDescriptor descriptors_conv_27_conv = *(LDKSpendableOutputDescriptor*)(descriptors_conv_27_ptr);
+               descriptors_conv_27_conv = SpendableOutputDescriptor_clone((LDKSpendableOutputDescriptor*)untag_ptr(descriptors_conv_27));
+               descriptors_constr.data[b] = descriptors_conv_27_conv;
+       }
+       FREE(descriptors);
+       LDKCVec_TxOutZ outputs_constr;
+       outputs_constr.datalen = outputs->arr_len;
+       if (outputs_constr.datalen > 0)
+               outputs_constr.data = MALLOC(outputs_constr.datalen * sizeof(LDKTxOut), "LDKCVec_TxOutZ Elements");
+       else
+               outputs_constr.data = NULL;
+       int64_t* outputs_vals = outputs->elems;
+       for (size_t h = 0; h < outputs_constr.datalen; h++) {
+               int64_t outputs_conv_7 = outputs_vals[h];
+               void* outputs_conv_7_ptr = untag_ptr(outputs_conv_7);
+               CHECK_ACCESS(outputs_conv_7_ptr);
+               LDKTxOut outputs_conv_7_conv = *(LDKTxOut*)(outputs_conv_7_ptr);
+               outputs_conv_7_conv = TxOut_clone((LDKTxOut*)untag_ptr(outputs_conv_7));
+               outputs_constr.data[h] = outputs_conv_7_conv;
+       }
+       FREE(outputs);
+       LDKCVec_u8Z change_destination_script_ref;
+       change_destination_script_ref.datalen = change_destination_script->arr_len;
+       change_destination_script_ref.data = MALLOC(change_destination_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(change_destination_script_ref.data, change_destination_script->elems, change_destination_script_ref.datalen); FREE(change_destination_script);
+       void* locktime_ptr = untag_ptr(locktime);
+       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");
+       *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);
+}
+
+void  CS_LDK_ChannelDerivationParameters_free(int64_t this_obj) {
+       LDKChannelDerivationParameters 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);
+       ChannelDerivationParameters_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ChannelDerivationParameters_get_value_satoshis(int64_t this_ptr) {
+       LDKChannelDerivationParameters 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 = ChannelDerivationParameters_get_value_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ChannelDerivationParameters_set_value_satoshis(int64_t this_ptr, int64_t val) {
+       LDKChannelDerivationParameters 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;
+       ChannelDerivationParameters_set_value_satoshis(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_ChannelDerivationParameters_get_keys_id(int64_t this_ptr) {
+       LDKChannelDerivationParameters 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, *ChannelDerivationParameters_get_keys_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ChannelDerivationParameters_set_keys_id(int64_t this_ptr, int8_tArray val) {
+       LDKChannelDerivationParameters 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);
+       ChannelDerivationParameters_set_keys_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ChannelDerivationParameters_get_transaction_parameters(int64_t this_ptr) {
+       LDKChannelDerivationParameters 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;
+       LDKChannelTransactionParameters ret_var = ChannelDerivationParameters_get_transaction_parameters(&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_ChannelDerivationParameters_set_transaction_parameters(int64_t this_ptr, int64_t val) {
+       LDKChannelDerivationParameters 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;
+       LDKChannelTransactionParameters 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 = ChannelTransactionParameters_clone(&val_conv);
+       ChannelDerivationParameters_set_transaction_parameters(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ChannelDerivationParameters_new(int64_t value_satoshis_arg, int8_tArray keys_id_arg, int64_t transaction_parameters_arg) {
+       LDKThirtyTwoBytes keys_id_arg_ref;
+       CHECK(keys_id_arg->arr_len == 32);
+       memcpy(keys_id_arg_ref.data, keys_id_arg->elems, 32); FREE(keys_id_arg);
+       LDKChannelTransactionParameters transaction_parameters_arg_conv;
+       transaction_parameters_arg_conv.inner = untag_ptr(transaction_parameters_arg);
+       transaction_parameters_arg_conv.is_owned = ptr_is_owned(transaction_parameters_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(transaction_parameters_arg_conv);
+       transaction_parameters_arg_conv = ChannelTransactionParameters_clone(&transaction_parameters_arg_conv);
+       LDKChannelDerivationParameters ret_var = ChannelDerivationParameters_new(value_satoshis_arg, keys_id_arg_ref, transaction_parameters_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 ChannelDerivationParameters_clone_ptr(LDKChannelDerivationParameters *NONNULL_PTR arg) {
+       LDKChannelDerivationParameters ret_var = ChannelDerivationParameters_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_ChannelDerivationParameters_clone_ptr(int64_t arg) {
+       LDKChannelDerivationParameters 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 = ChannelDerivationParameters_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelDerivationParameters_clone(int64_t orig) {
+       LDKChannelDerivationParameters 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;
+       LDKChannelDerivationParameters ret_var = ChannelDerivationParameters_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_ChannelDerivationParameters_eq(int64_t a, int64_t b) {
+       LDKChannelDerivationParameters 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;
+       LDKChannelDerivationParameters 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 = ChannelDerivationParameters_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_ChannelDerivationParameters_write(int64_t obj) {
+       LDKChannelDerivationParameters 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 = ChannelDerivationParameters_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_ChannelDerivationParameters_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ChannelDerivationParametersDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelDerivationParametersDecodeErrorZ), "LDKCResult_ChannelDerivationParametersDecodeErrorZ");
+       *ret_conv = ChannelDerivationParameters_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_HTLCDescriptor_free(int64_t this_obj) {
+       LDKHTLCDescriptor 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);
+       HTLCDescriptor_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_HTLCDescriptor_get_channel_derivation_parameters(int64_t this_ptr) {
+       LDKHTLCDescriptor 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;
+       LDKChannelDerivationParameters ret_var = HTLCDescriptor_get_channel_derivation_parameters(&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_HTLCDescriptor_set_channel_derivation_parameters(int64_t this_ptr, int64_t val) {
+       LDKHTLCDescriptor 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;
+       LDKChannelDerivationParameters 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 = ChannelDerivationParameters_clone(&val_conv);
+       HTLCDescriptor_set_channel_derivation_parameters(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_HTLCDescriptor_get_per_commitment_number(int64_t this_ptr) {
+       LDKHTLCDescriptor 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 = HTLCDescriptor_get_per_commitment_number(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_HTLCDescriptor_set_per_commitment_number(int64_t this_ptr, int64_t val) {
+       LDKHTLCDescriptor 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;
+       HTLCDescriptor_set_per_commitment_number(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_HTLCDescriptor_get_per_commitment_point(int64_t this_ptr) {
+       LDKHTLCDescriptor 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, HTLCDescriptor_get_per_commitment_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_HTLCDescriptor_set_per_commitment_point(int64_t this_ptr, int8_tArray val) {
+       LDKHTLCDescriptor 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);
+       HTLCDescriptor_set_per_commitment_point(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_HTLCDescriptor_get_feerate_per_kw(int64_t this_ptr) {
+       LDKHTLCDescriptor 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 = HTLCDescriptor_get_feerate_per_kw(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_HTLCDescriptor_set_feerate_per_kw(int64_t this_ptr, int32_t val) {
+       LDKHTLCDescriptor 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;
+       HTLCDescriptor_set_feerate_per_kw(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_HTLCDescriptor_get_htlc(int64_t this_ptr) {
+       LDKHTLCDescriptor 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;
+       LDKHTLCOutputInCommitment ret_var = HTLCDescriptor_get_htlc(&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_HTLCDescriptor_set_htlc(int64_t this_ptr, int64_t val) {
+       LDKHTLCDescriptor 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;
+       LDKHTLCOutputInCommitment 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 = HTLCOutputInCommitment_clone(&val_conv);
+       HTLCDescriptor_set_htlc(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_HTLCDescriptor_get_preimage(int64_t this_ptr) {
+       LDKHTLCDescriptor 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 = HTLCDescriptor_get_preimage(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_HTLCDescriptor_set_preimage(int64_t this_ptr, int64_t val) {
+       LDKHTLCDescriptor 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));
+       HTLCDescriptor_set_preimage(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_HTLCDescriptor_get_counterparty_sig(int64_t this_ptr) {
+       LDKHTLCDescriptor 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(64, __LINE__);
+       memcpy(ret_arr->elems, HTLCDescriptor_get_counterparty_sig(&this_ptr_conv).compact_form, 64);
+       return ret_arr;
+}
+
+void  CS_LDK_HTLCDescriptor_set_counterparty_sig(int64_t this_ptr, int8_tArray val) {
+       LDKHTLCDescriptor 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;
+       LDKECDSASignature val_ref;
+       CHECK(val->arr_len == 64);
+       memcpy(val_ref.compact_form, val->elems, 64); FREE(val);
+       HTLCDescriptor_set_counterparty_sig(&this_ptr_conv, val_ref);
+}
+
+static inline uint64_t HTLCDescriptor_clone_ptr(LDKHTLCDescriptor *NONNULL_PTR arg) {
+       LDKHTLCDescriptor ret_var = HTLCDescriptor_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_HTLCDescriptor_clone_ptr(int64_t arg) {
+       LDKHTLCDescriptor 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 = HTLCDescriptor_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_HTLCDescriptor_clone(int64_t orig) {
+       LDKHTLCDescriptor 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;
+       LDKHTLCDescriptor ret_var = HTLCDescriptor_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_HTLCDescriptor_eq(int64_t a, int64_t b) {
+       LDKHTLCDescriptor 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;
+       LDKHTLCDescriptor 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 = HTLCDescriptor_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_HTLCDescriptor_write(int64_t obj) {
+       LDKHTLCDescriptor 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 = HTLCDescriptor_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_HTLCDescriptor_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_HTLCDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HTLCDescriptorDecodeErrorZ), "LDKCResult_HTLCDescriptorDecodeErrorZ");
+       *ret_conv = HTLCDescriptor_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_HTLCDescriptor_outpoint(int64_t this_arg) {
+       LDKHTLCDescriptor 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;
+       LDKOutPoint ret_var = HTLCDescriptor_outpoint(&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_HTLCDescriptor_previous_utxo(int64_t this_arg) {
+       LDKHTLCDescriptor 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;
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = HTLCDescriptor_previous_utxo(&this_arg_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+int64_t  CS_LDK_HTLCDescriptor_unsigned_tx_input(int64_t this_arg) {
+       LDKHTLCDescriptor 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;
+       LDKTxIn* ret_ref = MALLOC(sizeof(LDKTxIn), "LDKTxIn");
+       *ret_ref = HTLCDescriptor_unsigned_tx_input(&this_arg_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+int64_t  CS_LDK_HTLCDescriptor_tx_output(int64_t this_arg) {
+       LDKHTLCDescriptor 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;
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = HTLCDescriptor_tx_output(&this_arg_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+int8_tArray  CS_LDK_HTLCDescriptor_witness_script(int64_t this_arg) {
+       LDKHTLCDescriptor 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;
+       LDKCVec_u8Z ret_var = HTLCDescriptor_witness_script(&this_arg_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;
+}
+
+int8_tArray  CS_LDK_HTLCDescriptor_tx_input_witness(int64_t this_arg, int8_tArray signature, int8_tArray witness_script) {
+       LDKHTLCDescriptor 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;
+       LDKECDSASignature signature_ref;
+       CHECK(signature->arr_len == 64);
+       memcpy(signature_ref.compact_form, signature->elems, 64); FREE(signature);
+       LDKu8slice witness_script_ref;
+       witness_script_ref.datalen = witness_script->arr_len;
+       witness_script_ref.data = witness_script->elems;
+       LDKWitness ret_var = HTLCDescriptor_tx_input_witness(&this_arg_conv, signature_ref, witness_script_ref);
+       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);
+       FREE(witness_script);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_HTLCDescriptor_derive_channel_signer(int64_t this_arg, int64_t signer_provider) {
+       LDKHTLCDescriptor 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;
+       void* signer_provider_ptr = untag_ptr(signer_provider);
+       if (ptr_is_owned(signer_provider)) { CHECK_ACCESS(signer_provider_ptr); }
+       LDKSignerProvider* signer_provider_conv = (LDKSignerProvider*)signer_provider_ptr;
+       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
+       *ret_ret = HTLCDescriptor_derive_channel_signer(&this_arg_conv, signer_provider_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_ChannelSigner_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);
+       LDKChannelSigner this_ptr_conv = *(LDKChannelSigner*)(this_ptr_ptr);
+       FREE(untag_ptr(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));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Recipient_node() {
+       int32_t ret_conv = LDKRecipient_to_cs(Recipient_node());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Recipient_phantom_node() {
+       int32_t ret_conv = LDKRecipient_to_cs(Recipient_phantom_node());
+       return ret_conv;
+}
+
+void  CS_LDK_EntropySource_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);
+       LDKEntropySource this_ptr_conv = *(LDKEntropySource*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       EntropySource_free(this_ptr_conv);
+}
+
+void  CS_LDK_NodeSigner_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);
+       LDKNodeSigner this_ptr_conv = *(LDKNodeSigner*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       NodeSigner_free(this_ptr_conv);
+}
+
+void  CS_LDK_SignerProvider_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);
+       LDKSignerProvider this_ptr_conv = *(LDKSignerProvider*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       SignerProvider_free(this_ptr_conv);
+}
+
+void  CS_LDK_InMemorySigner_free(int64_t this_obj) {
+       LDKInMemorySigner 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);
+       InMemorySigner_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_InMemorySigner_get_funding_key(int64_t this_ptr) {
+       LDKInMemorySigner 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, *InMemorySigner_get_funding_key(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_InMemorySigner_set_funding_key(int64_t this_ptr, int8_tArray val) {
+       LDKInMemorySigner 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;
+       LDKSecretKey val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.bytes, val->elems, 32); FREE(val);
+       InMemorySigner_set_funding_key(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_InMemorySigner_get_revocation_base_key(int64_t this_ptr) {
+       LDKInMemorySigner 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, *InMemorySigner_get_revocation_base_key(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_InMemorySigner_set_revocation_base_key(int64_t this_ptr, int8_tArray val) {
+       LDKInMemorySigner 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;
+       LDKSecretKey val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.bytes, val->elems, 32); FREE(val);
+       InMemorySigner_set_revocation_base_key(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_InMemorySigner_get_payment_key(int64_t this_ptr) {
+       LDKInMemorySigner 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, *InMemorySigner_get_payment_key(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_InMemorySigner_set_payment_key(int64_t this_ptr, int8_tArray val) {
+       LDKInMemorySigner 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;
+       LDKSecretKey val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.bytes, val->elems, 32); FREE(val);
+       InMemorySigner_set_payment_key(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_InMemorySigner_get_delayed_payment_base_key(int64_t this_ptr) {
+       LDKInMemorySigner 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, *InMemorySigner_get_delayed_payment_base_key(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_InMemorySigner_set_delayed_payment_base_key(int64_t this_ptr, int8_tArray val) {
+       LDKInMemorySigner 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;
+       LDKSecretKey val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.bytes, val->elems, 32); FREE(val);
+       InMemorySigner_set_delayed_payment_base_key(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_InMemorySigner_get_htlc_base_key(int64_t this_ptr) {
+       LDKInMemorySigner 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, *InMemorySigner_get_htlc_base_key(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_InMemorySigner_set_htlc_base_key(int64_t this_ptr, int8_tArray val) {
+       LDKInMemorySigner 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;
+       LDKSecretKey val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.bytes, val->elems, 32); FREE(val);
+       InMemorySigner_set_htlc_base_key(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_InMemorySigner_get_commitment_seed(int64_t this_ptr) {
+       LDKInMemorySigner 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, *InMemorySigner_get_commitment_seed(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_InMemorySigner_set_commitment_seed(int64_t this_ptr, int8_tArray val) {
+       LDKInMemorySigner 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);
+       InMemorySigner_set_commitment_seed(&this_ptr_conv, val_ref);
+}
+
+static inline uint64_t InMemorySigner_clone_ptr(LDKInMemorySigner *NONNULL_PTR arg) {
+       LDKInMemorySigner ret_var = InMemorySigner_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_InMemorySigner_clone_ptr(int64_t arg) {
+       LDKInMemorySigner 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 = InMemorySigner_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InMemorySigner_clone(int64_t orig) {
+       LDKInMemorySigner 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;
+       LDKInMemorySigner ret_var = InMemorySigner_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_InMemorySigner_new(int8_tArray funding_key, int8_tArray revocation_base_key, int8_tArray payment_key, int8_tArray delayed_payment_base_key, int8_tArray htlc_base_key, int8_tArray commitment_seed, int64_t channel_value_satoshis, int8_tArray channel_keys_id, int8_tArray rand_bytes_unique_start) {
+       LDKSecretKey funding_key_ref;
+       CHECK(funding_key->arr_len == 32);
+       memcpy(funding_key_ref.bytes, funding_key->elems, 32); FREE(funding_key);
+       LDKSecretKey revocation_base_key_ref;
+       CHECK(revocation_base_key->arr_len == 32);
+       memcpy(revocation_base_key_ref.bytes, revocation_base_key->elems, 32); FREE(revocation_base_key);
+       LDKSecretKey payment_key_ref;
+       CHECK(payment_key->arr_len == 32);
+       memcpy(payment_key_ref.bytes, payment_key->elems, 32); FREE(payment_key);
+       LDKSecretKey delayed_payment_base_key_ref;
+       CHECK(delayed_payment_base_key->arr_len == 32);
+       memcpy(delayed_payment_base_key_ref.bytes, delayed_payment_base_key->elems, 32); FREE(delayed_payment_base_key);
+       LDKSecretKey htlc_base_key_ref;
+       CHECK(htlc_base_key->arr_len == 32);
+       memcpy(htlc_base_key_ref.bytes, htlc_base_key->elems, 32); FREE(htlc_base_key);
+       LDKThirtyTwoBytes commitment_seed_ref;
+       CHECK(commitment_seed->arr_len == 32);
+       memcpy(commitment_seed_ref.data, commitment_seed->elems, 32); FREE(commitment_seed);
+       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);
+       LDKThirtyTwoBytes rand_bytes_unique_start_ref;
+       CHECK(rand_bytes_unique_start->arr_len == 32);
+       memcpy(rand_bytes_unique_start_ref.data, rand_bytes_unique_start->elems, 32); FREE(rand_bytes_unique_start);
+       LDKInMemorySigner ret_var = InMemorySigner_new(funding_key_ref, revocation_base_key_ref, payment_key_ref, delayed_payment_base_key_ref, htlc_base_key_ref, commitment_seed_ref, channel_value_satoshis, channel_keys_id_ref, rand_bytes_unique_start_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_InMemorySigner_counterparty_pubkeys(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKChannelPublicKeys ret_var = InMemorySigner_counterparty_pubkeys(&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_InMemorySigner_counterparty_selected_contest_delay(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKCOption_u16Z *ret_copy = MALLOC(sizeof(LDKCOption_u16Z), "LDKCOption_u16Z");
+       *ret_copy = InMemorySigner_counterparty_selected_contest_delay(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_InMemorySigner_holder_selected_contest_delay(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKCOption_u16Z *ret_copy = MALLOC(sizeof(LDKCOption_u16Z), "LDKCOption_u16Z");
+       *ret_copy = InMemorySigner_holder_selected_contest_delay(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_InMemorySigner_is_outbound(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKCOption_boolZ *ret_copy = MALLOC(sizeof(LDKCOption_boolZ), "LDKCOption_boolZ");
+       *ret_copy = InMemorySigner_is_outbound(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_InMemorySigner_funding_outpoint(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKOutPoint ret_var = InMemorySigner_funding_outpoint(&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_InMemorySigner_get_channel_parameters(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKChannelTransactionParameters ret_var = InMemorySigner_get_channel_parameters(&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_InMemorySigner_channel_type_features(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKChannelTypeFeatures ret_var = InMemorySigner_channel_type_features(&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_InMemorySigner_sign_counterparty_payment_input(int64_t this_arg, int8_tArray spend_tx, int64_t input_idx, int64_t descriptor) {
+       LDKInMemorySigner 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;
+       LDKTransaction spend_tx_ref;
+       spend_tx_ref.datalen = spend_tx->arr_len;
+       spend_tx_ref.data = MALLOC(spend_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(spend_tx_ref.data, spend_tx->elems, spend_tx_ref.datalen); FREE(spend_tx);
+       spend_tx_ref.data_is_owned = true;
+       LDKStaticPaymentOutputDescriptor descriptor_conv;
+       descriptor_conv.inner = untag_ptr(descriptor);
+       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");
+       *ret_conv = InMemorySigner_sign_counterparty_payment_input(&this_arg_conv, spend_tx_ref, input_idx, &descriptor_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InMemorySigner_sign_dynamic_p2wsh_input(int64_t this_arg, int8_tArray spend_tx, int64_t input_idx, int64_t descriptor) {
+       LDKInMemorySigner 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;
+       LDKTransaction spend_tx_ref;
+       spend_tx_ref.datalen = spend_tx->arr_len;
+       spend_tx_ref.data = MALLOC(spend_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(spend_tx_ref.data, spend_tx->elems, spend_tx_ref.datalen); FREE(spend_tx);
+       spend_tx_ref.data_is_owned = true;
+       LDKDelayedPaymentOutputDescriptor descriptor_conv;
+       descriptor_conv.inner = untag_ptr(descriptor);
+       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");
+       *ret_conv = InMemorySigner_sign_dynamic_p2wsh_input(&this_arg_conv, spend_tx_ref, input_idx, &descriptor_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_InMemorySigner_as_EntropySource(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKEntropySource* ret_ret = MALLOC(sizeof(LDKEntropySource), "LDKEntropySource");
+       *ret_ret = InMemorySigner_as_EntropySource(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_InMemorySigner_as_ChannelSigner(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKChannelSigner* ret_ret = MALLOC(sizeof(LDKChannelSigner), "LDKChannelSigner");
+       *ret_ret = InMemorySigner_as_ChannelSigner(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_InMemorySigner_as_EcdsaChannelSigner(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKEcdsaChannelSigner), "LDKEcdsaChannelSigner");
+       *ret_ret = InMemorySigner_as_EcdsaChannelSigner(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_InMemorySigner_as_WriteableEcdsaChannelSigner(int64_t this_arg) {
+       LDKInMemorySigner 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;
+       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
+       *ret_ret = InMemorySigner_as_WriteableEcdsaChannelSigner(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int8_tArray  CS_LDK_InMemorySigner_write(int64_t obj) {
+       LDKInMemorySigner 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 = InMemorySigner_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_InMemorySigner_read(int8_tArray ser, int64_t arg) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       void* arg_ptr = untag_ptr(arg);
+       CHECK_ACCESS(arg_ptr);
+       LDKEntropySource arg_conv = *(LDKEntropySource*)(arg_ptr);
+       if (arg_conv.free == LDKEntropySource_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKEntropySource_JCalls_cloned(&arg_conv);
+       }
+       LDKCResult_InMemorySignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InMemorySignerDecodeErrorZ), "LDKCResult_InMemorySignerDecodeErrorZ");
+       *ret_conv = InMemorySigner_read(ser_ref, arg_conv);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_KeysManager_free(int64_t this_obj) {
+       LDKKeysManager 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);
+       KeysManager_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_KeysManager_new(int8_tArray seed, int64_t starting_time_secs, int32_t starting_time_nanos) {
+       uint8_t seed_arr[32];
+       CHECK(seed->arr_len == 32);
+       memcpy(seed_arr, seed->elems, 32); FREE(seed);
+       uint8_t (*seed_ref)[32] = &seed_arr;
+       LDKKeysManager ret_var = KeysManager_new(seed_ref, starting_time_secs, starting_time_nanos);
+       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_KeysManager_get_node_secret_key(int64_t this_arg) {
+       LDKKeysManager 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, KeysManager_get_node_secret_key(&this_arg_conv).bytes, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_KeysManager_derive_channel_keys(int64_t this_arg, int64_t channel_value_satoshis, int8_tArray params) {
+       LDKKeysManager 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;
+       uint8_t params_arr[32];
+       CHECK(params->arr_len == 32);
+       memcpy(params_arr, params->elems, 32); FREE(params);
+       uint8_t (*params_ref)[32] = &params_arr;
+       LDKInMemorySigner ret_var = KeysManager_derive_channel_keys(&this_arg_conv, channel_value_satoshis, params_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_KeysManager_sign_spendable_outputs_psbt(int64_t this_arg, int64_tArray descriptors, int8_tArray psbt) {
+       LDKKeysManager 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;
+       LDKCVec_SpendableOutputDescriptorZ descriptors_constr;
+       descriptors_constr.datalen = descriptors->arr_len;
+       if (descriptors_constr.datalen > 0)
+               descriptors_constr.data = MALLOC(descriptors_constr.datalen * sizeof(LDKSpendableOutputDescriptor), "LDKCVec_SpendableOutputDescriptorZ Elements");
+       else
+               descriptors_constr.data = NULL;
+       int64_t* descriptors_vals = descriptors->elems;
+       for (size_t b = 0; b < descriptors_constr.datalen; b++) {
+               int64_t descriptors_conv_27 = descriptors_vals[b];
+               void* descriptors_conv_27_ptr = untag_ptr(descriptors_conv_27);
+               CHECK_ACCESS(descriptors_conv_27_ptr);
+               LDKSpendableOutputDescriptor descriptors_conv_27_conv = *(LDKSpendableOutputDescriptor*)(descriptors_conv_27_ptr);
+               descriptors_conv_27_conv = SpendableOutputDescriptor_clone((LDKSpendableOutputDescriptor*)untag_ptr(descriptors_conv_27));
+               descriptors_constr.data[b] = descriptors_conv_27_conv;
+       }
+       FREE(descriptors);
+       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_CVec_u8ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZNoneZ), "LDKCResult_CVec_u8ZNoneZ");
+       *ret_conv = KeysManager_sign_spendable_outputs_psbt(&this_arg_conv, descriptors_constr, psbt_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_KeysManager_spend_spendable_outputs(int64_t this_arg, int64_tArray descriptors, int64_tArray outputs, int8_tArray change_destination_script, int32_t feerate_sat_per_1000_weight, int64_t locktime) {
+       LDKKeysManager 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;
+       LDKCVec_SpendableOutputDescriptorZ descriptors_constr;
+       descriptors_constr.datalen = descriptors->arr_len;
+       if (descriptors_constr.datalen > 0)
+               descriptors_constr.data = MALLOC(descriptors_constr.datalen * sizeof(LDKSpendableOutputDescriptor), "LDKCVec_SpendableOutputDescriptorZ Elements");
+       else
+               descriptors_constr.data = NULL;
+       int64_t* descriptors_vals = descriptors->elems;
+       for (size_t b = 0; b < descriptors_constr.datalen; b++) {
+               int64_t descriptors_conv_27 = descriptors_vals[b];
+               void* descriptors_conv_27_ptr = untag_ptr(descriptors_conv_27);
+               CHECK_ACCESS(descriptors_conv_27_ptr);
+               LDKSpendableOutputDescriptor descriptors_conv_27_conv = *(LDKSpendableOutputDescriptor*)(descriptors_conv_27_ptr);
+               descriptors_conv_27_conv = SpendableOutputDescriptor_clone((LDKSpendableOutputDescriptor*)untag_ptr(descriptors_conv_27));
+               descriptors_constr.data[b] = descriptors_conv_27_conv;
+       }
+       FREE(descriptors);
+       LDKCVec_TxOutZ outputs_constr;
+       outputs_constr.datalen = outputs->arr_len;
+       if (outputs_constr.datalen > 0)
+               outputs_constr.data = MALLOC(outputs_constr.datalen * sizeof(LDKTxOut), "LDKCVec_TxOutZ Elements");
+       else
+               outputs_constr.data = NULL;
+       int64_t* outputs_vals = outputs->elems;
+       for (size_t h = 0; h < outputs_constr.datalen; h++) {
+               int64_t outputs_conv_7 = outputs_vals[h];
+               void* outputs_conv_7_ptr = untag_ptr(outputs_conv_7);
+               CHECK_ACCESS(outputs_conv_7_ptr);
+               LDKTxOut outputs_conv_7_conv = *(LDKTxOut*)(outputs_conv_7_ptr);
+               outputs_conv_7_conv = TxOut_clone((LDKTxOut*)untag_ptr(outputs_conv_7));
+               outputs_constr.data[h] = outputs_conv_7_conv;
+       }
+       FREE(outputs);
+       LDKCVec_u8Z change_destination_script_ref;
+       change_destination_script_ref.datalen = change_destination_script->arr_len;
+       change_destination_script_ref.data = MALLOC(change_destination_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(change_destination_script_ref.data, change_destination_script->elems, change_destination_script_ref.datalen); FREE(change_destination_script);
+       void* locktime_ptr = untag_ptr(locktime);
+       CHECK_ACCESS(locktime_ptr);
+       LDKCOption_u32Z locktime_conv = *(LDKCOption_u32Z*)(locktime_ptr);
+       locktime_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(locktime));
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = KeysManager_spend_spendable_outputs(&this_arg_conv, descriptors_constr, outputs_constr, change_destination_script_ref, feerate_sat_per_1000_weight, locktime_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_KeysManager_as_EntropySource(int64_t this_arg) {
+       LDKKeysManager 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;
+       LDKEntropySource* ret_ret = MALLOC(sizeof(LDKEntropySource), "LDKEntropySource");
+       *ret_ret = KeysManager_as_EntropySource(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_KeysManager_as_NodeSigner(int64_t this_arg) {
+       LDKKeysManager 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;
+       LDKNodeSigner* ret_ret = MALLOC(sizeof(LDKNodeSigner), "LDKNodeSigner");
+       *ret_ret = KeysManager_as_NodeSigner(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_KeysManager_as_SignerProvider(int64_t this_arg) {
+       LDKKeysManager 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;
+       LDKSignerProvider* ret_ret = MALLOC(sizeof(LDKSignerProvider), "LDKSignerProvider");
+       *ret_ret = KeysManager_as_SignerProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_PhantomKeysManager_free(int64_t this_obj) {
+       LDKPhantomKeysManager 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);
+       PhantomKeysManager_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_PhantomKeysManager_as_EntropySource(int64_t this_arg) {
+       LDKPhantomKeysManager 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;
+       LDKEntropySource* ret_ret = MALLOC(sizeof(LDKEntropySource), "LDKEntropySource");
+       *ret_ret = PhantomKeysManager_as_EntropySource(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_PhantomKeysManager_as_NodeSigner(int64_t this_arg) {
+       LDKPhantomKeysManager 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;
+       LDKNodeSigner* ret_ret = MALLOC(sizeof(LDKNodeSigner), "LDKNodeSigner");
+       *ret_ret = PhantomKeysManager_as_NodeSigner(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_PhantomKeysManager_as_SignerProvider(int64_t this_arg) {
+       LDKPhantomKeysManager 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;
+       LDKSignerProvider* ret_ret = MALLOC(sizeof(LDKSignerProvider), "LDKSignerProvider");
+       *ret_ret = PhantomKeysManager_as_SignerProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int64_t  CS_LDK_PhantomKeysManager_new(int8_tArray seed, int64_t starting_time_secs, int32_t starting_time_nanos, int8_tArray cross_node_seed) {
+       uint8_t seed_arr[32];
+       CHECK(seed->arr_len == 32);
+       memcpy(seed_arr, seed->elems, 32); FREE(seed);
+       uint8_t (*seed_ref)[32] = &seed_arr;
+       uint8_t cross_node_seed_arr[32];
+       CHECK(cross_node_seed->arr_len == 32);
+       memcpy(cross_node_seed_arr, cross_node_seed->elems, 32); FREE(cross_node_seed);
+       uint8_t (*cross_node_seed_ref)[32] = &cross_node_seed_arr;
+       LDKPhantomKeysManager ret_var = PhantomKeysManager_new(seed_ref, starting_time_secs, starting_time_nanos, cross_node_seed_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_PhantomKeysManager_spend_spendable_outputs(int64_t this_arg, int64_tArray descriptors, int64_tArray outputs, int8_tArray change_destination_script, int32_t feerate_sat_per_1000_weight, int64_t locktime) {
+       LDKPhantomKeysManager 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;
+       LDKCVec_SpendableOutputDescriptorZ descriptors_constr;
+       descriptors_constr.datalen = descriptors->arr_len;
+       if (descriptors_constr.datalen > 0)
+               descriptors_constr.data = MALLOC(descriptors_constr.datalen * sizeof(LDKSpendableOutputDescriptor), "LDKCVec_SpendableOutputDescriptorZ Elements");
+       else
+               descriptors_constr.data = NULL;
+       int64_t* descriptors_vals = descriptors->elems;
+       for (size_t b = 0; b < descriptors_constr.datalen; b++) {
+               int64_t descriptors_conv_27 = descriptors_vals[b];
+               void* descriptors_conv_27_ptr = untag_ptr(descriptors_conv_27);
+               CHECK_ACCESS(descriptors_conv_27_ptr);
+               LDKSpendableOutputDescriptor descriptors_conv_27_conv = *(LDKSpendableOutputDescriptor*)(descriptors_conv_27_ptr);
+               descriptors_conv_27_conv = SpendableOutputDescriptor_clone((LDKSpendableOutputDescriptor*)untag_ptr(descriptors_conv_27));
+               descriptors_constr.data[b] = descriptors_conv_27_conv;
+       }
+       FREE(descriptors);
+       LDKCVec_TxOutZ outputs_constr;
+       outputs_constr.datalen = outputs->arr_len;
+       if (outputs_constr.datalen > 0)
+               outputs_constr.data = MALLOC(outputs_constr.datalen * sizeof(LDKTxOut), "LDKCVec_TxOutZ Elements");
+       else
+               outputs_constr.data = NULL;
+       int64_t* outputs_vals = outputs->elems;
+       for (size_t h = 0; h < outputs_constr.datalen; h++) {
+               int64_t outputs_conv_7 = outputs_vals[h];
+               void* outputs_conv_7_ptr = untag_ptr(outputs_conv_7);
+               CHECK_ACCESS(outputs_conv_7_ptr);
+               LDKTxOut outputs_conv_7_conv = *(LDKTxOut*)(outputs_conv_7_ptr);
+               outputs_conv_7_conv = TxOut_clone((LDKTxOut*)untag_ptr(outputs_conv_7));
+               outputs_constr.data[h] = outputs_conv_7_conv;
+       }
+       FREE(outputs);
+       LDKCVec_u8Z change_destination_script_ref;
+       change_destination_script_ref.datalen = change_destination_script->arr_len;
+       change_destination_script_ref.data = MALLOC(change_destination_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(change_destination_script_ref.data, change_destination_script->elems, change_destination_script_ref.datalen); FREE(change_destination_script);
+       void* locktime_ptr = untag_ptr(locktime);
+       CHECK_ACCESS(locktime_ptr);
+       LDKCOption_u32Z locktime_conv = *(LDKCOption_u32Z*)(locktime_ptr);
+       locktime_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(locktime));
+       LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
+       *ret_conv = PhantomKeysManager_spend_spendable_outputs(&this_arg_conv, descriptors_constr, outputs_constr, change_destination_script_ref, feerate_sat_per_1000_weight, locktime_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PhantomKeysManager_derive_channel_keys(int64_t this_arg, int64_t channel_value_satoshis, int8_tArray params) {
+       LDKPhantomKeysManager 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;
+       uint8_t params_arr[32];
+       CHECK(params->arr_len == 32);
+       memcpy(params_arr, params->elems, 32); FREE(params);
+       uint8_t (*params_ref)[32] = &params_arr;
+       LDKInMemorySigner ret_var = PhantomKeysManager_derive_channel_keys(&this_arg_conv, channel_value_satoshis, params_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_PhantomKeysManager_get_node_secret_key(int64_t this_arg) {
+       LDKPhantomKeysManager 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, PhantomKeysManager_get_node_secret_key(&this_arg_conv).bytes, 32);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_PhantomKeysManager_get_phantom_node_secret_key(int64_t this_arg) {
+       LDKPhantomKeysManager 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, PhantomKeysManager_get_phantom_node_secret_key(&this_arg_conv).bytes, 32);
+       return ret_arr;
+}
+
+void  CS_LDK_OnionMessenger_free(int64_t this_obj) {
+       LDKOnionMessenger 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);
+       OnionMessenger_free(this_obj_conv);
+}
+
+void  CS_LDK_MessageRouter_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);
+       LDKMessageRouter this_ptr_conv = *(LDKMessageRouter*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       MessageRouter_free(this_ptr_conv);
+}
+
+void  CS_LDK_DefaultMessageRouter_free(int64_t this_obj) {
+       LDKDefaultMessageRouter 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);
+       DefaultMessageRouter_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_DefaultMessageRouter_new() {
+       LDKDefaultMessageRouter ret_var = DefaultMessageRouter_new();
+       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_DefaultMessageRouter_as_MessageRouter(int64_t this_arg) {
+       LDKDefaultMessageRouter 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 = DefaultMessageRouter_as_MessageRouter(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_OnionMessagePath_free(int64_t this_obj) {
+       LDKOnionMessagePath 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);
+       OnionMessagePath_free(this_obj_conv);
+}
+
+ptrArray  CS_LDK_OnionMessagePath_get_intermediate_nodes(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;
+       LDKCVec_PublicKeyZ ret_var = OnionMessagePath_get_intermediate_nodes(&this_ptr_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(33, __LINE__);
+               memcpy(ret_conv_8_arr->elems, ret_var.data[i].compressed_form, 33);
+               ret_arr_ptr[i] = ret_conv_8_arr;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_OnionMessagePath_set_intermediate_nodes(int64_t this_ptr, ptrArray 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;
+       LDKCVec_PublicKeyZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
+       else
+               val_constr.data = NULL;
+       int8_tArray* val_vals = (void*) val->elems;
+       for (size_t i = 0; i < val_constr.datalen; i++) {
+               int8_tArray val_conv_8 = val_vals[i];
+               LDKPublicKey val_conv_8_ref;
+               CHECK(val_conv_8->arr_len == 33);
+               memcpy(val_conv_8_ref.compressed_form, val_conv_8->elems, 33); FREE(val_conv_8);
+               val_constr.data[i] = val_conv_8_ref;
+       }
+       FREE(val);
+       OnionMessagePath_set_intermediate_nodes(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_OnionMessagePath_get_destination(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;
+       LDKDestination *ret_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
+       *ret_copy = OnionMessagePath_get_destination(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_OnionMessagePath_set_destination(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);
+       LDKDestination val_conv = *(LDKDestination*)(val_ptr);
+       val_conv = Destination_clone((LDKDestination*)untag_ptr(val));
+       OnionMessagePath_set_destination(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_OnionMessagePath_new(ptrArray intermediate_nodes_arg, int64_t destination_arg) {
+       LDKCVec_PublicKeyZ intermediate_nodes_arg_constr;
+       intermediate_nodes_arg_constr.datalen = intermediate_nodes_arg->arr_len;
+       if (intermediate_nodes_arg_constr.datalen > 0)
+               intermediate_nodes_arg_constr.data = MALLOC(intermediate_nodes_arg_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
+       else
+               intermediate_nodes_arg_constr.data = NULL;
+       int8_tArray* intermediate_nodes_arg_vals = (void*) intermediate_nodes_arg->elems;
+       for (size_t i = 0; i < intermediate_nodes_arg_constr.datalen; i++) {
+               int8_tArray intermediate_nodes_arg_conv_8 = intermediate_nodes_arg_vals[i];
+               LDKPublicKey intermediate_nodes_arg_conv_8_ref;
+               CHECK(intermediate_nodes_arg_conv_8->arr_len == 33);
+               memcpy(intermediate_nodes_arg_conv_8_ref.compressed_form, intermediate_nodes_arg_conv_8->elems, 33); FREE(intermediate_nodes_arg_conv_8);
+               intermediate_nodes_arg_constr.data[i] = intermediate_nodes_arg_conv_8_ref;
+       }
+       FREE(intermediate_nodes_arg);
+       void* destination_arg_ptr = untag_ptr(destination_arg);
+       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);
+       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 OnionMessagePath_clone_ptr(LDKOnionMessagePath *NONNULL_PTR arg) {
+       LDKOnionMessagePath ret_var = OnionMessagePath_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_OnionMessagePath_clone_ptr(int64_t arg) {
+       LDKOnionMessagePath 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 = OnionMessagePath_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OnionMessagePath_clone(int64_t orig) {
+       LDKOnionMessagePath 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;
+       LDKOnionMessagePath ret_var = OnionMessagePath_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_Destination_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);
+       LDKDestination this_ptr_conv = *(LDKDestination*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Destination_free(this_ptr_conv);
+}
+
+static inline uint64_t Destination_clone_ptr(LDKDestination *NONNULL_PTR arg) {
+       LDKDestination *ret_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
+       *ret_copy = Destination_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_Destination_clone_ptr(int64_t arg) {
+       LDKDestination* arg_conv = (LDKDestination*)untag_ptr(arg);
+       int64_t ret_conv = Destination_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Destination_clone(int64_t orig) {
+       LDKDestination* orig_conv = (LDKDestination*)untag_ptr(orig);
+       LDKDestination *ret_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
+       *ret_copy = Destination_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Destination_node(int8_tArray a) {
+       LDKPublicKey a_ref;
+       CHECK(a->arr_len == 33);
+       memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
+       LDKDestination *ret_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
+       *ret_copy = Destination_node(a_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Destination_blinded_path(int64_t a) {
+       LDKBlindedPath 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 = BlindedPath_clone(&a_conv);
+       LDKDestination *ret_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
+       *ret_copy = Destination_blinded_path(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_SendError_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);
+       LDKSendError this_ptr_conv = *(LDKSendError*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       SendError_free(this_ptr_conv);
+}
+
+static inline uint64_t SendError_clone_ptr(LDKSendError *NONNULL_PTR arg) {
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_SendError_clone_ptr(int64_t arg) {
+       LDKSendError* arg_conv = (LDKSendError*)untag_ptr(arg);
+       int64_t ret_conv = SendError_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SendError_clone(int64_t orig) {
+       LDKSendError* orig_conv = (LDKSendError*)untag_ptr(orig);
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_secp256k1(int32_t a) {
+       LDKSecp256k1Error a_conv = LDKSecp256k1Error_from_cs(a);
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_secp256k1(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_too_big_packet() {
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_too_big_packet();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_too_few_blinded_hops() {
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_too_few_blinded_hops();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_invalid_first_hop() {
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_invalid_first_hop();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_invalid_message() {
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_invalid_message();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_buffer_full() {
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_buffer_full();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_get_node_id_failed() {
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_get_node_id_failed();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_blinded_path_advance_failed() {
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_blinded_path_advance_failed();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_SendError_eq(int64_t a, int64_t b) {
+       LDKSendError* a_conv = (LDKSendError*)untag_ptr(a);
+       LDKSendError* b_conv = (LDKSendError*)untag_ptr(b);
+       jboolean ret_conv = SendError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CustomOnionMessageHandler_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);
+       LDKCustomOnionMessageHandler this_ptr_conv = *(LDKCustomOnionMessageHandler*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       CustomOnionMessageHandler_free(this_ptr_conv);
+}
+
+void  CS_LDK_PeeledOnion_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);
+       LDKPeeledOnion this_ptr_conv = *(LDKPeeledOnion*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       PeeledOnion_free(this_ptr_conv);
+}
+
+static inline uint64_t PeeledOnion_clone_ptr(LDKPeeledOnion *NONNULL_PTR arg) {
+       LDKPeeledOnion *ret_copy = MALLOC(sizeof(LDKPeeledOnion), "LDKPeeledOnion");
+       *ret_copy = PeeledOnion_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_PeeledOnion_clone_ptr(int64_t arg) {
+       LDKPeeledOnion* arg_conv = (LDKPeeledOnion*)untag_ptr(arg);
+       int64_t ret_conv = PeeledOnion_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PeeledOnion_clone(int64_t orig) {
+       LDKPeeledOnion* orig_conv = (LDKPeeledOnion*)untag_ptr(orig);
+       LDKPeeledOnion *ret_copy = MALLOC(sizeof(LDKPeeledOnion), "LDKPeeledOnion");
+       *ret_copy = PeeledOnion_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PeeledOnion_forward(int8_tArray a, int64_t b) {
+       LDKPublicKey a_ref;
+       CHECK(a->arr_len == 33);
+       memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
+       LDKOnionMessage 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 = OnionMessage_clone(&b_conv);
+       LDKPeeledOnion *ret_copy = MALLOC(sizeof(LDKPeeledOnion), "LDKPeeledOnion");
+       *ret_copy = PeeledOnion_forward(a_ref, b_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PeeledOnion_receive(int64_t a, int8_tArray b, int64_t c) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKParsedOnionMessageContents a_conv = *(LDKParsedOnionMessageContents*)(a_ptr);
+       a_conv = ParsedOnionMessageContents_clone((LDKParsedOnionMessageContents*)untag_ptr(a));
+       LDKThirtyTwoBytes b_ref;
+       CHECK(b->arr_len == 32);
+       memcpy(b_ref.data, b->elems, 32); FREE(b);
+       LDKBlindedPath 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 = BlindedPath_clone(&c_conv);
+       LDKPeeledOnion *ret_copy = MALLOC(sizeof(LDKPeeledOnion), "LDKPeeledOnion");
+       *ret_copy = PeeledOnion_receive(a_conv, b_ref, c_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_create_onion_message(int64_t entropy_source, int64_t node_signer, int64_t path, int64_t contents, int64_t reply_path) {
+       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;
+       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;
+       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);
+       if (contents_conv.free == LDKOnionMessageContents_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOnionMessageContents_JCalls_cloned(&contents_conv);
+       }
+       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_C2Tuple_PublicKeyOnionMessageZSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ), "LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ");
+       *ret_conv = create_onion_message(entropy_source_conv, node_signer_conv, path_conv, contents_conv, reply_path_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_peel_onion_message(int64_t msg, int64_t node_signer, int64_t logger, int64_t custom_handler) {
+       LDKOnionMessage 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);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       void* custom_handler_ptr = untag_ptr(custom_handler);
+       CHECK_ACCESS(custom_handler_ptr);
+       LDKCustomOnionMessageHandler custom_handler_conv = *(LDKCustomOnionMessageHandler*)(custom_handler_ptr);
+       if (custom_handler_conv.free == LDKCustomOnionMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKCustomOnionMessageHandler_JCalls_cloned(&custom_handler_conv);
+       }
+       LDKCResult_PeeledOnionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_PeeledOnionNoneZ), "LDKCResult_PeeledOnionNoneZ");
+       *ret_conv = peel_onion_message(&msg_conv, node_signer_conv, logger_conv, custom_handler_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_OnionMessenger_new(int64_t entropy_source, int64_t node_signer, int64_t logger, int64_t message_router, int64_t offers_handler, int64_t custom_handler) {
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       void* message_router_ptr = untag_ptr(message_router);
+       CHECK_ACCESS(message_router_ptr);
+       LDKMessageRouter message_router_conv = *(LDKMessageRouter*)(message_router_ptr);
+       if (message_router_conv.free == LDKMessageRouter_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKMessageRouter_JCalls_cloned(&message_router_conv);
+       }
+       void* offers_handler_ptr = untag_ptr(offers_handler);
+       CHECK_ACCESS(offers_handler_ptr);
+       LDKOffersMessageHandler offers_handler_conv = *(LDKOffersMessageHandler*)(offers_handler_ptr);
+       if (offers_handler_conv.free == LDKOffersMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOffersMessageHandler_JCalls_cloned(&offers_handler_conv);
+       }
+       void* custom_handler_ptr = untag_ptr(custom_handler);
+       CHECK_ACCESS(custom_handler_ptr);
+       LDKCustomOnionMessageHandler custom_handler_conv = *(LDKCustomOnionMessageHandler*)(custom_handler_ptr);
+       if (custom_handler_conv.free == LDKCustomOnionMessageHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKCustomOnionMessageHandler_JCalls_cloned(&custom_handler_conv);
+       }
+       LDKOnionMessenger ret_var = OnionMessenger_new(entropy_source_conv, node_signer_conv, logger_conv, message_router_conv, offers_handler_conv, custom_handler_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_OnionMessenger_send_onion_message(int64_t this_arg, int64_t path, int64_t contents, 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);
+       if (contents_conv.free == LDKOnionMessageContents_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOnionMessageContents_JCalls_cloned(&contents_conv);
+       }
+       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);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_OnionMessenger_as_OnionMessageHandler(int64_t this_arg) {
+       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;
+       LDKOnionMessageHandler* ret_ret = MALLOC(sizeof(LDKOnionMessageHandler), "LDKOnionMessageHandler");
+       *ret_ret = OnionMessenger_as_OnionMessageHandler(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_OffersMessageHandler_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);
+       LDKOffersMessageHandler this_ptr_conv = *(LDKOffersMessageHandler*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       OffersMessageHandler_free(this_ptr_conv);
+}
+
+void  CS_LDK_OffersMessage_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);
+       LDKOffersMessage this_ptr_conv = *(LDKOffersMessage*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       OffersMessage_free(this_ptr_conv);
+}
+
+static inline uint64_t OffersMessage_clone_ptr(LDKOffersMessage *NONNULL_PTR arg) {
+       LDKOffersMessage *ret_copy = MALLOC(sizeof(LDKOffersMessage), "LDKOffersMessage");
+       *ret_copy = OffersMessage_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_OffersMessage_clone_ptr(int64_t arg) {
+       LDKOffersMessage* arg_conv = (LDKOffersMessage*)untag_ptr(arg);
+       int64_t ret_conv = OffersMessage_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OffersMessage_clone(int64_t orig) {
+       LDKOffersMessage* orig_conv = (LDKOffersMessage*)untag_ptr(orig);
+       LDKOffersMessage *ret_copy = MALLOC(sizeof(LDKOffersMessage), "LDKOffersMessage");
+       *ret_copy = OffersMessage_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_OffersMessage_invoice_request(int64_t a) {
+       LDKInvoiceRequest 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 = InvoiceRequest_clone(&a_conv);
+       LDKOffersMessage *ret_copy = MALLOC(sizeof(LDKOffersMessage), "LDKOffersMessage");
+       *ret_copy = OffersMessage_invoice_request(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_OffersMessage_invoice(int64_t a) {
+       LDKBolt12Invoice 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 = Bolt12Invoice_clone(&a_conv);
+       LDKOffersMessage *ret_copy = MALLOC(sizeof(LDKOffersMessage), "LDKOffersMessage");
+       *ret_copy = OffersMessage_invoice(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_OffersMessage_invoice_error(int64_t a) {
+       LDKInvoiceError 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 = InvoiceError_clone(&a_conv);
+       LDKOffersMessage *ret_copy = MALLOC(sizeof(LDKOffersMessage), "LDKOffersMessage");
+       *ret_copy = OffersMessage_invoice_error(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_OffersMessage_is_known_type(int64_t tlv_type) {
+       jboolean ret_conv = OffersMessage_is_known_type(tlv_type);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_OffersMessage_write(int64_t obj) {
+       LDKOffersMessage* obj_conv = (LDKOffersMessage*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = OffersMessage_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_OffersMessage_read(int8_tArray ser, int64_t arg_a, int64_t arg_b) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       void* arg_b_ptr = untag_ptr(arg_b);
+       if (ptr_is_owned(arg_b)) { CHECK_ACCESS(arg_b_ptr); }
+       LDKLogger* arg_b_conv = (LDKLogger*)arg_b_ptr;
+       LDKCResult_OffersMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OffersMessageDecodeErrorZ), "LDKCResult_OffersMessageDecodeErrorZ");
+       *ret_conv = OffersMessage_read(ser_ref, arg_a, arg_b_conv);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_Packet_free(int64_t this_obj) {
+       LDKPacket 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);
+       Packet_free(this_obj_conv);
+}
+
+int8_t  CS_LDK_Packet_get_version(int64_t this_ptr) {
+       LDKPacket 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 = Packet_get_version(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Packet_set_version(int64_t this_ptr, int8_t val) {
+       LDKPacket 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;
+       Packet_set_version(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_Packet_get_public_key(int64_t this_ptr) {
+       LDKPacket 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, Packet_get_public_key(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_Packet_set_public_key(int64_t this_ptr, int8_tArray val) {
+       LDKPacket 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);
+       Packet_set_public_key(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_Packet_get_hop_data(int64_t this_ptr) {
+       LDKPacket 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 = Packet_get_hop_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_Packet_set_hop_data(int64_t this_ptr, int8_tArray val) {
+       LDKPacket 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);
+       Packet_set_hop_data(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_Packet_get_hmac(int64_t this_ptr) {
+       LDKPacket 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, *Packet_get_hmac(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_Packet_set_hmac(int64_t this_ptr, int8_tArray val) {
+       LDKPacket 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);
+       Packet_set_hmac(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_Packet_new(int8_t version_arg, int8_tArray public_key_arg, int8_tArray hop_data_arg, int8_tArray hmac_arg) {
+       LDKPublicKey public_key_arg_ref;
+       CHECK(public_key_arg->arr_len == 33);
+       memcpy(public_key_arg_ref.compressed_form, public_key_arg->elems, 33); FREE(public_key_arg);
+       LDKCVec_u8Z hop_data_arg_ref;
+       hop_data_arg_ref.datalen = hop_data_arg->arr_len;
+       hop_data_arg_ref.data = MALLOC(hop_data_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(hop_data_arg_ref.data, hop_data_arg->elems, hop_data_arg_ref.datalen); FREE(hop_data_arg);
+       LDKThirtyTwoBytes hmac_arg_ref;
+       CHECK(hmac_arg->arr_len == 32);
+       memcpy(hmac_arg_ref.data, hmac_arg->elems, 32); FREE(hmac_arg);
+       LDKPacket ret_var = Packet_new(version_arg, public_key_arg_ref, hop_data_arg_ref, hmac_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 Packet_clone_ptr(LDKPacket *NONNULL_PTR arg) {
+       LDKPacket ret_var = Packet_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_Packet_clone_ptr(int64_t arg) {
+       LDKPacket 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 = Packet_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Packet_clone(int64_t orig) {
+       LDKPacket 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;
+       LDKPacket ret_var = Packet_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_Packet_eq(int64_t a, int64_t b) {
+       LDKPacket 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;
+       LDKPacket 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 = Packet_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Packet_write(int64_t obj) {
+       LDKPacket 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 = Packet_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;
+}
+
+void  CS_LDK_ParsedOnionMessageContents_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);
+       LDKParsedOnionMessageContents this_ptr_conv = *(LDKParsedOnionMessageContents*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       ParsedOnionMessageContents_free(this_ptr_conv);
+}
+
+static inline uint64_t ParsedOnionMessageContents_clone_ptr(LDKParsedOnionMessageContents *NONNULL_PTR arg) {
+       LDKParsedOnionMessageContents *ret_copy = MALLOC(sizeof(LDKParsedOnionMessageContents), "LDKParsedOnionMessageContents");
+       *ret_copy = ParsedOnionMessageContents_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_ParsedOnionMessageContents_clone_ptr(int64_t arg) {
+       LDKParsedOnionMessageContents* arg_conv = (LDKParsedOnionMessageContents*)untag_ptr(arg);
+       int64_t ret_conv = ParsedOnionMessageContents_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ParsedOnionMessageContents_clone(int64_t orig) {
+       LDKParsedOnionMessageContents* orig_conv = (LDKParsedOnionMessageContents*)untag_ptr(orig);
+       LDKParsedOnionMessageContents *ret_copy = MALLOC(sizeof(LDKParsedOnionMessageContents), "LDKParsedOnionMessageContents");
+       *ret_copy = ParsedOnionMessageContents_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ParsedOnionMessageContents_offers(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKOffersMessage a_conv = *(LDKOffersMessage*)(a_ptr);
+       a_conv = OffersMessage_clone((LDKOffersMessage*)untag_ptr(a));
+       LDKParsedOnionMessageContents *ret_copy = MALLOC(sizeof(LDKParsedOnionMessageContents), "LDKParsedOnionMessageContents");
+       *ret_copy = ParsedOnionMessageContents_offers(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ParsedOnionMessageContents_custom(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKOnionMessageContents a_conv = *(LDKOnionMessageContents*)(a_ptr);
+       if (a_conv.free == LDKOnionMessageContents_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKOnionMessageContents_JCalls_cloned(&a_conv);
+       }
+       LDKParsedOnionMessageContents *ret_copy = MALLOC(sizeof(LDKParsedOnionMessageContents), "LDKParsedOnionMessageContents");
+       *ret_copy = ParsedOnionMessageContents_custom(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ParsedOnionMessageContents_as_OnionMessageContents(int64_t this_arg) {
+       LDKParsedOnionMessageContents* this_arg_conv = (LDKParsedOnionMessageContents*)untag_ptr(this_arg);
+       LDKOnionMessageContents* ret_ret = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
+       *ret_ret = ParsedOnionMessageContents_as_OnionMessageContents(this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+int8_tArray  CS_LDK_ParsedOnionMessageContents_write(int64_t obj) {
+       LDKParsedOnionMessageContents* obj_conv = (LDKParsedOnionMessageContents*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = ParsedOnionMessageContents_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;
+}
+
+static inline uint64_t OnionMessageContents_clone_ptr(LDKOnionMessageContents *NONNULL_PTR arg) {
+       LDKOnionMessageContents* ret_ret = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
+       *ret_ret = OnionMessageContents_clone(arg);
+       return tag_ptr(ret_ret, true);
+}
+int64_t  CS_LDK_OnionMessageContents_clone_ptr(int64_t arg) {
+       void* arg_ptr = untag_ptr(arg);
+       if (ptr_is_owned(arg)) { CHECK_ACCESS(arg_ptr); }
+       LDKOnionMessageContents* arg_conv = (LDKOnionMessageContents*)arg_ptr;
+       int64_t ret_conv = OnionMessageContents_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OnionMessageContents_clone(int64_t orig) {
+       void* orig_ptr = untag_ptr(orig);
+       if (ptr_is_owned(orig)) { CHECK_ACCESS(orig_ptr); }
+       LDKOnionMessageContents* orig_conv = (LDKOnionMessageContents*)orig_ptr;
+       LDKOnionMessageContents* ret_ret = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
+       *ret_ret = OnionMessageContents_clone(orig_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_OnionMessageContents_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);
+       LDKOnionMessageContents this_ptr_conv = *(LDKOnionMessageContents*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       OnionMessageContents_free(this_ptr_conv);
+}
+
+void  CS_LDK_BlindedPath_free(int64_t this_obj) {
+       LDKBlindedPath 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);
+       BlindedPath_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_BlindedPath_get_introduction_node_id(int64_t this_ptr) {
+       LDKBlindedPath 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, BlindedPath_get_introduction_node_id(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_BlindedPath_set_introduction_node_id(int64_t this_ptr, int8_tArray val) {
+       LDKBlindedPath 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);
+       BlindedPath_set_introduction_node_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_BlindedPath_get_blinding_point(int64_t this_ptr) {
+       LDKBlindedPath 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, BlindedPath_get_blinding_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_BlindedPath_set_blinding_point(int64_t this_ptr, int8_tArray val) {
+       LDKBlindedPath 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);
+       BlindedPath_set_blinding_point(&this_ptr_conv, val_ref);
+}
+
+int64_tArray  CS_LDK_BlindedPath_get_blinded_hops(int64_t this_ptr) {
+       LDKBlindedPath 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_BlindedHopZ ret_var = BlindedPath_get_blinded_hops(&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 m = 0; m < ret_var.datalen; m++) {
+               LDKBlindedHop ret_conv_12_var = ret_var.data[m];
+               int64_t ret_conv_12_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_12_var);
+               ret_conv_12_ref = tag_ptr(ret_conv_12_var.inner, ret_conv_12_var.is_owned);
+               ret_arr_ptr[m] = ret_conv_12_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_BlindedPath_set_blinded_hops(int64_t this_ptr, int64_tArray val) {
+       LDKBlindedPath 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_BlindedHopZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKBlindedHop), "LDKCVec_BlindedHopZ Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t m = 0; m < val_constr.datalen; m++) {
+               int64_t val_conv_12 = val_vals[m];
+               LDKBlindedHop val_conv_12_conv;
+               val_conv_12_conv.inner = untag_ptr(val_conv_12);
+               val_conv_12_conv.is_owned = ptr_is_owned(val_conv_12);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_12_conv);
+               val_conv_12_conv = BlindedHop_clone(&val_conv_12_conv);
+               val_constr.data[m] = val_conv_12_conv;
+       }
+       FREE(val);
+       BlindedPath_set_blinded_hops(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_BlindedPath_new(int8_tArray introduction_node_id_arg, int8_tArray blinding_point_arg, int64_tArray blinded_hops_arg) {
+       LDKPublicKey introduction_node_id_arg_ref;
+       CHECK(introduction_node_id_arg->arr_len == 33);
+       memcpy(introduction_node_id_arg_ref.compressed_form, introduction_node_id_arg->elems, 33); FREE(introduction_node_id_arg);
+       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);
+       LDKCVec_BlindedHopZ blinded_hops_arg_constr;
+       blinded_hops_arg_constr.datalen = blinded_hops_arg->arr_len;
+       if (blinded_hops_arg_constr.datalen > 0)
+               blinded_hops_arg_constr.data = MALLOC(blinded_hops_arg_constr.datalen * sizeof(LDKBlindedHop), "LDKCVec_BlindedHopZ Elements");
+       else
+               blinded_hops_arg_constr.data = NULL;
+       int64_t* blinded_hops_arg_vals = blinded_hops_arg->elems;
+       for (size_t m = 0; m < blinded_hops_arg_constr.datalen; m++) {
+               int64_t blinded_hops_arg_conv_12 = blinded_hops_arg_vals[m];
+               LDKBlindedHop blinded_hops_arg_conv_12_conv;
+               blinded_hops_arg_conv_12_conv.inner = untag_ptr(blinded_hops_arg_conv_12);
+               blinded_hops_arg_conv_12_conv.is_owned = ptr_is_owned(blinded_hops_arg_conv_12);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(blinded_hops_arg_conv_12_conv);
+               blinded_hops_arg_conv_12_conv = BlindedHop_clone(&blinded_hops_arg_conv_12_conv);
+               blinded_hops_arg_constr.data[m] = blinded_hops_arg_conv_12_conv;
+       }
+       FREE(blinded_hops_arg);
+       LDKBlindedPath ret_var = BlindedPath_new(introduction_node_id_arg_ref, blinding_point_arg_ref, blinded_hops_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);
+       return ret_ref;
+}
+
+static inline uint64_t BlindedPath_clone_ptr(LDKBlindedPath *NONNULL_PTR arg) {
+       LDKBlindedPath ret_var = BlindedPath_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_BlindedPath_clone_ptr(int64_t arg) {
+       LDKBlindedPath 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 = BlindedPath_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedPath_clone(int64_t orig) {
+       LDKBlindedPath 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;
+       LDKBlindedPath ret_var = BlindedPath_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_BlindedPath_hash(int64_t o) {
+       LDKBlindedPath 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 = BlindedPath_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BlindedPath_eq(int64_t a, int64_t b) {
+       LDKBlindedPath 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;
+       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.is_owned = false;
+       jboolean ret_conv = BlindedPath_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedHop_free(int64_t this_obj) {
+       LDKBlindedHop 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);
+       BlindedHop_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_BlindedHop_get_blinded_node_id(int64_t this_ptr) {
+       LDKBlindedHop 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, BlindedHop_get_blinded_node_id(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_BlindedHop_set_blinded_node_id(int64_t this_ptr, int8_tArray val) {
+       LDKBlindedHop 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);
+       BlindedHop_set_blinded_node_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_BlindedHop_get_encrypted_payload(int64_t this_ptr) {
+       LDKBlindedHop 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 = BlindedHop_get_encrypted_payload(&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_BlindedHop_set_encrypted_payload(int64_t this_ptr, int8_tArray val) {
+       LDKBlindedHop 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);
+       BlindedHop_set_encrypted_payload(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_BlindedHop_new(int8_tArray blinded_node_id_arg, int8_tArray encrypted_payload_arg) {
+       LDKPublicKey blinded_node_id_arg_ref;
+       CHECK(blinded_node_id_arg->arr_len == 33);
+       memcpy(blinded_node_id_arg_ref.compressed_form, blinded_node_id_arg->elems, 33); FREE(blinded_node_id_arg);
+       LDKCVec_u8Z encrypted_payload_arg_ref;
+       encrypted_payload_arg_ref.datalen = encrypted_payload_arg->arr_len;
+       encrypted_payload_arg_ref.data = MALLOC(encrypted_payload_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(encrypted_payload_arg_ref.data, encrypted_payload_arg->elems, encrypted_payload_arg_ref.datalen); FREE(encrypted_payload_arg);
+       LDKBlindedHop ret_var = BlindedHop_new(blinded_node_id_arg_ref, encrypted_payload_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 BlindedHop_clone_ptr(LDKBlindedHop *NONNULL_PTR arg) {
+       LDKBlindedHop ret_var = BlindedHop_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_BlindedHop_clone_ptr(int64_t arg) {
+       LDKBlindedHop 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 = BlindedHop_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedHop_clone(int64_t orig) {
+       LDKBlindedHop 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;
+       LDKBlindedHop ret_var = BlindedHop_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_BlindedHop_hash(int64_t o) {
+       LDKBlindedHop 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 = BlindedHop_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BlindedHop_eq(int64_t a, int64_t b) {
+       LDKBlindedHop 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;
+       LDKBlindedHop 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 = BlindedHop_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedPath_one_hop_for_message(int8_tArray recipient_node_id, int64_t entropy_source) {
+       LDKPublicKey recipient_node_id_ref;
+       CHECK(recipient_node_id->arr_len == 33);
+       memcpy(recipient_node_id_ref.compressed_form, recipient_node_id->elems, 33); FREE(recipient_node_id);
+       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_BlindedPathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathNoneZ), "LDKCResult_BlindedPathNoneZ");
+       *ret_conv = BlindedPath_one_hop_for_message(recipient_node_id_ref, entropy_source_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_BlindedPath_new_for_message(ptrArray node_pks, int64_t entropy_source) {
+       LDKCVec_PublicKeyZ node_pks_constr;
+       node_pks_constr.datalen = node_pks->arr_len;
+       if (node_pks_constr.datalen > 0)
+               node_pks_constr.data = MALLOC(node_pks_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
+       else
+               node_pks_constr.data = NULL;
+       int8_tArray* node_pks_vals = (void*) node_pks->elems;
+       for (size_t i = 0; i < node_pks_constr.datalen; i++) {
+               int8_tArray node_pks_conv_8 = node_pks_vals[i];
+               LDKPublicKey node_pks_conv_8_ref;
+               CHECK(node_pks_conv_8->arr_len == 33);
+               memcpy(node_pks_conv_8_ref.compressed_form, node_pks_conv_8->elems, 33); FREE(node_pks_conv_8);
+               node_pks_constr.data[i] = node_pks_conv_8_ref;
+       }
+       FREE(node_pks);
+       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_BlindedPathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathNoneZ), "LDKCResult_BlindedPathNoneZ");
+       *ret_conv = BlindedPath_new_for_message(node_pks_constr, entropy_source_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_BlindedPath_one_hop_for_payment(int8_tArray payee_node_id, int64_t payee_tlvs, int64_t entropy_source) {
+       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_one_hop_for_payment(payee_node_id_ref, payee_tlvs_conv, 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);
+       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 = BlindedPath_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_BlindedPath_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BlindedPathDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedPathDecodeErrorZ), "LDKCResult_BlindedPathDecodeErrorZ");
+       *ret_conv = BlindedPath_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_BlindedHop_write(int64_t obj) {
+       LDKBlindedHop 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 = BlindedHop_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_BlindedHop_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BlindedHopDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedHopDecodeErrorZ), "LDKCResult_BlindedHopDecodeErrorZ");
+       *ret_conv = BlindedHop_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ForwardNode_free(int64_t this_obj) {
+       LDKForwardNode 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);
+       ForwardNode_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ForwardNode_get_tlvs(int64_t this_ptr) {
+       LDKForwardNode 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;
+       LDKForwardTlvs ret_var = ForwardNode_get_tlvs(&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_ForwardNode_set_tlvs(int64_t this_ptr, int64_t val) {
+       LDKForwardNode 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;
+       LDKForwardTlvs 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 = ForwardTlvs_clone(&val_conv);
+       ForwardNode_set_tlvs(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_ForwardNode_get_node_id(int64_t this_ptr) {
+       LDKForwardNode 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, ForwardNode_get_node_id(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_ForwardNode_set_node_id(int64_t this_ptr, int8_tArray val) {
+       LDKForwardNode 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);
+       ForwardNode_set_node_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ForwardNode_get_htlc_maximum_msat(int64_t this_ptr) {
+       LDKForwardNode 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 = ForwardNode_get_htlc_maximum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ForwardNode_set_htlc_maximum_msat(int64_t this_ptr, int64_t val) {
+       LDKForwardNode 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;
+       ForwardNode_set_htlc_maximum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ForwardNode_new(int64_t tlvs_arg, int8_tArray node_id_arg, int64_t htlc_maximum_msat_arg) {
+       LDKForwardTlvs tlvs_arg_conv;
+       tlvs_arg_conv.inner = untag_ptr(tlvs_arg);
+       tlvs_arg_conv.is_owned = ptr_is_owned(tlvs_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(tlvs_arg_conv);
+       tlvs_arg_conv = ForwardTlvs_clone(&tlvs_arg_conv);
+       LDKPublicKey node_id_arg_ref;
+       CHECK(node_id_arg->arr_len == 33);
+       memcpy(node_id_arg_ref.compressed_form, node_id_arg->elems, 33); FREE(node_id_arg);
+       LDKForwardNode ret_var = ForwardNode_new(tlvs_arg_conv, node_id_arg_ref, htlc_maximum_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 ForwardNode_clone_ptr(LDKForwardNode *NONNULL_PTR arg) {
+       LDKForwardNode ret_var = ForwardNode_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_ForwardNode_clone_ptr(int64_t arg) {
+       LDKForwardNode 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 = ForwardNode_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ForwardNode_clone(int64_t orig) {
+       LDKForwardNode 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;
+       LDKForwardNode ret_var = ForwardNode_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_ForwardTlvs_free(int64_t this_obj) {
+       LDKForwardTlvs 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);
+       ForwardTlvs_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_ForwardTlvs_get_short_channel_id(int64_t this_ptr) {
+       LDKForwardTlvs 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 = ForwardTlvs_get_short_channel_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ForwardTlvs_set_short_channel_id(int64_t this_ptr, int64_t val) {
+       LDKForwardTlvs 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;
+       ForwardTlvs_set_short_channel_id(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ForwardTlvs_get_payment_relay(int64_t this_ptr) {
+       LDKForwardTlvs 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;
+       LDKPaymentRelay ret_var = ForwardTlvs_get_payment_relay(&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_ForwardTlvs_set_payment_relay(int64_t this_ptr, int64_t val) {
+       LDKForwardTlvs 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;
+       LDKPaymentRelay 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 = PaymentRelay_clone(&val_conv);
+       ForwardTlvs_set_payment_relay(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ForwardTlvs_get_payment_constraints(int64_t this_ptr) {
+       LDKForwardTlvs 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;
+       LDKPaymentConstraints ret_var = ForwardTlvs_get_payment_constraints(&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_ForwardTlvs_set_payment_constraints(int64_t this_ptr, int64_t val) {
+       LDKForwardTlvs 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;
+       LDKPaymentConstraints 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 = PaymentConstraints_clone(&val_conv);
+       ForwardTlvs_set_payment_constraints(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ForwardTlvs_get_features(int64_t this_ptr) {
+       LDKForwardTlvs 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;
+       LDKBlindedHopFeatures ret_var = ForwardTlvs_get_features(&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_ForwardTlvs_set_features(int64_t this_ptr, int64_t val) {
+       LDKForwardTlvs 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;
+       LDKBlindedHopFeatures 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 = BlindedHopFeatures_clone(&val_conv);
+       ForwardTlvs_set_features(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ForwardTlvs_new(int64_t short_channel_id_arg, int64_t payment_relay_arg, int64_t payment_constraints_arg, int64_t features_arg) {
+       LDKPaymentRelay payment_relay_arg_conv;
+       payment_relay_arg_conv.inner = untag_ptr(payment_relay_arg);
+       payment_relay_arg_conv.is_owned = ptr_is_owned(payment_relay_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_relay_arg_conv);
+       payment_relay_arg_conv = PaymentRelay_clone(&payment_relay_arg_conv);
+       LDKPaymentConstraints payment_constraints_arg_conv;
+       payment_constraints_arg_conv.inner = untag_ptr(payment_constraints_arg);
+       payment_constraints_arg_conv.is_owned = ptr_is_owned(payment_constraints_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_constraints_arg_conv);
+       payment_constraints_arg_conv = PaymentConstraints_clone(&payment_constraints_arg_conv);
+       LDKBlindedHopFeatures features_arg_conv;
+       features_arg_conv.inner = untag_ptr(features_arg);
+       features_arg_conv.is_owned = ptr_is_owned(features_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(features_arg_conv);
+       features_arg_conv = BlindedHopFeatures_clone(&features_arg_conv);
+       LDKForwardTlvs ret_var = ForwardTlvs_new(short_channel_id_arg, payment_relay_arg_conv, payment_constraints_arg_conv, features_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 ForwardTlvs_clone_ptr(LDKForwardTlvs *NONNULL_PTR arg) {
+       LDKForwardTlvs ret_var = ForwardTlvs_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_ForwardTlvs_clone_ptr(int64_t arg) {
+       LDKForwardTlvs 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 = ForwardTlvs_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ForwardTlvs_clone(int64_t orig) {
+       LDKForwardTlvs 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;
+       LDKForwardTlvs ret_var = ForwardTlvs_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_ReceiveTlvs_free(int64_t this_obj) {
+       LDKReceiveTlvs 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);
+       ReceiveTlvs_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ReceiveTlvs_get_payment_secret(int64_t this_ptr) {
+       LDKReceiveTlvs 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, *ReceiveTlvs_get_payment_secret(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ReceiveTlvs_set_payment_secret(int64_t this_ptr, int8_tArray val) {
+       LDKReceiveTlvs 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);
+       ReceiveTlvs_set_payment_secret(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_ReceiveTlvs_get_payment_constraints(int64_t this_ptr) {
+       LDKReceiveTlvs 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;
+       LDKPaymentConstraints ret_var = ReceiveTlvs_get_payment_constraints(&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_ReceiveTlvs_set_payment_constraints(int64_t this_ptr, int64_t val) {
+       LDKReceiveTlvs 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;
+       LDKPaymentConstraints 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 = PaymentConstraints_clone(&val_conv);
+       ReceiveTlvs_set_payment_constraints(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_ReceiveTlvs_new(int8_tArray payment_secret_arg, int64_t payment_constraints_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);
+       LDKPaymentConstraints payment_constraints_arg_conv;
+       payment_constraints_arg_conv.inner = untag_ptr(payment_constraints_arg);
+       payment_constraints_arg_conv.is_owned = ptr_is_owned(payment_constraints_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_constraints_arg_conv);
+       payment_constraints_arg_conv = PaymentConstraints_clone(&payment_constraints_arg_conv);
+       LDKReceiveTlvs ret_var = ReceiveTlvs_new(payment_secret_arg_ref, payment_constraints_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 ReceiveTlvs_clone_ptr(LDKReceiveTlvs *NONNULL_PTR arg) {
+       LDKReceiveTlvs ret_var = ReceiveTlvs_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_ReceiveTlvs_clone_ptr(int64_t arg) {
+       LDKReceiveTlvs 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 = ReceiveTlvs_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ReceiveTlvs_clone(int64_t orig) {
+       LDKReceiveTlvs 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;
+       LDKReceiveTlvs ret_var = ReceiveTlvs_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_PaymentRelay_free(int64_t this_obj) {
+       LDKPaymentRelay 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);
+       PaymentRelay_free(this_obj_conv);
+}
+
+int16_t  CS_LDK_PaymentRelay_get_cltv_expiry_delta(int64_t this_ptr) {
+       LDKPaymentRelay 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 = PaymentRelay_get_cltv_expiry_delta(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentRelay_set_cltv_expiry_delta(int64_t this_ptr, int16_t val) {
+       LDKPaymentRelay 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;
+       PaymentRelay_set_cltv_expiry_delta(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_PaymentRelay_get_fee_proportional_millionths(int64_t this_ptr) {
+       LDKPaymentRelay 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 = PaymentRelay_get_fee_proportional_millionths(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentRelay_set_fee_proportional_millionths(int64_t this_ptr, int32_t val) {
+       LDKPaymentRelay 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;
+       PaymentRelay_set_fee_proportional_millionths(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_PaymentRelay_get_fee_base_msat(int64_t this_ptr) {
+       LDKPaymentRelay 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 = PaymentRelay_get_fee_base_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentRelay_set_fee_base_msat(int64_t this_ptr, int32_t val) {
+       LDKPaymentRelay 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;
+       PaymentRelay_set_fee_base_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_PaymentRelay_new(int16_t cltv_expiry_delta_arg, int32_t fee_proportional_millionths_arg, int32_t fee_base_msat_arg) {
+       LDKPaymentRelay ret_var = PaymentRelay_new(cltv_expiry_delta_arg, fee_proportional_millionths_arg, fee_base_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 PaymentRelay_clone_ptr(LDKPaymentRelay *NONNULL_PTR arg) {
+       LDKPaymentRelay ret_var = PaymentRelay_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_PaymentRelay_clone_ptr(int64_t arg) {
+       LDKPaymentRelay 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 = PaymentRelay_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PaymentRelay_clone(int64_t orig) {
+       LDKPaymentRelay 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;
+       LDKPaymentRelay ret_var = PaymentRelay_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_PaymentConstraints_free(int64_t this_obj) {
+       LDKPaymentConstraints 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);
+       PaymentConstraints_free(this_obj_conv);
+}
+
+int32_t  CS_LDK_PaymentConstraints_get_max_cltv_expiry(int64_t this_ptr) {
+       LDKPaymentConstraints 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 = PaymentConstraints_get_max_cltv_expiry(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentConstraints_set_max_cltv_expiry(int64_t this_ptr, int32_t val) {
+       LDKPaymentConstraints 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;
+       PaymentConstraints_set_max_cltv_expiry(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_PaymentConstraints_get_htlc_minimum_msat(int64_t this_ptr) {
+       LDKPaymentConstraints 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 = PaymentConstraints_get_htlc_minimum_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PaymentConstraints_set_htlc_minimum_msat(int64_t this_ptr, int64_t val) {
+       LDKPaymentConstraints 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;
+       PaymentConstraints_set_htlc_minimum_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_PaymentConstraints_new(int32_t max_cltv_expiry_arg, int64_t htlc_minimum_msat_arg) {
+       LDKPaymentConstraints ret_var = PaymentConstraints_new(max_cltv_expiry_arg, htlc_minimum_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 PaymentConstraints_clone_ptr(LDKPaymentConstraints *NONNULL_PTR arg) {
+       LDKPaymentConstraints ret_var = PaymentConstraints_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_PaymentConstraints_clone_ptr(int64_t arg) {
+       LDKPaymentConstraints 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 = PaymentConstraints_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PaymentConstraints_clone(int64_t orig) {
+       LDKPaymentConstraints 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;
+       LDKPaymentConstraints ret_var = PaymentConstraints_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_ForwardTlvs_write(int64_t obj) {
+       LDKForwardTlvs 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 = ForwardTlvs_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;
+}
+
+int8_tArray  CS_LDK_ReceiveTlvs_write(int64_t obj) {
+       LDKReceiveTlvs 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 = ReceiveTlvs_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_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);
+       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 = PaymentRelay_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_PaymentRelay_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PaymentRelayDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentRelayDecodeErrorZ), "LDKCResult_PaymentRelayDecodeErrorZ");
+       *ret_conv = PaymentRelay_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_PaymentConstraints_write(int64_t obj) {
+       LDKPaymentConstraints 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 = PaymentConstraints_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_PaymentConstraints_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PaymentConstraintsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentConstraintsDecodeErrorZ), "LDKCResult_PaymentConstraintsDecodeErrorZ");
+       *ret_conv = PaymentConstraints_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_PaymentPurpose_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);
+       LDKPaymentPurpose this_ptr_conv = *(LDKPaymentPurpose*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       PaymentPurpose_free(this_ptr_conv);
+}
+
+static inline uint64_t PaymentPurpose_clone_ptr(LDKPaymentPurpose *NONNULL_PTR arg) {
+       LDKPaymentPurpose *ret_copy = MALLOC(sizeof(LDKPaymentPurpose), "LDKPaymentPurpose");
+       *ret_copy = PaymentPurpose_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_PaymentPurpose_clone_ptr(int64_t arg) {
+       LDKPaymentPurpose* arg_conv = (LDKPaymentPurpose*)untag_ptr(arg);
+       int64_t ret_conv = PaymentPurpose_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PaymentPurpose_clone(int64_t orig) {
+       LDKPaymentPurpose* orig_conv = (LDKPaymentPurpose*)untag_ptr(orig);
+       LDKPaymentPurpose *ret_copy = MALLOC(sizeof(LDKPaymentPurpose), "LDKPaymentPurpose");
+       *ret_copy = PaymentPurpose_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PaymentPurpose_invoice_payment(int64_t payment_preimage, int8_tArray payment_secret) {
+       void* payment_preimage_ptr = untag_ptr(payment_preimage);
+       CHECK_ACCESS(payment_preimage_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_preimage_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_preimage_ptr);
+       payment_preimage_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_preimage));
+       LDKThirtyTwoBytes payment_secret_ref;
+       CHECK(payment_secret->arr_len == 32);
+       memcpy(payment_secret_ref.data, payment_secret->elems, 32); FREE(payment_secret);
+       LDKPaymentPurpose *ret_copy = MALLOC(sizeof(LDKPaymentPurpose), "LDKPaymentPurpose");
+       *ret_copy = PaymentPurpose_invoice_payment(payment_preimage_conv, payment_secret_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PaymentPurpose_spontaneous_payment(int8_tArray a) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKPaymentPurpose *ret_copy = MALLOC(sizeof(LDKPaymentPurpose), "LDKPaymentPurpose");
+       *ret_copy = PaymentPurpose_spontaneous_payment(a_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_PaymentPurpose_eq(int64_t a, int64_t b) {
+       LDKPaymentPurpose* a_conv = (LDKPaymentPurpose*)untag_ptr(a);
+       LDKPaymentPurpose* b_conv = (LDKPaymentPurpose*)untag_ptr(b);
+       jboolean ret_conv = PaymentPurpose_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_PaymentPurpose_write(int64_t obj) {
+       LDKPaymentPurpose* obj_conv = (LDKPaymentPurpose*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = PaymentPurpose_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_PaymentPurpose_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PaymentPurposeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentPurposeDecodeErrorZ), "LDKCResult_PaymentPurposeDecodeErrorZ");
+       *ret_conv = PaymentPurpose_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ClaimedHTLC_free(int64_t this_obj) {
+       LDKClaimedHTLC 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);
+       ClaimedHTLC_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_ClaimedHTLC_get_channel_id(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;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *ClaimedHTLC_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_ClaimedHTLC_set_channel_id(int64_t this_ptr, int8_tArray 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;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       ClaimedHTLC_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_ClaimedHTLC_get_user_channel_id(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;
+       int8_tArray ret_arr = init_int8_tArray(16, __LINE__);
+       memcpy(ret_arr->elems, ClaimedHTLC_get_user_channel_id(&this_ptr_conv).le_bytes, 16);
+       return ret_arr;
+}
+
+void  CS_LDK_ClaimedHTLC_set_user_channel_id(int64_t this_ptr, int8_tArray 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;
+       LDKU128 val_ref;
+       CHECK(val->arr_len == 16);
+       memcpy(val_ref.le_bytes, val->elems, 16); FREE(val);
+       ClaimedHTLC_set_user_channel_id(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_ClaimedHTLC_get_cltv_expiry(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;
+       int32_t ret_conv = ClaimedHTLC_get_cltv_expiry(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ClaimedHTLC_set_cltv_expiry(int64_t this_ptr, int32_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_cltv_expiry(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ClaimedHTLC_get_value_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_value_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ClaimedHTLC_set_value_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_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) {
+       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);
+       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 ClaimedHTLC_clone_ptr(LDKClaimedHTLC *NONNULL_PTR arg) {
+       LDKClaimedHTLC ret_var = ClaimedHTLC_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_ClaimedHTLC_clone_ptr(int64_t arg) {
+       LDKClaimedHTLC 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 = ClaimedHTLC_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ClaimedHTLC_clone(int64_t orig) {
+       LDKClaimedHTLC 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;
+       LDKClaimedHTLC ret_var = ClaimedHTLC_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_ClaimedHTLC_eq(int64_t a, int64_t b) {
+       LDKClaimedHTLC 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;
+       LDKClaimedHTLC 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 = ClaimedHTLC_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_ClaimedHTLC_write(int64_t obj) {
+       LDKClaimedHTLC 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 = ClaimedHTLC_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_ClaimedHTLC_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_ClaimedHTLCDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ClaimedHTLCDecodeErrorZ), "LDKCResult_ClaimedHTLCDecodeErrorZ");
+       *ret_conv = ClaimedHTLC_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_PathFailure_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);
+       LDKPathFailure this_ptr_conv = *(LDKPathFailure*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       PathFailure_free(this_ptr_conv);
+}
+
+static inline uint64_t PathFailure_clone_ptr(LDKPathFailure *NONNULL_PTR arg) {
+       LDKPathFailure *ret_copy = MALLOC(sizeof(LDKPathFailure), "LDKPathFailure");
+       *ret_copy = PathFailure_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_PathFailure_clone_ptr(int64_t arg) {
+       LDKPathFailure* arg_conv = (LDKPathFailure*)untag_ptr(arg);
+       int64_t ret_conv = PathFailure_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PathFailure_clone(int64_t orig) {
+       LDKPathFailure* orig_conv = (LDKPathFailure*)untag_ptr(orig);
+       LDKPathFailure *ret_copy = MALLOC(sizeof(LDKPathFailure), "LDKPathFailure");
+       *ret_copy = PathFailure_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PathFailure_initial_send(int64_t err) {
+       void* err_ptr = untag_ptr(err);
+       CHECK_ACCESS(err_ptr);
+       LDKAPIError err_conv = *(LDKAPIError*)(err_ptr);
+       err_conv = APIError_clone((LDKAPIError*)untag_ptr(err));
+       LDKPathFailure *ret_copy = MALLOC(sizeof(LDKPathFailure), "LDKPathFailure");
+       *ret_copy = PathFailure_initial_send(err_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PathFailure_on_path(int64_t network_update) {
+       void* network_update_ptr = untag_ptr(network_update);
+       CHECK_ACCESS(network_update_ptr);
+       LDKCOption_NetworkUpdateZ network_update_conv = *(LDKCOption_NetworkUpdateZ*)(network_update_ptr);
+       network_update_conv = COption_NetworkUpdateZ_clone((LDKCOption_NetworkUpdateZ*)untag_ptr(network_update));
+       LDKPathFailure *ret_copy = MALLOC(sizeof(LDKPathFailure), "LDKPathFailure");
+       *ret_copy = PathFailure_on_path(network_update_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_PathFailure_eq(int64_t a, int64_t b) {
+       LDKPathFailure* a_conv = (LDKPathFailure*)untag_ptr(a);
+       LDKPathFailure* b_conv = (LDKPathFailure*)untag_ptr(b);
+       jboolean ret_conv = PathFailure_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_PathFailure_write(int64_t obj) {
+       LDKPathFailure* obj_conv = (LDKPathFailure*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = PathFailure_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_PathFailure_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_COption_PathFailureZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_PathFailureZDecodeErrorZ), "LDKCResult_COption_PathFailureZDecodeErrorZ");
+       *ret_conv = PathFailure_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_ClosureReason_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);
+       LDKClosureReason this_ptr_conv = *(LDKClosureReason*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       ClosureReason_free(this_ptr_conv);
+}
+
+static inline uint64_t ClosureReason_clone_ptr(LDKClosureReason *NONNULL_PTR arg) {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_ClosureReason_clone_ptr(int64_t arg) {
+       LDKClosureReason* arg_conv = (LDKClosureReason*)untag_ptr(arg);
+       int64_t ret_conv = ClosureReason_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ClosureReason_clone(int64_t orig) {
+       LDKClosureReason* orig_conv = (LDKClosureReason*)untag_ptr(orig);
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_counterparty_force_closed(int64_t peer_msg) {
+       LDKUntrustedString peer_msg_conv;
+       peer_msg_conv.inner = untag_ptr(peer_msg);
+       peer_msg_conv.is_owned = ptr_is_owned(peer_msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(peer_msg_conv);
+       peer_msg_conv = UntrustedString_clone(&peer_msg_conv);
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_counterparty_force_closed(peer_msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_holder_force_closed() {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_holder_force_closed();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_cooperative_closure() {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_cooperative_closure();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_commitment_tx_confirmed() {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_commitment_tx_confirmed();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_funding_timed_out() {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_funding_timed_out();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_processing_error(jstring err) {
+       LDKStr err_conv = str_ref_to_owned_c(err);
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_processing_error(err_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_disconnected_peer() {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_disconnected_peer();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_outdated_channel_manager() {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_outdated_channel_manager();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_counterparty_coop_closed_unfunded_channel() {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_counterparty_coop_closed_unfunded_channel();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ClosureReason_funding_batch_closure() {
+       LDKClosureReason *ret_copy = MALLOC(sizeof(LDKClosureReason), "LDKClosureReason");
+       *ret_copy = ClosureReason_funding_batch_closure();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_ClosureReason_eq(int64_t a, int64_t b) {
+       LDKClosureReason* a_conv = (LDKClosureReason*)untag_ptr(a);
+       LDKClosureReason* b_conv = (LDKClosureReason*)untag_ptr(b);
+       jboolean ret_conv = ClosureReason_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_ClosureReason_write(int64_t obj) {
+       LDKClosureReason* obj_conv = (LDKClosureReason*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = ClosureReason_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_ClosureReason_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_COption_ClosureReasonZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_ClosureReasonZDecodeErrorZ), "LDKCResult_COption_ClosureReasonZDecodeErrorZ");
+       *ret_conv = ClosureReason_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_HTLCDestination_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);
+       LDKHTLCDestination this_ptr_conv = *(LDKHTLCDestination*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       HTLCDestination_free(this_ptr_conv);
+}
+
+static inline uint64_t HTLCDestination_clone_ptr(LDKHTLCDestination *NONNULL_PTR arg) {
+       LDKHTLCDestination *ret_copy = MALLOC(sizeof(LDKHTLCDestination), "LDKHTLCDestination");
+       *ret_copy = HTLCDestination_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_HTLCDestination_clone_ptr(int64_t arg) {
+       LDKHTLCDestination* arg_conv = (LDKHTLCDestination*)untag_ptr(arg);
+       int64_t ret_conv = HTLCDestination_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_HTLCDestination_clone(int64_t orig) {
+       LDKHTLCDestination* orig_conv = (LDKHTLCDestination*)untag_ptr(orig);
+       LDKHTLCDestination *ret_copy = MALLOC(sizeof(LDKHTLCDestination), "LDKHTLCDestination");
+       *ret_copy = HTLCDestination_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_HTLCDestination_next_hop_channel(int8_tArray node_id, int8_tArray channel_id) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKThirtyTwoBytes channel_id_ref;
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_ref.data, channel_id->elems, 32); FREE(channel_id);
+       LDKHTLCDestination *ret_copy = MALLOC(sizeof(LDKHTLCDestination), "LDKHTLCDestination");
+       *ret_copy = HTLCDestination_next_hop_channel(node_id_ref, channel_id_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_HTLCDestination_unknown_next_hop(int64_t requested_forward_scid) {
+       LDKHTLCDestination *ret_copy = MALLOC(sizeof(LDKHTLCDestination), "LDKHTLCDestination");
+       *ret_copy = HTLCDestination_unknown_next_hop(requested_forward_scid);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_HTLCDestination_invalid_forward(int64_t requested_forward_scid) {
+       LDKHTLCDestination *ret_copy = MALLOC(sizeof(LDKHTLCDestination), "LDKHTLCDestination");
+       *ret_copy = HTLCDestination_invalid_forward(requested_forward_scid);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_HTLCDestination_failed_payment(int8_tArray payment_hash) {
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKHTLCDestination *ret_copy = MALLOC(sizeof(LDKHTLCDestination), "LDKHTLCDestination");
+       *ret_copy = HTLCDestination_failed_payment(payment_hash_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_HTLCDestination_eq(int64_t a, int64_t b) {
+       LDKHTLCDestination* a_conv = (LDKHTLCDestination*)untag_ptr(a);
+       LDKHTLCDestination* b_conv = (LDKHTLCDestination*)untag_ptr(b);
+       jboolean ret_conv = HTLCDestination_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_HTLCDestination_write(int64_t obj) {
+       LDKHTLCDestination* obj_conv = (LDKHTLCDestination*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = HTLCDestination_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_HTLCDestination_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_COption_HTLCDestinationZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_HTLCDestinationZDecodeErrorZ), "LDKCResult_COption_HTLCDestinationZDecodeErrorZ");
+       *ret_conv = HTLCDestination_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int32_t  CS_LDK_PaymentFailureReason_clone(int64_t orig) {
+       LDKPaymentFailureReason* orig_conv = (LDKPaymentFailureReason*)untag_ptr(orig);
+       int32_t ret_conv = LDKPaymentFailureReason_to_cs(PaymentFailureReason_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_PaymentFailureReason_recipient_rejected() {
+       int32_t ret_conv = LDKPaymentFailureReason_to_cs(PaymentFailureReason_recipient_rejected());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_PaymentFailureReason_user_abandoned() {
+       int32_t ret_conv = LDKPaymentFailureReason_to_cs(PaymentFailureReason_user_abandoned());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_PaymentFailureReason_retries_exhausted() {
+       int32_t ret_conv = LDKPaymentFailureReason_to_cs(PaymentFailureReason_retries_exhausted());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_PaymentFailureReason_payment_expired() {
+       int32_t ret_conv = LDKPaymentFailureReason_to_cs(PaymentFailureReason_payment_expired());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_PaymentFailureReason_route_not_found() {
+       int32_t ret_conv = LDKPaymentFailureReason_to_cs(PaymentFailureReason_route_not_found());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_PaymentFailureReason_unexpected_error() {
+       int32_t ret_conv = LDKPaymentFailureReason_to_cs(PaymentFailureReason_unexpected_error());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_PaymentFailureReason_eq(int64_t a, int64_t b) {
+       LDKPaymentFailureReason* a_conv = (LDKPaymentFailureReason*)untag_ptr(a);
+       LDKPaymentFailureReason* b_conv = (LDKPaymentFailureReason*)untag_ptr(b);
+       jboolean ret_conv = PaymentFailureReason_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_PaymentFailureReason_write(int64_t obj) {
+       LDKPaymentFailureReason* obj_conv = (LDKPaymentFailureReason*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = PaymentFailureReason_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_PaymentFailureReason_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PaymentFailureReasonDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PaymentFailureReasonDecodeErrorZ), "LDKCResult_PaymentFailureReasonDecodeErrorZ");
+       *ret_conv = PaymentFailureReason_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_Event_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);
+       LDKEvent this_ptr_conv = *(LDKEvent*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Event_free(this_ptr_conv);
+}
+
+static inline uint64_t Event_clone_ptr(LDKEvent *NONNULL_PTR arg) {
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_Event_clone_ptr(int64_t arg) {
+       LDKEvent* arg_conv = (LDKEvent*)untag_ptr(arg);
+       int64_t ret_conv = Event_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Event_clone(int64_t orig) {
+       LDKEvent* orig_conv = (LDKEvent*)untag_ptr(orig);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_funding_generation_ready(int8_tArray temporary_channel_id, int8_tArray counterparty_node_id, int64_t channel_value_satoshis, int8_tArray output_script, int8_tArray user_channel_id) {
+       LDKThirtyTwoBytes temporary_channel_id_ref;
+       CHECK(temporary_channel_id->arr_len == 32);
+       memcpy(temporary_channel_id_ref.data, temporary_channel_id->elems, 32); FREE(temporary_channel_id);
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKCVec_u8Z output_script_ref;
+       output_script_ref.datalen = output_script->arr_len;
+       output_script_ref.data = MALLOC(output_script_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(output_script_ref.data, output_script->elems, output_script_ref.datalen); FREE(output_script);
+       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);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_funding_generation_ready(temporary_channel_id_ref, counterparty_node_id_ref, channel_value_satoshis, output_script_ref, user_channel_id_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_payment_claimable(int8_tArray receiver_node_id, int8_tArray payment_hash, int64_t onion_fields, int64_t amount_msat, int64_t counterparty_skimmed_fee_msat, int64_t purpose, int64_t via_channel_id, int64_t via_user_channel_id, int64_t claim_deadline) {
+       LDKPublicKey receiver_node_id_ref;
+       CHECK(receiver_node_id->arr_len == 33);
+       memcpy(receiver_node_id_ref.compressed_form, receiver_node_id->elems, 33); FREE(receiver_node_id);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKRecipientOnionFields onion_fields_conv;
+       onion_fields_conv.inner = untag_ptr(onion_fields);
+       onion_fields_conv.is_owned = ptr_is_owned(onion_fields);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(onion_fields_conv);
+       onion_fields_conv = RecipientOnionFields_clone(&onion_fields_conv);
+       void* purpose_ptr = untag_ptr(purpose);
+       CHECK_ACCESS(purpose_ptr);
+       LDKPaymentPurpose purpose_conv = *(LDKPaymentPurpose*)(purpose_ptr);
+       purpose_conv = PaymentPurpose_clone((LDKPaymentPurpose*)untag_ptr(purpose));
+       void* via_channel_id_ptr = untag_ptr(via_channel_id);
+       CHECK_ACCESS(via_channel_id_ptr);
+       LDKCOption_ThirtyTwoBytesZ via_channel_id_conv = *(LDKCOption_ThirtyTwoBytesZ*)(via_channel_id_ptr);
+       via_channel_id_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(via_channel_id));
+       void* via_user_channel_id_ptr = untag_ptr(via_user_channel_id);
+       CHECK_ACCESS(via_user_channel_id_ptr);
+       LDKCOption_U128Z via_user_channel_id_conv = *(LDKCOption_U128Z*)(via_user_channel_id_ptr);
+       via_user_channel_id_conv = COption_U128Z_clone((LDKCOption_U128Z*)untag_ptr(via_user_channel_id));
+       void* claim_deadline_ptr = untag_ptr(claim_deadline);
+       CHECK_ACCESS(claim_deadline_ptr);
+       LDKCOption_u32Z claim_deadline_conv = *(LDKCOption_u32Z*)(claim_deadline_ptr);
+       claim_deadline_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(claim_deadline));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_payment_claimable(receiver_node_id_ref, payment_hash_ref, onion_fields_conv, amount_msat, counterparty_skimmed_fee_msat, purpose_conv, via_channel_id_conv, via_user_channel_id_conv, claim_deadline_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_payment_claimed(int8_tArray receiver_node_id, int8_tArray payment_hash, int64_t amount_msat, int64_t purpose, int64_tArray htlcs, int64_t sender_intended_total_msat) {
+       LDKPublicKey receiver_node_id_ref;
+       CHECK(receiver_node_id->arr_len == 33);
+       memcpy(receiver_node_id_ref.compressed_form, receiver_node_id->elems, 33); FREE(receiver_node_id);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       void* purpose_ptr = untag_ptr(purpose);
+       CHECK_ACCESS(purpose_ptr);
+       LDKPaymentPurpose purpose_conv = *(LDKPaymentPurpose*)(purpose_ptr);
+       purpose_conv = PaymentPurpose_clone((LDKPaymentPurpose*)untag_ptr(purpose));
+       LDKCVec_ClaimedHTLCZ htlcs_constr;
+       htlcs_constr.datalen = htlcs->arr_len;
+       if (htlcs_constr.datalen > 0)
+               htlcs_constr.data = MALLOC(htlcs_constr.datalen * sizeof(LDKClaimedHTLC), "LDKCVec_ClaimedHTLCZ Elements");
+       else
+               htlcs_constr.data = NULL;
+       int64_t* htlcs_vals = htlcs->elems;
+       for (size_t n = 0; n < htlcs_constr.datalen; n++) {
+               int64_t htlcs_conv_13 = htlcs_vals[n];
+               LDKClaimedHTLC htlcs_conv_13_conv;
+               htlcs_conv_13_conv.inner = untag_ptr(htlcs_conv_13);
+               htlcs_conv_13_conv.is_owned = ptr_is_owned(htlcs_conv_13);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(htlcs_conv_13_conv);
+               htlcs_conv_13_conv = ClaimedHTLC_clone(&htlcs_conv_13_conv);
+               htlcs_constr.data[n] = htlcs_conv_13_conv;
+       }
+       FREE(htlcs);
+       void* sender_intended_total_msat_ptr = untag_ptr(sender_intended_total_msat);
+       CHECK_ACCESS(sender_intended_total_msat_ptr);
+       LDKCOption_u64Z sender_intended_total_msat_conv = *(LDKCOption_u64Z*)(sender_intended_total_msat_ptr);
+       sender_intended_total_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(sender_intended_total_msat));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_payment_claimed(receiver_node_id_ref, payment_hash_ref, amount_msat, purpose_conv, htlcs_constr, sender_intended_total_msat_conv);
+       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);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_invoice_request_failed(payment_id_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_payment_sent(int64_t payment_id, int8_tArray payment_preimage, int8_tArray payment_hash, int64_t fee_paid_msat) {
+       void* payment_id_ptr = untag_ptr(payment_id);
+       CHECK_ACCESS(payment_id_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_id_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_id_ptr);
+       payment_id_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_id));
+       LDKThirtyTwoBytes payment_preimage_ref;
+       CHECK(payment_preimage->arr_len == 32);
+       memcpy(payment_preimage_ref.data, payment_preimage->elems, 32); FREE(payment_preimage);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       void* fee_paid_msat_ptr = untag_ptr(fee_paid_msat);
+       CHECK_ACCESS(fee_paid_msat_ptr);
+       LDKCOption_u64Z fee_paid_msat_conv = *(LDKCOption_u64Z*)(fee_paid_msat_ptr);
+       fee_paid_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(fee_paid_msat));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_payment_sent(payment_id_conv, payment_preimage_ref, payment_hash_ref, fee_paid_msat_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_payment_failed(int8_tArray payment_id, int8_tArray payment_hash, int64_t reason) {
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       void* reason_ptr = untag_ptr(reason);
+       CHECK_ACCESS(reason_ptr);
+       LDKCOption_PaymentFailureReasonZ reason_conv = *(LDKCOption_PaymentFailureReasonZ*)(reason_ptr);
+       reason_conv = COption_PaymentFailureReasonZ_clone((LDKCOption_PaymentFailureReasonZ*)untag_ptr(reason));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_payment_failed(payment_id_ref, payment_hash_ref, reason_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_payment_path_successful(int8_tArray payment_id, int64_t payment_hash, int64_t path) {
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       void* payment_hash_ptr = untag_ptr(payment_hash);
+       CHECK_ACCESS(payment_hash_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_hash_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_hash_ptr);
+       payment_hash_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_hash));
+       LDKPath 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 = Path_clone(&path_conv);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_payment_path_successful(payment_id_ref, payment_hash_conv, path_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_payment_path_failed(int64_t payment_id, int8_tArray payment_hash, jboolean payment_failed_permanently, int64_t failure, int64_t path, int64_t short_channel_id) {
+       void* payment_id_ptr = untag_ptr(payment_id);
+       CHECK_ACCESS(payment_id_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_id_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_id_ptr);
+       payment_id_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_id));
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       void* failure_ptr = untag_ptr(failure);
+       CHECK_ACCESS(failure_ptr);
+       LDKPathFailure failure_conv = *(LDKPathFailure*)(failure_ptr);
+       failure_conv = PathFailure_clone((LDKPathFailure*)untag_ptr(failure));
+       LDKPath 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 = Path_clone(&path_conv);
+       void* short_channel_id_ptr = untag_ptr(short_channel_id);
+       CHECK_ACCESS(short_channel_id_ptr);
+       LDKCOption_u64Z short_channel_id_conv = *(LDKCOption_u64Z*)(short_channel_id_ptr);
+       short_channel_id_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(short_channel_id));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_payment_path_failed(payment_id_conv, payment_hash_ref, payment_failed_permanently, failure_conv, path_conv, short_channel_id_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_probe_successful(int8_tArray payment_id, int8_tArray payment_hash, int64_t path) {
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKPath 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 = Path_clone(&path_conv);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_probe_successful(payment_id_ref, payment_hash_ref, path_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_probe_failed(int8_tArray payment_id, int8_tArray payment_hash, int64_t path, int64_t short_channel_id) {
+       LDKThirtyTwoBytes payment_id_ref;
+       CHECK(payment_id->arr_len == 32);
+       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKPath 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 = Path_clone(&path_conv);
+       void* short_channel_id_ptr = untag_ptr(short_channel_id);
+       CHECK_ACCESS(short_channel_id_ptr);
+       LDKCOption_u64Z short_channel_id_conv = *(LDKCOption_u64Z*)(short_channel_id_ptr);
+       short_channel_id_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(short_channel_id));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_probe_failed(payment_id_ref, payment_hash_ref, path_conv, short_channel_id_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_pending_htlcs_forwardable(int64_t time_forwardable) {
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_pending_htlcs_forwardable(time_forwardable);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_htlcintercepted(int8_tArray intercept_id, int64_t requested_next_hop_scid, int8_tArray payment_hash, int64_t inbound_amount_msat, int64_t expected_outbound_amount_msat) {
+       LDKThirtyTwoBytes intercept_id_ref;
+       CHECK(intercept_id->arr_len == 32);
+       memcpy(intercept_id_ref.data, intercept_id->elems, 32); FREE(intercept_id);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_htlcintercepted(intercept_id_ref, requested_next_hop_scid, payment_hash_ref, inbound_amount_msat, expected_outbound_amount_msat);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_spendable_outputs(int64_tArray outputs, int64_t channel_id) {
+       LDKCVec_SpendableOutputDescriptorZ outputs_constr;
+       outputs_constr.datalen = outputs->arr_len;
+       if (outputs_constr.datalen > 0)
+               outputs_constr.data = MALLOC(outputs_constr.datalen * sizeof(LDKSpendableOutputDescriptor), "LDKCVec_SpendableOutputDescriptorZ Elements");
+       else
+               outputs_constr.data = NULL;
+       int64_t* outputs_vals = outputs->elems;
+       for (size_t b = 0; b < outputs_constr.datalen; b++) {
+               int64_t outputs_conv_27 = outputs_vals[b];
+               void* outputs_conv_27_ptr = untag_ptr(outputs_conv_27);
+               CHECK_ACCESS(outputs_conv_27_ptr);
+               LDKSpendableOutputDescriptor outputs_conv_27_conv = *(LDKSpendableOutputDescriptor*)(outputs_conv_27_ptr);
+               outputs_conv_27_conv = SpendableOutputDescriptor_clone((LDKSpendableOutputDescriptor*)untag_ptr(outputs_conv_27));
+               outputs_constr.data[b] = outputs_conv_27_conv;
+       }
+       FREE(outputs);
+       void* channel_id_ptr = untag_ptr(channel_id);
+       CHECK_ACCESS(channel_id_ptr);
+       LDKCOption_ThirtyTwoBytesZ channel_id_conv = *(LDKCOption_ThirtyTwoBytesZ*)(channel_id_ptr);
+       channel_id_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(channel_id));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_spendable_outputs(outputs_constr, channel_id_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_payment_forwarded(int64_t prev_channel_id, int64_t next_channel_id, int64_t fee_earned_msat, jboolean claim_from_onchain_tx, int64_t outbound_amount_forwarded_msat) {
+       void* prev_channel_id_ptr = untag_ptr(prev_channel_id);
+       CHECK_ACCESS(prev_channel_id_ptr);
+       LDKCOption_ThirtyTwoBytesZ prev_channel_id_conv = *(LDKCOption_ThirtyTwoBytesZ*)(prev_channel_id_ptr);
+       prev_channel_id_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(prev_channel_id));
+       void* next_channel_id_ptr = untag_ptr(next_channel_id);
+       CHECK_ACCESS(next_channel_id_ptr);
+       LDKCOption_ThirtyTwoBytesZ next_channel_id_conv = *(LDKCOption_ThirtyTwoBytesZ*)(next_channel_id_ptr);
+       next_channel_id_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(next_channel_id));
+       void* fee_earned_msat_ptr = untag_ptr(fee_earned_msat);
+       CHECK_ACCESS(fee_earned_msat_ptr);
+       LDKCOption_u64Z fee_earned_msat_conv = *(LDKCOption_u64Z*)(fee_earned_msat_ptr);
+       fee_earned_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(fee_earned_msat));
+       void* outbound_amount_forwarded_msat_ptr = untag_ptr(outbound_amount_forwarded_msat);
+       CHECK_ACCESS(outbound_amount_forwarded_msat_ptr);
+       LDKCOption_u64Z outbound_amount_forwarded_msat_conv = *(LDKCOption_u64Z*)(outbound_amount_forwarded_msat_ptr);
+       outbound_amount_forwarded_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(outbound_amount_forwarded_msat));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_payment_forwarded(prev_channel_id_conv, next_channel_id_conv, fee_earned_msat_conv, claim_from_onchain_tx, outbound_amount_forwarded_msat_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_channel_pending(int8_tArray channel_id, int8_tArray user_channel_id, int64_t former_temporary_channel_id, int8_tArray counterparty_node_id, int64_t funding_txo) {
+       LDKThirtyTwoBytes channel_id_ref;
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_ref.data, channel_id->elems, 32); FREE(channel_id);
+       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* former_temporary_channel_id_ptr = untag_ptr(former_temporary_channel_id);
+       CHECK_ACCESS(former_temporary_channel_id_ptr);
+       LDKCOption_ThirtyTwoBytesZ former_temporary_channel_id_conv = *(LDKCOption_ThirtyTwoBytesZ*)(former_temporary_channel_id_ptr);
+       former_temporary_channel_id_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(former_temporary_channel_id));
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKOutPoint funding_txo_conv;
+       funding_txo_conv.inner = untag_ptr(funding_txo);
+       funding_txo_conv.is_owned = ptr_is_owned(funding_txo);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_channel_pending(channel_id_ref, user_channel_id_ref, former_temporary_channel_id_conv, counterparty_node_id_ref, funding_txo_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_channel_ready(int8_tArray channel_id, int8_tArray user_channel_id, int8_tArray counterparty_node_id, int64_t channel_type) {
+       LDKThirtyTwoBytes channel_id_ref;
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_ref.data, channel_id->elems, 32); FREE(channel_id);
+       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);
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKChannelTypeFeatures channel_type_conv;
+       channel_type_conv.inner = untag_ptr(channel_type);
+       channel_type_conv.is_owned = ptr_is_owned(channel_type);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_conv);
+       channel_type_conv = ChannelTypeFeatures_clone(&channel_type_conv);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_channel_ready(channel_id_ref, user_channel_id_ref, counterparty_node_id_ref, channel_type_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       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) {
+       LDKThirtyTwoBytes channel_id_ref;
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_ref.data, channel_id->elems, 32); FREE(channel_id);
+       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* reason_ptr = untag_ptr(reason);
+       CHECK_ACCESS(reason_ptr);
+       LDKClosureReason reason_conv = *(LDKClosureReason*)(reason_ptr);
+       reason_conv = ClosureReason_clone((LDKClosureReason*)untag_ptr(reason));
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       void* channel_capacity_sats_ptr = untag_ptr(channel_capacity_sats);
+       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));
+       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);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_discard_funding(int8_tArray channel_id, int8_tArray transaction) {
+       LDKThirtyTwoBytes channel_id_ref;
+       CHECK(channel_id->arr_len == 32);
+       memcpy(channel_id_ref.data, channel_id->elems, 32); FREE(channel_id);
+       LDKTransaction transaction_ref;
+       transaction_ref.datalen = transaction->arr_len;
+       transaction_ref.data = MALLOC(transaction_ref.datalen, "LDKTransaction Bytes");
+       memcpy(transaction_ref.data, transaction->elems, transaction_ref.datalen); FREE(transaction);
+       transaction_ref.data_is_owned = true;
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_discard_funding(channel_id_ref, transaction_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_open_channel_request(int8_tArray temporary_channel_id, int8_tArray counterparty_node_id, int64_t funding_satoshis, int64_t push_msat, int64_t channel_type) {
+       LDKThirtyTwoBytes temporary_channel_id_ref;
+       CHECK(temporary_channel_id->arr_len == 32);
+       memcpy(temporary_channel_id_ref.data, temporary_channel_id->elems, 32); FREE(temporary_channel_id);
+       LDKPublicKey counterparty_node_id_ref;
+       CHECK(counterparty_node_id->arr_len == 33);
+       memcpy(counterparty_node_id_ref.compressed_form, counterparty_node_id->elems, 33); FREE(counterparty_node_id);
+       LDKChannelTypeFeatures channel_type_conv;
+       channel_type_conv.inner = untag_ptr(channel_type);
+       channel_type_conv.is_owned = ptr_is_owned(channel_type);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_conv);
+       channel_type_conv = ChannelTypeFeatures_clone(&channel_type_conv);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_open_channel_request(temporary_channel_id_ref, counterparty_node_id_ref, funding_satoshis, push_msat, channel_type_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_htlchandling_failed(int8_tArray prev_channel_id, int64_t failed_next_destination) {
+       LDKThirtyTwoBytes prev_channel_id_ref;
+       CHECK(prev_channel_id->arr_len == 32);
+       memcpy(prev_channel_id_ref.data, prev_channel_id->elems, 32); FREE(prev_channel_id);
+       void* failed_next_destination_ptr = untag_ptr(failed_next_destination);
+       CHECK_ACCESS(failed_next_destination_ptr);
+       LDKHTLCDestination failed_next_destination_conv = *(LDKHTLCDestination*)(failed_next_destination_ptr);
+       failed_next_destination_conv = HTLCDestination_clone((LDKHTLCDestination*)untag_ptr(failed_next_destination));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_htlchandling_failed(prev_channel_id_ref, failed_next_destination_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Event_bump_transaction(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKBumpTransactionEvent a_conv = *(LDKBumpTransactionEvent*)(a_ptr);
+       a_conv = BumpTransactionEvent_clone((LDKBumpTransactionEvent*)untag_ptr(a));
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_bump_transaction(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_Event_eq(int64_t a, int64_t b) {
+       LDKEvent* a_conv = (LDKEvent*)untag_ptr(a);
+       LDKEvent* b_conv = (LDKEvent*)untag_ptr(b);
+       jboolean ret_conv = Event_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Event_write(int64_t obj) {
+       LDKEvent* obj_conv = (LDKEvent*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = Event_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_Event_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_COption_EventZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_COption_EventZDecodeErrorZ), "LDKCResult_COption_EventZDecodeErrorZ");
+       *ret_conv = Event_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_MessageSendEvent_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);
+       LDKMessageSendEvent this_ptr_conv = *(LDKMessageSendEvent*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       MessageSendEvent_free(this_ptr_conv);
+}
+
+static inline uint64_t MessageSendEvent_clone_ptr(LDKMessageSendEvent *NONNULL_PTR arg) {
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_MessageSendEvent_clone_ptr(int64_t arg) {
+       LDKMessageSendEvent* arg_conv = (LDKMessageSendEvent*)untag_ptr(arg);
+       int64_t ret_conv = MessageSendEvent_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_MessageSendEvent_clone(int64_t orig) {
+       LDKMessageSendEvent* orig_conv = (LDKMessageSendEvent*)untag_ptr(orig);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_accept_channel(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);
+       LDKAcceptChannel 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 = AcceptChannel_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_accept_channel(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_accept_channel_v2(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);
+       LDKAcceptChannelV2 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 = AcceptChannelV2_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_accept_channel_v2(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_open_channel(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);
+       LDKOpenChannel 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 = OpenChannel_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_open_channel(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_open_channel_v2(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);
+       LDKOpenChannelV2 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 = OpenChannelV2_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_open_channel_v2(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_funding_created(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);
+       LDKFundingCreated 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 = FundingCreated_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_funding_created(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_funding_signed(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);
+       LDKFundingSigned 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 = FundingSigned_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_funding_signed(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);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKTxAddInput 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 = TxAddInput_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_add_input(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_output(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);
+       LDKTxAddOutput 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 = TxAddOutput_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_add_output(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_tx_remove_input(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);
+       LDKTxRemoveInput 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 = TxRemoveInput_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_remove_input(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_tx_remove_output(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);
+       LDKTxRemoveOutput 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 = TxRemoveOutput_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_remove_output(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_tx_complete(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);
+       LDKTxComplete 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 = TxComplete_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_complete(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_tx_signatures(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);
+       LDKTxSignatures 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 = TxSignatures_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_signatures(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_tx_init_rbf(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);
+       LDKTxInitRbf 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 = TxInitRbf_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_init_rbf(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_tx_ack_rbf(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);
+       LDKTxAckRbf 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 = TxAckRbf_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_ack_rbf(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_tx_abort(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);
+       LDKTxAbort 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 = TxAbort_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_tx_abort(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_channel_ready(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);
+       LDKChannelReady 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 = ChannelReady_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_channel_ready(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_announcement_signatures(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);
+       LDKAnnouncementSignatures 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 = AnnouncementSignatures_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_announcement_signatures(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_update_htlcs(int8_tArray node_id, int64_t updates) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKCommitmentUpdate updates_conv;
+       updates_conv.inner = untag_ptr(updates);
+       updates_conv.is_owned = ptr_is_owned(updates);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(updates_conv);
+       updates_conv = CommitmentUpdate_clone(&updates_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_update_htlcs(node_id_ref, updates_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_revoke_and_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);
+       LDKRevokeAndACK 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 = RevokeAndACK_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_revoke_and_ack(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_closing_signed(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);
+       LDKClosingSigned 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 = ClosingSigned_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_closing_signed(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_shutdown(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);
+       LDKShutdown 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 = Shutdown_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_shutdown(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_channel_reestablish(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);
+       LDKChannelReestablish 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 = ChannelReestablish_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_channel_reestablish(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_channel_announcement(int8_tArray node_id, int64_t msg, int64_t update_msg) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKChannelAnnouncement 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 = ChannelAnnouncement_clone(&msg_conv);
+       LDKChannelUpdate update_msg_conv;
+       update_msg_conv.inner = untag_ptr(update_msg);
+       update_msg_conv.is_owned = ptr_is_owned(update_msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_msg_conv);
+       update_msg_conv = ChannelUpdate_clone(&update_msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_channel_announcement(node_id_ref, msg_conv, update_msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_broadcast_channel_announcement(int64_t msg, int64_t update_msg) {
+       LDKChannelAnnouncement 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 = ChannelAnnouncement_clone(&msg_conv);
+       LDKChannelUpdate update_msg_conv;
+       update_msg_conv.inner = untag_ptr(update_msg);
+       update_msg_conv.is_owned = ptr_is_owned(update_msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(update_msg_conv);
+       update_msg_conv = ChannelUpdate_clone(&update_msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_broadcast_channel_announcement(msg_conv, update_msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_broadcast_channel_update(int64_t msg) {
+       LDKChannelUpdate 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 = ChannelUpdate_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_broadcast_channel_update(msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_broadcast_node_announcement(int64_t msg) {
+       LDKNodeAnnouncement 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 = NodeAnnouncement_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_broadcast_node_announcement(msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_channel_update(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);
+       LDKChannelUpdate 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 = ChannelUpdate_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_channel_update(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_handle_error(int8_tArray node_id, int64_t action) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       void* action_ptr = untag_ptr(action);
+       CHECK_ACCESS(action_ptr);
+       LDKErrorAction action_conv = *(LDKErrorAction*)(action_ptr);
+       action_conv = ErrorAction_clone((LDKErrorAction*)untag_ptr(action));
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_handle_error(node_id_ref, action_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_channel_range_query(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);
+       LDKQueryChannelRange 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 = QueryChannelRange_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_channel_range_query(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_short_ids_query(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);
+       LDKQueryShortChannelIds 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 = QueryShortChannelIds_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_short_ids_query(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_reply_channel_range(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);
+       LDKReplyChannelRange 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 = ReplyChannelRange_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_reply_channel_range(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_gossip_timestamp_filter(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);
+       LDKGossipTimestampFilter 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 = GossipTimestampFilter_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_gossip_timestamp_filter(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_MessageSendEventsProvider_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);
+       LDKMessageSendEventsProvider this_ptr_conv = *(LDKMessageSendEventsProvider*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       MessageSendEventsProvider_free(this_ptr_conv);
+}
+
+void  CS_LDK_EventsProvider_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);
+       LDKEventsProvider this_ptr_conv = *(LDKEventsProvider*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       EventsProvider_free(this_ptr_conv);
+}
+
+void  CS_LDK_EventHandler_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);
+       LDKEventHandler this_ptr_conv = *(LDKEventHandler*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       EventHandler_free(this_ptr_conv);
+}
+
+void  CS_LDK_AnchorDescriptor_free(int64_t this_obj) {
+       LDKAnchorDescriptor 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);
+       AnchorDescriptor_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_AnchorDescriptor_get_channel_derivation_parameters(int64_t this_ptr) {
+       LDKAnchorDescriptor 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;
+       LDKChannelDerivationParameters ret_var = AnchorDescriptor_get_channel_derivation_parameters(&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_AnchorDescriptor_set_channel_derivation_parameters(int64_t this_ptr, int64_t val) {
+       LDKAnchorDescriptor 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;
+       LDKChannelDerivationParameters 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 = ChannelDerivationParameters_clone(&val_conv);
+       AnchorDescriptor_set_channel_derivation_parameters(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_AnchorDescriptor_get_outpoint(int64_t this_ptr) {
+       LDKAnchorDescriptor 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;
+       LDKOutPoint ret_var = AnchorDescriptor_get_outpoint(&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_AnchorDescriptor_set_outpoint(int64_t this_ptr, int64_t val) {
+       LDKAnchorDescriptor 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;
+       LDKOutPoint 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 = OutPoint_clone(&val_conv);
+       AnchorDescriptor_set_outpoint(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_AnchorDescriptor_new(int64_t channel_derivation_parameters_arg, int64_t outpoint_arg) {
+       LDKChannelDerivationParameters channel_derivation_parameters_arg_conv;
+       channel_derivation_parameters_arg_conv.inner = untag_ptr(channel_derivation_parameters_arg);
+       channel_derivation_parameters_arg_conv.is_owned = ptr_is_owned(channel_derivation_parameters_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_derivation_parameters_arg_conv);
+       channel_derivation_parameters_arg_conv = ChannelDerivationParameters_clone(&channel_derivation_parameters_arg_conv);
+       LDKOutPoint outpoint_arg_conv;
+       outpoint_arg_conv.inner = untag_ptr(outpoint_arg);
+       outpoint_arg_conv.is_owned = ptr_is_owned(outpoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_arg_conv);
+       outpoint_arg_conv = OutPoint_clone(&outpoint_arg_conv);
+       LDKAnchorDescriptor ret_var = AnchorDescriptor_new(channel_derivation_parameters_arg_conv, outpoint_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 AnchorDescriptor_clone_ptr(LDKAnchorDescriptor *NONNULL_PTR arg) {
+       LDKAnchorDescriptor ret_var = AnchorDescriptor_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_AnchorDescriptor_clone_ptr(int64_t arg) {
+       LDKAnchorDescriptor 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 = AnchorDescriptor_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_AnchorDescriptor_clone(int64_t orig) {
+       LDKAnchorDescriptor 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;
+       LDKAnchorDescriptor ret_var = AnchorDescriptor_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_AnchorDescriptor_eq(int64_t a, int64_t b) {
+       LDKAnchorDescriptor 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;
+       LDKAnchorDescriptor 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 = AnchorDescriptor_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_AnchorDescriptor_previous_utxo(int64_t this_arg) {
+       LDKAnchorDescriptor 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;
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = AnchorDescriptor_previous_utxo(&this_arg_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+int64_t  CS_LDK_AnchorDescriptor_unsigned_tx_input(int64_t this_arg) {
+       LDKAnchorDescriptor 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;
+       LDKTxIn* ret_ref = MALLOC(sizeof(LDKTxIn), "LDKTxIn");
+       *ret_ref = AnchorDescriptor_unsigned_tx_input(&this_arg_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+int8_tArray  CS_LDK_AnchorDescriptor_witness_script(int64_t this_arg) {
+       LDKAnchorDescriptor 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;
+       LDKCVec_u8Z ret_var = AnchorDescriptor_witness_script(&this_arg_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;
+}
+
+int8_tArray  CS_LDK_AnchorDescriptor_tx_input_witness(int64_t this_arg, int8_tArray signature) {
+       LDKAnchorDescriptor 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;
+       LDKECDSASignature signature_ref;
+       CHECK(signature->arr_len == 64);
+       memcpy(signature_ref.compact_form, signature->elems, 64); FREE(signature);
+       LDKWitness ret_var = AnchorDescriptor_tx_input_witness(&this_arg_conv, signature_ref);
+       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;
+}
+
+int64_t  CS_LDK_AnchorDescriptor_derive_channel_signer(int64_t this_arg, int64_t signer_provider) {
+       LDKAnchorDescriptor 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;
+       void* signer_provider_ptr = untag_ptr(signer_provider);
+       if (ptr_is_owned(signer_provider)) { CHECK_ACCESS(signer_provider_ptr); }
+       LDKSignerProvider* signer_provider_conv = (LDKSignerProvider*)signer_provider_ptr;
+       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
+       *ret_ret = AnchorDescriptor_derive_channel_signer(&this_arg_conv, signer_provider_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_BumpTransactionEvent_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);
+       LDKBumpTransactionEvent this_ptr_conv = *(LDKBumpTransactionEvent*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       BumpTransactionEvent_free(this_ptr_conv);
+}
+
+static inline uint64_t BumpTransactionEvent_clone_ptr(LDKBumpTransactionEvent *NONNULL_PTR arg) {
+       LDKBumpTransactionEvent *ret_copy = MALLOC(sizeof(LDKBumpTransactionEvent), "LDKBumpTransactionEvent");
+       *ret_copy = BumpTransactionEvent_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_BumpTransactionEvent_clone_ptr(int64_t arg) {
+       LDKBumpTransactionEvent* arg_conv = (LDKBumpTransactionEvent*)untag_ptr(arg);
+       int64_t ret_conv = BumpTransactionEvent_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BumpTransactionEvent_clone(int64_t orig) {
+       LDKBumpTransactionEvent* orig_conv = (LDKBumpTransactionEvent*)untag_ptr(orig);
+       LDKBumpTransactionEvent *ret_copy = MALLOC(sizeof(LDKBumpTransactionEvent), "LDKBumpTransactionEvent");
+       *ret_copy = BumpTransactionEvent_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_BumpTransactionEvent_channel_close(int8_tArray claim_id, int32_t package_target_feerate_sat_per_1000_weight, int8_tArray commitment_tx, int64_t commitment_tx_fee_satoshis, int64_t anchor_descriptor, int64_tArray pending_htlcs) {
+       LDKThirtyTwoBytes claim_id_ref;
+       CHECK(claim_id->arr_len == 32);
+       memcpy(claim_id_ref.data, claim_id->elems, 32); FREE(claim_id);
+       LDKTransaction commitment_tx_ref;
+       commitment_tx_ref.datalen = commitment_tx->arr_len;
+       commitment_tx_ref.data = MALLOC(commitment_tx_ref.datalen, "LDKTransaction Bytes");
+       memcpy(commitment_tx_ref.data, commitment_tx->elems, commitment_tx_ref.datalen); FREE(commitment_tx);
+       commitment_tx_ref.data_is_owned = true;
+       LDKAnchorDescriptor anchor_descriptor_conv;
+       anchor_descriptor_conv.inner = untag_ptr(anchor_descriptor);
+       anchor_descriptor_conv.is_owned = ptr_is_owned(anchor_descriptor);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(anchor_descriptor_conv);
+       anchor_descriptor_conv = AnchorDescriptor_clone(&anchor_descriptor_conv);
+       LDKCVec_HTLCOutputInCommitmentZ pending_htlcs_constr;
+       pending_htlcs_constr.datalen = pending_htlcs->arr_len;
+       if (pending_htlcs_constr.datalen > 0)
+               pending_htlcs_constr.data = MALLOC(pending_htlcs_constr.datalen * sizeof(LDKHTLCOutputInCommitment), "LDKCVec_HTLCOutputInCommitmentZ Elements");
+       else
+               pending_htlcs_constr.data = NULL;
+       int64_t* pending_htlcs_vals = pending_htlcs->elems;
+       for (size_t y = 0; y < pending_htlcs_constr.datalen; y++) {
+               int64_t pending_htlcs_conv_24 = pending_htlcs_vals[y];
+               LDKHTLCOutputInCommitment pending_htlcs_conv_24_conv;
+               pending_htlcs_conv_24_conv.inner = untag_ptr(pending_htlcs_conv_24);
+               pending_htlcs_conv_24_conv.is_owned = ptr_is_owned(pending_htlcs_conv_24);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(pending_htlcs_conv_24_conv);
+               pending_htlcs_conv_24_conv = HTLCOutputInCommitment_clone(&pending_htlcs_conv_24_conv);
+               pending_htlcs_constr.data[y] = pending_htlcs_conv_24_conv;
+       }
+       FREE(pending_htlcs);
+       LDKBumpTransactionEvent *ret_copy = MALLOC(sizeof(LDKBumpTransactionEvent), "LDKBumpTransactionEvent");
+       *ret_copy = BumpTransactionEvent_channel_close(claim_id_ref, package_target_feerate_sat_per_1000_weight, commitment_tx_ref, commitment_tx_fee_satoshis, anchor_descriptor_conv, pending_htlcs_constr);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_BumpTransactionEvent_htlcresolution(int8_tArray claim_id, int32_t target_feerate_sat_per_1000_weight, int64_tArray htlc_descriptors, int32_t tx_lock_time) {
+       LDKThirtyTwoBytes claim_id_ref;
+       CHECK(claim_id->arr_len == 32);
+       memcpy(claim_id_ref.data, claim_id->elems, 32); FREE(claim_id);
+       LDKCVec_HTLCDescriptorZ htlc_descriptors_constr;
+       htlc_descriptors_constr.datalen = htlc_descriptors->arr_len;
+       if (htlc_descriptors_constr.datalen > 0)
+               htlc_descriptors_constr.data = MALLOC(htlc_descriptors_constr.datalen * sizeof(LDKHTLCDescriptor), "LDKCVec_HTLCDescriptorZ Elements");
+       else
+               htlc_descriptors_constr.data = NULL;
+       int64_t* htlc_descriptors_vals = htlc_descriptors->elems;
+       for (size_t q = 0; q < htlc_descriptors_constr.datalen; q++) {
+               int64_t htlc_descriptors_conv_16 = htlc_descriptors_vals[q];
+               LDKHTLCDescriptor htlc_descriptors_conv_16_conv;
+               htlc_descriptors_conv_16_conv.inner = untag_ptr(htlc_descriptors_conv_16);
+               htlc_descriptors_conv_16_conv.is_owned = ptr_is_owned(htlc_descriptors_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_descriptors_conv_16_conv);
+               htlc_descriptors_conv_16_conv = HTLCDescriptor_clone(&htlc_descriptors_conv_16_conv);
+               htlc_descriptors_constr.data[q] = htlc_descriptors_conv_16_conv;
+       }
+       FREE(htlc_descriptors);
+       LDKBumpTransactionEvent *ret_copy = MALLOC(sizeof(LDKBumpTransactionEvent), "LDKBumpTransactionEvent");
+       *ret_copy = BumpTransactionEvent_htlcresolution(claim_id_ref, target_feerate_sat_per_1000_weight, htlc_descriptors_constr, tx_lock_time);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_BumpTransactionEvent_eq(int64_t a, int64_t b) {
+       LDKBumpTransactionEvent* a_conv = (LDKBumpTransactionEvent*)untag_ptr(a);
+       LDKBumpTransactionEvent* b_conv = (LDKBumpTransactionEvent*)untag_ptr(b);
+       jboolean ret_conv = BumpTransactionEvent_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Input_free(int64_t this_obj) {
+       LDKInput 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);
+       Input_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_Input_get_outpoint(int64_t this_ptr) {
+       LDKInput 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;
+       LDKOutPoint ret_var = Input_get_outpoint(&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_Input_set_outpoint(int64_t this_ptr, int64_t val) {
+       LDKInput 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;
+       LDKOutPoint 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 = OutPoint_clone(&val_conv);
+       Input_set_outpoint(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Input_get_previous_utxo(int64_t this_ptr) {
+       LDKInput 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;
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = Input_get_previous_utxo(&this_ptr_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+void  CS_LDK_Input_set_previous_utxo(int64_t this_ptr, int64_t val) {
+       LDKInput 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);
+       LDKTxOut val_conv = *(LDKTxOut*)(val_ptr);
+       val_conv = TxOut_clone((LDKTxOut*)untag_ptr(val));
+       Input_set_previous_utxo(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Input_get_satisfaction_weight(int64_t this_ptr) {
+       LDKInput 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 = Input_get_satisfaction_weight(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Input_set_satisfaction_weight(int64_t this_ptr, int64_t val) {
+       LDKInput 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;
+       Input_set_satisfaction_weight(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_Input_new(int64_t outpoint_arg, int64_t previous_utxo_arg, int64_t satisfaction_weight_arg) {
+       LDKOutPoint outpoint_arg_conv;
+       outpoint_arg_conv.inner = untag_ptr(outpoint_arg);
+       outpoint_arg_conv.is_owned = ptr_is_owned(outpoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_arg_conv);
+       outpoint_arg_conv = OutPoint_clone(&outpoint_arg_conv);
+       void* previous_utxo_arg_ptr = untag_ptr(previous_utxo_arg);
+       CHECK_ACCESS(previous_utxo_arg_ptr);
+       LDKTxOut previous_utxo_arg_conv = *(LDKTxOut*)(previous_utxo_arg_ptr);
+       previous_utxo_arg_conv = TxOut_clone((LDKTxOut*)untag_ptr(previous_utxo_arg));
+       LDKInput ret_var = Input_new(outpoint_arg_conv, previous_utxo_arg_conv, satisfaction_weight_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 Input_clone_ptr(LDKInput *NONNULL_PTR arg) {
+       LDKInput ret_var = Input_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_Input_clone_ptr(int64_t arg) {
+       LDKInput 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 = Input_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Input_clone(int64_t orig) {
+       LDKInput 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;
+       LDKInput ret_var = Input_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_Input_hash(int64_t o) {
+       LDKInput 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 = Input_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Input_eq(int64_t a, int64_t b) {
+       LDKInput 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;
+       LDKInput 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 = Input_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Utxo_free(int64_t this_obj) {
+       LDKUtxo 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);
+       Utxo_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_Utxo_get_outpoint(int64_t this_ptr) {
+       LDKUtxo 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;
+       LDKOutPoint ret_var = Utxo_get_outpoint(&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_Utxo_set_outpoint(int64_t this_ptr, int64_t val) {
+       LDKUtxo 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;
+       LDKOutPoint 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 = OutPoint_clone(&val_conv);
+       Utxo_set_outpoint(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Utxo_get_output(int64_t this_ptr) {
+       LDKUtxo 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;
+       LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
+       *ret_ref = Utxo_get_output(&this_ptr_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+void  CS_LDK_Utxo_set_output(int64_t this_ptr, int64_t val) {
+       LDKUtxo 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);
+       LDKTxOut val_conv = *(LDKTxOut*)(val_ptr);
+       val_conv = TxOut_clone((LDKTxOut*)untag_ptr(val));
+       Utxo_set_output(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_Utxo_get_satisfaction_weight(int64_t this_ptr) {
+       LDKUtxo 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 = Utxo_get_satisfaction_weight(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Utxo_set_satisfaction_weight(int64_t this_ptr, int64_t val) {
+       LDKUtxo 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;
+       Utxo_set_satisfaction_weight(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_Utxo_new(int64_t outpoint_arg, int64_t output_arg, int64_t satisfaction_weight_arg) {
+       LDKOutPoint outpoint_arg_conv;
+       outpoint_arg_conv.inner = untag_ptr(outpoint_arg);
+       outpoint_arg_conv.is_owned = ptr_is_owned(outpoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_arg_conv);
+       outpoint_arg_conv = OutPoint_clone(&outpoint_arg_conv);
+       void* output_arg_ptr = untag_ptr(output_arg);
+       CHECK_ACCESS(output_arg_ptr);
+       LDKTxOut output_arg_conv = *(LDKTxOut*)(output_arg_ptr);
+       output_arg_conv = TxOut_clone((LDKTxOut*)untag_ptr(output_arg));
+       LDKUtxo ret_var = Utxo_new(outpoint_arg_conv, output_arg_conv, satisfaction_weight_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 Utxo_clone_ptr(LDKUtxo *NONNULL_PTR arg) {
+       LDKUtxo ret_var = Utxo_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_Utxo_clone_ptr(int64_t arg) {
+       LDKUtxo 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 = Utxo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Utxo_clone(int64_t orig) {
+       LDKUtxo 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;
+       LDKUtxo ret_var = Utxo_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_Utxo_hash(int64_t o) {
+       LDKUtxo 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 = Utxo_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Utxo_eq(int64_t a, int64_t b) {
+       LDKUtxo 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;
+       LDKUtxo 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 = Utxo_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Utxo_new_p2pkh(int64_t outpoint, int64_t value, int8_tArray pubkey_hash) {
+       LDKOutPoint outpoint_conv;
+       outpoint_conv.inner = untag_ptr(outpoint);
+       outpoint_conv.is_owned = ptr_is_owned(outpoint);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(outpoint_conv);
+       outpoint_conv = OutPoint_clone(&outpoint_conv);
+       uint8_t pubkey_hash_arr[20];
+       CHECK(pubkey_hash->arr_len == 20);
+       memcpy(pubkey_hash_arr, pubkey_hash->elems, 20); FREE(pubkey_hash);
+       uint8_t (*pubkey_hash_ref)[20] = &pubkey_hash_arr;
+       LDKUtxo ret_var = Utxo_new_p2pkh(outpoint_conv, value, pubkey_hash_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;
+}
+
+void  CS_LDK_CoinSelection_free(int64_t this_obj) {
+       LDKCoinSelection 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);
+       CoinSelection_free(this_obj_conv);
+}
+
+int64_tArray  CS_LDK_CoinSelection_get_confirmed_utxos(int64_t this_ptr) {
+       LDKCoinSelection 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_UtxoZ ret_var = CoinSelection_get_confirmed_utxos(&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++) {
+               LDKUtxo ret_conv_6_var = ret_var.data[g];
+               int64_t ret_conv_6_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_6_var);
+               ret_conv_6_ref = tag_ptr(ret_conv_6_var.inner, ret_conv_6_var.is_owned);
+               ret_arr_ptr[g] = ret_conv_6_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_CoinSelection_set_confirmed_utxos(int64_t this_ptr, int64_tArray val) {
+       LDKCoinSelection 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_UtxoZ val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(LDKUtxo), "LDKCVec_UtxoZ 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];
+               LDKUtxo val_conv_6_conv;
+               val_conv_6_conv.inner = untag_ptr(val_conv_6);
+               val_conv_6_conv.is_owned = ptr_is_owned(val_conv_6);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv_6_conv);
+               val_conv_6_conv = Utxo_clone(&val_conv_6_conv);
+               val_constr.data[g] = val_conv_6_conv;
+       }
+       FREE(val);
+       CoinSelection_set_confirmed_utxos(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_CoinSelection_get_change_output(int64_t this_ptr) {
+       LDKCoinSelection 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_TxOutZ *ret_copy = MALLOC(sizeof(LDKCOption_TxOutZ), "LDKCOption_TxOutZ");
+       *ret_copy = CoinSelection_get_change_output(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_CoinSelection_set_change_output(int64_t this_ptr, int64_t val) {
+       LDKCoinSelection 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_TxOutZ val_conv = *(LDKCOption_TxOutZ*)(val_ptr);
+       val_conv = COption_TxOutZ_clone((LDKCOption_TxOutZ*)untag_ptr(val));
+       CoinSelection_set_change_output(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_CoinSelection_new(int64_tArray confirmed_utxos_arg, int64_t change_output_arg) {
+       LDKCVec_UtxoZ confirmed_utxos_arg_constr;
+       confirmed_utxos_arg_constr.datalen = confirmed_utxos_arg->arr_len;
+       if (confirmed_utxos_arg_constr.datalen > 0)
+               confirmed_utxos_arg_constr.data = MALLOC(confirmed_utxos_arg_constr.datalen * sizeof(LDKUtxo), "LDKCVec_UtxoZ Elements");
+       else
+               confirmed_utxos_arg_constr.data = NULL;
+       int64_t* confirmed_utxos_arg_vals = confirmed_utxos_arg->elems;
+       for (size_t g = 0; g < confirmed_utxos_arg_constr.datalen; g++) {
+               int64_t confirmed_utxos_arg_conv_6 = confirmed_utxos_arg_vals[g];
+               LDKUtxo confirmed_utxos_arg_conv_6_conv;
+               confirmed_utxos_arg_conv_6_conv.inner = untag_ptr(confirmed_utxos_arg_conv_6);
+               confirmed_utxos_arg_conv_6_conv.is_owned = ptr_is_owned(confirmed_utxos_arg_conv_6);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(confirmed_utxos_arg_conv_6_conv);
+               confirmed_utxos_arg_conv_6_conv = Utxo_clone(&confirmed_utxos_arg_conv_6_conv);
+               confirmed_utxos_arg_constr.data[g] = confirmed_utxos_arg_conv_6_conv;
+       }
+       FREE(confirmed_utxos_arg);
+       void* change_output_arg_ptr = untag_ptr(change_output_arg);
+       CHECK_ACCESS(change_output_arg_ptr);
+       LDKCOption_TxOutZ change_output_arg_conv = *(LDKCOption_TxOutZ*)(change_output_arg_ptr);
+       change_output_arg_conv = COption_TxOutZ_clone((LDKCOption_TxOutZ*)untag_ptr(change_output_arg));
+       LDKCoinSelection ret_var = CoinSelection_new(confirmed_utxos_arg_constr, change_output_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 CoinSelection_clone_ptr(LDKCoinSelection *NONNULL_PTR arg) {
+       LDKCoinSelection ret_var = CoinSelection_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_CoinSelection_clone_ptr(int64_t arg) {
+       LDKCoinSelection 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 = CoinSelection_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CoinSelection_clone(int64_t orig) {
+       LDKCoinSelection 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;
+       LDKCoinSelection ret_var = CoinSelection_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_CoinSelectionSource_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);
+       LDKCoinSelectionSource this_ptr_conv = *(LDKCoinSelectionSource*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       CoinSelectionSource_free(this_ptr_conv);
+}
+
+void  CS_LDK_WalletSource_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);
+       LDKWalletSource this_ptr_conv = *(LDKWalletSource*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       WalletSource_free(this_ptr_conv);
+}
+
+void  CS_LDK_Wallet_free(int64_t this_obj) {
+       LDKWallet 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);
+       Wallet_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_Wallet_new(int64_t source, int64_t logger) {
+       void* source_ptr = untag_ptr(source);
+       CHECK_ACCESS(source_ptr);
+       LDKWalletSource source_conv = *(LDKWalletSource*)(source_ptr);
+       if (source_conv.free == LDKWalletSource_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKWalletSource_JCalls_cloned(&source_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);
+       }
+       LDKWallet ret_var = Wallet_new(source_conv, logger_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_Wallet_as_CoinSelectionSource(int64_t this_arg) {
+       LDKWallet 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;
+       LDKCoinSelectionSource* ret_ret = MALLOC(sizeof(LDKCoinSelectionSource), "LDKCoinSelectionSource");
+       *ret_ret = Wallet_as_CoinSelectionSource(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_BumpTransactionEventHandler_free(int64_t this_obj) {
+       LDKBumpTransactionEventHandler 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);
+       BumpTransactionEventHandler_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_BumpTransactionEventHandler_new(int64_t broadcaster, int64_t utxo_source, int64_t signer_provider, int64_t logger) {
+       void* broadcaster_ptr = untag_ptr(broadcaster);
+       CHECK_ACCESS(broadcaster_ptr);
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(broadcaster_ptr);
+       if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKBroadcasterInterface_JCalls_cloned(&broadcaster_conv);
+       }
+       void* utxo_source_ptr = untag_ptr(utxo_source);
+       CHECK_ACCESS(utxo_source_ptr);
+       LDKCoinSelectionSource utxo_source_conv = *(LDKCoinSelectionSource*)(utxo_source_ptr);
+       if (utxo_source_conv.free == LDKCoinSelectionSource_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKCoinSelectionSource_JCalls_cloned(&utxo_source_conv);
+       }
+       void* signer_provider_ptr = untag_ptr(signer_provider);
+       CHECK_ACCESS(signer_provider_ptr);
+       LDKSignerProvider signer_provider_conv = *(LDKSignerProvider*)(signer_provider_ptr);
+       if (signer_provider_conv.free == LDKSignerProvider_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKSignerProvider_JCalls_cloned(&signer_provider_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);
+       }
+       LDKBumpTransactionEventHandler ret_var = BumpTransactionEventHandler_new(broadcaster_conv, utxo_source_conv, signer_provider_conv, logger_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_BumpTransactionEventHandler_handle_event(int64_t this_arg, int64_t event) {
+       LDKBumpTransactionEventHandler 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;
+       LDKBumpTransactionEvent* event_conv = (LDKBumpTransactionEvent*)untag_ptr(event);
+       BumpTransactionEventHandler_handle_event(&this_arg_conv, event_conv);
+}
+
+void  CS_LDK_FilesystemStore_free(int64_t this_obj) {
+       LDKFilesystemStore 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);
+       FilesystemStore_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_FilesystemStore_new(jstring data_dir) {
+       LDKStr data_dir_conv = str_ref_to_owned_c(data_dir);
+       LDKFilesystemStore ret_var = FilesystemStore_new(data_dir_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_FilesystemStore_get_data_dir(int64_t this_arg) {
+       LDKFilesystemStore 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 = FilesystemStore_get_data_dir(&this_arg_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_FilesystemStore_as_KVStore(int64_t this_arg) {
+       LDKFilesystemStore 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;
+       LDKKVStore* ret_ret = MALLOC(sizeof(LDKKVStore), "LDKKVStore");
+       *ret_ret = FilesystemStore_as_KVStore(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_BackgroundProcessor_free(int64_t this_obj) {
+       LDKBackgroundProcessor 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);
+       BackgroundProcessor_free(this_obj_conv);
+}
+
+void  CS_LDK_GossipSync_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);
+       LDKGossipSync this_ptr_conv = *(LDKGossipSync*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       GossipSync_free(this_ptr_conv);
+}
+
+int64_t  CS_LDK_GossipSync_p2_p(int64_t a) {
+       LDKP2PGossipSync 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;
+       LDKGossipSync *ret_copy = MALLOC(sizeof(LDKGossipSync), "LDKGossipSync");
+       *ret_copy = GossipSync_p2_p(&a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_GossipSync_rapid(int64_t a) {
+       LDKRapidGossipSync 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;
+       LDKGossipSync *ret_copy = MALLOC(sizeof(LDKGossipSync), "LDKGossipSync");
+       *ret_copy = GossipSync_rapid(&a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_GossipSync_none() {
+       LDKGossipSync *ret_copy = MALLOC(sizeof(LDKGossipSync), "LDKGossipSync");
+       *ret_copy = GossipSync_none();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_BackgroundProcessor_start(int64_t persister, int64_t event_handler, int64_t chain_monitor, int64_t channel_manager, int64_t gossip_sync, int64_t peer_manager, int64_t logger, int64_t scorer) {
+       void* persister_ptr = untag_ptr(persister);
+       CHECK_ACCESS(persister_ptr);
+       LDKPersister persister_conv = *(LDKPersister*)(persister_ptr);
+       if (persister_conv.free == LDKPersister_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKPersister_JCalls_cloned(&persister_conv);
+       }
+       void* event_handler_ptr = untag_ptr(event_handler);
+       CHECK_ACCESS(event_handler_ptr);
+       LDKEventHandler event_handler_conv = *(LDKEventHandler*)(event_handler_ptr);
+       if (event_handler_conv.free == LDKEventHandler_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKEventHandler_JCalls_cloned(&event_handler_conv);
+       }
+       LDKChainMonitor chain_monitor_conv;
+       chain_monitor_conv.inner = untag_ptr(chain_monitor);
+       chain_monitor_conv.is_owned = ptr_is_owned(chain_monitor);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(chain_monitor_conv);
+       chain_monitor_conv.is_owned = false;
+       LDKChannelManager channel_manager_conv;
+       channel_manager_conv.inner = untag_ptr(channel_manager);
+       channel_manager_conv.is_owned = ptr_is_owned(channel_manager);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_manager_conv);
+       channel_manager_conv.is_owned = false;
+       void* gossip_sync_ptr = untag_ptr(gossip_sync);
+       CHECK_ACCESS(gossip_sync_ptr);
+       LDKGossipSync gossip_sync_conv = *(LDKGossipSync*)(gossip_sync_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKGossipSync
+       LDKPeerManager peer_manager_conv;
+       peer_manager_conv.inner = untag_ptr(peer_manager);
+       peer_manager_conv.is_owned = ptr_is_owned(peer_manager);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(peer_manager_conv);
+       peer_manager_conv.is_owned = false;
+       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);
+       }
+       void* scorer_ptr = untag_ptr(scorer);
+       CHECK_ACCESS(scorer_ptr);
+       LDKCOption_WriteableScoreZ scorer_conv = *(LDKCOption_WriteableScoreZ*)(scorer_ptr);
+       // WARNING: we may need a move here but no clone is available for LDKCOption_WriteableScoreZ
+       if (scorer_conv.tag == LDKCOption_WriteableScoreZ_Some) {
+               // Manually implement clone for Java trait instances
+               if (scorer_conv.some.free == LDKWriteableScore_JCalls_free) {
+                       // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+                       LDKWriteableScore_JCalls_cloned(&scorer_conv.some);
+               }
+       }
+       LDKBackgroundProcessor ret_var = BackgroundProcessor_start(persister_conv, event_handler_conv, &chain_monitor_conv, &channel_manager_conv, gossip_sync_conv, &peer_manager_conv, logger_conv, scorer_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_BackgroundProcessor_join(int64_t this_arg) {
+       LDKBackgroundProcessor 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);
+       // WARNING: we need a move here but no clone is available for LDKBackgroundProcessor
+       
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = BackgroundProcessor_join(this_arg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_BackgroundProcessor_stop(int64_t this_arg) {
+       LDKBackgroundProcessor 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);
+       // WARNING: we need a move here but no clone is available for LDKBackgroundProcessor
+       
+       LDKCResult_NoneIOErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneIOErrorZ), "LDKCResult_NoneIOErrorZ");
+       *ret_conv = BackgroundProcessor_stop(this_arg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_Bolt11ParseError_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);
+       LDKBolt11ParseError this_ptr_conv = *(LDKBolt11ParseError*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Bolt11ParseError_free(this_ptr_conv);
+}
+
+static inline uint64_t Bolt11ParseError_clone_ptr(LDKBolt11ParseError *NONNULL_PTR arg) {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_Bolt11ParseError_clone_ptr(int64_t arg) {
+       LDKBolt11ParseError* arg_conv = (LDKBolt11ParseError*)untag_ptr(arg);
+       int64_t ret_conv = Bolt11ParseError_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_clone(int64_t orig) {
+       LDKBolt11ParseError* orig_conv = (LDKBolt11ParseError*)untag_ptr(orig);
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_bech32_error(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKBech32Error a_conv = *(LDKBech32Error*)(a_ptr);
+       a_conv = Bech32Error_clone((LDKBech32Error*)untag_ptr(a));
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_bech32_error(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_parse_amount_error(int32_t a) {
+       
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_parse_amount_error((LDKError){ ._dummy = 0 });
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_malformed_signature(int32_t a) {
+       LDKSecp256k1Error a_conv = LDKSecp256k1Error_from_cs(a);
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_malformed_signature(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_bad_prefix() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_bad_prefix();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_unknown_currency() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_unknown_currency();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_unknown_si_prefix() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_unknown_si_prefix();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_malformed_hrp() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_malformed_hrp();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_too_short_data_part() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_too_short_data_part();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_unexpected_end_of_tagged_fields() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_unexpected_end_of_tagged_fields();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_description_decode_error(int32_t a) {
+       
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_description_decode_error((LDKError){ ._dummy = 0 });
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_padding_error() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_padding_error();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_integer_overflow_error() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_integer_overflow_error();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_invalid_seg_wit_program_length() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_invalid_seg_wit_program_length();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_invalid_pub_key_hash_length() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_invalid_pub_key_hash_length();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_invalid_script_hash_length() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_invalid_script_hash_length();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_invalid_recovery_id() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_invalid_recovery_id();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_invalid_slice_length(jstring a) {
+       LDKStr a_conv = str_ref_to_owned_c(a);
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_invalid_slice_length(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11ParseError_skip() {
+       LDKBolt11ParseError *ret_copy = MALLOC(sizeof(LDKBolt11ParseError), "LDKBolt11ParseError");
+       *ret_copy = Bolt11ParseError_skip();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_Bolt11ParseError_eq(int64_t a, int64_t b) {
+       LDKBolt11ParseError* a_conv = (LDKBolt11ParseError*)untag_ptr(a);
+       LDKBolt11ParseError* b_conv = (LDKBolt11ParseError*)untag_ptr(b);
+       jboolean ret_conv = Bolt11ParseError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ParseOrSemanticError_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);
+       LDKParseOrSemanticError this_ptr_conv = *(LDKParseOrSemanticError*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       ParseOrSemanticError_free(this_ptr_conv);
+}
+
+static inline uint64_t ParseOrSemanticError_clone_ptr(LDKParseOrSemanticError *NONNULL_PTR arg) {
+       LDKParseOrSemanticError *ret_copy = MALLOC(sizeof(LDKParseOrSemanticError), "LDKParseOrSemanticError");
+       *ret_copy = ParseOrSemanticError_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_ParseOrSemanticError_clone_ptr(int64_t arg) {
+       LDKParseOrSemanticError* arg_conv = (LDKParseOrSemanticError*)untag_ptr(arg);
+       int64_t ret_conv = ParseOrSemanticError_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ParseOrSemanticError_clone(int64_t orig) {
+       LDKParseOrSemanticError* orig_conv = (LDKParseOrSemanticError*)untag_ptr(orig);
+       LDKParseOrSemanticError *ret_copy = MALLOC(sizeof(LDKParseOrSemanticError), "LDKParseOrSemanticError");
+       *ret_copy = ParseOrSemanticError_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ParseOrSemanticError_parse_error(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKBolt11ParseError a_conv = *(LDKBolt11ParseError*)(a_ptr);
+       a_conv = Bolt11ParseError_clone((LDKBolt11ParseError*)untag_ptr(a));
+       LDKParseOrSemanticError *ret_copy = MALLOC(sizeof(LDKParseOrSemanticError), "LDKParseOrSemanticError");
+       *ret_copy = ParseOrSemanticError_parse_error(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_ParseOrSemanticError_semantic_error(int32_t a) {
+       LDKBolt11SemanticError a_conv = LDKBolt11SemanticError_from_cs(a);
+       LDKParseOrSemanticError *ret_copy = MALLOC(sizeof(LDKParseOrSemanticError), "LDKParseOrSemanticError");
+       *ret_copy = ParseOrSemanticError_semantic_error(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_ParseOrSemanticError_eq(int64_t a, int64_t b) {
+       LDKParseOrSemanticError* a_conv = (LDKParseOrSemanticError*)untag_ptr(a);
+       LDKParseOrSemanticError* b_conv = (LDKParseOrSemanticError*)untag_ptr(b);
+       jboolean ret_conv = ParseOrSemanticError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Bolt11Invoice_free(int64_t this_obj) {
+       LDKBolt11Invoice 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);
+       Bolt11Invoice_free(this_obj_conv);
+}
+
+jboolean  CS_LDK_Bolt11Invoice_eq(int64_t a, int64_t b) {
+       LDKBolt11Invoice 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;
+       LDKBolt11Invoice 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 = Bolt11Invoice_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t Bolt11Invoice_clone_ptr(LDKBolt11Invoice *NONNULL_PTR arg) {
+       LDKBolt11Invoice ret_var = Bolt11Invoice_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_Bolt11Invoice_clone_ptr(int64_t arg) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_clone(int64_t orig) {
+       LDKBolt11Invoice 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;
+       LDKBolt11Invoice ret_var = Bolt11Invoice_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_Bolt11Invoice_hash(int64_t o) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_hash(&o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_SignedRawBolt11Invoice_free(int64_t this_obj) {
+       LDKSignedRawBolt11Invoice 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);
+       SignedRawBolt11Invoice_free(this_obj_conv);
+}
+
+jboolean  CS_LDK_SignedRawBolt11Invoice_eq(int64_t a, int64_t b) {
+       LDKSignedRawBolt11Invoice 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;
+       LDKSignedRawBolt11Invoice 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 = SignedRawBolt11Invoice_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t SignedRawBolt11Invoice_clone_ptr(LDKSignedRawBolt11Invoice *NONNULL_PTR arg) {
+       LDKSignedRawBolt11Invoice ret_var = SignedRawBolt11Invoice_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_SignedRawBolt11Invoice_clone_ptr(int64_t arg) {
+       LDKSignedRawBolt11Invoice 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 = SignedRawBolt11Invoice_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SignedRawBolt11Invoice_clone(int64_t orig) {
+       LDKSignedRawBolt11Invoice 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;
+       LDKSignedRawBolt11Invoice ret_var = SignedRawBolt11Invoice_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_SignedRawBolt11Invoice_hash(int64_t o) {
+       LDKSignedRawBolt11Invoice 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 = SignedRawBolt11Invoice_hash(&o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RawBolt11Invoice_free(int64_t this_obj) {
+       LDKRawBolt11Invoice 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);
+       RawBolt11Invoice_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_RawBolt11Invoice_get_data(int64_t this_ptr) {
+       LDKRawBolt11Invoice 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;
+       LDKRawDataPart ret_var = RawBolt11Invoice_get_data(&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_RawBolt11Invoice_set_data(int64_t this_ptr, int64_t val) {
+       LDKRawBolt11Invoice 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;
+       LDKRawDataPart 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 = RawDataPart_clone(&val_conv);
+       RawBolt11Invoice_set_data(&this_ptr_conv, val_conv);
+}
+
+jboolean  CS_LDK_RawBolt11Invoice_eq(int64_t a, int64_t b) {
+       LDKRawBolt11Invoice 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;
+       LDKRawBolt11Invoice 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 = RawBolt11Invoice_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t RawBolt11Invoice_clone_ptr(LDKRawBolt11Invoice *NONNULL_PTR arg) {
+       LDKRawBolt11Invoice ret_var = RawBolt11Invoice_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_RawBolt11Invoice_clone_ptr(int64_t arg) {
+       LDKRawBolt11Invoice 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 = RawBolt11Invoice_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RawBolt11Invoice_clone(int64_t orig) {
+       LDKRawBolt11Invoice 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;
+       LDKRawBolt11Invoice ret_var = RawBolt11Invoice_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_RawBolt11Invoice_hash(int64_t o) {
+       LDKRawBolt11Invoice 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 = RawBolt11Invoice_hash(&o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_RawDataPart_free(int64_t this_obj) {
+       LDKRawDataPart 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);
+       RawDataPart_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_RawDataPart_get_timestamp(int64_t this_ptr) {
+       LDKRawDataPart 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;
+       LDKPositiveTimestamp ret_var = RawDataPart_get_timestamp(&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_RawDataPart_set_timestamp(int64_t this_ptr, int64_t val) {
+       LDKRawDataPart 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;
+       LDKPositiveTimestamp 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 = PositiveTimestamp_clone(&val_conv);
+       RawDataPart_set_timestamp(&this_ptr_conv, val_conv);
+}
+
+jboolean  CS_LDK_RawDataPart_eq(int64_t a, int64_t b) {
+       LDKRawDataPart 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;
+       LDKRawDataPart 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 = RawDataPart_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t RawDataPart_clone_ptr(LDKRawDataPart *NONNULL_PTR arg) {
+       LDKRawDataPart ret_var = RawDataPart_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_RawDataPart_clone_ptr(int64_t arg) {
+       LDKRawDataPart 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 = RawDataPart_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RawDataPart_clone(int64_t orig) {
+       LDKRawDataPart 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;
+       LDKRawDataPart ret_var = RawDataPart_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_RawDataPart_hash(int64_t o) {
+       LDKRawDataPart 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 = RawDataPart_hash(&o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PositiveTimestamp_free(int64_t this_obj) {
+       LDKPositiveTimestamp 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);
+       PositiveTimestamp_free(this_obj_conv);
+}
+
+jboolean  CS_LDK_PositiveTimestamp_eq(int64_t a, int64_t b) {
+       LDKPositiveTimestamp 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;
+       LDKPositiveTimestamp 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 = PositiveTimestamp_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t PositiveTimestamp_clone_ptr(LDKPositiveTimestamp *NONNULL_PTR arg) {
+       LDKPositiveTimestamp ret_var = PositiveTimestamp_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_PositiveTimestamp_clone_ptr(int64_t arg) {
+       LDKPositiveTimestamp 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 = PositiveTimestamp_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PositiveTimestamp_clone(int64_t orig) {
+       LDKPositiveTimestamp 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;
+       LDKPositiveTimestamp ret_var = PositiveTimestamp_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_PositiveTimestamp_hash(int64_t o) {
+       LDKPositiveTimestamp 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 = PositiveTimestamp_hash(&o_conv);
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SiPrefix_clone(int64_t orig) {
+       LDKSiPrefix* orig_conv = (LDKSiPrefix*)untag_ptr(orig);
+       int32_t ret_conv = LDKSiPrefix_to_cs(SiPrefix_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SiPrefix_milli() {
+       int32_t ret_conv = LDKSiPrefix_to_cs(SiPrefix_milli());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SiPrefix_micro() {
+       int32_t ret_conv = LDKSiPrefix_to_cs(SiPrefix_micro());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SiPrefix_nano() {
+       int32_t ret_conv = LDKSiPrefix_to_cs(SiPrefix_nano());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_SiPrefix_pico() {
+       int32_t ret_conv = LDKSiPrefix_to_cs(SiPrefix_pico());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_SiPrefix_eq(int64_t a, int64_t b) {
+       LDKSiPrefix* a_conv = (LDKSiPrefix*)untag_ptr(a);
+       LDKSiPrefix* b_conv = (LDKSiPrefix*)untag_ptr(b);
+       jboolean ret_conv = SiPrefix_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SiPrefix_hash(int64_t o) {
+       LDKSiPrefix* o_conv = (LDKSiPrefix*)untag_ptr(o);
+       int64_t ret_conv = SiPrefix_hash(o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SiPrefix_multiplier(int64_t this_arg) {
+       LDKSiPrefix* this_arg_conv = (LDKSiPrefix*)untag_ptr(this_arg);
+       int64_t ret_conv = SiPrefix_multiplier(this_arg_conv);
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Currency_clone(int64_t orig) {
+       LDKCurrency* orig_conv = (LDKCurrency*)untag_ptr(orig);
+       int32_t ret_conv = LDKCurrency_to_cs(Currency_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Currency_bitcoin() {
+       int32_t ret_conv = LDKCurrency_to_cs(Currency_bitcoin());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Currency_bitcoin_testnet() {
+       int32_t ret_conv = LDKCurrency_to_cs(Currency_bitcoin_testnet());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Currency_regtest() {
+       int32_t ret_conv = LDKCurrency_to_cs(Currency_regtest());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Currency_simnet() {
+       int32_t ret_conv = LDKCurrency_to_cs(Currency_simnet());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Currency_signet() {
+       int32_t ret_conv = LDKCurrency_to_cs(Currency_signet());
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Currency_hash(int64_t o) {
+       LDKCurrency* o_conv = (LDKCurrency*)untag_ptr(o);
+       int64_t ret_conv = Currency_hash(o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Currency_eq(int64_t a, int64_t b) {
+       LDKCurrency* a_conv = (LDKCurrency*)untag_ptr(a);
+       LDKCurrency* b_conv = (LDKCurrency*)untag_ptr(b);
+       jboolean ret_conv = Currency_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Sha256_free(int64_t this_obj) {
+       LDKSha256 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);
+       Sha256_free(this_obj_conv);
+}
+
+static inline uint64_t Sha256_clone_ptr(LDKSha256 *NONNULL_PTR arg) {
+       LDKSha256 ret_var = Sha256_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_Sha256_clone_ptr(int64_t arg) {
+       LDKSha256 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 = Sha256_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Sha256_clone(int64_t orig) {
+       LDKSha256 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;
+       LDKSha256 ret_var = Sha256_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_Sha256_hash(int64_t o) {
+       LDKSha256 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 = Sha256_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Sha256_eq(int64_t a, int64_t b) {
+       LDKSha256 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;
+       LDKSha256 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 = Sha256_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Sha256_from_bytes(int8_tArray bytes) {
+       uint8_t bytes_arr[32];
+       CHECK(bytes->arr_len == 32);
+       memcpy(bytes_arr, bytes->elems, 32); FREE(bytes);
+       uint8_t (*bytes_ref)[32] = &bytes_arr;
+       LDKSha256 ret_var = Sha256_from_bytes(bytes_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;
+}
+
+void  CS_LDK_Description_free(int64_t this_obj) {
+       LDKDescription 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);
+       Description_free(this_obj_conv);
+}
+
+static inline uint64_t Description_clone_ptr(LDKDescription *NONNULL_PTR arg) {
+       LDKDescription ret_var = Description_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_Description_clone_ptr(int64_t arg) {
+       LDKDescription 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 = Description_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Description_clone(int64_t orig) {
+       LDKDescription 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;
+       LDKDescription ret_var = Description_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_Description_hash(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;
+       int64_t ret_conv = Description_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Description_eq(int64_t a, int64_t b) {
+       LDKDescription 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;
+       LDKDescription 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 = Description_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PayeePubKey_free(int64_t this_obj) {
+       LDKPayeePubKey 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);
+       PayeePubKey_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_PayeePubKey_get_a(int64_t this_ptr) {
+       LDKPayeePubKey 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, PayeePubKey_get_a(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_PayeePubKey_set_a(int64_t this_ptr, int8_tArray val) {
+       LDKPayeePubKey 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);
+       PayeePubKey_set_a(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_PayeePubKey_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);
+       LDKPayeePubKey ret_var = PayeePubKey_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;
+}
+
+static inline uint64_t PayeePubKey_clone_ptr(LDKPayeePubKey *NONNULL_PTR arg) {
+       LDKPayeePubKey ret_var = PayeePubKey_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_PayeePubKey_clone_ptr(int64_t arg) {
+       LDKPayeePubKey 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 = PayeePubKey_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PayeePubKey_clone(int64_t orig) {
+       LDKPayeePubKey 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;
+       LDKPayeePubKey ret_var = PayeePubKey_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_PayeePubKey_hash(int64_t o) {
+       LDKPayeePubKey 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 = PayeePubKey_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_PayeePubKey_eq(int64_t a, int64_t b) {
+       LDKPayeePubKey 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;
+       LDKPayeePubKey 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 = PayeePubKey_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ExpiryTime_free(int64_t this_obj) {
+       LDKExpiryTime 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);
+       ExpiryTime_free(this_obj_conv);
+}
+
+static inline uint64_t ExpiryTime_clone_ptr(LDKExpiryTime *NONNULL_PTR arg) {
+       LDKExpiryTime ret_var = ExpiryTime_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_ExpiryTime_clone_ptr(int64_t arg) {
+       LDKExpiryTime 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 = ExpiryTime_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ExpiryTime_clone(int64_t orig) {
+       LDKExpiryTime 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;
+       LDKExpiryTime ret_var = ExpiryTime_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_ExpiryTime_hash(int64_t o) {
+       LDKExpiryTime 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 = ExpiryTime_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_ExpiryTime_eq(int64_t a, int64_t b) {
+       LDKExpiryTime 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;
+       LDKExpiryTime 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 = ExpiryTime_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_MinFinalCltvExpiryDelta_free(int64_t this_obj) {
+       LDKMinFinalCltvExpiryDelta 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);
+       MinFinalCltvExpiryDelta_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_MinFinalCltvExpiryDelta_get_a(int64_t this_ptr) {
+       LDKMinFinalCltvExpiryDelta 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 = MinFinalCltvExpiryDelta_get_a(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_MinFinalCltvExpiryDelta_set_a(int64_t this_ptr, int64_t val) {
+       LDKMinFinalCltvExpiryDelta 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;
+       MinFinalCltvExpiryDelta_set_a(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_MinFinalCltvExpiryDelta_new(int64_t a_arg) {
+       LDKMinFinalCltvExpiryDelta ret_var = MinFinalCltvExpiryDelta_new(a_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 MinFinalCltvExpiryDelta_clone_ptr(LDKMinFinalCltvExpiryDelta *NONNULL_PTR arg) {
+       LDKMinFinalCltvExpiryDelta ret_var = MinFinalCltvExpiryDelta_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_MinFinalCltvExpiryDelta_clone_ptr(int64_t arg) {
+       LDKMinFinalCltvExpiryDelta 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 = MinFinalCltvExpiryDelta_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_MinFinalCltvExpiryDelta_clone(int64_t orig) {
+       LDKMinFinalCltvExpiryDelta 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;
+       LDKMinFinalCltvExpiryDelta ret_var = MinFinalCltvExpiryDelta_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_MinFinalCltvExpiryDelta_hash(int64_t o) {
+       LDKMinFinalCltvExpiryDelta 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 = MinFinalCltvExpiryDelta_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_MinFinalCltvExpiryDelta_eq(int64_t a, int64_t b) {
+       LDKMinFinalCltvExpiryDelta 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;
+       LDKMinFinalCltvExpiryDelta 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 = MinFinalCltvExpiryDelta_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Fallback_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);
+       LDKFallback this_ptr_conv = *(LDKFallback*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       Fallback_free(this_ptr_conv);
+}
+
+static inline uint64_t Fallback_clone_ptr(LDKFallback *NONNULL_PTR arg) {
+       LDKFallback *ret_copy = MALLOC(sizeof(LDKFallback), "LDKFallback");
+       *ret_copy = Fallback_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_Fallback_clone_ptr(int64_t arg) {
+       LDKFallback* arg_conv = (LDKFallback*)untag_ptr(arg);
+       int64_t ret_conv = Fallback_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Fallback_clone(int64_t orig) {
+       LDKFallback* orig_conv = (LDKFallback*)untag_ptr(orig);
+       LDKFallback *ret_copy = MALLOC(sizeof(LDKFallback), "LDKFallback");
+       *ret_copy = Fallback_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Fallback_seg_wit_program(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);
+       LDKFallback *ret_copy = MALLOC(sizeof(LDKFallback), "LDKFallback");
+       *ret_copy = Fallback_seg_wit_program((LDKWitnessVersion){ ._0 = version }, program_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Fallback_pub_key_hash(int8_tArray a) {
+       LDKTwentyBytes a_ref;
+       CHECK(a->arr_len == 20);
+       memcpy(a_ref.data, a->elems, 20); FREE(a);
+       LDKFallback *ret_copy = MALLOC(sizeof(LDKFallback), "LDKFallback");
+       *ret_copy = Fallback_pub_key_hash(a_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Fallback_script_hash(int8_tArray a) {
+       LDKTwentyBytes a_ref;
+       CHECK(a->arr_len == 20);
+       memcpy(a_ref.data, a->elems, 20); FREE(a);
+       LDKFallback *ret_copy = MALLOC(sizeof(LDKFallback), "LDKFallback");
+       *ret_copy = Fallback_script_hash(a_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Fallback_hash(int64_t o) {
+       LDKFallback* o_conv = (LDKFallback*)untag_ptr(o);
+       int64_t ret_conv = Fallback_hash(o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Fallback_eq(int64_t a, int64_t b) {
+       LDKFallback* a_conv = (LDKFallback*)untag_ptr(a);
+       LDKFallback* b_conv = (LDKFallback*)untag_ptr(b);
+       jboolean ret_conv = Fallback_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Bolt11InvoiceSignature_free(int64_t this_obj) {
+       LDKBolt11InvoiceSignature 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);
+       Bolt11InvoiceSignature_free(this_obj_conv);
+}
+
+static inline uint64_t Bolt11InvoiceSignature_clone_ptr(LDKBolt11InvoiceSignature *NONNULL_PTR arg) {
+       LDKBolt11InvoiceSignature ret_var = Bolt11InvoiceSignature_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_Bolt11InvoiceSignature_clone_ptr(int64_t arg) {
+       LDKBolt11InvoiceSignature 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 = Bolt11InvoiceSignature_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11InvoiceSignature_clone(int64_t orig) {
+       LDKBolt11InvoiceSignature 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;
+       LDKBolt11InvoiceSignature ret_var = Bolt11InvoiceSignature_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_Bolt11InvoiceSignature_hash(int64_t o) {
+       LDKBolt11InvoiceSignature 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 = Bolt11InvoiceSignature_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11InvoiceSignature_eq(int64_t a, int64_t b) {
+       LDKBolt11InvoiceSignature 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;
+       LDKBolt11InvoiceSignature 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 = Bolt11InvoiceSignature_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PrivateRoute_free(int64_t this_obj) {
+       LDKPrivateRoute 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);
+       PrivateRoute_free(this_obj_conv);
+}
+
+static inline uint64_t PrivateRoute_clone_ptr(LDKPrivateRoute *NONNULL_PTR arg) {
+       LDKPrivateRoute ret_var = PrivateRoute_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_PrivateRoute_clone_ptr(int64_t arg) {
+       LDKPrivateRoute 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 = PrivateRoute_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PrivateRoute_clone(int64_t orig) {
+       LDKPrivateRoute 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;
+       LDKPrivateRoute ret_var = PrivateRoute_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_PrivateRoute_hash(int64_t o) {
+       LDKPrivateRoute 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 = PrivateRoute_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_PrivateRoute_eq(int64_t a, int64_t b) {
+       LDKPrivateRoute 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;
+       LDKPrivateRoute 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 = PrivateRoute_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SignedRawBolt11Invoice_into_parts(int64_t this_arg) {
+       LDKSignedRawBolt11Invoice 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 = SignedRawBolt11Invoice_clone(&this_arg_conv);
+       LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ), "LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ");
+       *ret_conv = SignedRawBolt11Invoice_into_parts(this_arg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_SignedRawBolt11Invoice_raw_invoice(int64_t this_arg) {
+       LDKSignedRawBolt11Invoice 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;
+       LDKRawBolt11Invoice ret_var = SignedRawBolt11Invoice_raw_invoice(&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;
+}
+
+int8_tArray  CS_LDK_SignedRawBolt11Invoice_signable_hash(int64_t this_arg) {
+       LDKSignedRawBolt11Invoice 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, *SignedRawBolt11Invoice_signable_hash(&this_arg_conv), 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_SignedRawBolt11Invoice_signature(int64_t this_arg) {
+       LDKSignedRawBolt11Invoice 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;
+       LDKBolt11InvoiceSignature ret_var = SignedRawBolt11Invoice_signature(&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_SignedRawBolt11Invoice_recover_payee_pub_key(int64_t this_arg) {
+       LDKSignedRawBolt11Invoice 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;
+       LDKCResult_PayeePubKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PayeePubKeySecp256k1ErrorZ), "LDKCResult_PayeePubKeySecp256k1ErrorZ");
+       *ret_conv = SignedRawBolt11Invoice_recover_payee_pub_key(&this_arg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_SignedRawBolt11Invoice_check_signature(int64_t this_arg) {
+       LDKSignedRawBolt11Invoice 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 = SignedRawBolt11Invoice_check_signature(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_RawBolt11Invoice_signable_hash(int64_t this_arg) {
+       LDKRawBolt11Invoice 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, RawBolt11Invoice_signable_hash(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_RawBolt11Invoice_payment_hash(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKSha256 ret_var = RawBolt11Invoice_payment_hash(&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_RawBolt11Invoice_description(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKDescription ret_var = RawBolt11Invoice_description(&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_RawBolt11Invoice_payee_pub_key(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKPayeePubKey ret_var = RawBolt11Invoice_payee_pub_key(&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_RawBolt11Invoice_description_hash(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKSha256 ret_var = RawBolt11Invoice_description_hash(&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_RawBolt11Invoice_expiry_time(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKExpiryTime ret_var = RawBolt11Invoice_expiry_time(&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_RawBolt11Invoice_min_final_cltv_expiry_delta(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKMinFinalCltvExpiryDelta ret_var = RawBolt11Invoice_min_final_cltv_expiry_delta(&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_RawBolt11Invoice_payment_secret(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
+       *ret_copy = RawBolt11Invoice_payment_secret(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RawBolt11Invoice_payment_metadata(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = RawBolt11Invoice_payment_metadata(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RawBolt11Invoice_features(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKBolt11InvoiceFeatures ret_var = RawBolt11Invoice_features(&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_tArray  CS_LDK_RawBolt11Invoice_private_routes(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKCVec_PrivateRouteZ ret_var = RawBolt11Invoice_private_routes(&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 o = 0; o < ret_var.datalen; o++) {
+               LDKPrivateRoute ret_conv_14_var = ret_var.data[o];
+               int64_t ret_conv_14_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_14_var);
+               ret_conv_14_ref = tag_ptr(ret_conv_14_var.inner, ret_conv_14_var.is_owned);
+               ret_arr_ptr[o] = ret_conv_14_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_RawBolt11Invoice_amount_pico_btc(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = RawBolt11Invoice_amount_pico_btc(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int32_t  CS_LDK_RawBolt11Invoice_currency(int64_t this_arg) {
+       LDKRawBolt11Invoice 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;
+       int32_t ret_conv = LDKCurrency_to_cs(RawBolt11Invoice_currency(&this_arg_conv));
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PositiveTimestamp_from_unix_timestamp(int64_t unix_seconds) {
+       LDKCResult_PositiveTimestampCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PositiveTimestampCreationErrorZ), "LDKCResult_PositiveTimestampCreationErrorZ");
+       *ret_conv = PositiveTimestamp_from_unix_timestamp(unix_seconds);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PositiveTimestamp_from_system_time(int64_t time) {
+       LDKCResult_PositiveTimestampCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PositiveTimestampCreationErrorZ), "LDKCResult_PositiveTimestampCreationErrorZ");
+       *ret_conv = PositiveTimestamp_from_system_time(time);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PositiveTimestamp_from_duration_since_epoch(int64_t duration) {
+       LDKCResult_PositiveTimestampCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PositiveTimestampCreationErrorZ), "LDKCResult_PositiveTimestampCreationErrorZ");
+       *ret_conv = PositiveTimestamp_from_duration_since_epoch(duration);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PositiveTimestamp_as_unix_timestamp(int64_t this_arg) {
+       LDKPositiveTimestamp 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 = PositiveTimestamp_as_unix_timestamp(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PositiveTimestamp_as_duration_since_epoch(int64_t this_arg) {
+       LDKPositiveTimestamp 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 = PositiveTimestamp_as_duration_since_epoch(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PositiveTimestamp_as_time(int64_t this_arg) {
+       LDKPositiveTimestamp 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 = PositiveTimestamp_as_time(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Bolt11Invoice_signable_hash(int64_t this_arg) {
+       LDKBolt11Invoice 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, Bolt11Invoice_signable_hash(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_into_signed_raw(int64_t this_arg) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_clone(&this_arg_conv);
+       LDKSignedRawBolt11Invoice ret_var = Bolt11Invoice_into_signed_raw(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_Bolt11Invoice_check_signature(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       LDKCResult_NoneBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneBolt11SemanticErrorZ), "LDKCResult_NoneBolt11SemanticErrorZ");
+       *ret_conv = Bolt11Invoice_check_signature(&this_arg_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt11Invoice_from_signed(int64_t signed_invoice) {
+       LDKSignedRawBolt11Invoice signed_invoice_conv;
+       signed_invoice_conv.inner = untag_ptr(signed_invoice);
+       signed_invoice_conv.is_owned = ptr_is_owned(signed_invoice);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(signed_invoice_conv);
+       signed_invoice_conv = SignedRawBolt11Invoice_clone(&signed_invoice_conv);
+       LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ), "LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ");
+       *ret_conv = Bolt11Invoice_from_signed(signed_invoice_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt11Invoice_timestamp(int64_t this_arg) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_timestamp(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_duration_since_epoch(int64_t this_arg) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_duration_since_epoch(&this_arg_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_Bolt11Invoice_payment_hash(int64_t this_arg) {
+       LDKBolt11Invoice 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, *Bolt11Invoice_payment_hash(&this_arg_conv), 32);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_Bolt11Invoice_payee_pub_key(int64_t this_arg) {
+       LDKBolt11Invoice 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, Bolt11Invoice_payee_pub_key(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_Bolt11Invoice_payment_secret(int64_t this_arg) {
+       LDKBolt11Invoice 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, *Bolt11Invoice_payment_secret(&this_arg_conv), 32);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_payment_metadata(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       LDKCOption_CVec_u8ZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_u8ZZ), "LDKCOption_CVec_u8ZZ");
+       *ret_copy = Bolt11Invoice_payment_metadata(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_features(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       LDKBolt11InvoiceFeatures ret_var = Bolt11Invoice_features(&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;
+}
+
+int8_tArray  CS_LDK_Bolt11Invoice_recover_payee_pub_key(int64_t this_arg) {
+       LDKBolt11Invoice 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, Bolt11Invoice_recover_payee_pub_key(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_expires_at(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = Bolt11Invoice_expires_at(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_expiry_time(int64_t this_arg) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_expiry_time(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11Invoice_is_expired(int64_t this_arg) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_is_expired(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_duration_until_expiry(int64_t this_arg) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_duration_until_expiry(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_expiration_remaining_from_epoch(int64_t this_arg, int64_t time) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_expiration_remaining_from_epoch(&this_arg_conv, time);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11Invoice_would_expire(int64_t this_arg, int64_t at_time) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_would_expire(&this_arg_conv, at_time);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_min_final_cltv_expiry_delta(int64_t this_arg) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_min_final_cltv_expiry_delta(&this_arg_conv);
+       return ret_conv;
+}
+
+ptrArray  CS_LDK_Bolt11Invoice_fallback_addresses(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       LDKCVec_StrZ ret_var = Bolt11Invoice_fallback_addresses(&this_arg_conv);
+       ptrArray ret_arr = NULL;
+       ret_arr = init_ptrArray(ret_var.datalen, __LINE__);
+       jstring *ret_arr_ptr = (jstring*)(((uint8_t*)ret_arr) + 8);
+       for (size_t i = 0; i < ret_var.datalen; i++) {
+               LDKStr ret_conv_8_str = ret_var.data[i];
+               jstring ret_conv_8_conv = str_ref_to_cs(ret_conv_8_str.chars, ret_conv_8_str.len);
+               Str_free(ret_conv_8_str);
+               ret_arr_ptr[i] = ret_conv_8_conv;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_Bolt11Invoice_private_routes(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       LDKCVec_PrivateRouteZ ret_var = Bolt11Invoice_private_routes(&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 o = 0; o < ret_var.datalen; o++) {
+               LDKPrivateRoute ret_conv_14_var = ret_var.data[o];
+               int64_t ret_conv_14_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_14_var);
+               ret_conv_14_ref = tag_ptr(ret_conv_14_var.inner, ret_conv_14_var.is_owned);
+               ret_arr_ptr[o] = ret_conv_14_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int64_tArray  CS_LDK_Bolt11Invoice_route_hints(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       LDKCVec_RouteHintZ ret_var = Bolt11Invoice_route_hints(&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 l = 0; l < ret_var.datalen; l++) {
+               LDKRouteHint ret_conv_11_var = ret_var.data[l];
+               int64_t ret_conv_11_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_11_var);
+               ret_conv_11_ref = tag_ptr(ret_conv_11_var.inner, ret_conv_11_var.is_owned);
+               ret_arr_ptr[l] = ret_conv_11_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+int32_t  CS_LDK_Bolt11Invoice_currency(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       int32_t ret_conv = LDKCurrency_to_cs(Bolt11Invoice_currency(&this_arg_conv));
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11Invoice_amount_milli_satoshis(int64_t this_arg) {
+       LDKBolt11Invoice 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;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = Bolt11Invoice_amount_milli_satoshis(&this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_Description_new(jstring description) {
+       LDKStr description_conv = str_ref_to_owned_c(description);
+       LDKCResult_DescriptionCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DescriptionCreationErrorZ), "LDKCResult_DescriptionCreationErrorZ");
+       *ret_conv = Description_new(description_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jstring  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);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ExpiryTime_from_seconds(int64_t seconds) {
+       LDKExpiryTime ret_var = ExpiryTime_from_seconds(seconds);
+       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_ExpiryTime_from_duration(int64_t duration) {
+       LDKExpiryTime ret_var = ExpiryTime_from_duration(duration);
+       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_ExpiryTime_as_seconds(int64_t this_arg) {
+       LDKExpiryTime 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 = ExpiryTime_as_seconds(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ExpiryTime_as_duration(int64_t this_arg) {
+       LDKExpiryTime 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 = ExpiryTime_as_duration(&this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PrivateRoute_new(int64_t hops) {
+       LDKRouteHint hops_conv;
+       hops_conv.inner = untag_ptr(hops);
+       hops_conv.is_owned = ptr_is_owned(hops);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(hops_conv);
+       hops_conv = RouteHint_clone(&hops_conv);
+       LDKCResult_PrivateRouteCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PrivateRouteCreationErrorZ), "LDKCResult_PrivateRouteCreationErrorZ");
+       *ret_conv = PrivateRoute_new(hops_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_PrivateRoute_into_inner(int64_t this_arg) {
+       LDKPrivateRoute 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 = PrivateRoute_clone(&this_arg_conv);
+       LDKRouteHint ret_var = PrivateRoute_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;
+}
+
+int32_t  CS_LDK_CreationError_clone(int64_t orig) {
+       LDKCreationError* orig_conv = (LDKCreationError*)untag_ptr(orig);
+       int32_t ret_conv = LDKCreationError_to_cs(CreationError_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_CreationError_description_too_long() {
+       int32_t ret_conv = LDKCreationError_to_cs(CreationError_description_too_long());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_CreationError_route_too_long() {
+       int32_t ret_conv = LDKCreationError_to_cs(CreationError_route_too_long());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_CreationError_timestamp_out_of_bounds() {
+       int32_t ret_conv = LDKCreationError_to_cs(CreationError_timestamp_out_of_bounds());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_CreationError_invalid_amount() {
+       int32_t ret_conv = LDKCreationError_to_cs(CreationError_invalid_amount());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_CreationError_missing_route_hints() {
+       int32_t ret_conv = LDKCreationError_to_cs(CreationError_missing_route_hints());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_CreationError_min_final_cltv_expiry_delta_too_short() {
+       int32_t ret_conv = LDKCreationError_to_cs(CreationError_min_final_cltv_expiry_delta_too_short());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_CreationError_eq(int64_t a, int64_t b) {
+       LDKCreationError* a_conv = (LDKCreationError*)untag_ptr(a);
+       LDKCreationError* b_conv = (LDKCreationError*)untag_ptr(b);
+       jboolean ret_conv = CreationError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+jstring  CS_LDK_CreationError_to_str(int64_t o) {
+       LDKCreationError* o_conv = (LDKCreationError*)untag_ptr(o);
+       LDKStr ret_str = CreationError_to_str(o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_clone(int64_t orig) {
+       LDKBolt11SemanticError* orig_conv = (LDKBolt11SemanticError*)untag_ptr(orig);
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_no_payment_hash() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_no_payment_hash());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_multiple_payment_hashes() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_multiple_payment_hashes());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_no_description() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_no_description());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_multiple_descriptions() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_multiple_descriptions());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_no_payment_secret() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_no_payment_secret());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_multiple_payment_secrets() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_multiple_payment_secrets());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_invalid_features() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_invalid_features());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_invalid_recovery_id() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_invalid_recovery_id());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_invalid_signature() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_invalid_signature());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_Bolt11SemanticError_imprecise_amount() {
+       int32_t ret_conv = LDKBolt11SemanticError_to_cs(Bolt11SemanticError_imprecise_amount());
+       return ret_conv;
+}
+
+jboolean  CS_LDK_Bolt11SemanticError_eq(int64_t a, int64_t b) {
+       LDKBolt11SemanticError* a_conv = (LDKBolt11SemanticError*)untag_ptr(a);
+       LDKBolt11SemanticError* b_conv = (LDKBolt11SemanticError*)untag_ptr(b);
+       jboolean ret_conv = Bolt11SemanticError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+jstring  CS_LDK_Bolt11SemanticError_to_str(int64_t o) {
+       LDKBolt11SemanticError* o_conv = (LDKBolt11SemanticError*)untag_ptr(o);
+       LDKStr ret_str = Bolt11SemanticError_to_str(o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+void  CS_LDK_SignOrCreationError_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);
+       LDKSignOrCreationError this_ptr_conv = *(LDKSignOrCreationError*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       SignOrCreationError_free(this_ptr_conv);
+}
+
+static inline uint64_t SignOrCreationError_clone_ptr(LDKSignOrCreationError *NONNULL_PTR arg) {
+       LDKSignOrCreationError *ret_copy = MALLOC(sizeof(LDKSignOrCreationError), "LDKSignOrCreationError");
+       *ret_copy = SignOrCreationError_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_SignOrCreationError_clone_ptr(int64_t arg) {
+       LDKSignOrCreationError* arg_conv = (LDKSignOrCreationError*)untag_ptr(arg);
+       int64_t ret_conv = SignOrCreationError_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SignOrCreationError_clone(int64_t orig) {
+       LDKSignOrCreationError* orig_conv = (LDKSignOrCreationError*)untag_ptr(orig);
+       LDKSignOrCreationError *ret_copy = MALLOC(sizeof(LDKSignOrCreationError), "LDKSignOrCreationError");
+       *ret_copy = SignOrCreationError_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SignOrCreationError_sign_error() {
+       LDKSignOrCreationError *ret_copy = MALLOC(sizeof(LDKSignOrCreationError), "LDKSignOrCreationError");
+       *ret_copy = SignOrCreationError_sign_error();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SignOrCreationError_creation_error(int32_t a) {
+       LDKCreationError a_conv = LDKCreationError_from_cs(a);
+       LDKSignOrCreationError *ret_copy = MALLOC(sizeof(LDKSignOrCreationError), "LDKSignOrCreationError");
+       *ret_copy = SignOrCreationError_creation_error(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_SignOrCreationError_eq(int64_t a, int64_t b) {
+       LDKSignOrCreationError* a_conv = (LDKSignOrCreationError*)untag_ptr(a);
+       LDKSignOrCreationError* b_conv = (LDKSignOrCreationError*)untag_ptr(b);
+       jboolean ret_conv = SignOrCreationError_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
+jstring  CS_LDK_SignOrCreationError_to_str(int64_t o) {
+       LDKSignOrCreationError* o_conv = (LDKSignOrCreationError*)untag_ptr(o);
+       LDKStr ret_str = SignOrCreationError_to_str(o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_pay_invoice(int64_t invoice, 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_invoice(&invoice_conv, retry_strategy_conv, &channelmanager_conv);
+       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) {
+       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);
+       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);
+       LDKCOption_u64Z amt_msat_conv = *(LDKCOption_u64Z*)(amt_msat_ptr);
+       amt_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(amt_msat));
+       void* payment_hash_ptr = untag_ptr(payment_hash);
+       CHECK_ACCESS(payment_hash_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_hash_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_hash_ptr);
+       payment_hash_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_hash));
+       LDKStr description_conv = str_ref_to_owned_c(description);
+       LDKCVec_PhantomRouteHintsZ phantom_route_hints_constr;
+       phantom_route_hints_constr.datalen = phantom_route_hints->arr_len;
+       if (phantom_route_hints_constr.datalen > 0)
+               phantom_route_hints_constr.data = MALLOC(phantom_route_hints_constr.datalen * sizeof(LDKPhantomRouteHints), "LDKCVec_PhantomRouteHintsZ Elements");
+       else
+               phantom_route_hints_constr.data = NULL;
+       int64_t* phantom_route_hints_vals = phantom_route_hints->elems;
+       for (size_t t = 0; t < phantom_route_hints_constr.datalen; t++) {
+               int64_t phantom_route_hints_conv_19 = phantom_route_hints_vals[t];
+               LDKPhantomRouteHints phantom_route_hints_conv_19_conv;
+               phantom_route_hints_conv_19_conv.inner = untag_ptr(phantom_route_hints_conv_19);
+               phantom_route_hints_conv_19_conv.is_owned = ptr_is_owned(phantom_route_hints_conv_19);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(phantom_route_hints_conv_19_conv);
+               phantom_route_hints_conv_19_conv = PhantomRouteHints_clone(&phantom_route_hints_conv_19_conv);
+               phantom_route_hints_constr.data[t] = phantom_route_hints_conv_19_conv;
+       }
+       FREE(phantom_route_hints);
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       LDKCurrency network_conv = LDKCurrency_from_cs(network);
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = create_phantom_invoice(amt_msat_conv, payment_hash_conv, description_conv, invoice_expiry_delta_secs, phantom_route_hints_constr, entropy_source_conv, node_signer_conv, logger_conv, network_conv, min_final_cltv_expiry_delta_conv, duration_since_epoch);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_create_phantom_invoice_with_description_hash(int64_t amt_msat, int64_t payment_hash, int32_t invoice_expiry_delta_secs, int64_t description_hash, 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);
+       LDKCOption_u64Z amt_msat_conv = *(LDKCOption_u64Z*)(amt_msat_ptr);
+       amt_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(amt_msat));
+       void* payment_hash_ptr = untag_ptr(payment_hash);
+       CHECK_ACCESS(payment_hash_ptr);
+       LDKCOption_ThirtyTwoBytesZ payment_hash_conv = *(LDKCOption_ThirtyTwoBytesZ*)(payment_hash_ptr);
+       payment_hash_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(payment_hash));
+       LDKSha256 description_hash_conv;
+       description_hash_conv.inner = untag_ptr(description_hash);
+       description_hash_conv.is_owned = ptr_is_owned(description_hash);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(description_hash_conv);
+       description_hash_conv = Sha256_clone(&description_hash_conv);
+       LDKCVec_PhantomRouteHintsZ phantom_route_hints_constr;
+       phantom_route_hints_constr.datalen = phantom_route_hints->arr_len;
+       if (phantom_route_hints_constr.datalen > 0)
+               phantom_route_hints_constr.data = MALLOC(phantom_route_hints_constr.datalen * sizeof(LDKPhantomRouteHints), "LDKCVec_PhantomRouteHintsZ Elements");
+       else
+               phantom_route_hints_constr.data = NULL;
+       int64_t* phantom_route_hints_vals = phantom_route_hints->elems;
+       for (size_t t = 0; t < phantom_route_hints_constr.datalen; t++) {
+               int64_t phantom_route_hints_conv_19 = phantom_route_hints_vals[t];
+               LDKPhantomRouteHints phantom_route_hints_conv_19_conv;
+               phantom_route_hints_conv_19_conv.inner = untag_ptr(phantom_route_hints_conv_19);
+               phantom_route_hints_conv_19_conv.is_owned = ptr_is_owned(phantom_route_hints_conv_19);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(phantom_route_hints_conv_19_conv);
+               phantom_route_hints_conv_19_conv = PhantomRouteHints_clone(&phantom_route_hints_conv_19_conv);
+               phantom_route_hints_constr.data[t] = phantom_route_hints_conv_19_conv;
+       }
+       FREE(phantom_route_hints);
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       LDKCurrency network_conv = LDKCurrency_from_cs(network);
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = create_phantom_invoice_with_description_hash(amt_msat_conv, payment_hash_conv, invoice_expiry_delta_secs, description_hash_conv, phantom_route_hints_constr, entropy_source_conv, node_signer_conv, logger_conv, network_conv, min_final_cltv_expiry_delta_conv, duration_since_epoch);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_create_invoice_from_channelmanager(int64_t channelmanager, int64_t node_signer, int64_t logger, int32_t network, int64_t amt_msat, jstring description, int32_t invoice_expiry_delta_secs, int64_t min_final_cltv_expiry_delta) {
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       LDKCurrency network_conv = LDKCurrency_from_cs(network);
+       void* amt_msat_ptr = untag_ptr(amt_msat);
+       CHECK_ACCESS(amt_msat_ptr);
+       LDKCOption_u64Z amt_msat_conv = *(LDKCOption_u64Z*)(amt_msat_ptr);
+       amt_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(amt_msat));
+       LDKStr description_conv = str_ref_to_owned_c(description);
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = create_invoice_from_channelmanager(&channelmanager_conv, node_signer_conv, logger_conv, network_conv, amt_msat_conv, description_conv, invoice_expiry_delta_secs, min_final_cltv_expiry_delta_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_create_invoice_from_channelmanager_with_description_hash(int64_t channelmanager, int64_t node_signer, int64_t logger, int32_t network, int64_t amt_msat, int64_t description_hash, int32_t invoice_expiry_delta_secs, int64_t min_final_cltv_expiry_delta) {
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       LDKCurrency network_conv = LDKCurrency_from_cs(network);
+       void* amt_msat_ptr = untag_ptr(amt_msat);
+       CHECK_ACCESS(amt_msat_ptr);
+       LDKCOption_u64Z amt_msat_conv = *(LDKCOption_u64Z*)(amt_msat_ptr);
+       amt_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(amt_msat));
+       LDKSha256 description_hash_conv;
+       description_hash_conv.inner = untag_ptr(description_hash);
+       description_hash_conv.is_owned = ptr_is_owned(description_hash);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(description_hash_conv);
+       description_hash_conv = Sha256_clone(&description_hash_conv);
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = create_invoice_from_channelmanager_with_description_hash(&channelmanager_conv, node_signer_conv, logger_conv, network_conv, amt_msat_conv, description_hash_conv, invoice_expiry_delta_secs, min_final_cltv_expiry_delta_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_create_invoice_from_channelmanager_with_description_hash_and_duration_since_epoch(int64_t channelmanager, int64_t node_signer, int64_t logger, int32_t network, int64_t amt_msat, int64_t description_hash, int64_t duration_since_epoch, int32_t invoice_expiry_delta_secs, int64_t min_final_cltv_expiry_delta) {
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       LDKCurrency network_conv = LDKCurrency_from_cs(network);
+       void* amt_msat_ptr = untag_ptr(amt_msat);
+       CHECK_ACCESS(amt_msat_ptr);
+       LDKCOption_u64Z amt_msat_conv = *(LDKCOption_u64Z*)(amt_msat_ptr);
+       amt_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(amt_msat));
+       LDKSha256 description_hash_conv;
+       description_hash_conv.inner = untag_ptr(description_hash);
+       description_hash_conv.is_owned = ptr_is_owned(description_hash);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(description_hash_conv);
+       description_hash_conv = Sha256_clone(&description_hash_conv);
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = create_invoice_from_channelmanager_with_description_hash_and_duration_since_epoch(&channelmanager_conv, node_signer_conv, logger_conv, network_conv, amt_msat_conv, description_hash_conv, duration_since_epoch, invoice_expiry_delta_secs, min_final_cltv_expiry_delta_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_create_invoice_from_channelmanager_and_duration_since_epoch(int64_t channelmanager, int64_t node_signer, int64_t logger, int32_t network, int64_t amt_msat, jstring description, int64_t duration_since_epoch, int32_t invoice_expiry_delta_secs, int64_t min_final_cltv_expiry_delta) {
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       LDKCurrency network_conv = LDKCurrency_from_cs(network);
+       void* amt_msat_ptr = untag_ptr(amt_msat);
+       CHECK_ACCESS(amt_msat_ptr);
+       LDKCOption_u64Z amt_msat_conv = *(LDKCOption_u64Z*)(amt_msat_ptr);
+       amt_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(amt_msat));
+       LDKStr description_conv = str_ref_to_owned_c(description);
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = create_invoice_from_channelmanager_and_duration_since_epoch(&channelmanager_conv, node_signer_conv, logger_conv, network_conv, amt_msat_conv, description_conv, duration_since_epoch, invoice_expiry_delta_secs, min_final_cltv_expiry_delta_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_hash(int64_t channelmanager, int64_t node_signer, int64_t logger, int32_t network, int64_t amt_msat, jstring description, int64_t duration_since_epoch, int32_t invoice_expiry_delta_secs, int8_tArray payment_hash, int64_t min_final_cltv_expiry_delta) {
+       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* node_signer_ptr = untag_ptr(node_signer);
+       CHECK_ACCESS(node_signer_ptr);
+       LDKNodeSigner node_signer_conv = *(LDKNodeSigner*)(node_signer_ptr);
+       if (node_signer_conv.free == LDKNodeSigner_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKNodeSigner_JCalls_cloned(&node_signer_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);
+       }
+       LDKCurrency network_conv = LDKCurrency_from_cs(network);
+       void* amt_msat_ptr = untag_ptr(amt_msat);
+       CHECK_ACCESS(amt_msat_ptr);
+       LDKCOption_u64Z amt_msat_conv = *(LDKCOption_u64Z*)(amt_msat_ptr);
+       amt_msat_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(amt_msat));
+       LDKStr description_conv = str_ref_to_owned_c(description);
+       LDKThirtyTwoBytes payment_hash_ref;
+       CHECK(payment_hash->arr_len == 32);
+       memcpy(payment_hash_ref.data, payment_hash->elems, 32); FREE(payment_hash);
+       void* min_final_cltv_expiry_delta_ptr = untag_ptr(min_final_cltv_expiry_delta);
+       CHECK_ACCESS(min_final_cltv_expiry_delta_ptr);
+       LDKCOption_u16Z min_final_cltv_expiry_delta_conv = *(LDKCOption_u16Z*)(min_final_cltv_expiry_delta_ptr);
+       min_final_cltv_expiry_delta_conv = COption_u16Z_clone((LDKCOption_u16Z*)untag_ptr(min_final_cltv_expiry_delta));
+       LDKCResult_Bolt11InvoiceSignOrCreationErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceSignOrCreationErrorZ), "LDKCResult_Bolt11InvoiceSignOrCreationErrorZ");
+       *ret_conv = create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_hash(&channelmanager_conv, node_signer_conv, logger_conv, network_conv, amt_msat_conv, description_conv, duration_since_epoch, invoice_expiry_delta_secs, payment_hash_ref, min_final_cltv_expiry_delta_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_SiPrefix_from_str(jstring s) {
+       LDKStr s_conv = str_ref_to_owned_c(s);
+       LDKCResult_SiPrefixBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SiPrefixBolt11ParseErrorZ), "LDKCResult_SiPrefixBolt11ParseErrorZ");
+       *ret_conv = SiPrefix_from_str(s_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_Bolt11Invoice_from_str(jstring s) {
+       LDKStr s_conv = str_ref_to_owned_c(s);
+       LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ), "LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ");
+       *ret_conv = Bolt11Invoice_from_str(s_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_SignedRawBolt11Invoice_from_str(jstring s) {
+       LDKStr s_conv = str_ref_to_owned_c(s);
+       LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ), "LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ");
+       *ret_conv = SignedRawBolt11Invoice_from_str(s_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jstring  CS_LDK_Bolt11ParseError_to_str(int64_t o) {
+       LDKBolt11ParseError* o_conv = (LDKBolt11ParseError*)untag_ptr(o);
+       LDKStr ret_str = Bolt11ParseError_to_str(o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+jstring  CS_LDK_ParseOrSemanticError_to_str(int64_t o) {
+       LDKParseOrSemanticError* o_conv = (LDKParseOrSemanticError*)untag_ptr(o);
+       LDKStr ret_str = ParseOrSemanticError_to_str(o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+jstring  CS_LDK_Bolt11Invoice_to_str(int64_t o) {
+       LDKBolt11Invoice 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 = Bolt11Invoice_to_str(&o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+jstring  CS_LDK_SignedRawBolt11Invoice_to_str(int64_t o) {
+       LDKSignedRawBolt11Invoice 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 = SignedRawBolt11Invoice_to_str(&o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+jstring  CS_LDK_Currency_to_str(int64_t o) {
+       LDKCurrency* o_conv = (LDKCurrency*)untag_ptr(o);
+       LDKStr ret_str = Currency_to_str(o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+jstring  CS_LDK_SiPrefix_to_str(int64_t o) {
+       LDKSiPrefix* o_conv = (LDKSiPrefix*)untag_ptr(o);
+       LDKStr ret_str = SiPrefix_to_str(o_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+void  CS_LDK_RapidGossipSync_free(int64_t this_obj) {
+       LDKRapidGossipSync 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);
+       RapidGossipSync_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_RapidGossipSync_new(int64_t network_graph, int64_t logger) {
+       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* 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);
+       }
+       LDKRapidGossipSync ret_var = RapidGossipSync_new(&network_graph_conv, logger_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_RapidGossipSync_sync_network_graph_with_file_path(int64_t this_arg, jstring sync_path) {
+       LDKRapidGossipSync 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 sync_path_conv = str_ref_to_owned_c(sync_path);
+       LDKCResult_u32GraphSyncErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_u32GraphSyncErrorZ), "LDKCResult_u32GraphSyncErrorZ");
+       *ret_conv = RapidGossipSync_sync_network_graph_with_file_path(&this_arg_conv, sync_path_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RapidGossipSync_update_network_graph(int64_t this_arg, int8_tArray update_data) {
+       LDKRapidGossipSync 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;
+       LDKu8slice update_data_ref;
+       update_data_ref.datalen = update_data->arr_len;
+       update_data_ref.data = update_data->elems;
+       LDKCResult_u32GraphSyncErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_u32GraphSyncErrorZ), "LDKCResult_u32GraphSyncErrorZ");
+       *ret_conv = RapidGossipSync_update_network_graph(&this_arg_conv, update_data_ref);
+       FREE(update_data);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_RapidGossipSync_update_network_graph_no_std(int64_t this_arg, int8_tArray update_data, int64_t current_time_unix) {
+       LDKRapidGossipSync 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;
+       LDKu8slice update_data_ref;
+       update_data_ref.datalen = update_data->arr_len;
+       update_data_ref.data = update_data->elems;
+       void* current_time_unix_ptr = untag_ptr(current_time_unix);
+       CHECK_ACCESS(current_time_unix_ptr);
+       LDKCOption_u64Z current_time_unix_conv = *(LDKCOption_u64Z*)(current_time_unix_ptr);
+       current_time_unix_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(current_time_unix));
+       LDKCResult_u32GraphSyncErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_u32GraphSyncErrorZ), "LDKCResult_u32GraphSyncErrorZ");
+       *ret_conv = RapidGossipSync_update_network_graph_no_std(&this_arg_conv, update_data_ref, current_time_unix_conv);
+       FREE(update_data);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_RapidGossipSync_is_initial_sync_complete(int64_t this_arg) {
+       LDKRapidGossipSync 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 = RapidGossipSync_is_initial_sync_complete(&this_arg_conv);
+       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/build-release-nupkg.sh b/c_sharp/build-release-nupkg.sh
new file mode 100755 (executable)
index 0000000..476a431
--- /dev/null
@@ -0,0 +1,14 @@
+#/bin/sh
+set -e
+set -x
+
+# zips are not generally deterministic without some tweaking, which we do here.
+
+echo "Checking that required release native libraries are present..."
+ls packaging_artifacts/runtimes/win-x64/native/ldkcsharp.dll
+ls packaging_artifacts/runtimes/linux-x64/native/libldkcsharp.so
+ls packaging_artifacts/lib/net3.0/csharpldk.dll
+
+cd packaging_artifacts
+find . | xargs -L1 touch -d "2021-01-01 00:00 UTC" 
+zip -Xvu ../org.ldk.nupkg * */* */*/* */*/*/* */*/*/*/*
diff --git a/c_sharp/packaging_artifacts/LICENSE-APACHE b/c_sharp/packaging_artifacts/LICENSE-APACHE
new file mode 120000 (symlink)
index 0000000..1cd601d
--- /dev/null
@@ -0,0 +1 @@
+../../LICENSE-APACHE
\ No newline at end of file
diff --git a/c_sharp/packaging_artifacts/LICENSE-MIT b/c_sharp/packaging_artifacts/LICENSE-MIT
new file mode 120000 (symlink)
index 0000000..b2cfbdc
--- /dev/null
@@ -0,0 +1 @@
+../../LICENSE-MIT
\ No newline at end of file
diff --git a/c_sharp/packaging_artifacts/LICENSE.md b/c_sharp/packaging_artifacts/LICENSE.md
new file mode 120000 (symlink)
index 0000000..f0608a6
--- /dev/null
@@ -0,0 +1 @@
+../../LICENSE.md
\ No newline at end of file
diff --git a/c_sharp/packaging_artifacts/README.md b/c_sharp/packaging_artifacts/README.md
new file mode 120000 (symlink)
index 0000000..fe84005
--- /dev/null
@@ -0,0 +1 @@
+../../README.md
\ No newline at end of file
diff --git a/c_sharp/packaging_artifacts/[Content_Types].xml b/c_sharp/packaging_artifacts/[Content_Types].xml
new file mode 100644 (file)
index 0000000..b24fef0
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
+  <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" />
+  <Default Extension="psmdcp" ContentType="application/vnd.openxmlformats-package.core-properties+xml" />
+  <Default Extension="dll" ContentType="application/octet" />
+  <Default Extension="dylib" ContentType="application/octet" />
+  <Default Extension="so" ContentType="application/octet" />
+  <Default Extension="md" ContentType="application/octet" />
+  <Default Extension="nuspec" ContentType="application/octet" />
+  <Override PartName="//LICENSE" ContentType="application/octet" />
+</Types>
\ No newline at end of file
diff --git a/c_sharp/packaging_artifacts/_rels/.rels b/c_sharp/packaging_artifacts/_rels/.rels
new file mode 100644 (file)
index 0000000..7f80149
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
+  <Relationship Type="http://schemas.microsoft.com/packaging/2010/07/manifest" Target="/org.ldk.nuspec" Id="spec" />
+  <Relationship Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="/package/services/metadata/core-properties/ldk.psmdcp" Id="Properties" />
+</Relationships>
diff --git a/c_sharp/packaging_artifacts/org.ldk.nuspec b/c_sharp/packaging_artifacts/org.ldk.nuspec
new file mode 100644 (file)
index 0000000..35937cb
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
+  <metadata>
+    <id>org.ldk</id>
+    <version>Set in genbindings.sh automagically</version>
+    <authors>LDK</authors>
+    <license type="file">LICENSE</license>
+    <licenseUrl>https://github.com/lightningdevkit/rust-lightning/blob/main/LICENSE.md</licenseUrl>
+    <readme>README.md</readme>
+    <projectUrl>https://lightningdevkit.org/</projectUrl>
+    <description>LDK C# Bindings</description>
+    <copyright>2023 LDK Contributors</copyright>
+    <tags>bitcoin lightning ldk sdk non-custodial</tags>
+    <repository type="git" url="https://github.com/lightningdevkit/ldk-garbagecollected" />
+    <dependencies>
+      <group targetFramework="net3.0" />
+    </dependencies>
+  </metadata>
+</package>
diff --git a/c_sharp/packaging_artifacts/package/services/metadata/core-properties/ldk.psmdcp b/c_sharp/packaging_artifacts/package/services/metadata/core-properties/ldk.psmdcp
new file mode 100644 (file)
index 0000000..ef3de09
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<coreProperties xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.openxmlformats.org/package/2006/metadata/core-properties">
+  <dc:creator>LDK</dc:creator>
+  <dc:description>LDK C# Bindings</dc:description>
+  <dc:identifier>org.ldk</dc:identifier>
+  <version>Set in genbindings.sh automagically</version>
+  <keywords>bitcoin lightning ldk sdk non-custodial</keywords>
+  <lastModifiedBy>hand</lastModifiedBy>
+</coreProperties>
index 281890795ecf2404d59c4e180498d655d750fbe6..df1e8103760e4fb7b2cf7cb61b43751bf2aea61d 100644 (file)
@@ -86,6 +86,10 @@ public enum Bolt12SemanticError {
         * A payer id was expected but was missing.
         */
        LDKBolt12SemanticError_MissingPayerId,
+       /**
+        * The payment id for a refund or request is already in use.
+        */
+       LDKBolt12SemanticError_DuplicatePaymentId,
        /**
         * Blinded paths were expected but were missing.
         */
index 45ad7a8b4bbf4124f61b2cf7e4956b5a3ff1d358..c0a60fe3239dc1c7fae069d1e0bdfa950cfde6de 100644 (file)
@@ -1,5 +1,24 @@
 namespace org { namespace ldk { namespace enums {/**
  * An enum representing the status of a channel monitor update persistence.
+ * 
+ * These are generally used as the return value for an implementation of [`Persist`] which is used
+ * as the storage layer for a [`ChainMonitor`]. See the docs on [`Persist`] for a high-level
+ * explanation of how to handle different cases.
+ * 
+ * While `UnrecoverableError` is provided as a failure variant, it is not truly \"handled\" on the
+ * calling side, and generally results in an immediate panic. For those who prefer to avoid
+ * panics, `InProgress` can be used and you can retry the update operation in the background or
+ * shut down cleanly.
+ * 
+ * Note that channels should generally *not* be force-closed after a persistence failure.
+ * Force-closing with the latest [`ChannelMonitorUpdate`] applied may result in a transaction
+ * being broadcast which can only be spent by the latest [`ChannelMonitor`]! Thus, if the
+ * latest [`ChannelMonitor`] is not durably persisted anywhere and exists only in memory, naively
+ * calling [`ChannelManager::force_close_broadcasting_latest_txn`] *may result in loss of funds*!
+ * 
+ * [`Persist`]: chainmonitor::Persist
+ * [`ChainMonitor`]: chainmonitor::ChainMonitor
+ * [`ChannelManager::force_close_broadcasting_latest_txn`]: crate::ln::channelmanager::ChannelManager::force_close_broadcasting_latest_txn
  */
 public enum ChannelMonitorUpdateStatus {
        /**
@@ -11,17 +30,13 @@ public enum ChannelMonitorUpdateStatus {
         */
        LDKChannelMonitorUpdateStatus_Completed,
        /**
-        * Used to indicate a temporary failure (eg connection to a watchtower or remote backup of
-        * our state failed, but is expected to succeed at some point in the future).
+        * Indicates that the update will happen asynchronously in the background or that a transient
+        * failure occurred which is being retried in the background and will eventually complete.
         * 
-        * Such a failure will \"freeze\" a channel, preventing us from revoking old states or
-        * submitting new commitment transactions to the counterparty. Once the update(s) which failed
-        * have been successfully applied, a [`MonitorEvent::Completed`] can be used to restore the
-        * channel to an operational state.
-        * 
-        * Note that a given [`ChannelManager`] will *never* re-generate a [`ChannelMonitorUpdate`].
-        * If you return this error you must ensure that it is written to disk safely before writing
-        * the latest [`ChannelManager`] state, or you should return [`PermanentFailure`] instead.
+        * This will \"freeze\" a channel, preventing us from revoking old states or submitting a new
+        * commitment transaction to the counterparty. Once the update(s) which are `InProgress` have
+        * been completed, a [`MonitorEvent::Completed`] can be used to restore the channel to an
+        * operational state.
         * 
         * Even when a channel has been \"frozen\", updates to the [`ChannelMonitor`] can continue to
         * occur (e.g. if an inbound HTLC which we forwarded was claimed upstream, resulting in us
@@ -31,54 +46,29 @@ public enum ChannelMonitorUpdateStatus {
         * until a [`MonitorEvent::Completed`] is provided, even if you return no error on a later
         * monitor update for the same channel.
         * 
-        * For deployments where a copy of ChannelMonitors and other local state are backed up in a
-        * remote location (with local copies persisted immediately), it is anticipated that all
+        * For deployments where a copy of [`ChannelMonitor`]s and other local state are backed up in
+        * remote location (with local copies persisted immediately), it is anticipated that all
         * updates will return [`InProgress`] until the remote copies could be updated.
         * 
-        * [`PermanentFailure`]: ChannelMonitorUpdateStatus::PermanentFailure
+        * Note that while fully asynchronous persistence of [`ChannelMonitor`] data is generally
+        * reliable, this feature is considered beta, and a handful of edge-cases remain. Until the
+        * remaining cases are fixed, in rare cases, *using this feature may lead to funds loss*.
+        * 
         * [`InProgress`]: ChannelMonitorUpdateStatus::InProgress
-        * [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
         */
        LDKChannelMonitorUpdateStatus_InProgress,
        /**
-        * Used to indicate no further channel monitor updates will be allowed (likely a disk failure
-        * or a remote copy of this [`ChannelMonitor`] is no longer reachable and thus not updatable).
-        * 
-        * When this is returned, [`ChannelManager`] will force-close the channel but *not* broadcast
-        * our current commitment transaction. This avoids a dangerous case where a local disk failure
-        * (e.g. the Linux-default remounting of the disk as read-only) causes [`PermanentFailure`]s
-        * for all monitor updates. If we were to broadcast our latest commitment transaction and then
-        * restart, we could end up reading a previous [`ChannelMonitor`] and [`ChannelManager`],
-        * revoking our now-broadcasted state before seeing it confirm and losing all our funds.
-        * 
-        * Note that this is somewhat of a tradeoff - if the disk is really gone and we may have lost
-        * the data permanently, we really should broadcast immediately. If the data can be recovered
-        * with manual intervention, we'd rather close the channel, rejecting future updates to it,
-        * and broadcast the latest state only if we have HTLCs to claim which are timing out (which
-        * we do as long as blocks are connected).
+        * Indicates that an update has failed and will not complete at any point in the future.
         * 
-        * In order to broadcast the latest local commitment transaction, you'll need to call
-        * [`ChannelMonitor::get_latest_holder_commitment_txn`] and broadcast the resulting
-        * transactions once you've safely ensured no further channel updates can be generated by your
-        * [`ChannelManager`].
+        * Currently returning this variant will cause LDK to immediately panic to encourage immediate
+        * shutdown. In the future this may be updated to disconnect peers and refuse to continue
+        * normal operation without a panic.
         * 
-        * Note that at least one final [`ChannelMonitorUpdate`] may still be provided, which must
-        * still be processed by a running [`ChannelMonitor`]. This final update will mark the
-        * [`ChannelMonitor`] as finalized, ensuring no further updates (e.g. revocation of the latest
-        * commitment transaction) are allowed.
+        * Applications which wish to perform an orderly shutdown after failure should consider
+        * returning [`InProgress`] instead and simply shut down without ever marking the update
+        * complete.
         * 
-        * Note that even if you return a [`PermanentFailure`] due to unavailability of secondary
-        * [`ChannelMonitor`] copies, you should still make an attempt to store the update where
-        * possible to ensure you can claim HTLC outputs on the latest commitment transaction
-        * broadcasted later.
-        * 
-        * In case of distributed watchtowers deployment, the new version must be written to disk, as
-        * state may have been stored but rejected due to a block forcing a commitment broadcast. This
-        * storage is used to claim outputs of rejected state confirmed onchain by another watchtower,
-        * lagging behind on block processing.
-        * 
-        * [`PermanentFailure`]: ChannelMonitorUpdateStatus::PermanentFailure
-        * [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
+        * [`InProgress`]: ChannelMonitorUpdateStatus::InProgress
         */
-       LDKChannelMonitorUpdateStatus_PermanentFailure,
+       LDKChannelMonitorUpdateStatus_UnrecoverableError,
 }} } }
index 4a05f56cfb95cc7b19d26685db38799f58e32978..dceec73671c97744624472ec8e2296217150ec45 100644 (file)
@@ -4,26 +4,109 @@ namespace org { namespace ldk { namespace enums {/**
  */
 public enum ConfirmationTarget {
        /**
-        * We'd like a transaction to confirm in the future, but don't want to commit most of the fees
-        * required to do so yet. The remaining fees will come via a Child-Pays-For-Parent (CPFP) fee
-        * bump of the transaction.
+        * We have some funds available on chain which we need to spend prior to some expiry time at
+        * which point our counterparty may be able to steal them. Generally we have in the high tens
+        * to low hundreds of blocks to get our transaction on-chain, but we shouldn't risk too low a
+        * 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.
         * 
-        * The feerate returned should be the absolute minimum feerate required to enter most node
-        * mempools across the network. Note that if you are not able to obtain this feerate estimate,
-        * you should likely use the furthest-out estimate allowed by your fee estimator.
+        * 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_MempoolMinimum,
+       LDKConfirmationTarget_MaxAllowedNonAnchorChannelRemoteFee,
        /**
-        * We are happy with a transaction confirming slowly, at least within a day or so worth of
-        * blocks.
+        * 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.
+        * 
+        * This needs to be sufficient to get into the mempool when the channel needs to
+        * be force-closed. Setting too high may result in force-closures if our counterparty attempts
+        * to use a lower feerate. Because this is for anchor channels, we can always bump the feerate
+        * later; the feerate here only needs to be sufficient to enter the mempool.
+        * 
+        * A good estimate is the expected mempool minimum at the time of force-closure. Obviously this
+        * is not an estimate which is very easy to calculate because we do not know the future. Using
+        * a simple long-term fee estimate or tracking of the mempool minimum is a good approach to
+        * ensure you can always close the channel. A future change to Bitcoin's P2P network
+        * (package relay) may obviate the need for this entirely.
         */
-       LDKConfirmationTarget_Background,
+       LDKConfirmationTarget_MinAllowedAnchorChannelRemoteFee,
        /**
-        * We'd like a transaction to confirm without major delayed, i.e., within the next 12-24 blocks.
+        * The lowest 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 if a channel party goes away. Setting this value too high will
+        * cause immediate force-closures in order to avoid having an unbroadcastable state.
+        * 
+        * This feerate represents the fee we pick now, which must be sufficient to enter a block at an
+        * arbitrary time in the future. Obviously this is not an estimate which is very easy to
+        * calculate. This can leave channels subject to being unable to close if feerates rise, and in
+        * general you should prefer anchor channels to ensure you can increase the feerate when the
+        * transactions need broadcasting.
+        * 
+        * Do note some fee estimators round up to the next full sat/vbyte (ie 250 sats per kw),
+        * causing occasional issues with feerate disagreements between an initiator that wants a
+        * feerate of 1.1 sat/vbyte and a receiver that wants 1.1 rounded up to 2. If your fee
+        * estimator rounds subtracting 250 to your desired feerate here can help avoid this issue.
+        * 
+        * [`ChannelConfig::max_dust_htlc_exposure`]: crate::util::config::ChannelConfig::max_dust_htlc_exposure
         */
-       LDKConfirmationTarget_Normal,
+       LDKConfirmationTarget_MinAllowedNonAnchorChannelRemoteFee,
        /**
-        * We'd like a transaction to confirm in the next few blocks.
+        * This is the feerate on the transaction which we (or our counterparty) will broadcast in
+        * order to close the channel if a channel party goes away.
+        * 
+        * This needs to be sufficient to get into the mempool when the channel needs to
+        * be force-closed. Setting too low may result in force-closures. Because this is for anchor
+        * channels, it can be a low value as we can always bump the feerate later.
+        * 
+        * A good estimate is the expected mempool minimum at the time of force-closure. Obviously this
+        * is not an estimate which is very easy to calculate because we do not know the future. Using
+        * a simple long-term fee estimate or tracking of the mempool minimum is a good approach to
+        * ensure you can always close the channel. A future change to Bitcoin's P2P network
+        * (package relay) may obviate the need for this entirely.
+        */
+       LDKConfirmationTarget_AnchorChannelFee,
+       /**
+        * Lightning is built around the ability to broadcast a transaction in the future to close our
+        * channel and claim all pending funds. In order to do so, non-anchor channels are built with
+        * transactions which we need to be able to broadcast at some point in the future.
+        * 
+        * This feerate represents the fee we pick now, which must be sufficient to enter a block at an
+        * arbitrary time in the future. Obviously this is not an estimate which is very easy to
+        * calculate, so most lightning nodes use some relatively high-priority feerate using the
+        * current mempool. This leaves channels subject to being unable to close if feerates rise, and
+        * in general you should prefer anchor channels to ensure you can increase the feerate when the
+        * transactions need broadcasting.
+        * 
+        * Since this should represent the feerate of a channel close that does not need fee
+        * bumping, this is also used as an upper bound for our attempted feerate when doing cooperative
+        * closure of any channel.
+        */
+       LDKConfirmationTarget_NonAnchorChannelFee,
+       /**
+        * When cooperatively closing a channel, this is the minimum feerate we will accept.
+        * Recommended at least within a day or so worth of blocks.
+        * 
+        * This will also be used when initiating a cooperative close of a channel. When closing a
+        * channel you can override this fee by using
+        * [`ChannelManager::close_channel_with_feerate_and_script`].
+        * 
+        * [`ChannelManager::close_channel_with_feerate_and_script`]: crate::ln::channelmanager::ChannelManager::close_channel_with_feerate_and_script
         */
-       LDKConfirmationTarget_HighPriority,
+       LDKConfirmationTarget_ChannelCloseMinimum,
 }} } }
diff --git a/c_sharp/src/org/ldk/enums/FailureCode.cs b/c_sharp/src/org/ldk/enums/FailureCode.cs
deleted file mode 100644 (file)
index 3cfeac8..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-namespace org { namespace ldk { namespace enums {/**
- * This enum is used to specify which error data to send to peers when failing back an HTLC
- * using [`ChannelManager::fail_htlc_backwards_with_reason`].
- * 
- * For more info on failure codes, see <https://github.com/lightning/bolts/blob/master/04-onion-routing.md#failure-messages>.
- */
-public enum FailureCode {
-       /**
-        * We had a temporary error processing the payment. Useful if no other error codes fit
-        * and you want to indicate that the payer may want to retry.
-        */
-       LDKFailureCode_TemporaryNodeFailure,
-       /**
-        * We have a required feature which was not in this onion. For example, you may require
-        * some additional metadata that was not provided with this payment.
-        */
-       LDKFailureCode_RequiredNodeFeatureMissing,
-       /**
-        * You may wish to use this when a `payment_preimage` is unknown, or the CLTV expiry of
-        * the HTLC is too close to the current block height for safe handling.
-        * Using this failure code in [`ChannelManager::fail_htlc_backwards_with_reason`] is
-        * equivalent to calling [`ChannelManager::fail_htlc_backwards`].
-        */
-       LDKFailureCode_IncorrectOrUnknownPaymentDetails,
-}} } }
diff --git a/c_sharp/src/org/ldk/enums/SocketAddressParseError.cs b/c_sharp/src/org/ldk/enums/SocketAddressParseError.cs
new file mode 100644 (file)
index 0000000..14dded3
--- /dev/null
@@ -0,0 +1,21 @@
+namespace org { namespace ldk { namespace enums {/**
+ * [`SocketAddress`] error variants
+ */
+public enum SocketAddressParseError {
+       /**
+        * Socket address (IPv4/IPv6) parsing error
+        */
+       LDKSocketAddressParseError_SocketAddrParse,
+       /**
+        * Invalid input format
+        */
+       LDKSocketAddressParseError_InvalidInput,
+       /**
+        * Invalid port
+        */
+       LDKSocketAddressParseError_InvalidPort,
+       /**
+        * Invalid onion v3 address
+        */
+       LDKSocketAddressParseError_InvalidOnionV3,
+}} } }
index f3c708656ab59dc2e9d30c4abede2d10d1eed679..8e1e194ccc12a59a3a05974d5a2f06848fca894f 100644 (file)
 using org.ldk.enums;
 using org.ldk.impl;
 using System;
+using System.Collections.Generic;
 using System.Runtime.InteropServices;
 
 namespace org { namespace ldk { namespace impl {
 
 internal class bindings {
-       internal class ArrayCoder : ICustomMarshaler {
-               int size = 0;
-               GCHandle pinnedArray;
-               public static ICustomMarshaler GetInstance(string pstrCookie) {
-                       return new ArrayCoder();
-               }
-
-               public Object MarshalNativeToManaged(IntPtr pNativeData) { throw new NotImplementedException(); }
-               public IntPtr MarshalManagedToNative(Object obj) {
-                       if (obj.GetType() == typeof(byte[])) {
-                               byte[] inp = (byte[])obj;
-                               IntPtr data = Marshal.AllocHGlobal(inp.Length + 8);
-                               Marshal.WriteInt64(data, inp.Length);
-                               Marshal.Copy(inp, 0, data + 8, inp.Length);
-                               this.size = inp.Length + 8;
-                               return data;
-                       } else {
-                               throw new NotImplementedException();
-                       }
-               }
-               public void CleanUpNativeData(IntPtr pNativeData) {
-                       Marshal.FreeHGlobal(pNativeData);
-               }
-               public void CleanUpManagedData(Object ManagedObj) { }
-               public int GetNativeDataSize() {
-                       // Blindly guess based on the last allocation, no idea how else to implement this.
-                       return this.size;
-               }
-       }
+       static List<WeakReference> js_objs = new List<WeakReference>();
 
-       /*static {
-               init(java.lang.Enum.class, VecOrSliceDef.class);
-               init_class_cache();
-               if (!get_lib_version_string().equals(version.get_ldk_java_bindings_version()))
-                       throw new ArgumentException("Compiled LDK library and LDK class failes do not match");
-               // Fetching the LDK versions from C also checks that the header and binaries match
-               Console.Error.WriteLine("Loaded LDK-Java Bindings " + version.get_ldk_java_bindings_version() + " with LDK " + get_ldk_version() + " and LDK-C-Bindings " + get_ldk_c_bindings_version());
-       }*/
-       //static extern void init(java.lang.Class c);
-       //static native void init_class_cache();
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_get_lib_version_string")] public static extern string get_lib_version_string();
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_get_ldk_c_bindings_version")] public static extern string get_ldk_c_bindings_version();
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_get_ldk_version")] public static extern string get_ldk_version();
 
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_allocate_buffer")] public static extern long allocate_buffer(long buflen);
+
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_free_buffer")] public static extern void free_buffer(long buf);
+
        // struct LDKThirtyTwoBytes BigEndianScalar_get_bytes (struct LDKBigEndianScalar* thing)
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BigEndianScalar_get_bytes")] public static extern byte[] BigEndianScalar_get_bytes(long _thing);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BigEndianScalar_get_bytes")] public static extern long BigEndianScalar_get_bytes(long _thing);
        // static void BigEndianScalar_free (struct LDKBigEndianScalar thing)
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BigEndianScalar_free")] public static extern void BigEndianScalar_free(long _thing);
        [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 byte[] TxIn_get_witness(long _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 byte[] TxIn_get_script_sig(long _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 byte[] TxIn_get_previous_txid(long _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 byte[] TxOut_get_script_pubkey(long _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_DurationZ_ty_from_ptr")] public static extern long LDKCOption_DurationZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_DurationZ_Some_get_some")] public static extern long LDKCOption_DurationZ_Some_get_some(long ptr);
        [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);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RefundBolt12ParseErrorZ_get_ok")] public static extern long CResult_RefundBolt12ParseErrorZ_get_ok(long _owner);
        // struct LDKBolt12ParseError CResult_RefundBolt12ParseErrorZ_get_err(LDKCResult_RefundBolt12ParseErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RefundBolt12ParseErrorZ_get_err")] public static extern long CResult_RefundBolt12ParseErrorZ_get_err(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRetry_ty_from_ptr")] public static extern long LDKRetry_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRetry_Attempts_get_attempts")] public static extern int LDKRetry_Attempts_get_attempts(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRetry_Timeout_get_timeout")] public static extern long LDKRetry_Timeout_get_timeout(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKDecodeError_ty_from_ptr")] public static extern long LDKDecodeError_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKDecodeError_Io_get_io")] public static extern IOError LDKDecodeError_Io_get_io(long ptr);
+       // struct LDKRetry CResult_RetryDecodeErrorZ_get_ok(LDKCResult_RetryDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RetryDecodeErrorZ_get_ok")] public static extern long CResult_RetryDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_RetryDecodeErrorZ_get_err(LDKCResult_RetryDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RetryDecodeErrorZ_get_err")] public static extern long CResult_RetryDecodeErrorZ_get_err(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKAPIError_ty_from_ptr")] public static extern long LDKAPIError_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKAPIError_APIMisuseError_get_err")] public static extern string LDKAPIError_APIMisuseError_get_err(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKAPIError_FeeRateTooHigh_get_err")] public static extern string LDKAPIError_FeeRateTooHigh_get_err(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKAPIError_APIMisuseError_get_err")] public static extern long LDKAPIError_APIMisuseError_get_err(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKAPIError_FeeRateTooHigh_get_err")] public static extern long LDKAPIError_FeeRateTooHigh_get_err(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKAPIError_FeeRateTooHigh_get_feerate")] public static extern int LDKAPIError_FeeRateTooHigh_get_feerate(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKAPIError_InvalidRoute_get_err")] public static extern string LDKAPIError_InvalidRoute_get_err(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKAPIError_ChannelUnavailable_get_err")] public static extern string LDKAPIError_ChannelUnavailable_get_err(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKAPIError_InvalidRoute_get_err")] public static extern long LDKAPIError_InvalidRoute_get_err(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKAPIError_ChannelUnavailable_get_err")] public static extern long LDKAPIError_ChannelUnavailable_get_err(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKAPIError_IncompatibleShutdownScript_get_script")] public static extern long LDKAPIError_IncompatibleShutdownScript_get_script(long ptr);
        // void CResult_NoneAPIErrorZ_get_ok(LDKCResult_NoneAPIErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneAPIErrorZ_get_ok")] public static extern void CResult_NoneAPIErrorZ_get_ok(long _owner);
        // struct LDKAPIError CResult_NoneAPIErrorZ_get_err(LDKCResult_NoneAPIErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneAPIErrorZ_get_err")] public static extern long CResult_NoneAPIErrorZ_get_err(long _owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_PaymentSecretZ_ty_from_ptr")] public static extern long LDKCOption_PaymentSecretZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_PaymentSecretZ_Some_get_some")] public static extern byte[] LDKCOption_PaymentSecretZ_Some_get_some(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_ThirtyTwoBytesZ_ty_from_ptr")] public static extern long LDKCOption_ThirtyTwoBytesZ_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_ThirtyTwoBytesZ_Some_get_some")] public static extern long LDKCOption_ThirtyTwoBytesZ_Some_get_some(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_CVec_u8ZZ_ty_from_ptr")] public static extern long LDKCOption_CVec_u8ZZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_CVec_u8ZZ_Some_get_some")] public static extern byte[] LDKCOption_CVec_u8ZZ_Some_get_some(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKDecodeError_ty_from_ptr")] public static extern long LDKDecodeError_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKDecodeError_Io_get_io")] public static extern IOError LDKDecodeError_Io_get_io(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_CVec_u8ZZ_Some_get_some")] public static extern long LDKCOption_CVec_u8ZZ_Some_get_some(long ptr);
        // struct LDKRecipientOnionFields CResult_RecipientOnionFieldsDecodeErrorZ_get_ok(LDKCResult_RecipientOnionFieldsDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_get_ok")] public static extern long CResult_RecipientOnionFieldsDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_RecipientOnionFieldsDecodeErrorZ_get_err(LDKCResult_RecipientOnionFieldsDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_get_err")] public static extern long CResult_RecipientOnionFieldsDecodeErrorZ_get_err(long _owner);
+       // uint64_t C2Tuple_u64CVec_u8ZZ_get_a(LDKC2Tuple_u64CVec_u8ZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u64CVec_u8ZZ_get_a")] public static extern long C2Tuple_u64CVec_u8ZZ_get_a(long _owner);
+       // struct LDKCVec_u8Z C2Tuple_u64CVec_u8ZZ_get_b(LDKC2Tuple_u64CVec_u8ZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u64CVec_u8ZZ_get_b")] public static extern long C2Tuple_u64CVec_u8ZZ_get_b(long _owner);
+       // struct LDKRecipientOnionFields CResult_RecipientOnionFieldsNoneZ_get_ok(LDKCResult_RecipientOnionFieldsNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecipientOnionFieldsNoneZ_get_ok")] public static extern long CResult_RecipientOnionFieldsNoneZ_get_ok(long _owner);
+       // void CResult_RecipientOnionFieldsNoneZ_get_err(LDKCResult_RecipientOnionFieldsNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecipientOnionFieldsNoneZ_get_err")] public static extern void CResult_RecipientOnionFieldsNoneZ_get_err(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_CVec_ThirtyTwoBytesZZ_ty_from_ptr")] public static extern long LDKCOption_CVec_ThirtyTwoBytesZZ_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_CVec_ThirtyTwoBytesZZ_Some_get_some")] public static extern long LDKCOption_CVec_ThirtyTwoBytesZZ_Some_get_some(long ptr);
+       // struct LDKThirtyTwoBytes CResult_ThirtyTwoBytesNoneZ_get_ok(LDKCResult_ThirtyTwoBytesNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesNoneZ_get_ok")] public static extern long CResult_ThirtyTwoBytesNoneZ_get_ok(long _owner);
+       // void CResult_ThirtyTwoBytesNoneZ_get_err(LDKCResult_ThirtyTwoBytesNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesNoneZ_get_err")] public static extern void CResult_ThirtyTwoBytesNoneZ_get_err(long _owner);
        // struct LDKBlindedPayInfo CResult_BlindedPayInfoDecodeErrorZ_get_ok(LDKCResult_BlindedPayInfoDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_get_ok")] public static extern long CResult_BlindedPayInfoDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_BlindedPayInfoDecodeErrorZ_get_err(LDKCResult_BlindedPayInfoDecodeErrorZ *NONNULL_PTR owner);
@@ -122,176 +108,295 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_get_ok")] public static extern long CResult_SpendableOutputDescriptorDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_SpendableOutputDescriptorDecodeErrorZ_get_err(LDKCResult_SpendableOutputDescriptorDecodeErrorZ *NONNULL_PTR owner);
        [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_PackedLockTimeZ_ty_from_ptr")] public static extern long LDKCOption_PackedLockTimeZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_PackedLockTimeZ_Some_get_some")] public static extern int LDKCOption_PackedLockTimeZ_Some_get_some(long ptr);
-       // struct LDKCVec_u8Z C2Tuple_PartiallySignedTransactionusizeZ_get_a(LDKC2Tuple_PartiallySignedTransactionusizeZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PartiallySignedTransactionusizeZ_get_a")] public static extern byte[] C2Tuple_PartiallySignedTransactionusizeZ_get_a(long _owner);
-       // uintptr_t C2Tuple_PartiallySignedTransactionusizeZ_get_b(LDKC2Tuple_PartiallySignedTransactionusizeZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PartiallySignedTransactionusizeZ_get_b")] public static extern long C2Tuple_PartiallySignedTransactionusizeZ_get_b(long _owner);
-       // struct LDKC2Tuple_PartiallySignedTransactionusizeZ CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_get_ok(LDKCResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_get_ok")] public static extern long CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_get_ok(long _owner);
-       // void CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_get_err(LDKCResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_get_err")] public static extern void CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_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 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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_get_err")] public static extern long CResult_ChannelDerivationParametersDecodeErrorZ_get_err(long _owner);
+       // struct LDKHTLCDescriptor CResult_HTLCDescriptorDecodeErrorZ_get_ok(LDKCResult_HTLCDescriptorDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_get_ok")] public static extern long CResult_HTLCDescriptorDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_HTLCDescriptorDecodeErrorZ_get_err(LDKCResult_HTLCDescriptorDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_get_err")] public static extern long CResult_HTLCDescriptorDecodeErrorZ_get_err(long _owner);
        // void CResult_NoneNoneZ_get_ok(LDKCResult_NoneNoneZ *NONNULL_PTR owner);
        [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 LDKSignature C2Tuple_SignatureCVec_SignatureZZ_get_a(LDKC2Tuple_SignatureCVec_SignatureZZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_SignatureCVec_SignatureZZ_get_a")] public static extern byte[] C2Tuple_SignatureCVec_SignatureZZ_get_a(long _owner);
-       // struct LDKCVec_SignatureZ C2Tuple_SignatureCVec_SignatureZZ_get_b(LDKC2Tuple_SignatureCVec_SignatureZZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_SignatureCVec_SignatureZZ_get_b")] public static extern byte[][] C2Tuple_SignatureCVec_SignatureZZ_get_b(long _owner);
-       // struct LDKC2Tuple_SignatureCVec_SignatureZZ CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_get_ok(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_get_ok")] public static extern long CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_get_ok(long _owner);
-       // void CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_get_err(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_get_err")] public static extern void CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_get_err(long _owner);
-       // struct LDKSignature CResult_SignatureNoneZ_get_ok(LDKCResult_SignatureNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SignatureNoneZ_get_ok")] public static extern byte[] CResult_SignatureNoneZ_get_ok(long _owner);
-       // void CResult_SignatureNoneZ_get_err(LDKCResult_SignatureNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SignatureNoneZ_get_err")] public static extern void CResult_SignatureNoneZ_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 byte[] CResult_PublicKeyNoneZ_get_ok(long _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);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeyNoneZ_get_err")] public static extern void CResult_PublicKeyNoneZ_get_err(long _owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_ScalarZ_ty_from_ptr")] public static extern long LDKCOption_ScalarZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_ScalarZ_Some_get_some")] public static extern long LDKCOption_ScalarZ_Some_get_some(long ptr);
-       // struct LDKThirtyTwoBytes CResult_SharedSecretNoneZ_get_ok(LDKCResult_SharedSecretNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SharedSecretNoneZ_get_ok")] public static extern byte[] CResult_SharedSecretNoneZ_get_ok(long _owner);
-       // void CResult_SharedSecretNoneZ_get_err(LDKCResult_SharedSecretNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SharedSecretNoneZ_get_err")] public static extern void CResult_SharedSecretNoneZ_get_err(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_BigEndianScalarZ_ty_from_ptr")] public static extern long LDKCOption_BigEndianScalarZ_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_BigEndianScalarZ_Some_get_some")] public static extern long LDKCOption_BigEndianScalarZ_Some_get_some(long ptr);
        // struct LDKRecoverableSignature CResult_RecoverableSignatureNoneZ_get_ok(LDKCResult_RecoverableSignatureNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecoverableSignatureNoneZ_get_ok")] public static extern byte[] CResult_RecoverableSignatureNoneZ_get_ok(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecoverableSignatureNoneZ_get_ok")] public static extern long CResult_RecoverableSignatureNoneZ_get_ok(long _owner);
        // void CResult_RecoverableSignatureNoneZ_get_err(LDKCResult_RecoverableSignatureNoneZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecoverableSignatureNoneZ_get_err")] public static extern void CResult_RecoverableSignatureNoneZ_get_err(long _owner);
+       // struct LDKSchnorrSignature CResult_SchnorrSignatureNoneZ_get_ok(LDKCResult_SchnorrSignatureNoneZ *NONNULL_PTR owner);
+       [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);
        public interface LDKChannelSigner {
-               byte[] get_per_commitment_point(long _idx);
-               byte[] release_commitment_secret(long _idx);
-               long validate_holder_commitment(long _holder_tx, byte[][] _preimages);
-               byte[] channel_keys_id();
-               void provide_channel_parameters(long _channel_parameters);
+               long get_per_commitment_point(long idx);
+               long release_commitment_secret(long idx);
+               long validate_holder_commitment(long holder_tx, long preimages);
+               long channel_keys_id();
+               void provide_channel_parameters(long channel_parameters);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKChannelSigner_new")] public static extern long LDKChannelSigner_new_native(long impl_idx, long pubkeys);
+       public static long[] LDKChannelSigner_new(LDKChannelSigner impl, long pubkeys) {
+               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] = LDKChannelSigner_new_native(i, pubkeys);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKChannelSigner_new")] public static extern long LDKChannelSigner_new(LDKChannelSigner impl, long pubkeys);
        // LDKPublicKey ChannelSigner_get_per_commitment_point LDKChannelSigner *NONNULL_PTR this_arg, uint64_t idx
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelSigner_get_per_commitment_point")] public static extern byte[] ChannelSigner_get_per_commitment_point(long _this_arg, long _idx);
+       [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 byte[] 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_PaymentPreimageZ preimages
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelSigner_validate_holder_commitment")] public static extern long ChannelSigner_validate_holder_commitment(long _this_arg, long _holder_tx, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _preimages);
+       [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);
        // LDKThirtyTwoBytes ChannelSigner_channel_keys_id LDKChannelSigner *NONNULL_PTR this_arg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelSigner_channel_keys_id")] public static extern byte[] ChannelSigner_channel_keys_id(long _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
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelSigner_provide_channel_parameters")] public static extern void ChannelSigner_provide_channel_parameters(long _this_arg, long _channel_parameters);
        // 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, byte[][] _preimages);
-               long validate_counterparty_revocation(long _idx, byte[] _secret);
-               long sign_holder_commitment_and_htlcs(long _commitment_tx);
-               long sign_justice_revoked_output(byte[] _justice_tx, long _input, long _amount, byte[] _per_commitment_key);
-               long sign_justice_revoked_htlc(byte[] _justice_tx, long _input, long _amount, byte[] _per_commitment_key, long _htlc);
-               long sign_holder_htlc_transaction(byte[] _htlc_tx, long _input, long _htlc_descriptor);
-               long sign_counterparty_htlc_transaction(byte[] _htlc_tx, long _input, long _amount, byte[] _per_commitment_point, long _htlc);
-               long sign_closing_transaction(long _closing_tx);
-               long sign_holder_anchor_input(byte[] _anchor_tx, long _input);
-               long sign_channel_announcement_with_funding_key(long _msg);
+               long sign_counterparty_commitment(long commitment_tx, long preimages);
+               long validate_counterparty_revocation(long idx, long secret);
+               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);
+               long sign_holder_htlc_transaction(long htlc_tx, long input, long htlc_descriptor);
+               long sign_counterparty_htlc_transaction(long htlc_tx, long input, long amount, long per_commitment_point, long htlc);
+               long sign_closing_transaction(long closing_tx);
+               long sign_holder_anchor_input(long anchor_tx, long input);
+               long sign_channel_announcement_with_funding_key(long msg);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEcdsaChannelSigner_new")] public static extern long LDKEcdsaChannelSigner_new_native(long impl_idx, long ChannelSigner, long pubkeys);
+       public static long[] LDKEcdsaChannelSigner_new(LDKEcdsaChannelSigner impl, long ChannelSigner, long pubkeys) {
+               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] = LDKEcdsaChannelSigner_new_native(i, ChannelSigner, pubkeys);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEcdsaChannelSigner_new")] public static extern long LDKEcdsaChannelSigner_new(LDKEcdsaChannelSigner impl, LDKChannelSigner ChannelSigner, long pubkeys);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEcdsaChannelSigner_get_ChannelSigner")] public static extern long LDKEcdsaChannelSigner_get_ChannelSigner(long arg);
-       // LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ EcdsaChannelSigner_sign_counterparty_commitment LDKEcdsaChannelSigner *NONNULL_PTR this_arg, const struct LDKCommitmentTransaction *NONNULL_PTR commitment_tx, struct LDKCVec_PaymentPreimageZ preimages
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_counterparty_commitment")] public static extern long EcdsaChannelSigner_sign_counterparty_commitment(long _this_arg, long _commitment_tx, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _preimages);
+       // 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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _secret);
-       // LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ EcdsaChannelSigner_sign_holder_commitment_and_htlcs LDKEcdsaChannelSigner *NONNULL_PTR this_arg, const struct LDKHolderCommitmentTransaction *NONNULL_PTR commitment_tx
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_holder_commitment_and_htlcs")] public static extern long EcdsaChannelSigner_sign_holder_commitment_and_htlcs(long _this_arg, long _commitment_tx);
-       // LDKCResult_SignatureNoneZ 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]
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_justice_revoked_output")] public static extern long EcdsaChannelSigner_sign_justice_revoked_output(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _justice_tx, long _input, long _amount, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _per_commitment_key);
-       // LDKCResult_SignatureNoneZ EcdsaChannelSigner_sign_justice_revoked_htlc LDKEcdsaChannelSigner *NONNULL_PTR this_arg, struct LDKTransaction justice_tx, uintptr_t input, uint64_t amount, const uint8_t (*per_commitment_key)[32], const struct LDKHTLCOutputInCommitment *NONNULL_PTR htlc
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_justice_revoked_htlc")] public static extern long EcdsaChannelSigner_sign_justice_revoked_htlc(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _justice_tx, long _input, long _amount, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _per_commitment_key, long _htlc);
-       // LDKCResult_SignatureNoneZ EcdsaChannelSigner_sign_holder_htlc_transaction LDKEcdsaChannelSigner *NONNULL_PTR this_arg, struct LDKTransaction htlc_tx, uintptr_t input, const struct LDKHTLCDescriptor *NONNULL_PTR htlc_descriptor
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_holder_htlc_transaction")] public static extern long EcdsaChannelSigner_sign_holder_htlc_transaction(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _htlc_tx, long _input, long _htlc_descriptor);
-       // LDKCResult_SignatureNoneZ EcdsaChannelSigner_sign_counterparty_htlc_transaction LDKEcdsaChannelSigner *NONNULL_PTR this_arg, struct LDKTransaction htlc_tx, uintptr_t input, uint64_t amount, struct LDKPublicKey per_commitment_point, const struct LDKHTLCOutputInCommitment *NONNULL_PTR htlc
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_counterparty_htlc_transaction")] public static extern long EcdsaChannelSigner_sign_counterparty_htlc_transaction(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _htlc_tx, long _input, long _amount, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _per_commitment_point, long _htlc);
-       // LDKCResult_SignatureNoneZ EcdsaChannelSigner_sign_closing_transaction LDKEcdsaChannelSigner *NONNULL_PTR this_arg, const struct LDKClosingTransaction *NONNULL_PTR closing_tx
+       [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_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]
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_justice_revoked_output")] public static extern long EcdsaChannelSigner_sign_justice_revoked_output(long _this_arg, long _justice_tx, long _input, long _amount, long _per_commitment_key);
+       // LDKCResult_ECDSASignatureNoneZ EcdsaChannelSigner_sign_justice_revoked_htlc LDKEcdsaChannelSigner *NONNULL_PTR this_arg, struct LDKTransaction justice_tx, uintptr_t input, uint64_t amount, const uint8_t (*per_commitment_key)[32], const struct LDKHTLCOutputInCommitment *NONNULL_PTR htlc
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_justice_revoked_htlc")] public static extern long EcdsaChannelSigner_sign_justice_revoked_htlc(long _this_arg, long _justice_tx, long _input, long _amount, long _per_commitment_key, long _htlc);
+       // LDKCResult_ECDSASignatureNoneZ EcdsaChannelSigner_sign_holder_htlc_transaction LDKEcdsaChannelSigner *NONNULL_PTR this_arg, struct LDKTransaction htlc_tx, uintptr_t input, const struct LDKHTLCDescriptor *NONNULL_PTR htlc_descriptor
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_holder_htlc_transaction")] public static extern long EcdsaChannelSigner_sign_holder_htlc_transaction(long _this_arg, long _htlc_tx, long _input, long _htlc_descriptor);
+       // LDKCResult_ECDSASignatureNoneZ EcdsaChannelSigner_sign_counterparty_htlc_transaction LDKEcdsaChannelSigner *NONNULL_PTR this_arg, struct LDKTransaction htlc_tx, uintptr_t input, uint64_t amount, struct LDKPublicKey per_commitment_point, const struct LDKHTLCOutputInCommitment *NONNULL_PTR htlc
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_counterparty_htlc_transaction")] public static extern long EcdsaChannelSigner_sign_counterparty_htlc_transaction(long _this_arg, long _htlc_tx, long _input, long _amount, long _per_commitment_point, long _htlc);
+       // LDKCResult_ECDSASignatureNoneZ EcdsaChannelSigner_sign_closing_transaction LDKEcdsaChannelSigner *NONNULL_PTR this_arg, const struct LDKClosingTransaction *NONNULL_PTR closing_tx
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_closing_transaction")] public static extern long EcdsaChannelSigner_sign_closing_transaction(long _this_arg, long _closing_tx);
-       // LDKCResult_SignatureNoneZ EcdsaChannelSigner_sign_holder_anchor_input LDKEcdsaChannelSigner *NONNULL_PTR this_arg, struct LDKTransaction anchor_tx, uintptr_t input
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_holder_anchor_input")] public static extern long EcdsaChannelSigner_sign_holder_anchor_input(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _anchor_tx, long _input);
-       // LDKCResult_SignatureNoneZ EcdsaChannelSigner_sign_channel_announcement_with_funding_key LDKEcdsaChannelSigner *NONNULL_PTR this_arg, const struct LDKUnsignedChannelAnnouncement *NONNULL_PTR msg
+       // LDKCResult_ECDSASignatureNoneZ EcdsaChannelSigner_sign_holder_anchor_input LDKEcdsaChannelSigner *NONNULL_PTR this_arg, struct LDKTransaction anchor_tx, uintptr_t input
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_holder_anchor_input")] public static extern long EcdsaChannelSigner_sign_holder_anchor_input(long _this_arg, long _anchor_tx, long _input);
+       // LDKCResult_ECDSASignatureNoneZ EcdsaChannelSigner_sign_channel_announcement_with_funding_key LDKEcdsaChannelSigner *NONNULL_PTR this_arg, const struct LDKUnsignedChannelAnnouncement *NONNULL_PTR msg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_channel_announcement_with_funding_key")] public static extern long EcdsaChannelSigner_sign_channel_announcement_with_funding_key(long _this_arg, long _msg);
        public interface LDKWriteableEcdsaChannelSigner {
-               byte[] write();
+               long write();
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKWriteableEcdsaChannelSigner_new")] public static extern long LDKWriteableEcdsaChannelSigner_new_native(long impl_idx, long EcdsaChannelSigner, long ChannelSigner, long pubkeys);
+       public static long[] LDKWriteableEcdsaChannelSigner_new(LDKWriteableEcdsaChannelSigner impl, long EcdsaChannelSigner, long ChannelSigner, long pubkeys) {
+               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] = LDKWriteableEcdsaChannelSigner_new_native(i, EcdsaChannelSigner, ChannelSigner, pubkeys);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKWriteableEcdsaChannelSigner_new")] public static extern long LDKWriteableEcdsaChannelSigner_new(LDKWriteableEcdsaChannelSigner impl, LDKEcdsaChannelSigner EcdsaChannelSigner, LDKChannelSigner ChannelSigner, long pubkeys);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKWriteableEcdsaChannelSigner_get_EcdsaChannelSigner")] public static extern long LDKWriteableEcdsaChannelSigner_get_EcdsaChannelSigner(long arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKWriteableEcdsaChannelSigner_get_ChannelSigner")] public static extern long LDKWriteableEcdsaChannelSigner_get_ChannelSigner(long arg);
        // LDKCVec_u8Z WriteableEcdsaChannelSigner_write LDKWriteableEcdsaChannelSigner *NONNULL_PTR this_arg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WriteableEcdsaChannelSigner_write")] public static extern byte[] WriteableEcdsaChannelSigner_write(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WriteableEcdsaChannelSigner_write")] public static extern long WriteableEcdsaChannelSigner_write(long _this_arg);
        // struct LDKWriteableEcdsaChannelSigner CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_ok(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_ok")] public static extern long CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_err(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_err")] public static extern long CResult_WriteableEcdsaChannelSignerDecodeErrorZ_get_err(long _owner);
-       // struct LDKCVec_u8Z CResult_ScriptNoneZ_get_ok(LDKCResult_ScriptNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ScriptNoneZ_get_ok")] public static extern byte[] CResult_ScriptNoneZ_get_ok(long _owner);
-       // void CResult_ScriptNoneZ_get_err(LDKCResult_ScriptNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ScriptNoneZ_get_err")] public static extern void CResult_ScriptNoneZ_get_err(long _owner);
+       // struct LDKCVec_u8Z CResult_CVec_u8ZNoneZ_get_ok(LDKCResult_CVec_u8ZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZNoneZ_get_ok")] public static extern long CResult_CVec_u8ZNoneZ_get_ok(long _owner);
+       // void CResult_CVec_u8ZNoneZ_get_err(LDKCResult_CVec_u8ZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZNoneZ_get_err")] public static extern void CResult_CVec_u8ZNoneZ_get_err(long _owner);
        // struct LDKShutdownScript CResult_ShutdownScriptNoneZ_get_ok(LDKCResult_ShutdownScriptNoneZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ShutdownScriptNoneZ_get_ok")] public static extern long CResult_ShutdownScriptNoneZ_get_ok(long _owner);
        // void CResult_ShutdownScriptNoneZ_get_err(LDKCResult_ShutdownScriptNoneZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ShutdownScriptNoneZ_get_err")] public static extern void CResult_ShutdownScriptNoneZ_get_err(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_u16Z_ty_from_ptr")] public static extern long LDKCOption_u16Z_ty_from_ptr(long ptr);
+       [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 byte[][] CResult_CVec_CVec_u8ZZNoneZ_get_ok(long _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 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);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_InMemorySignerDecodeErrorZ_get_err")] public static extern long CResult_InMemorySignerDecodeErrorZ_get_err(long _owner);
-       // struct LDKCVec_u8Z CResult_PartiallySignedTransactionNoneZ_get_ok(LDKCResult_PartiallySignedTransactionNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PartiallySignedTransactionNoneZ_get_ok")] public static extern byte[] CResult_PartiallySignedTransactionNoneZ_get_ok(long _owner);
-       // void CResult_PartiallySignedTransactionNoneZ_get_err(LDKCResult_PartiallySignedTransactionNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PartiallySignedTransactionNoneZ_get_err")] public static extern void CResult_PartiallySignedTransactionNoneZ_get_err(long _owner);
        // struct LDKTransaction CResult_TransactionNoneZ_get_ok(LDKCResult_TransactionNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_TransactionNoneZ_get_ok")] public static extern byte[] CResult_TransactionNoneZ_get_ok(long _owner);
+       [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);
-       public interface LDKScore {
-               long channel_penalty_msat(long _short_channel_id, long _source, long _target, long _usage, long _score_params);
-               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);
-               byte[] write();
+       public interface LDKScoreLookUp {
+               long channel_penalty_msat(long short_channel_id, long source, long target, long usage, long score_params);
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKScore_new")] public static extern long LDKScore_new(LDKScore impl);
-       // uint64_t Score_channel_penalty_msat LDKScore *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_Score_channel_penalty_msat")] public static extern long Score_channel_penalty_msat(long _this_arg, long _short_channel_id, long _source, long _target, long _usage, long _score_params);
-       // void Score_payment_path_failed LDKScore *NONNULL_PTR this_arg, const struct LDKPath *NONNULL_PTR path, uint64_t short_channel_id
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Score_payment_path_failed")] public static extern void Score_payment_path_failed(long _this_arg, long _path, long _short_channel_id);
-       // void Score_payment_path_successful LDKScore *NONNULL_PTR this_arg, const struct LDKPath *NONNULL_PTR path
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Score_payment_path_successful")] public static extern void Score_payment_path_successful(long _this_arg, long _path);
-       // void Score_probe_failed LDKScore *NONNULL_PTR this_arg, const struct LDKPath *NONNULL_PTR path, uint64_t short_channel_id
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Score_probe_failed")] public static extern void Score_probe_failed(long _this_arg, long _path, long _short_channel_id);
-       // void Score_probe_successful LDKScore *NONNULL_PTR this_arg, const struct LDKPath *NONNULL_PTR path
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Score_probe_successful")] public static extern void Score_probe_successful(long _this_arg, long _path);
-       // LDKCVec_u8Z Score_write LDKScore *NONNULL_PTR this_arg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Score_write")] public static extern byte[] Score_write(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKScoreLookUp_new")] public static extern long LDKScoreLookUp_new_native(long impl_idx);
+       public static long[] LDKScoreLookUp_new(LDKScoreLookUp 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] = LDKScoreLookUp_new_native(i);
+               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);
+       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);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKScoreUpdate_new")] public static extern long LDKScoreUpdate_new_native(long impl_idx);
+       public static long[] LDKScoreUpdate_new(LDKScoreUpdate 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] = LDKScoreUpdate_new_native(i);
+               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);
        public interface LDKLockableScore {
-               long do_lock();
+               long read_lock();
+               long write_lock();
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKLockableScore_new")] public static extern long LDKLockableScore_new_native(long impl_idx);
+       public static long[] LDKLockableScore_new(LDKLockableScore 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] = LDKLockableScore_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKLockableScore_new")] public static extern long LDKLockableScore_new(LDKLockableScore impl);
-       // LDKScore LockableScore_lock LDKLockableScore *NONNULL_PTR this_arg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LockableScore_lock")] public static extern long LockableScore_lock(long _this_arg);
+       // LDKScoreLookUp LockableScore_read_lock LDKLockableScore *NONNULL_PTR this_arg
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LockableScore_read_lock")] public static extern long LockableScore_read_lock(long _this_arg);
+       // LDKScoreUpdate LockableScore_write_lock LDKLockableScore *NONNULL_PTR this_arg
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LockableScore_write_lock")] public static extern long LockableScore_write_lock(long _this_arg);
        public interface LDKWriteableScore {
-               byte[] write();
+               long write();
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKWriteableScore_new")] public static extern long LDKWriteableScore_new_native(long impl_idx, long LockableScore);
+       public static long[] LDKWriteableScore_new(LDKWriteableScore impl, long LockableScore) {
+               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] = LDKWriteableScore_new_native(i, LockableScore);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKWriteableScore_new")] public static extern long LDKWriteableScore_new(LDKWriteableScore impl, LDKLockableScore LockableScore);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKWriteableScore_get_LockableScore")] public static extern long LDKWriteableScore_get_LockableScore(long arg);
        // LDKCVec_u8Z WriteableScore_write LDKWriteableScore *NONNULL_PTR this_arg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WriteableScore_write")] public static extern byte[] WriteableScore_write(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WriteableScore_write")] public static extern long WriteableScore_write(long _this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_WriteableScoreZ_ty_from_ptr")] public static extern long LDKCOption_WriteableScoreZ_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_WriteableScoreZ_Some_get_some")] public static extern long LDKCOption_WriteableScoreZ_Some_get_some(long ptr);
-       // void CResult_NoneErrorZ_get_ok(LDKCResult_NoneErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneErrorZ_get_ok")] public static extern void CResult_NoneErrorZ_get_ok(long _owner);
-       // enum LDKIOError CResult_NoneErrorZ_get_err(LDKCResult_NoneErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneErrorZ_get_err")] public static extern IOError CResult_NoneErrorZ_get_err(long _owner);
+       // void CResult_NoneIOErrorZ_get_ok(LDKCResult_NoneIOErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneIOErrorZ_get_ok")] public static extern void CResult_NoneIOErrorZ_get_ok(long _owner);
+       // enum LDKIOError CResult_NoneIOErrorZ_get_err(LDKCResult_NoneIOErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneIOErrorZ_get_err")] public static extern IOError CResult_NoneIOErrorZ_get_err(long _owner);
        // struct LDKRoute CResult_RouteLightningErrorZ_get_ok(LDKCResult_RouteLightningErrorZ *NONNULL_PTR owner);
        [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);
@@ -308,8 +413,6 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedTailDecodeErrorZ_get_ok")] public static extern long CResult_BlindedTailDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_BlindedTailDecodeErrorZ_get_err(LDKCResult_BlindedTailDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedTailDecodeErrorZ_get_err")] public static extern long CResult_BlindedTailDecodeErrorZ_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 LDKRoute CResult_RouteDecodeErrorZ_get_ok(LDKCResult_RouteDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RouteDecodeErrorZ_get_ok")] public static extern long CResult_RouteDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_RouteDecodeErrorZ_get_err(LDKCResult_RouteDecodeErrorZ *NONNULL_PTR owner);
@@ -344,20 +447,38 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u64u64Z_get_b")] public static extern long C2Tuple_u64u64Z_get_b(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_C2Tuple_u64u64ZZ_ty_from_ptr")] public static extern long LDKCOption_C2Tuple_u64u64ZZ_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_C2Tuple_u64u64ZZ_Some_get_some")] public static extern long LDKCOption_C2Tuple_u64u64ZZ_Some_get_some(long ptr);
-       // struct LDKEightU16s C2Tuple_Z_get_a(LDKC2Tuple_Z *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_Z_get_a")] public static extern short[] C2Tuple_Z_get_a(long _owner);
-       // struct LDKEightU16s C2Tuple_Z_get_b(LDKC2Tuple_Z *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_Z_get_b")] public static extern short[] C2Tuple_Z_get_b(long _owner);
-       // struct LDKEightU16s C2Tuple__u168_u168Z_get_a(LDKC2Tuple__u168_u168Z *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple__u168_u168Z_get_a")] public static extern short[] C2Tuple__u168_u168Z_get_a(long _owner);
-       // struct LDKEightU16s C2Tuple__u168_u168Z_get_b(LDKC2Tuple__u168_u168Z *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple__u168_u168Z_get_b")] public static extern short[] C2Tuple__u168_u168Z_get_b(long _owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_C2Tuple_EightU16sEightU16sZZ_ty_from_ptr")] public static extern long LDKCOption_C2Tuple_EightU16sEightU16sZZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_C2Tuple_EightU16sEightU16sZZ_Some_get_some")] public static extern long LDKCOption_C2Tuple_EightU16sEightU16sZZ_Some_get_some(long ptr);
+       // struct LDKThirtyTwoU16s C2Tuple_Z_get_a(LDKC2Tuple_Z *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_Z_get_a")] public static extern long C2Tuple_Z_get_a(long _owner);
+       // struct LDKThirtyTwoU16s C2Tuple_Z_get_b(LDKC2Tuple_Z *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_Z_get_b")] public static extern long C2Tuple_Z_get_b(long _owner);
+       // struct LDKThirtyTwoU16s C2Tuple__u1632_u1632Z_get_a(LDKC2Tuple__u1632_u1632Z *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple__u1632_u1632Z_get_a")] public static extern long C2Tuple__u1632_u1632Z_get_a(long _owner);
+       // struct LDKThirtyTwoU16s C2Tuple__u1632_u1632Z_get_b(LDKC2Tuple__u1632_u1632Z *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple__u1632_u1632Z_get_b")] public static extern long C2Tuple__u1632_u1632Z_get_b(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_ty_from_ptr")] public static extern long LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_Some_get_some")] public static extern long LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_Some_get_some(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_f64Z_ty_from_ptr")] public static extern long LDKCOption_f64Z_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_f64Z_Some_get_some")] public static extern double LDKCOption_f64Z_Some_get_some(long ptr);
        public interface LDKLogger {
-               void log(long _record);
+               void log(long record);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKLogger_new")] public static extern long LDKLogger_new_native(long impl_idx);
+       public static long[] LDKLogger_new(LDKLogger 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] = LDKLogger_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKLogger_new")] public static extern long LDKLogger_new(LDKLogger impl);
        // struct LDKProbabilisticScorer CResult_ProbabilisticScorerDecodeErrorZ_get_ok(LDKCResult_ProbabilisticScorerDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ProbabilisticScorerDecodeErrorZ_get_ok")] public static extern long CResult_ProbabilisticScorerDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_ProbabilisticScorerDecodeErrorZ_get_err(LDKCResult_ProbabilisticScorerDecodeErrorZ *NONNULL_PTR owner);
@@ -365,25 +486,26 @@ internal class bindings {
        // uintptr_t C2Tuple_usizeTransactionZ_get_a(LDKC2Tuple_usizeTransactionZ *NONNULL_PTR owner);
        [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 byte[] C2Tuple_usizeTransactionZ_get_b(long _owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_BlockHashZ_ty_from_ptr")] public static extern long LDKCOption_BlockHashZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_BlockHashZ_Some_get_some")] public static extern byte[] LDKCOption_BlockHashZ_Some_get_some(long ptr);
-       // struct LDKThirtyTwoBytes C2Tuple_TxidCOption_BlockHashZZ_get_a(LDKC2Tuple_TxidCOption_BlockHashZZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCOption_BlockHashZZ_get_a")] public static extern byte[] C2Tuple_TxidCOption_BlockHashZZ_get_a(long _owner);
-       // struct LDKCOption_BlockHashZ C2Tuple_TxidCOption_BlockHashZZ_get_b(LDKC2Tuple_TxidCOption_BlockHashZZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCOption_BlockHashZZ_get_b")] public static extern long C2Tuple_TxidCOption_BlockHashZZ_get_b(long _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);
+       // 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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_get_err")] public static extern void CResult_ChannelMonitorUpdateStatusNoneZ_get_err(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMonitorEvent_ty_from_ptr")] public static extern long LDKMonitorEvent_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMonitorEvent_HTLCEvent_get_htlc_event")] public static extern long LDKMonitorEvent_HTLCEvent_get_htlc_event(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMonitorEvent_CommitmentTxConfirmed_get_commitment_tx_confirmed")] public static extern long LDKMonitorEvent_CommitmentTxConfirmed_get_commitment_tx_confirmed(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMonitorEvent_HolderForceClosed_get_holder_force_closed")] public static extern long LDKMonitorEvent_HolderForceClosed_get_holder_force_closed(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMonitorEvent_Completed_get_funding_txo")] public static extern long LDKMonitorEvent_Completed_get_funding_txo(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMonitorEvent_Completed_get_monitor_update_id")] public static extern long LDKMonitorEvent_Completed_get_monitor_update_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMonitorEvent_UpdateFailed_get_update_failed")] public static extern long LDKMonitorEvent_UpdateFailed_get_update_failed(long ptr);
        // struct LDKOutPoint C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_a(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_a")] public static extern long C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_a(long _owner);
        // struct LDKCVec_MonitorEventZ C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_b(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_b")] public static extern long[] C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_b(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_b")] public static extern long C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_b(long _owner);
        // struct LDKPublicKey C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_c(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_c")] public static extern byte[] C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_c(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_c")] public static extern long C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_c(long _owner);
        // struct LDKInitFeatures CResult_InitFeaturesDecodeErrorZ_get_ok(LDKCResult_InitFeaturesDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_InitFeaturesDecodeErrorZ_get_ok")] public static extern long CResult_InitFeaturesDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_InitFeaturesDecodeErrorZ_get_err(LDKCResult_InitFeaturesDecodeErrorZ *NONNULL_PTR owner);
@@ -416,10 +538,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OfferBolt12ParseErrorZ_get_ok")] public static extern long CResult_OfferBolt12ParseErrorZ_get_ok(long _owner);
        // struct LDKBolt12ParseError CResult_OfferBolt12ParseErrorZ_get_err(LDKCResult_OfferBolt12ParseErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OfferBolt12ParseErrorZ_get_err")] public static extern long CResult_OfferBolt12ParseErrorZ_get_err(long _owner);
-       // struct LDKPublicKey CResult_PublicKeyErrorZ_get_ok(LDKCResult_PublicKeyErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeyErrorZ_get_ok")] public static extern byte[] CResult_PublicKeyErrorZ_get_ok(long _owner);
-       // enum LDKSecp256k1Error CResult_PublicKeyErrorZ_get_err(LDKCResult_PublicKeyErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeyErrorZ_get_err")] public static extern Secp256k1Error CResult_PublicKeyErrorZ_get_err(long _owner);
+       // struct LDKPublicKey CResult_PublicKeySecp256k1ErrorZ_get_ok(LDKCResult_PublicKeySecp256k1ErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeySecp256k1ErrorZ_get_ok")] public static extern long CResult_PublicKeySecp256k1ErrorZ_get_ok(long _owner);
+       // enum LDKSecp256k1Error CResult_PublicKeySecp256k1ErrorZ_get_err(LDKCResult_PublicKeySecp256k1ErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeySecp256k1ErrorZ_get_err")] public static extern Secp256k1Error CResult_PublicKeySecp256k1ErrorZ_get_err(long _owner);
        // struct LDKNodeId CResult_NodeIdDecodeErrorZ_get_ok(LDKCResult_NodeIdDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NodeIdDecodeErrorZ_get_ok")] public static extern long CResult_NodeIdDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_NodeIdDecodeErrorZ_get_err(LDKCResult_NodeIdDecodeErrorZ *NONNULL_PTR owner);
@@ -428,7 +550,7 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetworkUpdate_ChannelUpdateMessage_get_msg")] public static extern long LDKNetworkUpdate_ChannelUpdateMessage_get_msg(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetworkUpdate_ChannelFailure_get_short_channel_id")] public static extern long LDKNetworkUpdate_ChannelFailure_get_short_channel_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetworkUpdate_ChannelFailure_get_is_permanent")] public static extern bool LDKNetworkUpdate_ChannelFailure_get_is_permanent(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetworkUpdate_NodeFailure_get_node_id")] public static extern byte[] LDKNetworkUpdate_NodeFailure_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetworkUpdate_NodeFailure_get_node_id")] public static extern long LDKNetworkUpdate_NodeFailure_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetworkUpdate_NodeFailure_get_is_permanent")] public static extern bool LDKNetworkUpdate_NodeFailure_get_is_permanent(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_NetworkUpdateZ_ty_from_ptr")] public static extern long LDKCOption_NetworkUpdateZ_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_NetworkUpdateZ_Some_get_some")] public static extern long LDKCOption_NetworkUpdateZ_Some_get_some(long ptr);
@@ -444,11 +566,27 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKUtxoResult_Sync_get_sync")] public static extern long LDKUtxoResult_Sync_get_sync(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKUtxoResult_Async_get_async")] public static extern long LDKUtxoResult_Async_get_async(long ptr);
        public interface LDKUtxoLookup {
-               long get_utxo(byte[] _genesis_hash, long _short_channel_id);
+               long get_utxo(long chain_hash, long short_channel_id);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKUtxoLookup_new")] public static extern long LDKUtxoLookup_new_native(long impl_idx);
+       public static long[] LDKUtxoLookup_new(LDKUtxoLookup 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] = LDKUtxoLookup_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKUtxoLookup_new")] public static extern long LDKUtxoLookup_new(LDKUtxoLookup impl);
-       // LDKUtxoResult UtxoLookup_get_utxo LDKUtxoLookup *NONNULL_PTR this_arg, const uint8_t (*genesis_hash)[32], uint64_t short_channel_id
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UtxoLookup_get_utxo")] public static extern long UtxoLookup_get_utxo(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _genesis_hash, long _short_channel_id);
+       // LDKUtxoResult UtxoLookup_get_utxo LDKUtxoLookup *NONNULL_PTR this_arg, const uint8_t (*chain_hash)[32], uint64_t short_channel_id
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UtxoLookup_get_utxo")] public static extern long UtxoLookup_get_utxo(long _this_arg, long _chain_hash, long _short_channel_id);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_UtxoLookupZ_ty_from_ptr")] public static extern long LDKCOption_UtxoLookupZ_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_UtxoLookupZ_Some_get_some")] public static extern long LDKCOption_UtxoLookupZ_Some_get_some(long ptr);
        // void CResult_NoneLightningErrorZ_get_ok(LDKCResult_NoneLightningErrorZ *NONNULL_PTR owner);
@@ -475,68 +613,68 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKErrorAction_SendWarningMessage_get_msg")] public static extern long LDKErrorAction_SendWarningMessage_get_msg(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKErrorAction_SendWarningMessage_get_log_level")] public static extern Level LDKErrorAction_SendWarningMessage_get_log_level(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_ty_from_ptr")] public static extern long LDKMessageSendEvent_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendAcceptChannel_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendAcceptChannel_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendAcceptChannel_get_node_id")] public static extern long LDKMessageSendEvent_SendAcceptChannel_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendAcceptChannel_get_msg")] public static extern long LDKMessageSendEvent_SendAcceptChannel_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendAcceptChannelV2_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendAcceptChannelV2_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendAcceptChannelV2_get_node_id")] public static extern long LDKMessageSendEvent_SendAcceptChannelV2_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendAcceptChannelV2_get_msg")] public static extern long LDKMessageSendEvent_SendAcceptChannelV2_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendOpenChannel_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendOpenChannel_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendOpenChannel_get_node_id")] public static extern long LDKMessageSendEvent_SendOpenChannel_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendOpenChannel_get_msg")] public static extern long LDKMessageSendEvent_SendOpenChannel_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendOpenChannelV2_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendOpenChannelV2_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendOpenChannelV2_get_node_id")] public static extern long LDKMessageSendEvent_SendOpenChannelV2_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendOpenChannelV2_get_msg")] public static extern long LDKMessageSendEvent_SendOpenChannelV2_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendFundingCreated_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendFundingCreated_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendFundingCreated_get_node_id")] public static extern long LDKMessageSendEvent_SendFundingCreated_get_node_id(long ptr);
        [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 byte[] LDKMessageSendEvent_SendFundingSigned_get_node_id(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_SendTxAddInput_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendTxAddInput_get_node_id(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 byte[] LDKMessageSendEvent_SendTxAddOutput_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxAddOutput_get_node_id")] public static extern long LDKMessageSendEvent_SendTxAddOutput_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxAddOutput_get_msg")] public static extern long LDKMessageSendEvent_SendTxAddOutput_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxRemoveInput_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendTxRemoveInput_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxRemoveInput_get_node_id")] public static extern long LDKMessageSendEvent_SendTxRemoveInput_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxRemoveInput_get_msg")] public static extern long LDKMessageSendEvent_SendTxRemoveInput_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxRemoveOutput_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendTxRemoveOutput_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxRemoveOutput_get_node_id")] public static extern long LDKMessageSendEvent_SendTxRemoveOutput_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxRemoveOutput_get_msg")] public static extern long LDKMessageSendEvent_SendTxRemoveOutput_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxComplete_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendTxComplete_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxComplete_get_node_id")] public static extern long LDKMessageSendEvent_SendTxComplete_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxComplete_get_msg")] public static extern long LDKMessageSendEvent_SendTxComplete_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxSignatures_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendTxSignatures_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxSignatures_get_node_id")] public static extern long LDKMessageSendEvent_SendTxSignatures_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxSignatures_get_msg")] public static extern long LDKMessageSendEvent_SendTxSignatures_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxInitRbf_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendTxInitRbf_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxInitRbf_get_node_id")] public static extern long LDKMessageSendEvent_SendTxInitRbf_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxInitRbf_get_msg")] public static extern long LDKMessageSendEvent_SendTxInitRbf_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxAckRbf_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendTxAckRbf_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxAckRbf_get_node_id")] public static extern long LDKMessageSendEvent_SendTxAckRbf_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxAckRbf_get_msg")] public static extern long LDKMessageSendEvent_SendTxAckRbf_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxAbort_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendTxAbort_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxAbort_get_node_id")] public static extern long LDKMessageSendEvent_SendTxAbort_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxAbort_get_msg")] public static extern long LDKMessageSendEvent_SendTxAbort_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendChannelReady_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendChannelReady_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendChannelReady_get_node_id")] public static extern long LDKMessageSendEvent_SendChannelReady_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendChannelReady_get_msg")] public static extern long LDKMessageSendEvent_SendChannelReady_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendAnnouncementSignatures_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendAnnouncementSignatures_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendAnnouncementSignatures_get_node_id")] public static extern long LDKMessageSendEvent_SendAnnouncementSignatures_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendAnnouncementSignatures_get_msg")] public static extern long LDKMessageSendEvent_SendAnnouncementSignatures_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_UpdateHTLCs_get_node_id")] public static extern byte[] LDKMessageSendEvent_UpdateHTLCs_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_UpdateHTLCs_get_node_id")] public static extern long LDKMessageSendEvent_UpdateHTLCs_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_UpdateHTLCs_get_updates")] public static extern long LDKMessageSendEvent_UpdateHTLCs_get_updates(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendRevokeAndACK_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendRevokeAndACK_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendRevokeAndACK_get_node_id")] public static extern long LDKMessageSendEvent_SendRevokeAndACK_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendRevokeAndACK_get_msg")] public static extern long LDKMessageSendEvent_SendRevokeAndACK_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendClosingSigned_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendClosingSigned_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendClosingSigned_get_node_id")] public static extern long LDKMessageSendEvent_SendClosingSigned_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendClosingSigned_get_msg")] public static extern long LDKMessageSendEvent_SendClosingSigned_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendShutdown_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendShutdown_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendShutdown_get_node_id")] public static extern long LDKMessageSendEvent_SendShutdown_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendShutdown_get_msg")] public static extern long LDKMessageSendEvent_SendShutdown_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendChannelReestablish_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendChannelReestablish_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendChannelReestablish_get_node_id")] public static extern long LDKMessageSendEvent_SendChannelReestablish_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendChannelReestablish_get_msg")] public static extern long LDKMessageSendEvent_SendChannelReestablish_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendChannelAnnouncement_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendChannelAnnouncement_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendChannelAnnouncement_get_node_id")] public static extern long LDKMessageSendEvent_SendChannelAnnouncement_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendChannelAnnouncement_get_msg")] public static extern long LDKMessageSendEvent_SendChannelAnnouncement_get_msg(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendChannelAnnouncement_get_update_msg")] public static extern long LDKMessageSendEvent_SendChannelAnnouncement_get_update_msg(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_BroadcastChannelAnnouncement_get_msg")] public static extern long LDKMessageSendEvent_BroadcastChannelAnnouncement_get_msg(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_BroadcastChannelAnnouncement_get_update_msg")] public static extern long LDKMessageSendEvent_BroadcastChannelAnnouncement_get_update_msg(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_BroadcastChannelUpdate_get_msg")] public static extern long LDKMessageSendEvent_BroadcastChannelUpdate_get_msg(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_BroadcastNodeAnnouncement_get_msg")] public static extern long LDKMessageSendEvent_BroadcastNodeAnnouncement_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendChannelUpdate_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendChannelUpdate_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendChannelUpdate_get_node_id")] public static extern long LDKMessageSendEvent_SendChannelUpdate_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendChannelUpdate_get_msg")] public static extern long LDKMessageSendEvent_SendChannelUpdate_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_HandleError_get_node_id")] public static extern byte[] LDKMessageSendEvent_HandleError_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_HandleError_get_node_id")] public static extern long LDKMessageSendEvent_HandleError_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_HandleError_get_action")] public static extern long LDKMessageSendEvent_HandleError_get_action(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendChannelRangeQuery_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendChannelRangeQuery_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendChannelRangeQuery_get_node_id")] public static extern long LDKMessageSendEvent_SendChannelRangeQuery_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendChannelRangeQuery_get_msg")] public static extern long LDKMessageSendEvent_SendChannelRangeQuery_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendShortIdsQuery_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendShortIdsQuery_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendShortIdsQuery_get_node_id")] public static extern long LDKMessageSendEvent_SendShortIdsQuery_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendShortIdsQuery_get_msg")] public static extern long LDKMessageSendEvent_SendShortIdsQuery_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendReplyChannelRange_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendReplyChannelRange_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendReplyChannelRange_get_node_id")] public static extern long LDKMessageSendEvent_SendReplyChannelRange_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendReplyChannelRange_get_msg")] public static extern long LDKMessageSendEvent_SendReplyChannelRange_get_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendGossipTimestampFilter_get_node_id")] public static extern byte[] LDKMessageSendEvent_SendGossipTimestampFilter_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendGossipTimestampFilter_get_node_id")] public static extern long LDKMessageSendEvent_SendGossipTimestampFilter_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendGossipTimestampFilter_get_msg")] public static extern long LDKMessageSendEvent_SendGossipTimestampFilter_get_msg(long ptr);
        // struct LDKChannelUpdateInfo CResult_ChannelUpdateInfoDecodeErrorZ_get_ok(LDKCResult_ChannelUpdateInfoDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_get_ok")] public static extern long CResult_ChannelUpdateInfoDecodeErrorZ_get_ok(long _owner);
@@ -550,18 +688,18 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RoutingFeesDecodeErrorZ_get_ok")] public static extern long CResult_RoutingFeesDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_RoutingFeesDecodeErrorZ_get_err(LDKCResult_RoutingFeesDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RoutingFeesDecodeErrorZ_get_err")] public static extern long CResult_RoutingFeesDecodeErrorZ_get_err(long _owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetAddress_ty_from_ptr")] public static extern long LDKNetAddress_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetAddress_IPv4_get_addr")] public static extern byte[] LDKNetAddress_IPv4_get_addr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetAddress_IPv4_get_port")] public static extern short LDKNetAddress_IPv4_get_port(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetAddress_IPv6_get_addr")] public static extern byte[] LDKNetAddress_IPv6_get_addr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetAddress_IPv6_get_port")] public static extern short LDKNetAddress_IPv6_get_port(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetAddress_OnionV2_get_onion_v2")] public static extern byte[] LDKNetAddress_OnionV2_get_onion_v2(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetAddress_OnionV3_get_ed25519_pubkey")] public static extern byte[] LDKNetAddress_OnionV3_get_ed25519_pubkey(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetAddress_OnionV3_get_checksum")] public static extern short LDKNetAddress_OnionV3_get_checksum(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetAddress_OnionV3_get_version")] public static extern byte LDKNetAddress_OnionV3_get_version(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetAddress_OnionV3_get_port")] public static extern short LDKNetAddress_OnionV3_get_port(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetAddress_Hostname_get_hostname")] public static extern long LDKNetAddress_Hostname_get_hostname(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNetAddress_Hostname_get_port")] public static extern short LDKNetAddress_Hostname_get_port(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSocketAddress_ty_from_ptr")] public static extern long LDKSocketAddress_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSocketAddress_TcpIpV4_get_addr")] public static extern long LDKSocketAddress_TcpIpV4_get_addr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSocketAddress_TcpIpV4_get_port")] public static extern short LDKSocketAddress_TcpIpV4_get_port(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSocketAddress_TcpIpV6_get_addr")] public static extern long LDKSocketAddress_TcpIpV6_get_addr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSocketAddress_TcpIpV6_get_port")] public static extern short LDKSocketAddress_TcpIpV6_get_port(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSocketAddress_OnionV2_get_onion_v2")] public static extern long LDKSocketAddress_OnionV2_get_onion_v2(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSocketAddress_OnionV3_get_ed25519_pubkey")] public static extern long LDKSocketAddress_OnionV3_get_ed25519_pubkey(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSocketAddress_OnionV3_get_checksum")] public static extern short LDKSocketAddress_OnionV3_get_checksum(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSocketAddress_OnionV3_get_version")] public static extern byte LDKSocketAddress_OnionV3_get_version(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSocketAddress_OnionV3_get_port")] public static extern short LDKSocketAddress_OnionV3_get_port(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSocketAddress_Hostname_get_hostname")] public static extern long LDKSocketAddress_Hostname_get_hostname(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSocketAddress_Hostname_get_port")] public static extern short LDKSocketAddress_Hostname_get_port(long ptr);
        // struct LDKNodeAnnouncementInfo CResult_NodeAnnouncementInfoDecodeErrorZ_get_ok(LDKCResult_NodeAnnouncementInfoDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_get_ok")] public static extern long CResult_NodeAnnouncementInfoDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_NodeAnnouncementInfoDecodeErrorZ_get_err(LDKCResult_NodeAnnouncementInfoDecodeErrorZ *NONNULL_PTR owner);
@@ -578,10 +716,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NetworkGraphDecodeErrorZ_get_ok")] public static extern long CResult_NetworkGraphDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_NetworkGraphDecodeErrorZ_get_err(LDKCResult_NetworkGraphDecodeErrorZ *NONNULL_PTR owner);
        [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_NetAddressZZ_ty_from_ptr")] public static extern long LDKCOption_CVec_NetAddressZZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_CVec_NetAddressZZ_Some_get_some")] public static extern long[] LDKCOption_CVec_NetAddressZZ_Some_get_some(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_PaymentPreimageZ_ty_from_ptr")] public static extern long LDKCOption_PaymentPreimageZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_PaymentPreimageZ_Some_get_some")] public static extern byte[] LDKCOption_PaymentPreimageZ_Some_get_some(long ptr);
+       [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);
        [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);
@@ -589,31 +725,37 @@ internal class bindings {
        // void CResult_CoinSelectionNoneZ_get_err(LDKCResult_CoinSelectionNoneZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CoinSelectionNoneZ_get_err")] public static extern void CResult_CoinSelectionNoneZ_get_err(long _owner);
        // struct LDKCVec_UtxoZ CResult_CVec_UtxoZNoneZ_get_ok(LDKCResult_CVec_UtxoZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_UtxoZNoneZ_get_ok")] public static extern long[] CResult_CVec_UtxoZNoneZ_get_ok(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_UtxoZNoneZ_get_ok")] public static extern long CResult_CVec_UtxoZNoneZ_get_ok(long _owner);
        // void CResult_CVec_UtxoZNoneZ_get_err(LDKCResult_CVec_UtxoZNoneZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_UtxoZNoneZ_get_err")] public static extern void CResult_CVec_UtxoZNoneZ_get_err(long _owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_u16Z_ty_from_ptr")] public static extern long LDKCOption_u16Z_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_u16Z_Some_get_some")] public static extern short LDKCOption_u16Z_Some_get_some(long ptr);
+       // uint64_t C2Tuple_u64u16Z_get_a(LDKC2Tuple_u64u16Z *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u64u16Z_get_a")] public static extern long C2Tuple_u64u16Z_get_a(long _owner);
+       // uint16_t C2Tuple_u64u16Z_get_b(LDKC2Tuple_u64u16Z *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u64u16Z_get_b")] public static extern short C2Tuple_u64u16Z_get_b(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_C2Tuple_u64u16ZZ_ty_from_ptr")] public static extern long LDKCOption_C2Tuple_u64u16ZZ_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_C2Tuple_u64u16ZZ_Some_get_some")] public static extern long LDKCOption_C2Tuple_u64u16ZZ_Some_get_some(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_ChannelShutdownStateZ_ty_from_ptr")] public static extern long LDKCOption_ChannelShutdownStateZ_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_ChannelShutdownStateZ_Some_get_some")] public static extern ChannelShutdownState LDKCOption_ChannelShutdownStateZ_Some_get_some(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_PaymentHashZ_ty_from_ptr")] public static extern long LDKCOption_PaymentHashZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_PaymentHashZ_Some_get_some")] public static extern byte[] LDKCOption_PaymentHashZ_Some_get_some(long ptr);
-       // struct LDKThirtyTwoBytes CResult__u832APIErrorZ_get_ok(LDKCResult__u832APIErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult__u832APIErrorZ_get_ok")] public static extern byte[] CResult__u832APIErrorZ_get_ok(long _owner);
-       // struct LDKAPIError CResult__u832APIErrorZ_get_err(LDKCResult__u832APIErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult__u832APIErrorZ_get_err")] public static extern long CResult__u832APIErrorZ_get_err(long _owner);
+       // struct LDKThirtyTwoBytes CResult_ThirtyTwoBytesAPIErrorZ_get_ok(LDKCResult_ThirtyTwoBytesAPIErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_get_ok")] public static extern long CResult_ThirtyTwoBytesAPIErrorZ_get_ok(long _owner);
+       // struct LDKAPIError CResult_ThirtyTwoBytesAPIErrorZ_get_err(LDKCResult_ThirtyTwoBytesAPIErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_get_err")] public static extern long CResult_ThirtyTwoBytesAPIErrorZ_get_err(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRecentPaymentDetails_ty_from_ptr")] public static extern long LDKRecentPaymentDetails_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRecentPaymentDetails_Pending_get_payment_hash")] public static extern byte[] LDKRecentPaymentDetails_Pending_get_payment_hash(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRecentPaymentDetails_AwaitingInvoice_get_payment_id")] public static extern long LDKRecentPaymentDetails_AwaitingInvoice_get_payment_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRecentPaymentDetails_Pending_get_payment_id")] public static extern long LDKRecentPaymentDetails_Pending_get_payment_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRecentPaymentDetails_Pending_get_payment_hash")] public static extern long LDKRecentPaymentDetails_Pending_get_payment_hash(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRecentPaymentDetails_Pending_get_total_msat")] public static extern long LDKRecentPaymentDetails_Pending_get_total_msat(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRecentPaymentDetails_Fulfilled_get_payment_id")] public static extern long LDKRecentPaymentDetails_Fulfilled_get_payment_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRecentPaymentDetails_Fulfilled_get_payment_hash")] public static extern long LDKRecentPaymentDetails_Fulfilled_get_payment_hash(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRecentPaymentDetails_Abandoned_get_payment_hash")] public static extern byte[] LDKRecentPaymentDetails_Abandoned_get_payment_hash(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRecentPaymentDetails_Abandoned_get_payment_id")] public static extern long LDKRecentPaymentDetails_Abandoned_get_payment_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRecentPaymentDetails_Abandoned_get_payment_hash")] public static extern long LDKRecentPaymentDetails_Abandoned_get_payment_hash(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentSendFailure_ty_from_ptr")] public static extern long LDKPaymentSendFailure_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentSendFailure_ParameterError_get_parameter_error")] public static extern long LDKPaymentSendFailure_ParameterError_get_parameter_error(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentSendFailure_PathParameterError_get_path_parameter_error")] public static extern long[] LDKPaymentSendFailure_PathParameterError_get_path_parameter_error(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentSendFailure_AllFailedResendSafe_get_all_failed_resend_safe")] public static extern long[] LDKPaymentSendFailure_AllFailedResendSafe_get_all_failed_resend_safe(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentSendFailure_PartialFailure_get_results")] public static extern long[] LDKPaymentSendFailure_PartialFailure_get_results(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentSendFailure_PathParameterError_get_path_parameter_error")] public static extern long LDKPaymentSendFailure_PathParameterError_get_path_parameter_error(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentSendFailure_AllFailedResendSafe_get_all_failed_resend_safe")] public static extern long LDKPaymentSendFailure_AllFailedResendSafe_get_all_failed_resend_safe(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentSendFailure_PartialFailure_get_results")] public static extern long LDKPaymentSendFailure_PartialFailure_get_results(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentSendFailure_PartialFailure_get_failed_paths_retry")] public static extern long LDKPaymentSendFailure_PartialFailure_get_failed_paths_retry(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentSendFailure_PartialFailure_get_payment_id")] public static extern byte[] LDKPaymentSendFailure_PartialFailure_get_payment_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentSendFailure_PartialFailure_get_payment_id")] public static extern long LDKPaymentSendFailure_PartialFailure_get_payment_id(long ptr);
        // void CResult_NonePaymentSendFailureZ_get_ok(LDKCResult_NonePaymentSendFailureZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NonePaymentSendFailureZ_get_ok")] public static extern void CResult_NonePaymentSendFailureZ_get_ok(long _owner);
        // struct LDKPaymentSendFailure CResult_NonePaymentSendFailureZ_get_err(LDKCResult_NonePaymentSendFailureZ *NONNULL_PTR owner);
@@ -622,40 +764,57 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneRetryableSendFailureZ_get_ok")] public static extern void CResult_NoneRetryableSendFailureZ_get_ok(long _owner);
        // enum LDKRetryableSendFailure CResult_NoneRetryableSendFailureZ_get_err(LDKCResult_NoneRetryableSendFailureZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneRetryableSendFailureZ_get_err")] public static extern RetryableSendFailure CResult_NoneRetryableSendFailureZ_get_err(long _owner);
-       // struct LDKThirtyTwoBytes CResult_PaymentHashPaymentSendFailureZ_get_ok(LDKCResult_PaymentHashPaymentSendFailureZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentHashPaymentSendFailureZ_get_ok")] public static extern byte[] CResult_PaymentHashPaymentSendFailureZ_get_ok(long _owner);
-       // struct LDKPaymentSendFailure CResult_PaymentHashPaymentSendFailureZ_get_err(LDKCResult_PaymentHashPaymentSendFailureZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentHashPaymentSendFailureZ_get_err")] public static extern long CResult_PaymentHashPaymentSendFailureZ_get_err(long _owner);
-       // struct LDKThirtyTwoBytes CResult_PaymentHashRetryableSendFailureZ_get_ok(LDKCResult_PaymentHashRetryableSendFailureZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentHashRetryableSendFailureZ_get_ok")] public static extern byte[] CResult_PaymentHashRetryableSendFailureZ_get_ok(long _owner);
-       // enum LDKRetryableSendFailure CResult_PaymentHashRetryableSendFailureZ_get_err(LDKCResult_PaymentHashRetryableSendFailureZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentHashRetryableSendFailureZ_get_err")] public static extern RetryableSendFailure CResult_PaymentHashRetryableSendFailureZ_get_err(long _owner);
-       // struct LDKThirtyTwoBytes C2Tuple_PaymentHashPaymentIdZ_get_a(LDKC2Tuple_PaymentHashPaymentIdZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PaymentHashPaymentIdZ_get_a")] public static extern byte[] C2Tuple_PaymentHashPaymentIdZ_get_a(long _owner);
-       // struct LDKThirtyTwoBytes C2Tuple_PaymentHashPaymentIdZ_get_b(LDKC2Tuple_PaymentHashPaymentIdZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PaymentHashPaymentIdZ_get_b")] public static extern byte[] C2Tuple_PaymentHashPaymentIdZ_get_b(long _owner);
-       // struct LDKC2Tuple_PaymentHashPaymentIdZ CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_get_ok(LDKCResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_get_ok")] public static extern long CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_get_ok(long _owner);
-       // struct LDKPaymentSendFailure CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_get_err(LDKCResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_get_err")] public static extern long CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_get_err(long _owner);
-       // struct LDKThirtyTwoBytes C2Tuple_PaymentHashPaymentSecretZ_get_a(LDKC2Tuple_PaymentHashPaymentSecretZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PaymentHashPaymentSecretZ_get_a")] public static extern byte[] C2Tuple_PaymentHashPaymentSecretZ_get_a(long _owner);
-       // struct LDKThirtyTwoBytes C2Tuple_PaymentHashPaymentSecretZ_get_b(LDKC2Tuple_PaymentHashPaymentSecretZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PaymentHashPaymentSecretZ_get_b")] public static extern byte[] C2Tuple_PaymentHashPaymentSecretZ_get_b(long _owner);
-       // struct LDKC2Tuple_PaymentHashPaymentSecretZ CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_get_ok(LDKCResult_C2Tuple_PaymentHashPaymentSecretZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_get_ok")] public static extern long CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_get_ok(long _owner);
-       // void CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_get_err(LDKCResult_C2Tuple_PaymentHashPaymentSecretZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_get_err")] public static extern void CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_get_err(long _owner);
-       // struct LDKThirtyTwoBytes CResult_PaymentSecretNoneZ_get_ok(LDKCResult_PaymentSecretNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentSecretNoneZ_get_ok")] public static extern byte[] CResult_PaymentSecretNoneZ_get_ok(long _owner);
-       // void CResult_PaymentSecretNoneZ_get_err(LDKCResult_PaymentSecretNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentSecretNoneZ_get_err")] public static extern void CResult_PaymentSecretNoneZ_get_err(long _owner);
-       // struct LDKThirtyTwoBytes CResult_PaymentPreimageAPIErrorZ_get_ok(LDKCResult_PaymentPreimageAPIErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentPreimageAPIErrorZ_get_ok")] public static extern byte[] CResult_PaymentPreimageAPIErrorZ_get_ok(long _owner);
-       // struct LDKAPIError CResult_PaymentPreimageAPIErrorZ_get_err(LDKCResult_PaymentPreimageAPIErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentPreimageAPIErrorZ_get_err")] public static extern long CResult_PaymentPreimageAPIErrorZ_get_err(long _owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_CVec_ChainHashZZ_ty_from_ptr")] public static extern long LDKCOption_CVec_ChainHashZZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_CVec_ChainHashZZ_Some_get_some")] public static extern byte[][] LDKCOption_CVec_ChainHashZZ_Some_get_some(long ptr);
+       // struct LDKThirtyTwoBytes CResult_ThirtyTwoBytesPaymentSendFailureZ_get_ok(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_get_ok")] public static extern long CResult_ThirtyTwoBytesPaymentSendFailureZ_get_ok(long _owner);
+       // struct LDKPaymentSendFailure CResult_ThirtyTwoBytesPaymentSendFailureZ_get_err(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_get_err")] public static extern long CResult_ThirtyTwoBytesPaymentSendFailureZ_get_err(long _owner);
+       // struct LDKThirtyTwoBytes CResult_ThirtyTwoBytesRetryableSendFailureZ_get_ok(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_get_ok")] public static extern long CResult_ThirtyTwoBytesRetryableSendFailureZ_get_ok(long _owner);
+       // enum LDKRetryableSendFailure CResult_ThirtyTwoBytesRetryableSendFailureZ_get_err(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_get_err")] public static extern RetryableSendFailure CResult_ThirtyTwoBytesRetryableSendFailureZ_get_err(long _owner);
+       // struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_a(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_a")] public static extern long C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_a(long _owner);
+       // struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_b(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_b")] public static extern long C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_b(long _owner);
+       // struct LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_ok(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_ok")] public static extern long CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_ok(long _owner);
+       // struct LDKPaymentSendFailure CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_err(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_err")] public static extern long CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_err(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKProbeSendFailure_ty_from_ptr")] public static extern long LDKProbeSendFailure_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKProbeSendFailure_SendingFailed_get_sending_failed")] public static extern long LDKProbeSendFailure_SendingFailed_get_sending_failed(long ptr);
+       // struct LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_ok(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_ok")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_ok(long _owner);
+       // struct LDKProbeSendFailure CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_err(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_err")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_err(long _owner);
+       // struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesPublicKeyZ_get_a(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_get_a")] public static extern long C2Tuple_ThirtyTwoBytesPublicKeyZ_get_a(long _owner);
+       // struct LDKPublicKey C2Tuple_ThirtyTwoBytesPublicKeyZ_get_b(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_get_b")] public static extern long C2Tuple_ThirtyTwoBytesPublicKeyZ_get_b(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_StrZ_ty_from_ptr")] public static extern long LDKCOption_StrZ_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_StrZ_Some_get_some")] public static extern long LDKCOption_StrZ_Some_get_some(long ptr);
+       // void CResult_NoneBolt12SemanticErrorZ_get_ok(LDKCResult_NoneBolt12SemanticErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneBolt12SemanticErrorZ_get_ok")] public static extern void CResult_NoneBolt12SemanticErrorZ_get_ok(long _owner);
+       // enum LDKBolt12SemanticError CResult_NoneBolt12SemanticErrorZ_get_err(LDKCResult_NoneBolt12SemanticErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneBolt12SemanticErrorZ_get_err")] public static extern Bolt12SemanticError CResult_NoneBolt12SemanticErrorZ_get_err(long _owner);
+       // struct LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_ok(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_ok")] public static extern long CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_ok(long _owner);
+       // void CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_err(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_err")] public static extern void CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_err(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOffersMessage_ty_from_ptr")] public static extern long LDKOffersMessage_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOffersMessage_InvoiceRequest_get_invoice_request")] public static extern long LDKOffersMessage_InvoiceRequest_get_invoice_request(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOffersMessage_Invoice_get_invoice")] public static extern long LDKOffersMessage_Invoice_get_invoice(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOffersMessage_InvoiceError_get_invoice_error")] public static extern long LDKOffersMessage_InvoiceError_get_invoice_error(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_OffersMessageZ_ty_from_ptr")] public static extern long LDKCOption_OffersMessageZ_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_OffersMessageZ_Some_get_some")] public static extern long LDKCOption_OffersMessageZ_Some_get_some(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKDestination_ty_from_ptr")] public static extern long LDKDestination_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKDestination_Node_get_node")] public static extern long LDKDestination_Node_get_node(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKDestination_BlindedPath_get_blinded_path")] public static extern long LDKDestination_BlindedPath_get_blinded_path(long ptr);
+       // struct LDKOffersMessage C3Tuple_OffersMessageDestinationBlindedPathZ_get_a(LDKC3Tuple_OffersMessageDestinationBlindedPathZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_get_a")] public static extern long C3Tuple_OffersMessageDestinationBlindedPathZ_get_a(long _owner);
+       // struct LDKDestination C3Tuple_OffersMessageDestinationBlindedPathZ_get_b(LDKC3Tuple_OffersMessageDestinationBlindedPathZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_get_b")] public static extern long C3Tuple_OffersMessageDestinationBlindedPathZ_get_b(long _owner);
+       // struct LDKBlindedPath C3Tuple_OffersMessageDestinationBlindedPathZ_get_c(LDKC3Tuple_OffersMessageDestinationBlindedPathZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_get_c")] public static extern long C3Tuple_OffersMessageDestinationBlindedPathZ_get_c(long _owner);
        // struct LDKCounterpartyForwardingInfo CResult_CounterpartyForwardingInfoDecodeErrorZ_get_ok(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_get_ok")] public static extern long CResult_CounterpartyForwardingInfoDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_CounterpartyForwardingInfoDecodeErrorZ_get_err(LDKCResult_CounterpartyForwardingInfoDecodeErrorZ *NONNULL_PTR owner);
@@ -677,92 +836,210 @@ internal class bindings {
        // struct LDKDecodeError CResult_ChannelShutdownStateDecodeErrorZ_get_err(LDKCResult_ChannelShutdownStateDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_get_err")] public static extern long CResult_ChannelShutdownStateDecodeErrorZ_get_err(long _owner);
        public interface LDKWatch {
-               ChannelMonitorUpdateStatus watch_channel(long _funding_txo, long _monitor);
-               ChannelMonitorUpdateStatus update_channel(long _funding_txo, long _update);
-               long[] release_pending_monitor_events();
+               long watch_channel(long funding_txo, long monitor);
+               ChannelMonitorUpdateStatus update_channel(long funding_txo, long update);
+               long release_pending_monitor_events();
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKWatch_new")] public static extern long LDKWatch_new_native(long impl_idx);
+       public static long[] LDKWatch_new(LDKWatch 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] = LDKWatch_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKWatch_new")] public static extern long LDKWatch_new(LDKWatch impl);
-       // LDKChannelMonitorUpdateStatus Watch_watch_channel LDKWatch *NONNULL_PTR this_arg, struct LDKOutPoint funding_txo, struct LDKChannelMonitor monitor
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Watch_watch_channel")] public static extern ChannelMonitorUpdateStatus Watch_watch_channel(long _this_arg, long _funding_txo, long _monitor);
+       // LDKCResult_ChannelMonitorUpdateStatusNoneZ Watch_watch_channel LDKWatch *NONNULL_PTR this_arg, struct LDKOutPoint funding_txo, struct LDKChannelMonitor monitor
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Watch_watch_channel")] public static extern long Watch_watch_channel(long _this_arg, long _funding_txo, long _monitor);
        // LDKChannelMonitorUpdateStatus Watch_update_channel LDKWatch *NONNULL_PTR this_arg, struct LDKOutPoint funding_txo, const struct LDKChannelMonitorUpdate *NONNULL_PTR update
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Watch_update_channel")] public static extern ChannelMonitorUpdateStatus Watch_update_channel(long _this_arg, long _funding_txo, long _update);
        // LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ Watch_release_pending_monitor_events LDKWatch *NONNULL_PTR this_arg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Watch_release_pending_monitor_events")] public static extern long[] Watch_release_pending_monitor_events(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Watch_release_pending_monitor_events")] public static extern long Watch_release_pending_monitor_events(long _this_arg);
        public interface LDKBroadcasterInterface {
-               void broadcast_transactions(byte[][] _txs);
+               void broadcast_transactions(long txs);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBroadcasterInterface_new")] public static extern long LDKBroadcasterInterface_new_native(long impl_idx);
+       public static long[] LDKBroadcasterInterface_new(LDKBroadcasterInterface 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] = LDKBroadcasterInterface_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBroadcasterInterface_new")] public static extern long LDKBroadcasterInterface_new(LDKBroadcasterInterface impl);
        // void BroadcasterInterface_broadcast_transactions LDKBroadcasterInterface *NONNULL_PTR this_arg, struct LDKCVec_TransactionZ txs
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BroadcasterInterface_broadcast_transactions")] public static extern void BroadcasterInterface_broadcast_transactions(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _txs);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BroadcasterInterface_broadcast_transactions")] public static extern void BroadcasterInterface_broadcast_transactions(long _this_arg, long _txs);
        public interface LDKEntropySource {
-               byte[] get_secure_random_bytes();
+               long get_secure_random_bytes();
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEntropySource_new")] public static extern long LDKEntropySource_new_native(long impl_idx);
+       public static long[] LDKEntropySource_new(LDKEntropySource 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] = LDKEntropySource_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEntropySource_new")] public static extern long LDKEntropySource_new(LDKEntropySource impl);
        // LDKThirtyTwoBytes EntropySource_get_secure_random_bytes LDKEntropySource *NONNULL_PTR this_arg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EntropySource_get_secure_random_bytes")] public static extern byte[] EntropySource_get_secure_random_bytes(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EntropySource_get_secure_random_bytes")] public static extern long EntropySource_get_secure_random_bytes(long _this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKUnsignedGossipMessage_ty_from_ptr")] public static extern long LDKUnsignedGossipMessage_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKUnsignedGossipMessage_ChannelAnnouncement_get_channel_announcement")] public static extern long LDKUnsignedGossipMessage_ChannelAnnouncement_get_channel_announcement(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKUnsignedGossipMessage_ChannelUpdate_get_channel_update")] public static extern long LDKUnsignedGossipMessage_ChannelUpdate_get_channel_update(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKUnsignedGossipMessage_NodeAnnouncement_get_node_announcement")] public static extern long LDKUnsignedGossipMessage_NodeAnnouncement_get_node_announcement(long ptr);
        public interface LDKNodeSigner {
-               byte[] get_inbound_payment_key_material();
-               long get_node_id(Recipient _recipient);
-               long ecdh(Recipient _recipient, byte[] _other_key, long _tweak);
-               long sign_invoice(byte[] _hrp_bytes, byte[] _invoice_data, Recipient _recipient);
-               long sign_gossip_message(long _msg);
+               long get_inbound_payment_key_material();
+               long get_node_id(Recipient recipient);
+               long ecdh(Recipient recipient, long other_key, long tweak);
+               long sign_invoice(long hrp_bytes, long invoice_data, Recipient recipient);
+               long sign_bolt12_invoice_request(long invoice_request);
+               long sign_bolt12_invoice(long invoice);
+               long sign_gossip_message(long msg);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNodeSigner_new")] public static extern long LDKNodeSigner_new_native(long impl_idx);
+       public static long[] LDKNodeSigner_new(LDKNodeSigner 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] = LDKNodeSigner_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKNodeSigner_new")] public static extern long LDKNodeSigner_new(LDKNodeSigner impl);
        // LDKThirtyTwoBytes NodeSigner_get_inbound_payment_key_material LDKNodeSigner *NONNULL_PTR this_arg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeSigner_get_inbound_payment_key_material")] public static extern byte[] NodeSigner_get_inbound_payment_key_material(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeSigner_get_inbound_payment_key_material")] public static extern long NodeSigner_get_inbound_payment_key_material(long _this_arg);
        // LDKCResult_PublicKeyNoneZ NodeSigner_get_node_id LDKNodeSigner *NONNULL_PTR this_arg, enum LDKRecipient recipient
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeSigner_get_node_id")] public static extern long NodeSigner_get_node_id(long _this_arg, Recipient _recipient);
-       // LDKCResult_SharedSecretNoneZ NodeSigner_ecdh LDKNodeSigner *NONNULL_PTR this_arg, enum LDKRecipient recipient, struct LDKPublicKey other_key, struct LDKCOption_ScalarZ tweak
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeSigner_ecdh")] public static extern long NodeSigner_ecdh(long _this_arg, Recipient _recipient, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _other_key, long _tweak);
+       // LDKCResult_ThirtyTwoBytesNoneZ NodeSigner_ecdh LDKNodeSigner *NONNULL_PTR this_arg, enum LDKRecipient recipient, struct LDKPublicKey other_key, struct LDKCOption_BigEndianScalarZ tweak
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeSigner_ecdh")] public static extern long NodeSigner_ecdh(long _this_arg, Recipient _recipient, long _other_key, long _tweak);
        // LDKCResult_RecoverableSignatureNoneZ NodeSigner_sign_invoice LDKNodeSigner *NONNULL_PTR this_arg, struct LDKu8slice hrp_bytes, struct LDKCVec_U5Z invoice_data, enum LDKRecipient recipient
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeSigner_sign_invoice")] public static extern long NodeSigner_sign_invoice(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _hrp_bytes, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _invoice_data, Recipient _recipient);
-       // LDKCResult_SignatureNoneZ NodeSigner_sign_gossip_message LDKNodeSigner *NONNULL_PTR this_arg, struct LDKUnsignedGossipMessage msg
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeSigner_sign_invoice")] public static extern long NodeSigner_sign_invoice(long _this_arg, long _hrp_bytes, long _invoice_data, Recipient _recipient);
+       // LDKCResult_SchnorrSignatureNoneZ NodeSigner_sign_bolt12_invoice_request LDKNodeSigner *NONNULL_PTR this_arg, const struct LDKUnsignedInvoiceRequest *NONNULL_PTR invoice_request
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeSigner_sign_bolt12_invoice_request")] public static extern long NodeSigner_sign_bolt12_invoice_request(long _this_arg, long _invoice_request);
+       // LDKCResult_SchnorrSignatureNoneZ NodeSigner_sign_bolt12_invoice LDKNodeSigner *NONNULL_PTR this_arg, const struct LDKUnsignedBolt12Invoice *NONNULL_PTR invoice
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeSigner_sign_bolt12_invoice")] public static extern long NodeSigner_sign_bolt12_invoice(long _this_arg, long _invoice);
+       // LDKCResult_ECDSASignatureNoneZ NodeSigner_sign_gossip_message LDKNodeSigner *NONNULL_PTR this_arg, struct LDKUnsignedGossipMessage msg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeSigner_sign_gossip_message")] public static extern long NodeSigner_sign_gossip_message(long _this_arg, long _msg);
        public interface LDKSignerProvider {
-               byte[] generate_channel_keys_id(bool _inbound, long _channel_value_satoshis, byte[] _user_channel_id);
-               long derive_channel_signer(long _channel_value_satoshis, byte[] _channel_keys_id);
-               long read_chan_signer(byte[] _reader);
+               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_shutdown_scriptpubkey();
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSignerProvider_new")] public static extern long LDKSignerProvider_new(LDKSignerProvider impl);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSignerProvider_new")] public static extern long LDKSignerProvider_new_native(long impl_idx);
+       public static long[] LDKSignerProvider_new(LDKSignerProvider 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] = LDKSignerProvider_new_native(i);
+               ret[1] = i;
+               return ret;
+       }
        // LDKThirtyTwoBytes SignerProvider_generate_channel_keys_id LDKSignerProvider *NONNULL_PTR this_arg, bool inbound, uint64_t channel_value_satoshis, struct LDKU128 user_channel_id
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignerProvider_generate_channel_keys_id")] public static extern byte[] SignerProvider_generate_channel_keys_id(long _this_arg, bool _inbound, long _channel_value_satoshis, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _user_channel_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignerProvider_generate_channel_keys_id")] public static extern long SignerProvider_generate_channel_keys_id(long _this_arg, bool _inbound, long _channel_value_satoshis, long _user_channel_id);
        // LDKWriteableEcdsaChannelSigner SignerProvider_derive_channel_signer LDKSignerProvider *NONNULL_PTR this_arg, uint64_t channel_value_satoshis, struct LDKThirtyTwoBytes channel_keys_id
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignerProvider_derive_channel_signer")] public static extern long SignerProvider_derive_channel_signer(long _this_arg, long _channel_value_satoshis, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_keys_id);
+       [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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _reader);
-       // LDKCResult_ScriptNoneZ SignerProvider_get_destination_script LDKSignerProvider *NONNULL_PTR this_arg
+       [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_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 {
-               int get_est_sat_per_1000_weight(ConfirmationTarget _confirmation_target);
+               int get_est_sat_per_1000_weight(ConfirmationTarget confirmation_target);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKFeeEstimator_new")] public static extern long LDKFeeEstimator_new_native(long impl_idx);
+       public static long[] LDKFeeEstimator_new(LDKFeeEstimator 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] = LDKFeeEstimator_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKFeeEstimator_new")] public static extern long LDKFeeEstimator_new(LDKFeeEstimator impl);
        // 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 LDKRouter {
-               long find_route(byte[] _payer, long _route_params, long[] _first_hops, long _inflight_htlcs);
-               long find_route_with_id(byte[] _payer, long _route_params, long[] _first_hops, long _inflight_htlcs, byte[] __payment_hash, byte[] __payment_id);
+               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);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRouter_new")] public static extern long LDKRouter_new_native(long impl_idx);
+       public static long[] LDKRouter_new(LDKRouter 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] = LDKRouter_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRouter_new")] public static extern long LDKRouter_new(LDKRouter impl);
        // LDKCResult_RouteLightningErrorZ Router_find_route LDKRouter *NONNULL_PTR this_arg, struct LDKPublicKey payer, const struct LDKRouteParameters *NONNULL_PTR route_params, struct LDKCVec_ChannelDetailsZ *first_hops, struct LDKInFlightHtlcs inflight_htlcs
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Router_find_route")] public static extern long Router_find_route(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payer, long _route_params, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _first_hops, long _inflight_htlcs);
+       [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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payer, long _route_params, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _first_hops, long _inflight_htlcs, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] __payment_hash, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] __payment_id);
-       // struct LDKThirtyTwoBytes C2Tuple_BlockHashChannelManagerZ_get_a(LDKC2Tuple_BlockHashChannelManagerZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlockHashChannelManagerZ_get_a")] public static extern byte[] C2Tuple_BlockHashChannelManagerZ_get_a(long _owner);
-       // struct LDKChannelManager C2Tuple_BlockHashChannelManagerZ_get_b(LDKC2Tuple_BlockHashChannelManagerZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlockHashChannelManagerZ_get_b")] public static extern long C2Tuple_BlockHashChannelManagerZ_get_b(long _owner);
-       // struct LDKC2Tuple_BlockHashChannelManagerZ *CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_get_ok(LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_get_ok")] public static extern long CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_get_ok(long _owner);
-       // struct LDKDecodeError CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_get_err(LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_get_err")] public static extern long CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_get_err(long _owner);
+       [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);
+       // 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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_get_b")] public static extern long C2Tuple_ThirtyTwoBytesChannelManagerZ_get_b(long _owner);
+       // struct LDKC2Tuple_ThirtyTwoBytesChannelManagerZ *CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_ok(LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_ok")] public static extern long CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_err(LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_err")] public static extern long CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_err(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMaxDustHTLCExposure_ty_from_ptr")] public static extern long LDKMaxDustHTLCExposure_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMaxDustHTLCExposure_FixedLimitMsat_get_fixed_limit_msat")] public static extern long LDKMaxDustHTLCExposure_FixedLimitMsat_get_fixed_limit_msat(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMaxDustHTLCExposure_FeeRateMultiplier_get_fee_rate_multiplier")] public static extern long LDKMaxDustHTLCExposure_FeeRateMultiplier_get_fee_rate_multiplier(long ptr);
@@ -796,100 +1073,132 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HTLCUpdateDecodeErrorZ_get_ok")] public static extern long CResult_HTLCUpdateDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_HTLCUpdateDecodeErrorZ_get_err(LDKCResult_HTLCUpdateDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HTLCUpdateDecodeErrorZ_get_err")] public static extern long CResult_HTLCUpdateDecodeErrorZ_get_err(long _owner);
-       // struct LDKOutPoint C2Tuple_OutPointScriptZ_get_a(LDKC2Tuple_OutPointScriptZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointScriptZ_get_a")] public static extern long C2Tuple_OutPointScriptZ_get_a(long _owner);
-       // struct LDKCVec_u8Z C2Tuple_OutPointScriptZ_get_b(LDKC2Tuple_OutPointScriptZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointScriptZ_get_b")] public static extern byte[] C2Tuple_OutPointScriptZ_get_b(long _owner);
-       // uint32_t C2Tuple_u32ScriptZ_get_a(LDKC2Tuple_u32ScriptZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u32ScriptZ_get_a")] public static extern int C2Tuple_u32ScriptZ_get_a(long _owner);
-       // struct LDKCVec_u8Z C2Tuple_u32ScriptZ_get_b(LDKC2Tuple_u32ScriptZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u32ScriptZ_get_b")] public static extern byte[] C2Tuple_u32ScriptZ_get_b(long _owner);
-       // struct LDKThirtyTwoBytes C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_get_a(LDKC2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_get_a")] public static extern byte[] C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_get_a(long _owner);
-       // struct LDKCVec_C2Tuple_u32ScriptZZ C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_get_b(LDKC2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_get_b")] public static extern long[] C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_get_b(long _owner);
+       // struct LDKOutPoint C2Tuple_OutPointCVec_u8ZZ_get_a(LDKC2Tuple_OutPointCVec_u8ZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointCVec_u8ZZ_get_a")] public static extern long C2Tuple_OutPointCVec_u8ZZ_get_a(long _owner);
+       // struct LDKCVec_u8Z C2Tuple_OutPointCVec_u8ZZ_get_b(LDKC2Tuple_OutPointCVec_u8ZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointCVec_u8ZZ_get_b")] public static extern long C2Tuple_OutPointCVec_u8ZZ_get_b(long _owner);
+       // uint32_t C2Tuple_u32CVec_u8ZZ_get_a(LDKC2Tuple_u32CVec_u8ZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u32CVec_u8ZZ_get_a")] public static extern int C2Tuple_u32CVec_u8ZZ_get_a(long _owner);
+       // struct LDKCVec_u8Z C2Tuple_u32CVec_u8ZZ_get_b(LDKC2Tuple_u32CVec_u8ZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u32CVec_u8ZZ_get_b")] public static extern long C2Tuple_u32CVec_u8ZZ_get_b(long _owner);
+       // struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_a(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_a")] public static extern long C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_a(long _owner);
+       // struct LDKCVec_C2Tuple_u32CVec_u8ZZZ C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_b(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_b")] public static extern long C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_b(long _owner);
        // uint32_t C2Tuple_u32TxOutZ_get_a(LDKC2Tuple_u32TxOutZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u32TxOutZ_get_a")] public static extern int C2Tuple_u32TxOutZ_get_a(long _owner);
        // struct LDKTxOut C2Tuple_u32TxOutZ_get_b(LDKC2Tuple_u32TxOutZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u32TxOutZ_get_b")] public static extern long C2Tuple_u32TxOutZ_get_b(long _owner);
-       // struct LDKThirtyTwoBytes C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_get_a(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_get_a")] public static extern byte[] C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_get_a(long _owner);
-       // struct LDKCVec_C2Tuple_u32TxOutZZ C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_get_b(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_get_b")] public static extern long[] C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_get_b(long _owner);
+       // struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_a(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_a")] public static extern long C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_a(long _owner);
+       // struct LDKCVec_C2Tuple_u32TxOutZZ C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_b(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_b")] public static extern long C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_b(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_ty_from_ptr")] public static extern long LDKBalance_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_ClaimableOnChannelClose_get_amount_satoshis")] public static extern long LDKBalance_ClaimableOnChannelClose_get_amount_satoshis(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_ClaimableAwaitingConfirmations_get_amount_satoshis")] public static extern long LDKBalance_ClaimableAwaitingConfirmations_get_amount_satoshis(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_ClaimableAwaitingConfirmations_get_confirmation_height")] public static extern int LDKBalance_ClaimableAwaitingConfirmations_get_confirmation_height(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_ContentiousClaimable_get_amount_satoshis")] public static extern long LDKBalance_ContentiousClaimable_get_amount_satoshis(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_ContentiousClaimable_get_timeout_height")] public static extern int LDKBalance_ContentiousClaimable_get_timeout_height(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_ContentiousClaimable_get_payment_hash")] public static extern byte[] LDKBalance_ContentiousClaimable_get_payment_hash(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_ContentiousClaimable_get_payment_preimage")] public static extern byte[] LDKBalance_ContentiousClaimable_get_payment_preimage(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_ContentiousClaimable_get_payment_hash")] public static extern long LDKBalance_ContentiousClaimable_get_payment_hash(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_ContentiousClaimable_get_payment_preimage")] public static extern long LDKBalance_ContentiousClaimable_get_payment_preimage(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_MaybeTimeoutClaimableHTLC_get_amount_satoshis")] public static extern long LDKBalance_MaybeTimeoutClaimableHTLC_get_amount_satoshis(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_MaybeTimeoutClaimableHTLC_get_claimable_height")] public static extern int LDKBalance_MaybeTimeoutClaimableHTLC_get_claimable_height(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_MaybeTimeoutClaimableHTLC_get_payment_hash")] public static extern byte[] LDKBalance_MaybeTimeoutClaimableHTLC_get_payment_hash(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_MaybeTimeoutClaimableHTLC_get_payment_hash")] public static extern long LDKBalance_MaybeTimeoutClaimableHTLC_get_payment_hash(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_MaybePreimageClaimableHTLC_get_amount_satoshis")] public static extern long LDKBalance_MaybePreimageClaimableHTLC_get_amount_satoshis(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_MaybePreimageClaimableHTLC_get_expiry_height")] public static extern int LDKBalance_MaybePreimageClaimableHTLC_get_expiry_height(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_MaybePreimageClaimableHTLC_get_payment_hash")] public static extern byte[] LDKBalance_MaybePreimageClaimableHTLC_get_payment_hash(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_MaybePreimageClaimableHTLC_get_payment_hash")] public static extern long LDKBalance_MaybePreimageClaimableHTLC_get_payment_hash(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBalance_CounterpartyRevokedOutputClaimable_get_amount_satoshis")] public static extern long LDKBalance_CounterpartyRevokedOutputClaimable_get_amount_satoshis(long ptr);
-       // struct LDKThirtyTwoBytes C2Tuple_BlockHashChannelMonitorZ_get_a(LDKC2Tuple_BlockHashChannelMonitorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlockHashChannelMonitorZ_get_a")] public static extern byte[] C2Tuple_BlockHashChannelMonitorZ_get_a(long _owner);
-       // struct LDKChannelMonitor C2Tuple_BlockHashChannelMonitorZ_get_b(LDKC2Tuple_BlockHashChannelMonitorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlockHashChannelMonitorZ_get_b")] public static extern long C2Tuple_BlockHashChannelMonitorZ_get_b(long _owner);
-       // struct LDKC2Tuple_BlockHashChannelMonitorZ CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_get_ok(LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_get_ok")] public static extern long CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_get_ok(long _owner);
-       // struct LDKDecodeError CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_get_err(LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_get_err")] public static extern long CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_get_err(long _owner);
+       // struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_a(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_a")] public static extern long C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_a(long _owner);
+       // struct LDKChannelMonitor C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_b(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_b")] public static extern long C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_b(long _owner);
+       // struct LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_ok(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_ok")] public static extern long CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_err(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_err")] public static extern long CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_err(long _owner);
        public interface LDKType {
                short type_id();
-               string debug_str();
-               byte[] write();
+               long debug_str();
+               long write();
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKType_new")] public static extern long LDKType_new_native(long impl_idx);
+       public static long[] LDKType_new(LDKType 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] = LDKType_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKType_new")] public static extern long LDKType_new(LDKType impl);
        // uint16_t Type_type_id LDKType *NONNULL_PTR this_arg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Type_type_id")] public static extern short Type_type_id(long _this_arg);
        // LDKStr Type_debug_str LDKType *NONNULL_PTR this_arg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Type_debug_str")] public static extern string Type_debug_str(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Type_debug_str")] public static extern long Type_debug_str(long _this_arg);
        // LDKCVec_u8Z Type_write LDKType *NONNULL_PTR this_arg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Type_write")] public static extern byte[] Type_write(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Type_write")] public static extern long Type_write(long _this_arg);
        // struct LDKPublicKey C2Tuple_PublicKeyTypeZ_get_a(LDKC2Tuple_PublicKeyTypeZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyTypeZ_get_a")] public static extern byte[] C2Tuple_PublicKeyTypeZ_get_a(long _owner);
+       [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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOffersMessage_ty_from_ptr")] public static extern long LDKOffersMessage_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOffersMessage_InvoiceRequest_get_invoice_request")] public static extern long LDKOffersMessage_InvoiceRequest_get_invoice_request(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOffersMessage_Invoice_get_invoice")] public static extern long LDKOffersMessage_Invoice_get_invoice(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOffersMessage_InvoiceError_get_invoice_error")] public static extern long LDKOffersMessage_InvoiceError_get_invoice_error(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_OffersMessageZ_ty_from_ptr")] public static extern long LDKCOption_OffersMessageZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_OffersMessageZ_Some_get_some")] public static extern long LDKCOption_OffersMessageZ_Some_get_some(long ptr);
-       public interface LDKCustomOnionMessageContents {
+       public interface LDKOnionMessageContents {
                long tlv_type();
-               byte[] write();
+               long write();
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCustomOnionMessageContents_new")] public static extern long LDKCustomOnionMessageContents_new(LDKCustomOnionMessageContents impl);
-       // uint64_t CustomOnionMessageContents_tlv_type LDKCustomOnionMessageContents *NONNULL_PTR this_arg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomOnionMessageContents_tlv_type")] public static extern long CustomOnionMessageContents_tlv_type(long _this_arg);
-       // LDKCVec_u8Z CustomOnionMessageContents_write LDKCustomOnionMessageContents *NONNULL_PTR this_arg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomOnionMessageContents_write")] public static extern byte[] CustomOnionMessageContents_write(long _this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_CustomOnionMessageContentsZ_ty_from_ptr")] public static extern long LDKCOption_CustomOnionMessageContentsZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_CustomOnionMessageContentsZ_Some_get_some")] public static extern long LDKCOption_CustomOnionMessageContentsZ_Some_get_some(long ptr);
-       // struct LDKCOption_CustomOnionMessageContentsZ CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_get_ok(LDKCResult_COption_CustomOnionMessageContentsZDecodeErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_get_ok")] public static extern long CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_get_ok(long _owner);
-       // struct LDKDecodeError CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_get_err(LDKCResult_COption_CustomOnionMessageContentsZDecodeErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_get_err")] public static extern long CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_get_err(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOnionMessageContents_new")] public static extern long LDKOnionMessageContents_new_native(long impl_idx);
+       public static long[] LDKOnionMessageContents_new(LDKOnionMessageContents 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] = LDKOnionMessageContents_new_native(i);
+               ret[1] = i;
+               return ret;
+       }
+       // uint64_t OnionMessageContents_tlv_type LDKOnionMessageContents *NONNULL_PTR this_arg
+       [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);
+       [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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_get_ok")] public static extern long CResult_COption_OnionMessageContentsZDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_COption_OnionMessageContentsZDecodeErrorZ_get_err(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_get_err")] public static extern long CResult_COption_OnionMessageContentsZDecodeErrorZ_get_err(long _owner);
+       // struct LDKOnionMessageContents C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_a(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_a")] public static extern long C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_a(long _owner);
+       // struct LDKDestination C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_b(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_b")] public static extern long C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_b(long _owner);
+       // struct LDKBlindedPath C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_c(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_c")] public static extern long C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_c(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_TypeZ_ty_from_ptr")] public static extern long LDKCOption_TypeZ_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_TypeZ_Some_get_some")] public static extern long LDKCOption_TypeZ_Some_get_some(long ptr);
        // struct LDKCOption_TypeZ CResult_COption_TypeZDecodeErrorZ_get_ok(LDKCResult_COption_TypeZDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_TypeZDecodeErrorZ_get_ok")] public static extern long CResult_COption_TypeZDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_COption_TypeZDecodeErrorZ_get_err(LDKCResult_COption_TypeZDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_TypeZDecodeErrorZ_get_err")] public static extern long CResult_COption_TypeZDecodeErrorZ_get_err(long _owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_NetAddressZ_ty_from_ptr")] public static extern long LDKCOption_NetAddressZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_NetAddressZ_Some_get_some")] public static extern long LDKCOption_NetAddressZ_Some_get_some(long ptr);
-       // struct LDKPublicKey C2Tuple_PublicKeyCOption_NetAddressZZ_get_a(LDKC2Tuple_PublicKeyCOption_NetAddressZZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCOption_NetAddressZZ_get_a")] public static extern byte[] C2Tuple_PublicKeyCOption_NetAddressZZ_get_a(long _owner);
-       // struct LDKCOption_NetAddressZ C2Tuple_PublicKeyCOption_NetAddressZZ_get_b(LDKC2Tuple_PublicKeyCOption_NetAddressZZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCOption_NetAddressZZ_get_b")] public static extern long C2Tuple_PublicKeyCOption_NetAddressZZ_get_b(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_SocketAddressZ_ty_from_ptr")] public static extern long LDKCOption_SocketAddressZ_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_SocketAddressZ_Some_get_some")] public static extern long LDKCOption_SocketAddressZ_Some_get_some(long ptr);
+       // struct LDKPublicKey C2Tuple_PublicKeyCOption_SocketAddressZZ_get_a(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_get_a")] public static extern long C2Tuple_PublicKeyCOption_SocketAddressZZ_get_a(long _owner);
+       // struct LDKCOption_SocketAddressZ C2Tuple_PublicKeyCOption_SocketAddressZZ_get_b(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_get_b")] public static extern long C2Tuple_PublicKeyCOption_SocketAddressZZ_get_b(long _owner);
        // struct LDKCVec_u8Z CResult_CVec_u8ZPeerHandleErrorZ_get_ok(LDKCResult_CVec_u8ZPeerHandleErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_get_ok")] public static extern byte[] CResult_CVec_u8ZPeerHandleErrorZ_get_ok(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_get_ok")] public static extern long CResult_CVec_u8ZPeerHandleErrorZ_get_ok(long _owner);
        // struct LDKPeerHandleError CResult_CVec_u8ZPeerHandleErrorZ_get_err(LDKCResult_CVec_u8ZPeerHandleErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_get_err")] public static extern long CResult_CVec_u8ZPeerHandleErrorZ_get_err(long _owner);
        // void CResult_NonePeerHandleErrorZ_get_ok(LDKCResult_NonePeerHandleErrorZ *NONNULL_PTR owner);
@@ -907,22 +1216,38 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_u32GraphSyncErrorZ_get_ok")] public static extern int CResult_u32GraphSyncErrorZ_get_ok(long _owner);
        // struct LDKGraphSyncError CResult_u32GraphSyncErrorZ_get_err(LDKCResult_u32GraphSyncErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_u32GraphSyncErrorZ_get_err")] public static extern long CResult_u32GraphSyncErrorZ_get_err(long _owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_KeyPairZ_ty_from_ptr")] public static extern long LDKCOption_KeyPairZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_KeyPairZ_Some_get_some")] public static extern byte[] LDKCOption_KeyPairZ_Some_get_some(long ptr);
-       // struct LDKCOption_KeyPairZ CResult_COption_KeyPairZNoneZ_get_ok(LDKCResult_COption_KeyPairZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_KeyPairZNoneZ_get_ok")] public static extern long CResult_COption_KeyPairZNoneZ_get_ok(long _owner);
-       // void CResult_COption_KeyPairZNoneZ_get_err(LDKCResult_COption_KeyPairZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_KeyPairZNoneZ_get_err")] public static extern void CResult_COption_KeyPairZNoneZ_get_err(long _owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_ScriptZ_ty_from_ptr")] public static extern long LDKCOption_ScriptZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_ScriptZ_Some_get_some")] public static extern byte[] LDKCOption_ScriptZ_Some_get_some(long ptr);
+       // struct LDKCVec_u8Z CResult_CVec_u8ZIOErrorZ_get_ok(LDKCResult_CVec_u8ZIOErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZIOErrorZ_get_ok")] public static extern long CResult_CVec_u8ZIOErrorZ_get_ok(long _owner);
+       // enum LDKIOError CResult_CVec_u8ZIOErrorZ_get_err(LDKCResult_CVec_u8ZIOErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZIOErrorZ_get_err")] public static extern IOError CResult_CVec_u8ZIOErrorZ_get_err(long _owner);
+       // struct LDKCVec_StrZ CResult_CVec_StrZIOErrorZ_get_ok(LDKCResult_CVec_StrZIOErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_StrZIOErrorZ_get_ok")] public static extern long CResult_CVec_StrZIOErrorZ_get_ok(long _owner);
+       // enum LDKIOError CResult_CVec_StrZIOErrorZ_get_err(LDKCResult_CVec_StrZIOErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_StrZIOErrorZ_get_err")] public static extern IOError CResult_CVec_StrZIOErrorZ_get_err(long _owner);
+       // struct LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_ok(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_ok")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_ok(long _owner);
+       // enum LDKIOError CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_err(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_err")] public static extern IOError CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_err(long _owner);
+       // struct LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_ok(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_ok")] public static extern long CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_ok(long _owner);
+       // enum LDKIOError CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_err(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_err")] public static extern IOError CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_err(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_SecretKeyZ_ty_from_ptr")] public static extern long LDKCOption_SecretKeyZ_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_SecretKeyZ_Some_get_some")] public static extern long LDKCOption_SecretKeyZ_Some_get_some(long ptr);
+       // struct LDKVerifiedInvoiceRequest CResult_VerifiedInvoiceRequestNoneZ_get_ok(LDKCResult_VerifiedInvoiceRequestNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_get_ok")] public static extern long CResult_VerifiedInvoiceRequestNoneZ_get_ok(long _owner);
+       // void CResult_VerifiedInvoiceRequestNoneZ_get_err(LDKCResult_VerifiedInvoiceRequestNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_get_err")] public static extern void CResult_VerifiedInvoiceRequestNoneZ_get_err(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_i64Z_ty_from_ptr")] public static extern long LDKCOption_i64Z_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_i64Z_Some_get_some")] public static extern long LDKCOption_i64Z_Some_get_some(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_TxidZ_ty_from_ptr")] public static extern long LDKCOption_TxidZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_TxidZ_Some_get_some")] public static extern byte[] LDKCOption_TxidZ_Some_get_some(long ptr);
-       // struct LDKNetAddress CResult_NetAddressDecodeErrorZ_get_ok(LDKCResult_NetAddressDecodeErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NetAddressDecodeErrorZ_get_ok")] public static extern long CResult_NetAddressDecodeErrorZ_get_ok(long _owner);
-       // struct LDKDecodeError CResult_NetAddressDecodeErrorZ_get_err(LDKCResult_NetAddressDecodeErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NetAddressDecodeErrorZ_get_err")] public static extern long CResult_NetAddressDecodeErrorZ_get_err(long _owner);
+       // struct LDKSocketAddress CResult_SocketAddressDecodeErrorZ_get_ok(LDKCResult_SocketAddressDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SocketAddressDecodeErrorZ_get_ok")] public static extern long CResult_SocketAddressDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_SocketAddressDecodeErrorZ_get_err(LDKCResult_SocketAddressDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SocketAddressDecodeErrorZ_get_err")] public static extern long CResult_SocketAddressDecodeErrorZ_get_err(long _owner);
+       // struct LDKSocketAddress CResult_SocketAddressSocketAddressParseErrorZ_get_ok(LDKCResult_SocketAddressSocketAddressParseErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_get_ok")] public static extern long CResult_SocketAddressSocketAddressParseErrorZ_get_ok(long _owner);
+       // enum LDKSocketAddressParseError CResult_SocketAddressSocketAddressParseErrorZ_get_err(LDKCResult_SocketAddressSocketAddressParseErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_get_err")] public static extern SocketAddressParseError CResult_SocketAddressSocketAddressParseErrorZ_get_err(long _owner);
        // struct LDKAcceptChannel CResult_AcceptChannelDecodeErrorZ_get_ok(LDKCResult_AcceptChannelDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_AcceptChannelDecodeErrorZ_get_ok")] public static extern long CResult_AcceptChannelDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_AcceptChannelDecodeErrorZ_get_err(LDKCResult_AcceptChannelDecodeErrorZ *NONNULL_PTR owner);
@@ -1159,10 +1484,12 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_TrustedCommitmentTransactionNoneZ_get_ok")] public static extern long CResult_TrustedCommitmentTransactionNoneZ_get_ok(long _owner);
        // void CResult_TrustedCommitmentTransactionNoneZ_get_err(LDKCResult_TrustedCommitmentTransactionNoneZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_TrustedCommitmentTransactionNoneZ_get_err")] public static extern void CResult_TrustedCommitmentTransactionNoneZ_get_err(long _owner);
-       // struct LDKCVec_SignatureZ CResult_CVec_SignatureZNoneZ_get_ok(LDKCResult_CVec_SignatureZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_SignatureZNoneZ_get_ok")] public static extern byte[][] CResult_CVec_SignatureZNoneZ_get_ok(long _owner);
-       // void CResult_CVec_SignatureZNoneZ_get_err(LDKCResult_CVec_SignatureZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_SignatureZNoneZ_get_err")] public static extern void CResult_CVec_SignatureZNoneZ_get_err(long _owner);
+       // struct LDKCVec_ECDSASignatureZ CResult_CVec_ECDSASignatureZNoneZ_get_ok(LDKCResult_CVec_ECDSASignatureZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_get_ok")] public static extern long CResult_CVec_ECDSASignatureZNoneZ_get_ok(long _owner);
+       // void CResult_CVec_ECDSASignatureZNoneZ_get_err(LDKCResult_CVec_ECDSASignatureZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_get_err")] public static extern void CResult_CVec_ECDSASignatureZNoneZ_get_err(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_usizeZ_ty_from_ptr")] public static extern long LDKCOption_usizeZ_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_usizeZ_Some_get_some")] public static extern long LDKCOption_usizeZ_Some_get_some(long ptr);
        // struct LDKShutdownScript CResult_ShutdownScriptDecodeErrorZ_get_ok(LDKCResult_ShutdownScriptDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ShutdownScriptDecodeErrorZ_get_ok")] public static extern long CResult_ShutdownScriptDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_ShutdownScriptDecodeErrorZ_get_err(LDKCResult_ShutdownScriptDecodeErrorZ *NONNULL_PTR owner);
@@ -1173,12 +1500,16 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ShutdownScriptInvalidShutdownScriptZ_get_err")] public static extern long CResult_ShutdownScriptInvalidShutdownScriptZ_get_err(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentPurpose_ty_from_ptr")] public static extern long LDKPaymentPurpose_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentPurpose_InvoicePayment_get_payment_preimage")] public static extern long LDKPaymentPurpose_InvoicePayment_get_payment_preimage(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentPurpose_InvoicePayment_get_payment_secret")] public static extern byte[] LDKPaymentPurpose_InvoicePayment_get_payment_secret(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentPurpose_SpontaneousPayment_get_spontaneous_payment")] public static extern byte[] LDKPaymentPurpose_SpontaneousPayment_get_spontaneous_payment(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentPurpose_InvoicePayment_get_payment_secret")] public static extern long LDKPaymentPurpose_InvoicePayment_get_payment_secret(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentPurpose_SpontaneousPayment_get_spontaneous_payment")] public static extern long LDKPaymentPurpose_SpontaneousPayment_get_spontaneous_payment(long ptr);
        // struct LDKPaymentPurpose CResult_PaymentPurposeDecodeErrorZ_get_ok(LDKCResult_PaymentPurposeDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentPurposeDecodeErrorZ_get_ok")] public static extern long CResult_PaymentPurposeDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_PaymentPurposeDecodeErrorZ_get_err(LDKCResult_PaymentPurposeDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentPurposeDecodeErrorZ_get_err")] public static extern long CResult_PaymentPurposeDecodeErrorZ_get_err(long _owner);
+       // struct LDKClaimedHTLC CResult_ClaimedHTLCDecodeErrorZ_get_ok(LDKCResult_ClaimedHTLCDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_get_ok")] public static extern long CResult_ClaimedHTLCDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_ClaimedHTLCDecodeErrorZ_get_err(LDKCResult_ClaimedHTLCDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_get_err")] public static extern long CResult_ClaimedHTLCDecodeErrorZ_get_err(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPathFailure_ty_from_ptr")] public static extern long LDKPathFailure_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPathFailure_InitialSend_get_err")] public static extern long LDKPathFailure_InitialSend_get_err(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPathFailure_OnPath_get_network_update")] public static extern long LDKPathFailure_OnPath_get_network_update(long ptr);
@@ -1190,7 +1521,7 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_PathFailureZDecodeErrorZ_get_err")] public static extern long CResult_COption_PathFailureZDecodeErrorZ_get_err(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKClosureReason_ty_from_ptr")] public static extern long LDKClosureReason_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKClosureReason_CounterpartyForceClosed_get_peer_msg")] public static extern long LDKClosureReason_CounterpartyForceClosed_get_peer_msg(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKClosureReason_ProcessingError_get_err")] public static extern string LDKClosureReason_ProcessingError_get_err(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKClosureReason_ProcessingError_get_err")] public static extern long LDKClosureReason_ProcessingError_get_err(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_ClosureReasonZ_ty_from_ptr")] public static extern long LDKCOption_ClosureReasonZ_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_ClosureReasonZ_Some_get_some")] public static extern long LDKCOption_ClosureReasonZ_Some_get_some(long ptr);
        // struct LDKCOption_ClosureReasonZ CResult_COption_ClosureReasonZDecodeErrorZ_get_ok(LDKCResult_COption_ClosureReasonZDecodeErrorZ *NONNULL_PTR owner);
@@ -1198,11 +1529,11 @@ internal class bindings {
        // struct LDKDecodeError CResult_COption_ClosureReasonZDecodeErrorZ_get_err(LDKCResult_COption_ClosureReasonZDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_ClosureReasonZDecodeErrorZ_get_err")] public static extern long CResult_COption_ClosureReasonZDecodeErrorZ_get_err(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKHTLCDestination_ty_from_ptr")] public static extern long LDKHTLCDestination_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKHTLCDestination_NextHopChannel_get_node_id")] public static extern byte[] LDKHTLCDestination_NextHopChannel_get_node_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKHTLCDestination_NextHopChannel_get_channel_id")] public static extern byte[] LDKHTLCDestination_NextHopChannel_get_channel_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKHTLCDestination_NextHopChannel_get_node_id")] public static extern long LDKHTLCDestination_NextHopChannel_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKHTLCDestination_NextHopChannel_get_channel_id")] public static extern long LDKHTLCDestination_NextHopChannel_get_channel_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKHTLCDestination_UnknownNextHop_get_requested_forward_scid")] public static extern long LDKHTLCDestination_UnknownNextHop_get_requested_forward_scid(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKHTLCDestination_InvalidForward_get_requested_forward_scid")] public static extern long LDKHTLCDestination_InvalidForward_get_requested_forward_scid(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKHTLCDestination_FailedPayment_get_payment_hash")] public static extern byte[] LDKHTLCDestination_FailedPayment_get_payment_hash(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKHTLCDestination_FailedPayment_get_payment_hash")] public static extern long LDKHTLCDestination_FailedPayment_get_payment_hash(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_HTLCDestinationZ_ty_from_ptr")] public static extern long LDKCOption_HTLCDestinationZ_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_HTLCDestinationZ_Some_get_some")] public static extern long LDKCOption_HTLCDestinationZ_Some_get_some(long ptr);
        // struct LDKCOption_HTLCDestinationZ CResult_COption_HTLCDestinationZDecodeErrorZ_get_ok(LDKCResult_COption_HTLCDestinationZDecodeErrorZ *NONNULL_PTR owner);
@@ -1213,97 +1544,101 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_get_ok")] public static extern PaymentFailureReason CResult_PaymentFailureReasonDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_PaymentFailureReasonDecodeErrorZ_get_err(LDKCResult_PaymentFailureReasonDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_get_err")] public static extern long CResult_PaymentFailureReasonDecodeErrorZ_get_err(long _owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_u128Z_ty_from_ptr")] public static extern long LDKCOption_u128Z_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_u128Z_Some_get_some")] public static extern byte[] LDKCOption_u128Z_Some_get_some(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_PaymentIdZ_ty_from_ptr")] public static extern long LDKCOption_PaymentIdZ_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_PaymentIdZ_Some_get_some")] public static extern byte[] LDKCOption_PaymentIdZ_Some_get_some(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_U128Z_ty_from_ptr")] public static extern long LDKCOption_U128Z_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_U128Z_Some_get_some")] public static extern long LDKCOption_U128Z_Some_get_some(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_PaymentFailureReasonZ_ty_from_ptr")] public static extern long LDKCOption_PaymentFailureReasonZ_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_PaymentFailureReasonZ_Some_get_some")] public static extern PaymentFailureReason LDKCOption_PaymentFailureReasonZ_Some_get_some(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBumpTransactionEvent_ty_from_ptr")] public static extern long LDKBumpTransactionEvent_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_claim_id")] public static extern byte[] LDKBumpTransactionEvent_ChannelClose_get_claim_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_claim_id")] public static extern long LDKBumpTransactionEvent_ChannelClose_get_claim_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_package_target_feerate_sat_per_1000_weight")] public static extern int LDKBumpTransactionEvent_ChannelClose_get_package_target_feerate_sat_per_1000_weight(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_commitment_tx")] public static extern byte[] LDKBumpTransactionEvent_ChannelClose_get_commitment_tx(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_commitment_tx")] public static extern long LDKBumpTransactionEvent_ChannelClose_get_commitment_tx(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_commitment_tx_fee_satoshis")] public static extern long LDKBumpTransactionEvent_ChannelClose_get_commitment_tx_fee_satoshis(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_anchor_descriptor")] public static extern long LDKBumpTransactionEvent_ChannelClose_get_anchor_descriptor(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_pending_htlcs")] public static extern long[] LDKBumpTransactionEvent_ChannelClose_get_pending_htlcs(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBumpTransactionEvent_HTLCResolution_get_claim_id")] public static extern byte[] LDKBumpTransactionEvent_HTLCResolution_get_claim_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBumpTransactionEvent_ChannelClose_get_pending_htlcs")] public static extern long LDKBumpTransactionEvent_ChannelClose_get_pending_htlcs(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBumpTransactionEvent_HTLCResolution_get_claim_id")] public static extern long LDKBumpTransactionEvent_HTLCResolution_get_claim_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBumpTransactionEvent_HTLCResolution_get_target_feerate_sat_per_1000_weight")] public static extern int LDKBumpTransactionEvent_HTLCResolution_get_target_feerate_sat_per_1000_weight(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBumpTransactionEvent_HTLCResolution_get_htlc_descriptors")] public static extern long[] LDKBumpTransactionEvent_HTLCResolution_get_htlc_descriptors(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBumpTransactionEvent_HTLCResolution_get_htlc_descriptors")] public static extern long LDKBumpTransactionEvent_HTLCResolution_get_htlc_descriptors(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBumpTransactionEvent_HTLCResolution_get_tx_lock_time")] public static extern int LDKBumpTransactionEvent_HTLCResolution_get_tx_lock_time(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ty_from_ptr")] public static extern long LDKEvent_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_FundingGenerationReady_get_temporary_channel_id")] public static extern byte[] LDKEvent_FundingGenerationReady_get_temporary_channel_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_FundingGenerationReady_get_counterparty_node_id")] public static extern byte[] LDKEvent_FundingGenerationReady_get_counterparty_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_FundingGenerationReady_get_temporary_channel_id")] public static extern long LDKEvent_FundingGenerationReady_get_temporary_channel_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_FundingGenerationReady_get_counterparty_node_id")] public static extern long LDKEvent_FundingGenerationReady_get_counterparty_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_FundingGenerationReady_get_channel_value_satoshis")] public static extern long LDKEvent_FundingGenerationReady_get_channel_value_satoshis(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_FundingGenerationReady_get_output_script")] public static extern byte[] LDKEvent_FundingGenerationReady_get_output_script(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_FundingGenerationReady_get_user_channel_id")] public static extern byte[] LDKEvent_FundingGenerationReady_get_user_channel_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimable_get_receiver_node_id")] public static extern byte[] LDKEvent_PaymentClaimable_get_receiver_node_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimable_get_payment_hash")] public static extern byte[] LDKEvent_PaymentClaimable_get_payment_hash(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_FundingGenerationReady_get_output_script")] public static extern long LDKEvent_FundingGenerationReady_get_output_script(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_FundingGenerationReady_get_user_channel_id")] public static extern long LDKEvent_FundingGenerationReady_get_user_channel_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimable_get_receiver_node_id")] public static extern long LDKEvent_PaymentClaimable_get_receiver_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimable_get_payment_hash")] public static extern long LDKEvent_PaymentClaimable_get_payment_hash(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimable_get_onion_fields")] public static extern long LDKEvent_PaymentClaimable_get_onion_fields(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimable_get_amount_msat")] public static extern long LDKEvent_PaymentClaimable_get_amount_msat(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimable_get_counterparty_skimmed_fee_msat")] public static extern long LDKEvent_PaymentClaimable_get_counterparty_skimmed_fee_msat(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimable_get_purpose")] public static extern long LDKEvent_PaymentClaimable_get_purpose(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimable_get_via_channel_id")] public static extern byte[] LDKEvent_PaymentClaimable_get_via_channel_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimable_get_via_channel_id")] public static extern long LDKEvent_PaymentClaimable_get_via_channel_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimable_get_via_user_channel_id")] public static extern long LDKEvent_PaymentClaimable_get_via_user_channel_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimable_get_claim_deadline")] public static extern long LDKEvent_PaymentClaimable_get_claim_deadline(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimed_get_receiver_node_id")] public static extern byte[] LDKEvent_PaymentClaimed_get_receiver_node_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimed_get_payment_hash")] public static extern byte[] LDKEvent_PaymentClaimed_get_payment_hash(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimed_get_receiver_node_id")] public static extern long LDKEvent_PaymentClaimed_get_receiver_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimed_get_payment_hash")] public static extern long LDKEvent_PaymentClaimed_get_payment_hash(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimed_get_amount_msat")] public static extern long LDKEvent_PaymentClaimed_get_amount_msat(long ptr);
        [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_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 byte[] LDKEvent_PaymentSent_get_payment_preimage(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentSent_get_payment_hash")] public static extern byte[] LDKEvent_PaymentSent_get_payment_hash(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentSent_get_payment_preimage")] public static extern long LDKEvent_PaymentSent_get_payment_preimage(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentSent_get_payment_hash")] public static extern long LDKEvent_PaymentSent_get_payment_hash(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentSent_get_fee_paid_msat")] public static extern long LDKEvent_PaymentSent_get_fee_paid_msat(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentFailed_get_payment_id")] public static extern byte[] LDKEvent_PaymentFailed_get_payment_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentFailed_get_payment_hash")] public static extern byte[] LDKEvent_PaymentFailed_get_payment_hash(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentFailed_get_payment_id")] public static extern long LDKEvent_PaymentFailed_get_payment_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentFailed_get_payment_hash")] public static extern long LDKEvent_PaymentFailed_get_payment_hash(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentFailed_get_reason")] public static extern long LDKEvent_PaymentFailed_get_reason(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentPathSuccessful_get_payment_id")] public static extern byte[] LDKEvent_PaymentPathSuccessful_get_payment_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentPathSuccessful_get_payment_id")] public static extern long LDKEvent_PaymentPathSuccessful_get_payment_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentPathSuccessful_get_payment_hash")] public static extern long LDKEvent_PaymentPathSuccessful_get_payment_hash(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentPathSuccessful_get_path")] public static extern long LDKEvent_PaymentPathSuccessful_get_path(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentPathFailed_get_payment_id")] public static extern long LDKEvent_PaymentPathFailed_get_payment_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentPathFailed_get_payment_hash")] public static extern byte[] LDKEvent_PaymentPathFailed_get_payment_hash(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentPathFailed_get_payment_hash")] public static extern long LDKEvent_PaymentPathFailed_get_payment_hash(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentPathFailed_get_payment_failed_permanently")] public static extern bool LDKEvent_PaymentPathFailed_get_payment_failed_permanently(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentPathFailed_get_failure")] public static extern long LDKEvent_PaymentPathFailed_get_failure(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentPathFailed_get_path")] public static extern long LDKEvent_PaymentPathFailed_get_path(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentPathFailed_get_short_channel_id")] public static extern long LDKEvent_PaymentPathFailed_get_short_channel_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ProbeSuccessful_get_payment_id")] public static extern byte[] LDKEvent_ProbeSuccessful_get_payment_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ProbeSuccessful_get_payment_hash")] public static extern byte[] LDKEvent_ProbeSuccessful_get_payment_hash(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ProbeSuccessful_get_payment_id")] public static extern long LDKEvent_ProbeSuccessful_get_payment_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ProbeSuccessful_get_payment_hash")] public static extern long LDKEvent_ProbeSuccessful_get_payment_hash(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ProbeSuccessful_get_path")] public static extern long LDKEvent_ProbeSuccessful_get_path(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ProbeFailed_get_payment_id")] public static extern byte[] LDKEvent_ProbeFailed_get_payment_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ProbeFailed_get_payment_hash")] public static extern byte[] LDKEvent_ProbeFailed_get_payment_hash(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ProbeFailed_get_payment_id")] public static extern long LDKEvent_ProbeFailed_get_payment_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ProbeFailed_get_payment_hash")] public static extern long LDKEvent_ProbeFailed_get_payment_hash(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ProbeFailed_get_path")] public static extern long LDKEvent_ProbeFailed_get_path(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ProbeFailed_get_short_channel_id")] public static extern long LDKEvent_ProbeFailed_get_short_channel_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PendingHTLCsForwardable_get_time_forwardable")] public static extern long LDKEvent_PendingHTLCsForwardable_get_time_forwardable(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_HTLCIntercepted_get_intercept_id")] public static extern byte[] LDKEvent_HTLCIntercepted_get_intercept_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_HTLCIntercepted_get_intercept_id")] public static extern long LDKEvent_HTLCIntercepted_get_intercept_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_HTLCIntercepted_get_requested_next_hop_scid")] public static extern long LDKEvent_HTLCIntercepted_get_requested_next_hop_scid(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_HTLCIntercepted_get_payment_hash")] public static extern byte[] LDKEvent_HTLCIntercepted_get_payment_hash(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_HTLCIntercepted_get_payment_hash")] public static extern long LDKEvent_HTLCIntercepted_get_payment_hash(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_HTLCIntercepted_get_inbound_amount_msat")] public static extern long LDKEvent_HTLCIntercepted_get_inbound_amount_msat(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_HTLCIntercepted_get_expected_outbound_amount_msat")] public static extern long LDKEvent_HTLCIntercepted_get_expected_outbound_amount_msat(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_SpendableOutputs_get_outputs")] public static extern long[] LDKEvent_SpendableOutputs_get_outputs(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentForwarded_get_prev_channel_id")] public static extern byte[] LDKEvent_PaymentForwarded_get_prev_channel_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentForwarded_get_next_channel_id")] public static extern byte[] LDKEvent_PaymentForwarded_get_next_channel_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_SpendableOutputs_get_outputs")] public static extern long LDKEvent_SpendableOutputs_get_outputs(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_SpendableOutputs_get_channel_id")] public static extern long LDKEvent_SpendableOutputs_get_channel_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentForwarded_get_prev_channel_id")] public static extern long LDKEvent_PaymentForwarded_get_prev_channel_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentForwarded_get_next_channel_id")] public static extern long LDKEvent_PaymentForwarded_get_next_channel_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentForwarded_get_fee_earned_msat")] public static extern long LDKEvent_PaymentForwarded_get_fee_earned_msat(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentForwarded_get_claim_from_onchain_tx")] public static extern bool LDKEvent_PaymentForwarded_get_claim_from_onchain_tx(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentForwarded_get_outbound_amount_forwarded_msat")] public static extern long LDKEvent_PaymentForwarded_get_outbound_amount_forwarded_msat(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelPending_get_channel_id")] public static extern byte[] LDKEvent_ChannelPending_get_channel_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelPending_get_user_channel_id")] public static extern byte[] LDKEvent_ChannelPending_get_user_channel_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelPending_get_former_temporary_channel_id")] public static extern byte[] LDKEvent_ChannelPending_get_former_temporary_channel_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelPending_get_counterparty_node_id")] public static extern byte[] LDKEvent_ChannelPending_get_counterparty_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelPending_get_channel_id")] public static extern long LDKEvent_ChannelPending_get_channel_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelPending_get_user_channel_id")] public static extern long LDKEvent_ChannelPending_get_user_channel_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelPending_get_former_temporary_channel_id")] public static extern long LDKEvent_ChannelPending_get_former_temporary_channel_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelPending_get_counterparty_node_id")] public static extern long LDKEvent_ChannelPending_get_counterparty_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelPending_get_funding_txo")] public static extern long LDKEvent_ChannelPending_get_funding_txo(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelReady_get_channel_id")] public static extern byte[] LDKEvent_ChannelReady_get_channel_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelReady_get_user_channel_id")] public static extern byte[] LDKEvent_ChannelReady_get_user_channel_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelReady_get_counterparty_node_id")] public static extern byte[] LDKEvent_ChannelReady_get_counterparty_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelReady_get_channel_id")] public static extern long LDKEvent_ChannelReady_get_channel_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelReady_get_user_channel_id")] public static extern long LDKEvent_ChannelReady_get_user_channel_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelReady_get_counterparty_node_id")] public static extern long LDKEvent_ChannelReady_get_counterparty_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelReady_get_channel_type")] public static extern long LDKEvent_ChannelReady_get_channel_type(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelClosed_get_channel_id")] public static extern byte[] LDKEvent_ChannelClosed_get_channel_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelClosed_get_user_channel_id")] public static extern byte[] LDKEvent_ChannelClosed_get_user_channel_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelClosed_get_channel_id")] public static extern long LDKEvent_ChannelClosed_get_channel_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelClosed_get_user_channel_id")] public static extern long LDKEvent_ChannelClosed_get_user_channel_id(long ptr);
        [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_DiscardFunding_get_channel_id")] public static extern byte[] LDKEvent_DiscardFunding_get_channel_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_DiscardFunding_get_transaction")] public static extern byte[] LDKEvent_DiscardFunding_get_transaction(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_OpenChannelRequest_get_temporary_channel_id")] public static extern byte[] LDKEvent_OpenChannelRequest_get_temporary_channel_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_OpenChannelRequest_get_counterparty_node_id")] public static extern byte[] LDKEvent_OpenChannelRequest_get_counterparty_node_id(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_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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_OpenChannelRequest_get_counterparty_node_id")] public static extern long LDKEvent_OpenChannelRequest_get_counterparty_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_OpenChannelRequest_get_funding_satoshis")] public static extern long LDKEvent_OpenChannelRequest_get_funding_satoshis(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_OpenChannelRequest_get_push_msat")] public static extern long LDKEvent_OpenChannelRequest_get_push_msat(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_OpenChannelRequest_get_channel_type")] public static extern long LDKEvent_OpenChannelRequest_get_channel_type(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_HTLCHandlingFailed_get_prev_channel_id")] public static extern byte[] LDKEvent_HTLCHandlingFailed_get_prev_channel_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_HTLCHandlingFailed_get_prev_channel_id")] public static extern long LDKEvent_HTLCHandlingFailed_get_prev_channel_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_HTLCHandlingFailed_get_failed_next_destination")] public static extern long LDKEvent_HTLCHandlingFailed_get_failed_next_destination(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_BumpTransaction_get_bump_transaction")] public static extern long LDKEvent_BumpTransaction_get_bump_transaction(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_EventZ_ty_from_ptr")] public static extern long LDKCOption_EventZ_ty_from_ptr(long ptr);
@@ -1312,16 +1647,12 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_EventZDecodeErrorZ_get_ok")] public static extern long CResult_COption_EventZDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_COption_EventZDecodeErrorZ_get_err(LDKCResult_COption_EventZDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_EventZDecodeErrorZ_get_err")] public static extern long CResult_COption_EventZDecodeErrorZ_get_err(long _owner);
-       // struct LDKCVec_C2Tuple_BlockHashChannelMonitorZZ CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_get_ok(LDKCResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_get_ok")] public static extern long[] CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_get_ok(long _owner);
-       // enum LDKIOError CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_get_err(LDKCResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_get_err")] public static extern IOError CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_get_err(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBolt11ParseError_ty_from_ptr")] public static extern long LDKBolt11ParseError_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBolt11ParseError_Bech32Error_get_bech32_error")] public static extern long LDKBolt11ParseError_Bech32Error_get_bech32_error(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBolt11ParseError_ParseAmountError_get_parse_amount_error")] public static extern int LDKBolt11ParseError_ParseAmountError_get_parse_amount_error(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBolt11ParseError_MalformedSignature_get_malformed_signature")] public static extern Secp256k1Error LDKBolt11ParseError_MalformedSignature_get_malformed_signature(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBolt11ParseError_DescriptionDecodeError_get_description_decode_error")] public static extern int LDKBolt11ParseError_DescriptionDecodeError_get_description_decode_error(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBolt11ParseError_InvalidSliceLength_get_invalid_slice_length")] public static extern string LDKBolt11ParseError_InvalidSliceLength_get_invalid_slice_length(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBolt11ParseError_InvalidSliceLength_get_invalid_slice_length")] public static extern long LDKBolt11ParseError_InvalidSliceLength_get_invalid_slice_length(long ptr);
        // enum LDKSiPrefix CResult_SiPrefixBolt11ParseErrorZ_get_ok(LDKCResult_SiPrefixBolt11ParseErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_get_ok")] public static extern SiPrefix CResult_SiPrefixBolt11ParseErrorZ_get_ok(long _owner);
        // struct LDKBolt11ParseError CResult_SiPrefixBolt11ParseErrorZ_get_err(LDKCResult_SiPrefixBolt11ParseErrorZ *NONNULL_PTR owner);
@@ -1340,13 +1671,13 @@ internal class bindings {
        // struct LDKRawBolt11Invoice C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_a(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_a")] public static extern long C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_a(long _owner);
        // struct LDKThirtyTwoBytes C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_b(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_b")] public static extern byte[] C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_b(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_b")] public static extern long C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_b(long _owner);
        // struct LDKBolt11InvoiceSignature C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_c(LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_c")] public static extern long C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_c(long _owner);
-       // struct LDKPayeePubKey CResult_PayeePubKeyErrorZ_get_ok(LDKCResult_PayeePubKeyErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PayeePubKeyErrorZ_get_ok")] public static extern long CResult_PayeePubKeyErrorZ_get_ok(long _owner);
-       // enum LDKSecp256k1Error CResult_PayeePubKeyErrorZ_get_err(LDKCResult_PayeePubKeyErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PayeePubKeyErrorZ_get_err")] public static extern Secp256k1Error CResult_PayeePubKeyErrorZ_get_err(long _owner);
+       // struct LDKPayeePubKey CResult_PayeePubKeySecp256k1ErrorZ_get_ok(LDKCResult_PayeePubKeySecp256k1ErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_get_ok")] public static extern long CResult_PayeePubKeySecp256k1ErrorZ_get_ok(long _owner);
+       // enum LDKSecp256k1Error CResult_PayeePubKeySecp256k1ErrorZ_get_err(LDKCResult_PayeePubKeySecp256k1ErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_get_err")] public static extern Secp256k1Error CResult_PayeePubKeySecp256k1ErrorZ_get_err(long _owner);
        // struct LDKPositiveTimestamp CResult_PositiveTimestampCreationErrorZ_get_ok(LDKCResult_PositiveTimestampCreationErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PositiveTimestampCreationErrorZ_get_ok")] public static extern long CResult_PositiveTimestampCreationErrorZ_get_ok(long _owner);
        // enum LDKCreationError CResult_PositiveTimestampCreationErrorZ_get_err(LDKCResult_PositiveTimestampCreationErrorZ *NONNULL_PTR owner);
@@ -1391,27 +1722,67 @@ 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 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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentRelayDecodeErrorZ_get_err")] public static extern long CResult_PaymentRelayDecodeErrorZ_get_err(long _owner);
+       // struct LDKPaymentConstraints CResult_PaymentConstraintsDecodeErrorZ_get_ok(LDKCResult_PaymentConstraintsDecodeErrorZ *NONNULL_PTR owner);
+       [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 string LDKPaymentError_Invoice_get_invoice(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_PaymentIdPaymentErrorZ_get_ok(LDKCResult_PaymentIdPaymentErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentIdPaymentErrorZ_get_ok")] public static extern byte[] CResult_PaymentIdPaymentErrorZ_get_ok(long _owner);
-       // struct LDKPaymentError CResult_PaymentIdPaymentErrorZ_get_err(LDKCResult_PaymentIdPaymentErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentIdPaymentErrorZ_get_err")] public static extern long CResult_PaymentIdPaymentErrorZ_get_err(long _owner);
+       // 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);
-       // struct LDKStr CResult_StringErrorZ_get_ok(LDKCResult_StringErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StringErrorZ_get_ok")] public static extern string CResult_StringErrorZ_get_ok(long _owner);
-       // enum LDKSecp256k1Error CResult_StringErrorZ_get_err(LDKCResult_StringErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StringErrorZ_get_err")] public static extern Secp256k1Error CResult_StringErrorZ_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 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);
        [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_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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPeeledOnion_ty_from_ptr")] public static extern long LDKPeeledOnion_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPeeledOnion_Forward_get__0")] public static extern long LDKPeeledOnion_Forward_get__0(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPeeledOnion_Forward_get__1")] public static extern long LDKPeeledOnion_Forward_get__1(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPeeledOnion_Receive_get__0")] public static extern long LDKPeeledOnion_Receive_get__0(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPeeledOnion_Receive_get__1")] public static extern long LDKPeeledOnion_Receive_get__1(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPeeledOnion_Receive_get__2")] public static extern long LDKPeeledOnion_Receive_get__2(long ptr);
+       // struct LDKPeeledOnion CResult_PeeledOnionNoneZ_get_ok(LDKCResult_PeeledOnionNoneZ *NONNULL_PTR owner);
+       [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);
@@ -1420,6 +1791,10 @@ internal class bindings {
        [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);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedPathNoneZ_get_err")] public static extern void CResult_BlindedPathNoneZ_get_err(long _owner);
+       // struct LDKC2Tuple_BlindedPayInfoBlindedPathZ CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_ok(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_ok")] public static extern long CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_ok(long _owner);
+       // void CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_err(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_err")] public static extern void CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_err(long _owner);
        // struct LDKBlindedPath CResult_BlindedPathDecodeErrorZ_get_ok(LDKCResult_BlindedPathDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedPathDecodeErrorZ_get_ok")] public static extern long CResult_BlindedPathDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_BlindedPathDecodeErrorZ_get_err(LDKCResult_BlindedPathDecodeErrorZ *NONNULL_PTR owner);
@@ -1433,12 +1808,28 @@ internal class bindings {
        // 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);
        public interface LDKFilter {
-               void register_tx(byte[] _txid, byte[] _script_pubkey);
-               void register_output(long _output);
+               void register_tx(long txid, long script_pubkey);
+               void register_output(long output);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKFilter_new")] public static extern long LDKFilter_new_native(long impl_idx);
+       public static long[] LDKFilter_new(LDKFilter 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] = LDKFilter_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKFilter_new")] public static extern long LDKFilter_new(LDKFilter impl);
        // void Filter_register_tx LDKFilter *NONNULL_PTR this_arg, const uint8_t (*txid)[32], struct LDKu8slice script_pubkey
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Filter_register_tx")] public static extern void Filter_register_tx(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _txid, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _script_pubkey);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Filter_register_tx")] public static extern void Filter_register_tx(long _this_arg, long _txid, long _script_pubkey);
        // void Filter_register_output LDKFilter *NONNULL_PTR this_arg, struct LDKWatchedOutput output
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Filter_register_output")] public static extern void Filter_register_output(long _this_arg, long _output);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_FilterZ_ty_from_ptr")] public static extern long LDKCOption_FilterZ_ty_from_ptr(long ptr);
@@ -1450,205 +1841,418 @@ internal class bindings {
        // struct LDKOutPoint C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_a(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_a")] public static extern long C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_a(long _owner);
        // struct LDKCVec_MonitorUpdateIdZ C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_b(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_b")] public static extern long[] C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_b(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_b")] public static extern long C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_b(long _owner);
+       public interface LDKKVStore {
+               long read(long primary_namespace, long secondary_namespace, long key);
+               long write(long primary_namespace, long secondary_namespace, long key, long buf);
+               long remove(long primary_namespace, long secondary_namespace, long key, bool lazy);
+               long list(long primary_namespace, long secondary_namespace);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKKVStore_new")] public static extern long LDKKVStore_new_native(long impl_idx);
+       public static long[] LDKKVStore_new(LDKKVStore 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] = LDKKVStore_new_native(i);
+               ret[1] = i;
+               return ret;
+       }
+       // LDKCResult_CVec_u8ZIOErrorZ KVStore_read LDKKVStore *NONNULL_PTR this_arg, struct LDKStr primary_namespace, struct LDKStr secondary_namespace, struct LDKStr key
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_KVStore_read")] public static extern long KVStore_read(long _this_arg, long _primary_namespace, long _secondary_namespace, long _key);
+       // LDKCResult_NoneIOErrorZ KVStore_write LDKKVStore *NONNULL_PTR this_arg, struct LDKStr primary_namespace, struct LDKStr secondary_namespace, struct LDKStr key, struct LDKu8slice buf
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_KVStore_write")] public static extern long KVStore_write(long _this_arg, long _primary_namespace, long _secondary_namespace, long _key, long _buf);
+       // LDKCResult_NoneIOErrorZ KVStore_remove LDKKVStore *NONNULL_PTR this_arg, struct LDKStr primary_namespace, struct LDKStr secondary_namespace, struct LDKStr key, bool lazy
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_KVStore_remove")] public static extern long KVStore_remove(long _this_arg, long _primary_namespace, long _secondary_namespace, long _key, bool _lazy);
+       // LDKCResult_CVec_StrZIOErrorZ KVStore_list LDKKVStore *NONNULL_PTR this_arg, struct LDKStr primary_namespace, struct LDKStr secondary_namespace
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_KVStore_list")] public static extern long KVStore_list(long _this_arg, long _primary_namespace, long _secondary_namespace);
        public interface LDKPersister {
-               long persist_manager(long _channel_manager);
-               long persist_graph(long _network_graph);
-               long persist_scorer(long _scorer);
+               long persist_manager(long channel_manager);
+               long persist_graph(long network_graph);
+               long persist_scorer(long scorer);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPersister_new")] public static extern long LDKPersister_new_native(long impl_idx);
+       public static long[] LDKPersister_new(LDKPersister 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] = LDKPersister_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPersister_new")] public static extern long LDKPersister_new(LDKPersister impl);
-       // LDKCResult_NoneErrorZ Persister_persist_manager LDKPersister *NONNULL_PTR this_arg, const struct LDKChannelManager *NONNULL_PTR channel_manager
+       // LDKCResult_NoneIOErrorZ Persister_persist_manager LDKPersister *NONNULL_PTR this_arg, const struct LDKChannelManager *NONNULL_PTR channel_manager
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Persister_persist_manager")] public static extern long Persister_persist_manager(long _this_arg, long _channel_manager);
-       // LDKCResult_NoneErrorZ Persister_persist_graph LDKPersister *NONNULL_PTR this_arg, const struct LDKNetworkGraph *NONNULL_PTR network_graph
+       // LDKCResult_NoneIOErrorZ Persister_persist_graph LDKPersister *NONNULL_PTR this_arg, const struct LDKNetworkGraph *NONNULL_PTR network_graph
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Persister_persist_graph")] public static extern long Persister_persist_graph(long _this_arg, long _network_graph);
-       // LDKCResult_NoneErrorZ Persister_persist_scorer LDKPersister *NONNULL_PTR this_arg, const struct LDKWriteableScore *NONNULL_PTR scorer
+       // LDKCResult_NoneIOErrorZ Persister_persist_scorer LDKPersister *NONNULL_PTR this_arg, const struct LDKWriteableScore *NONNULL_PTR scorer
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Persister_persist_scorer")] public static extern long Persister_persist_scorer(long _this_arg, long _scorer);
+       public interface LDKPersist {
+               ChannelMonitorUpdateStatus persist_new_channel(long channel_id, long data, long update_id);
+               ChannelMonitorUpdateStatus update_persisted_channel(long channel_id, long update, long data, long update_id);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPersist_new")] public static extern long LDKPersist_new_native(long impl_idx);
+       public static long[] LDKPersist_new(LDKPersist 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] = LDKPersist_new_native(i);
+               ret[1] = i;
+               return ret;
+       }
+       // LDKChannelMonitorUpdateStatus Persist_persist_new_channel LDKPersist *NONNULL_PTR this_arg, struct LDKOutPoint channel_id, const struct LDKChannelMonitor *NONNULL_PTR data, struct LDKMonitorUpdateId update_id
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Persist_persist_new_channel")] public static extern ChannelMonitorUpdateStatus Persist_persist_new_channel(long _this_arg, long _channel_id, long _data, long _update_id);
+       // LDKChannelMonitorUpdateStatus Persist_update_persisted_channel LDKPersist *NONNULL_PTR this_arg, struct LDKOutPoint channel_id, struct LDKChannelMonitorUpdate update, const struct LDKChannelMonitor *NONNULL_PTR data, struct LDKMonitorUpdateId update_id
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Persist_update_persisted_channel")] public static extern ChannelMonitorUpdateStatus Persist_update_persisted_channel(long _this_arg, long _channel_id, long _update, long _data, long _update_id);
        public interface LDKFutureCallback {
                void call();
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKFutureCallback_new")] public static extern long LDKFutureCallback_new(LDKFutureCallback impl);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKFutureCallback_new")] public static extern long LDKFutureCallback_new_native(long impl_idx);
+       public static long[] LDKFutureCallback_new(LDKFutureCallback 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] = LDKFutureCallback_new_native(i);
+               ret[1] = i;
+               return ret;
+       }
        // void FutureCallback_call LDKFutureCallback *NONNULL_PTR this_arg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FutureCallback_call")] public static extern void FutureCallback_call(long _this_arg);
        public interface LDKListen {
-               void filtered_block_connected(byte[] _header, long[] _txdata, int _height);
-               void block_connected(byte[] _block, int _height);
-               void block_disconnected(byte[] _header, int _height);
+               void filtered_block_connected(long header, long txdata, int height);
+               void block_connected(long block, int height);
+               void block_disconnected(long header, int height);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKListen_new")] public static extern long LDKListen_new_native(long impl_idx);
+       public static long[] LDKListen_new(LDKListen 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] = LDKListen_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKListen_new")] public static extern long LDKListen_new(LDKListen impl);
        // void Listen_filtered_block_connected LDKListen *NONNULL_PTR this_arg, const uint8_t (*header)[80], struct LDKCVec_C2Tuple_usizeTransactionZZ txdata, uint32_t height
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Listen_filtered_block_connected")] public static extern void Listen_filtered_block_connected(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _header, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _txdata, int _height);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Listen_filtered_block_connected")] public static extern void Listen_filtered_block_connected(long _this_arg, long _header, long _txdata, int _height);
        // void Listen_block_connected LDKListen *NONNULL_PTR this_arg, struct LDKu8slice block, uint32_t height
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Listen_block_connected")] public static extern void Listen_block_connected(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _block, int _height);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Listen_block_connected")] public static extern void Listen_block_connected(long _this_arg, long _block, int _height);
        // void Listen_block_disconnected LDKListen *NONNULL_PTR this_arg, const uint8_t (*header)[80], uint32_t height
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Listen_block_disconnected")] public static extern void Listen_block_disconnected(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _header, int _height);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Listen_block_disconnected")] public static extern void Listen_block_disconnected(long _this_arg, long _header, int _height);
        public interface LDKConfirm {
-               void transactions_confirmed(byte[] _header, long[] _txdata, int _height);
-               void transaction_unconfirmed(byte[] _txid);
-               void best_block_updated(byte[] _header, int _height);
-               long[] get_relevant_txids();
+               void transactions_confirmed(long header, long txdata, int height);
+               void transaction_unconfirmed(long txid);
+               void best_block_updated(long header, int height);
+               long get_relevant_txids();
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKConfirm_new")] public static extern long LDKConfirm_new_native(long impl_idx);
+       public static long[] LDKConfirm_new(LDKConfirm 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] = LDKConfirm_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKConfirm_new")] public static extern long LDKConfirm_new(LDKConfirm impl);
        // void Confirm_transactions_confirmed LDKConfirm *NONNULL_PTR this_arg, const uint8_t (*header)[80], struct LDKCVec_C2Tuple_usizeTransactionZZ txdata, uint32_t height
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Confirm_transactions_confirmed")] public static extern void Confirm_transactions_confirmed(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _header, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _txdata, int _height);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Confirm_transactions_confirmed")] public static extern void Confirm_transactions_confirmed(long _this_arg, long _header, long _txdata, int _height);
        // void Confirm_transaction_unconfirmed LDKConfirm *NONNULL_PTR this_arg, const uint8_t (*txid)[32]
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Confirm_transaction_unconfirmed")] public static extern void Confirm_transaction_unconfirmed(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _txid);
+       [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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _header, int _height);
-       // LDKCVec_C2Tuple_TxidCOption_BlockHashZZZ 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 LDKPersist {
-               ChannelMonitorUpdateStatus persist_new_channel(long _channel_id, long _data, long _update_id);
-               ChannelMonitorUpdateStatus update_persisted_channel(long _channel_id, long _update, long _data, long _update_id);
-       }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPersist_new")] public static extern long LDKPersist_new(LDKPersist impl);
-       // LDKChannelMonitorUpdateStatus Persist_persist_new_channel LDKPersist *NONNULL_PTR this_arg, struct LDKOutPoint channel_id, const struct LDKChannelMonitor *NONNULL_PTR data, struct LDKMonitorUpdateId update_id
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Persist_persist_new_channel")] public static extern ChannelMonitorUpdateStatus Persist_persist_new_channel(long _this_arg, long _channel_id, long _data, long _update_id);
-       // LDKChannelMonitorUpdateStatus Persist_update_persisted_channel LDKPersist *NONNULL_PTR this_arg, struct LDKOutPoint channel_id, struct LDKChannelMonitorUpdate update, const struct LDKChannelMonitor *NONNULL_PTR data, struct LDKMonitorUpdateId update_id
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Persist_update_persisted_channel")] public static extern ChannelMonitorUpdateStatus Persist_update_persisted_channel(long _this_arg, long _channel_id, long _update, long _data, long _update_id);
+       [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
+       [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);
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEventHandler_new")] public static extern long LDKEventHandler_new(LDKEventHandler impl);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEventHandler_new")] public static extern long LDKEventHandler_new_native(long impl_idx);
+       public static long[] LDKEventHandler_new(LDKEventHandler 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] = LDKEventHandler_new_native(i);
+               ret[1] = i;
+               return ret;
+       }
        // void EventHandler_handle_event LDKEventHandler *NONNULL_PTR this_arg, struct LDKEvent event
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EventHandler_handle_event")] public static extern void EventHandler_handle_event(long _this_arg, long _event);
        public interface LDKEventsProvider {
-               void process_pending_events(long _handler);
+               void process_pending_events(long handler);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEventsProvider_new")] public static extern long LDKEventsProvider_new_native(long impl_idx);
+       public static long[] LDKEventsProvider_new(LDKEventsProvider 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] = LDKEventsProvider_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEventsProvider_new")] public static extern long LDKEventsProvider_new(LDKEventsProvider impl);
        // void EventsProvider_process_pending_events LDKEventsProvider *NONNULL_PTR this_arg, struct LDKEventHandler handler
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EventsProvider_process_pending_events")] public static extern void EventsProvider_process_pending_events(long _this_arg, long _handler);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRetry_ty_from_ptr")] public static extern long LDKRetry_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRetry_Attempts_get_attempts")] public static extern long LDKRetry_Attempts_get_attempts(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRetry_Timeout_get_timeout")] public static extern long LDKRetry_Timeout_get_timeout(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKFailureCode_ty_from_ptr")] public static extern long LDKFailureCode_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKFailureCode_InvalidOnionPayload_get_invalid_onion_payload")] public static extern long LDKFailureCode_InvalidOnionPayload_get_invalid_onion_payload(long ptr);
        public interface LDKMessageSendEventsProvider {
-               long[] get_and_clear_pending_msg_events();
+               long get_and_clear_pending_msg_events();
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEventsProvider_new")] public static extern long LDKMessageSendEventsProvider_new_native(long impl_idx);
+       public static long[] LDKMessageSendEventsProvider_new(LDKMessageSendEventsProvider 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] = LDKMessageSendEventsProvider_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEventsProvider_new")] public static extern long LDKMessageSendEventsProvider_new(LDKMessageSendEventsProvider impl);
        // LDKCVec_MessageSendEventZ MessageSendEventsProvider_get_and_clear_pending_msg_events LDKMessageSendEventsProvider *NONNULL_PTR this_arg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEventsProvider_get_and_clear_pending_msg_events")] public static extern long[] MessageSendEventsProvider_get_and_clear_pending_msg_events(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEventsProvider_get_and_clear_pending_msg_events")] public static extern long MessageSendEventsProvider_get_and_clear_pending_msg_events(long _this_arg);
        public interface LDKChannelMessageHandler {
-               void handle_open_channel(byte[] _their_node_id, long _msg);
-               void handle_open_channel_v2(byte[] _their_node_id, long _msg);
-               void handle_accept_channel(byte[] _their_node_id, long _msg);
-               void handle_accept_channel_v2(byte[] _their_node_id, long _msg);
-               void handle_funding_created(byte[] _their_node_id, long _msg);
-               void handle_funding_signed(byte[] _their_node_id, long _msg);
-               void handle_channel_ready(byte[] _their_node_id, long _msg);
-               void handle_shutdown(byte[] _their_node_id, long _msg);
-               void handle_closing_signed(byte[] _their_node_id, long _msg);
-               void handle_tx_add_input(byte[] _their_node_id, long _msg);
-               void handle_tx_add_output(byte[] _their_node_id, long _msg);
-               void handle_tx_remove_input(byte[] _their_node_id, long _msg);
-               void handle_tx_remove_output(byte[] _their_node_id, long _msg);
-               void handle_tx_complete(byte[] _their_node_id, long _msg);
-               void handle_tx_signatures(byte[] _their_node_id, long _msg);
-               void handle_tx_init_rbf(byte[] _their_node_id, long _msg);
-               void handle_tx_ack_rbf(byte[] _their_node_id, long _msg);
-               void handle_tx_abort(byte[] _their_node_id, long _msg);
-               void handle_update_add_htlc(byte[] _their_node_id, long _msg);
-               void handle_update_fulfill_htlc(byte[] _their_node_id, long _msg);
-               void handle_update_fail_htlc(byte[] _their_node_id, long _msg);
-               void handle_update_fail_malformed_htlc(byte[] _their_node_id, long _msg);
-               void handle_commitment_signed(byte[] _their_node_id, long _msg);
-               void handle_revoke_and_ack(byte[] _their_node_id, long _msg);
-               void handle_update_fee(byte[] _their_node_id, long _msg);
-               void handle_announcement_signatures(byte[] _their_node_id, long _msg);
-               void peer_disconnected(byte[] _their_node_id);
-               long peer_connected(byte[] _their_node_id, long _msg, bool _inbound);
-               void handle_channel_reestablish(byte[] _their_node_id, long _msg);
-               void handle_channel_update(byte[] _their_node_id, long _msg);
-               void handle_error(byte[] _their_node_id, long _msg);
+               void handle_open_channel(long their_node_id, long msg);
+               void handle_open_channel_v2(long their_node_id, long msg);
+               void handle_accept_channel(long their_node_id, long msg);
+               void handle_accept_channel_v2(long their_node_id, long msg);
+               void handle_funding_created(long their_node_id, long msg);
+               void handle_funding_signed(long their_node_id, long msg);
+               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_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);
+               void handle_tx_remove_output(long their_node_id, long msg);
+               void handle_tx_complete(long their_node_id, long msg);
+               void handle_tx_signatures(long their_node_id, long msg);
+               void handle_tx_init_rbf(long their_node_id, long msg);
+               void handle_tx_ack_rbf(long their_node_id, long msg);
+               void handle_tx_abort(long their_node_id, long msg);
+               void handle_update_add_htlc(long their_node_id, long msg);
+               void handle_update_fulfill_htlc(long their_node_id, long msg);
+               void handle_update_fail_htlc(long their_node_id, long msg);
+               void handle_update_fail_malformed_htlc(long their_node_id, long msg);
+               void handle_commitment_signed(long their_node_id, long msg);
+               void handle_revoke_and_ack(long their_node_id, long msg);
+               void handle_update_fee(long their_node_id, long msg);
+               void handle_announcement_signatures(long their_node_id, long msg);
+               void peer_disconnected(long their_node_id);
+               long peer_connected(long their_node_id, long msg, bool inbound);
+               void handle_channel_reestablish(long their_node_id, long msg);
+               void handle_channel_update(long their_node_id, long msg);
+               void handle_error(long their_node_id, long msg);
                long provided_node_features();
-               long provided_init_features(byte[] _their_node_id);
-               long get_genesis_hashes();
+               long provided_init_features(long their_node_id);
+               long get_chain_hashes();
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKChannelMessageHandler_new")] public static extern long LDKChannelMessageHandler_new_native(long impl_idx, long MessageSendEventsProvider);
+       public static long[] LDKChannelMessageHandler_new(LDKChannelMessageHandler impl, long MessageSendEventsProvider) {
+               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] = LDKChannelMessageHandler_new_native(i, MessageSendEventsProvider);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKChannelMessageHandler_new")] public static extern long LDKChannelMessageHandler_new(LDKChannelMessageHandler impl, LDKMessageSendEventsProvider MessageSendEventsProvider);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKChannelMessageHandler_get_MessageSendEventsProvider")] public static extern long LDKChannelMessageHandler_get_MessageSendEventsProvider(long arg);
        // void ChannelMessageHandler_handle_open_channel LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKOpenChannel *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_open_channel")] public static extern void ChannelMessageHandler_handle_open_channel(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_open_channel")] public static extern void ChannelMessageHandler_handle_open_channel(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_open_channel_v2 LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKOpenChannelV2 *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_open_channel_v2")] public static extern void ChannelMessageHandler_handle_open_channel_v2(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_open_channel_v2")] public static extern void ChannelMessageHandler_handle_open_channel_v2(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_accept_channel LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKAcceptChannel *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_accept_channel")] public static extern void ChannelMessageHandler_handle_accept_channel(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_accept_channel")] public static extern void ChannelMessageHandler_handle_accept_channel(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_accept_channel_v2 LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKAcceptChannelV2 *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_accept_channel_v2")] public static extern void ChannelMessageHandler_handle_accept_channel_v2(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_accept_channel_v2")] public static extern void ChannelMessageHandler_handle_accept_channel_v2(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_funding_created LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKFundingCreated *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_funding_created")] public static extern void ChannelMessageHandler_handle_funding_created(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_funding_created")] public static extern void ChannelMessageHandler_handle_funding_created(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_funding_signed LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKFundingSigned *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_funding_signed")] public static extern void ChannelMessageHandler_handle_funding_signed(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_funding_signed")] public static extern void ChannelMessageHandler_handle_funding_signed(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_channel_ready LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKChannelReady *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_channel_ready")] public static extern void ChannelMessageHandler_handle_channel_ready(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_channel_ready")] public static extern void ChannelMessageHandler_handle_channel_ready(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_shutdown LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKShutdown *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_shutdown")] public static extern void ChannelMessageHandler_handle_shutdown(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _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_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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _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
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_add_output")] public static extern void ChannelMessageHandler_handle_tx_add_output(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_add_output")] public static extern void ChannelMessageHandler_handle_tx_add_output(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_tx_remove_input LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKTxRemoveInput *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_remove_input")] public static extern void ChannelMessageHandler_handle_tx_remove_input(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_remove_input")] public static extern void ChannelMessageHandler_handle_tx_remove_input(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_tx_remove_output LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKTxRemoveOutput *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_remove_output")] public static extern void ChannelMessageHandler_handle_tx_remove_output(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_remove_output")] public static extern void ChannelMessageHandler_handle_tx_remove_output(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_tx_complete LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKTxComplete *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_complete")] public static extern void ChannelMessageHandler_handle_tx_complete(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_complete")] public static extern void ChannelMessageHandler_handle_tx_complete(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_tx_signatures LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKTxSignatures *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_signatures")] public static extern void ChannelMessageHandler_handle_tx_signatures(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_signatures")] public static extern void ChannelMessageHandler_handle_tx_signatures(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_tx_init_rbf LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKTxInitRbf *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_init_rbf")] public static extern void ChannelMessageHandler_handle_tx_init_rbf(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_init_rbf")] public static extern void ChannelMessageHandler_handle_tx_init_rbf(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_tx_ack_rbf LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKTxAckRbf *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_ack_rbf")] public static extern void ChannelMessageHandler_handle_tx_ack_rbf(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_ack_rbf")] public static extern void ChannelMessageHandler_handle_tx_ack_rbf(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_tx_abort LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKTxAbort *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_abort")] public static extern void ChannelMessageHandler_handle_tx_abort(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_abort")] public static extern void ChannelMessageHandler_handle_tx_abort(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_update_add_htlc LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKUpdateAddHTLC *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_update_add_htlc")] public static extern void ChannelMessageHandler_handle_update_add_htlc(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_update_add_htlc")] public static extern void ChannelMessageHandler_handle_update_add_htlc(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_update_fulfill_htlc LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKUpdateFulfillHTLC *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_update_fulfill_htlc")] public static extern void ChannelMessageHandler_handle_update_fulfill_htlc(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_update_fulfill_htlc")] public static extern void ChannelMessageHandler_handle_update_fulfill_htlc(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_update_fail_htlc LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKUpdateFailHTLC *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_update_fail_htlc")] public static extern void ChannelMessageHandler_handle_update_fail_htlc(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_update_fail_htlc")] public static extern void ChannelMessageHandler_handle_update_fail_htlc(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_update_fail_malformed_htlc LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKUpdateFailMalformedHTLC *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_update_fail_malformed_htlc")] public static extern void ChannelMessageHandler_handle_update_fail_malformed_htlc(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_update_fail_malformed_htlc")] public static extern void ChannelMessageHandler_handle_update_fail_malformed_htlc(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_commitment_signed LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKCommitmentSigned *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_commitment_signed")] public static extern void ChannelMessageHandler_handle_commitment_signed(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_commitment_signed")] public static extern void ChannelMessageHandler_handle_commitment_signed(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_revoke_and_ack LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKRevokeAndACK *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_revoke_and_ack")] public static extern void ChannelMessageHandler_handle_revoke_and_ack(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_revoke_and_ack")] public static extern void ChannelMessageHandler_handle_revoke_and_ack(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_update_fee LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKUpdateFee *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_update_fee")] public static extern void ChannelMessageHandler_handle_update_fee(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_update_fee")] public static extern void ChannelMessageHandler_handle_update_fee(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_announcement_signatures LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKAnnouncementSignatures *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_announcement_signatures")] public static extern void ChannelMessageHandler_handle_announcement_signatures(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_announcement_signatures")] public static extern void ChannelMessageHandler_handle_announcement_signatures(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_peer_disconnected LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_peer_disconnected")] public static extern void ChannelMessageHandler_peer_disconnected(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_peer_disconnected")] public static extern void ChannelMessageHandler_peer_disconnected(long _this_arg, long _their_node_id);
        // LDKCResult_NoneNoneZ ChannelMessageHandler_peer_connected LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKInit *NONNULL_PTR msg, bool inbound
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_peer_connected")] public static extern long ChannelMessageHandler_peer_connected(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg, bool _inbound);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_peer_connected")] public static extern long ChannelMessageHandler_peer_connected(long _this_arg, long _their_node_id, long _msg, bool _inbound);
        // void ChannelMessageHandler_handle_channel_reestablish LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKChannelReestablish *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_channel_reestablish")] public static extern void ChannelMessageHandler_handle_channel_reestablish(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_channel_reestablish")] public static extern void ChannelMessageHandler_handle_channel_reestablish(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_channel_update LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKChannelUpdate *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_channel_update")] public static extern void ChannelMessageHandler_handle_channel_update(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_channel_update")] public static extern void ChannelMessageHandler_handle_channel_update(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_error LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKErrorMessage *NONNULL_PTR msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_error")] public static extern void ChannelMessageHandler_handle_error(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_error")] public static extern void ChannelMessageHandler_handle_error(long _this_arg, long _their_node_id, long _msg);
        // LDKNodeFeatures ChannelMessageHandler_provided_node_features LDKChannelMessageHandler *NONNULL_PTR this_arg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_provided_node_features")] public static extern long ChannelMessageHandler_provided_node_features(long _this_arg);
        // LDKInitFeatures ChannelMessageHandler_provided_init_features LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_provided_init_features")] public static extern long ChannelMessageHandler_provided_init_features(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id);
-       // LDKCOption_CVec_ChainHashZZ ChannelMessageHandler_get_genesis_hashes LDKChannelMessageHandler *NONNULL_PTR this_arg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_get_genesis_hashes")] public static extern long ChannelMessageHandler_get_genesis_hashes(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_provided_init_features")] public static extern long ChannelMessageHandler_provided_init_features(long _this_arg, long _their_node_id);
+       // LDKCOption_CVec_ThirtyTwoBytesZZ ChannelMessageHandler_get_chain_hashes LDKChannelMessageHandler *NONNULL_PTR this_arg
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_get_chain_hashes")] public static extern long ChannelMessageHandler_get_chain_hashes(long _this_arg);
+       public interface LDKOffersMessageHandler {
+               long handle_message(long message);
+               long release_pending_messages();
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOffersMessageHandler_new")] public static extern long LDKOffersMessageHandler_new_native(long impl_idx);
+       public static long[] LDKOffersMessageHandler_new(LDKOffersMessageHandler 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] = LDKOffersMessageHandler_new_native(i);
+               ret[1] = i;
+               return ret;
+       }
+       // LDKCOption_OffersMessageZ OffersMessageHandler_handle_message LDKOffersMessageHandler *NONNULL_PTR this_arg, struct LDKOffersMessage message
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OffersMessageHandler_handle_message")] public static extern long OffersMessageHandler_handle_message(long _this_arg, long _message);
+       // LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ OffersMessageHandler_release_pending_messages LDKOffersMessageHandler *NONNULL_PTR this_arg
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OffersMessageHandler_release_pending_messages")] public static extern long OffersMessageHandler_release_pending_messages(long _this_arg);
        public interface LDKRoutingMessageHandler {
-               long handle_node_announcement(long _msg);
-               long handle_channel_announcement(long _msg);
-               long handle_channel_update(long _msg);
-               long get_next_channel_announcement(long _starting_point);
-               long get_next_node_announcement(long _starting_point);
-               long peer_connected(byte[] _their_node_id, long _init, bool _inbound);
-               long handle_reply_channel_range(byte[] _their_node_id, long _msg);
-               long handle_reply_short_channel_ids_end(byte[] _their_node_id, long _msg);
-               long handle_query_channel_range(byte[] _their_node_id, long _msg);
-               long handle_query_short_channel_ids(byte[] _their_node_id, long _msg);
+               long handle_node_announcement(long msg);
+               long handle_channel_announcement(long msg);
+               long handle_channel_update(long msg);
+               long get_next_channel_announcement(long starting_point);
+               long get_next_node_announcement(long starting_point);
+               long peer_connected(long their_node_id, long init, bool inbound);
+               long handle_reply_channel_range(long their_node_id, long msg);
+               long handle_reply_short_channel_ids_end(long their_node_id, long msg);
+               long handle_query_channel_range(long their_node_id, long msg);
+               long handle_query_short_channel_ids(long their_node_id, long msg);
                bool processing_queue_high();
                long provided_node_features();
-               long provided_init_features(byte[] _their_node_id);
+               long provided_init_features(long their_node_id);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRoutingMessageHandler_new")] public static extern long LDKRoutingMessageHandler_new_native(long impl_idx, long MessageSendEventsProvider);
+       public static long[] LDKRoutingMessageHandler_new(LDKRoutingMessageHandler impl, long MessageSendEventsProvider) {
+               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] = LDKRoutingMessageHandler_new_native(i, MessageSendEventsProvider);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRoutingMessageHandler_new")] public static extern long LDKRoutingMessageHandler_new(LDKRoutingMessageHandler impl, LDKMessageSendEventsProvider MessageSendEventsProvider);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRoutingMessageHandler_get_MessageSendEventsProvider")] public static extern long LDKRoutingMessageHandler_get_MessageSendEventsProvider(long arg);
        // LDKCResult_boolLightningErrorZ RoutingMessageHandler_handle_node_announcement LDKRoutingMessageHandler *NONNULL_PTR this_arg, const struct LDKNodeAnnouncement *NONNULL_PTR msg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingMessageHandler_handle_node_announcement")] public static extern long RoutingMessageHandler_handle_node_announcement(long _this_arg, long _msg);
        // LDKCResult_boolLightningErrorZ RoutingMessageHandler_handle_channel_announcement LDKRoutingMessageHandler *NONNULL_PTR this_arg, const struct LDKChannelAnnouncement *NONNULL_PTR msg
@@ -1660,92 +2264,164 @@ internal class bindings {
        // LDKNodeAnnouncement RoutingMessageHandler_get_next_node_announcement LDKRoutingMessageHandler *NONNULL_PTR this_arg, struct LDKNodeId starting_point
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingMessageHandler_get_next_node_announcement")] public static extern long RoutingMessageHandler_get_next_node_announcement(long _this_arg, long _starting_point);
        // LDKCResult_NoneNoneZ RoutingMessageHandler_peer_connected LDKRoutingMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKInit *NONNULL_PTR init, bool inbound
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingMessageHandler_peer_connected")] public static extern long RoutingMessageHandler_peer_connected(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _init, bool _inbound);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingMessageHandler_peer_connected")] public static extern long RoutingMessageHandler_peer_connected(long _this_arg, long _their_node_id, long _init, bool _inbound);
        // LDKCResult_NoneLightningErrorZ RoutingMessageHandler_handle_reply_channel_range LDKRoutingMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, struct LDKReplyChannelRange msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingMessageHandler_handle_reply_channel_range")] public static extern long RoutingMessageHandler_handle_reply_channel_range(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingMessageHandler_handle_reply_channel_range")] public static extern long RoutingMessageHandler_handle_reply_channel_range(long _this_arg, long _their_node_id, long _msg);
        // LDKCResult_NoneLightningErrorZ RoutingMessageHandler_handle_reply_short_channel_ids_end LDKRoutingMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, struct LDKReplyShortChannelIdsEnd msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingMessageHandler_handle_reply_short_channel_ids_end")] public static extern long RoutingMessageHandler_handle_reply_short_channel_ids_end(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingMessageHandler_handle_reply_short_channel_ids_end")] public static extern long RoutingMessageHandler_handle_reply_short_channel_ids_end(long _this_arg, long _their_node_id, long _msg);
        // LDKCResult_NoneLightningErrorZ RoutingMessageHandler_handle_query_channel_range LDKRoutingMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, struct LDKQueryChannelRange msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingMessageHandler_handle_query_channel_range")] public static extern long RoutingMessageHandler_handle_query_channel_range(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingMessageHandler_handle_query_channel_range")] public static extern long RoutingMessageHandler_handle_query_channel_range(long _this_arg, long _their_node_id, long _msg);
        // LDKCResult_NoneLightningErrorZ RoutingMessageHandler_handle_query_short_channel_ids LDKRoutingMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, struct LDKQueryShortChannelIds msg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingMessageHandler_handle_query_short_channel_ids")] public static extern long RoutingMessageHandler_handle_query_short_channel_ids(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingMessageHandler_handle_query_short_channel_ids")] public static extern long RoutingMessageHandler_handle_query_short_channel_ids(long _this_arg, long _their_node_id, long _msg);
        // bool RoutingMessageHandler_processing_queue_high LDKRoutingMessageHandler *NONNULL_PTR this_arg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingMessageHandler_processing_queue_high")] public static extern bool RoutingMessageHandler_processing_queue_high(long _this_arg);
        // LDKNodeFeatures RoutingMessageHandler_provided_node_features LDKRoutingMessageHandler *NONNULL_PTR this_arg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingMessageHandler_provided_node_features")] public static extern long RoutingMessageHandler_provided_node_features(long _this_arg);
        // 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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id);
-       public interface LDKOnionMessageProvider {
-               long next_onion_message_for_peer(byte[] _peer_node_id);
-       }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOnionMessageProvider_new")] public static extern long LDKOnionMessageProvider_new(LDKOnionMessageProvider impl);
-       // LDKOnionMessage OnionMessageProvider_next_onion_message_for_peer LDKOnionMessageProvider *NONNULL_PTR this_arg, struct LDKPublicKey peer_node_id
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageProvider_next_onion_message_for_peer")] public static extern long OnionMessageProvider_next_onion_message_for_peer(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _peer_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 {
-               void handle_onion_message(byte[] _peer_node_id, long _msg);
-               long peer_connected(byte[] _their_node_id, long _init, bool _inbound);
-               void peer_disconnected(byte[] _their_node_id);
+               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);
                long provided_node_features();
-               long provided_init_features(byte[] _their_node_id);
+               long provided_init_features(long their_node_id);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOnionMessageHandler_new")] public static extern long LDKOnionMessageHandler_new_native(long impl_idx);
+       public static long[] LDKOnionMessageHandler_new(LDKOnionMessageHandler 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] = LDKOnionMessageHandler_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOnionMessageHandler_new")] public static extern long LDKOnionMessageHandler_new(LDKOnionMessageHandler impl, LDKOnionMessageProvider OnionMessageProvider);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOnionMessageHandler_get_OnionMessageProvider")] public static extern long LDKOnionMessageHandler_get_OnionMessageProvider(long 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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _peer_node_id, long _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
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageHandler_next_onion_message_for_peer")] public static extern long OnionMessageHandler_next_onion_message_for_peer(long _this_arg, long _peer_node_id);
        // LDKCResult_NoneNoneZ OnionMessageHandler_peer_connected LDKOnionMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKInit *NONNULL_PTR init, bool inbound
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageHandler_peer_connected")] public static extern long OnionMessageHandler_peer_connected(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _init, bool _inbound);
+       [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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
        // 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
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageHandler_provided_init_features")] public static extern long OnionMessageHandler_provided_init_features(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageHandler_provided_init_features")] public static extern long OnionMessageHandler_provided_init_features(long _this_arg, long _their_node_id);
        public interface LDKCustomMessageReader {
-               long read(short _message_type, byte[] _buffer);
+               long read(short message_type, long buffer);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCustomMessageReader_new")] public static extern long LDKCustomMessageReader_new_native(long impl_idx);
+       public static long[] LDKCustomMessageReader_new(LDKCustomMessageReader 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] = LDKCustomMessageReader_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCustomMessageReader_new")] public static extern long LDKCustomMessageReader_new(LDKCustomMessageReader impl);
        // LDKCResult_COption_TypeZDecodeErrorZ CustomMessageReader_read LDKCustomMessageReader *NONNULL_PTR this_arg, uint16_t message_type, struct LDKu8slice buffer
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomMessageReader_read")] public static extern long CustomMessageReader_read(long _this_arg, short _message_type, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _buffer);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomMessageReader_read")] public static extern long CustomMessageReader_read(long _this_arg, short _message_type, long _buffer);
        public interface LDKCustomMessageHandler {
-               long handle_custom_message(long _msg, byte[] _sender_node_id);
-               long[] get_and_clear_pending_msg();
+               long handle_custom_message(long msg, long sender_node_id);
+               long get_and_clear_pending_msg();
                long provided_node_features();
-               long provided_init_features(byte[] _their_node_id);
+               long provided_init_features(long their_node_id);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCustomMessageHandler_new")] public static extern long LDKCustomMessageHandler_new_native(long impl_idx, long CustomMessageReader);
+       public static long[] LDKCustomMessageHandler_new(LDKCustomMessageHandler impl, long CustomMessageReader) {
+               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] = LDKCustomMessageHandler_new_native(i, CustomMessageReader);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCustomMessageHandler_new")] public static extern long LDKCustomMessageHandler_new(LDKCustomMessageHandler impl, LDKCustomMessageReader CustomMessageReader);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCustomMessageHandler_get_CustomMessageReader")] public static extern long LDKCustomMessageHandler_get_CustomMessageReader(long arg);
        // LDKCResult_NoneLightningErrorZ CustomMessageHandler_handle_custom_message LDKCustomMessageHandler *NONNULL_PTR this_arg, struct LDKType msg, struct LDKPublicKey sender_node_id
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomMessageHandler_handle_custom_message")] public static extern long CustomMessageHandler_handle_custom_message(long _this_arg, long _msg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _sender_node_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomMessageHandler_handle_custom_message")] public static extern long CustomMessageHandler_handle_custom_message(long _this_arg, long _msg, long _sender_node_id);
        // LDKCVec_C2Tuple_PublicKeyTypeZZ CustomMessageHandler_get_and_clear_pending_msg LDKCustomMessageHandler *NONNULL_PTR this_arg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomMessageHandler_get_and_clear_pending_msg")] public static extern long[] CustomMessageHandler_get_and_clear_pending_msg(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomMessageHandler_get_and_clear_pending_msg")] public static extern long CustomMessageHandler_get_and_clear_pending_msg(long _this_arg);
        // LDKNodeFeatures CustomMessageHandler_provided_node_features LDKCustomMessageHandler *NONNULL_PTR this_arg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomMessageHandler_provided_node_features")] public static extern long CustomMessageHandler_provided_node_features(long _this_arg);
        // LDKInitFeatures CustomMessageHandler_provided_init_features LDKCustomMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomMessageHandler_provided_init_features")] public static extern long CustomMessageHandler_provided_init_features(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id);
-       public interface LDKOffersMessageHandler {
-               long handle_message(long _message);
-       }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOffersMessageHandler_new")] public static extern long LDKOffersMessageHandler_new(LDKOffersMessageHandler impl);
-       // LDKCOption_OffersMessageZ OffersMessageHandler_handle_message LDKOffersMessageHandler *NONNULL_PTR this_arg, struct LDKOffersMessage message
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OffersMessageHandler_handle_message")] public static extern long OffersMessageHandler_handle_message(long _this_arg, long _message);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomMessageHandler_provided_init_features")] public static extern long CustomMessageHandler_provided_init_features(long _this_arg, long _their_node_id);
        public interface LDKCustomOnionMessageHandler {
-               long handle_custom_message(long _msg);
-               long read_custom_message(long _message_type, byte[] _buffer);
+               long handle_custom_message(long msg);
+               long read_custom_message(long message_type, long buffer);
+               long release_pending_custom_messages();
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCustomOnionMessageHandler_new")] public static extern long LDKCustomOnionMessageHandler_new_native(long impl_idx);
+       public static long[] LDKCustomOnionMessageHandler_new(LDKCustomOnionMessageHandler 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] = LDKCustomOnionMessageHandler_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCustomOnionMessageHandler_new")] public static extern long LDKCustomOnionMessageHandler_new(LDKCustomOnionMessageHandler impl);
-       // LDKCOption_CustomOnionMessageContentsZ CustomOnionMessageHandler_handle_custom_message LDKCustomOnionMessageHandler *NONNULL_PTR this_arg, struct LDKCustomOnionMessageContents msg
+       // LDKCOption_OnionMessageContentsZ CustomOnionMessageHandler_handle_custom_message LDKCustomOnionMessageHandler *NONNULL_PTR this_arg, struct LDKOnionMessageContents msg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomOnionMessageHandler_handle_custom_message")] public static extern long CustomOnionMessageHandler_handle_custom_message(long _this_arg, long _msg);
-       // LDKCResult_COption_CustomOnionMessageContentsZDecodeErrorZ CustomOnionMessageHandler_read_custom_message LDKCustomOnionMessageHandler *NONNULL_PTR this_arg, uint64_t message_type, struct LDKu8slice buffer
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomOnionMessageHandler_read_custom_message")] public static extern long CustomOnionMessageHandler_read_custom_message(long _this_arg, long _message_type, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _buffer);
+       // LDKCResult_COption_OnionMessageContentsZDecodeErrorZ CustomOnionMessageHandler_read_custom_message LDKCustomOnionMessageHandler *NONNULL_PTR this_arg, uint64_t message_type, struct LDKu8slice buffer
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomOnionMessageHandler_read_custom_message")] public static extern long CustomOnionMessageHandler_read_custom_message(long _this_arg, long _message_type, long _buffer);
+       // LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ CustomOnionMessageHandler_release_pending_custom_messages LDKCustomOnionMessageHandler *NONNULL_PTR this_arg
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomOnionMessageHandler_release_pending_custom_messages")] public static extern long CustomOnionMessageHandler_release_pending_custom_messages(long _this_arg);
        public interface LDKSocketDescriptor {
-               long send_data(byte[] _data, bool _resume_read);
+               long send_data(long data, bool resume_read);
                void disconnect_socket();
-               bool eq(long _other_arg);
+               bool eq(long other_arg);
                long hash();
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSocketDescriptor_new")] public static extern long LDKSocketDescriptor_new(LDKSocketDescriptor impl);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSocketDescriptor_new")] public static extern long LDKSocketDescriptor_new_native(long impl_idx);
+       public static long[] LDKSocketDescriptor_new(LDKSocketDescriptor 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] = LDKSocketDescriptor_new_native(i);
+               ret[1] = i;
+               return ret;
+       }
        // uintptr_t SocketDescriptor_send_data LDKSocketDescriptor *NONNULL_PTR this_arg, struct LDKu8slice data, bool resume_read
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketDescriptor_send_data")] public static extern long SocketDescriptor_send_data(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _data, bool _resume_read);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketDescriptor_send_data")] public static extern long SocketDescriptor_send_data(long _this_arg, long _data, bool _resume_read);
        // void SocketDescriptor_disconnect_socket LDKSocketDescriptor *NONNULL_PTR this_arg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketDescriptor_disconnect_socket")] public static extern void SocketDescriptor_disconnect_socket(long _this_arg);
        // uint64_t SocketDescriptor_hash LDKSocketDescriptor *NONNULL_PTR this_arg
@@ -1757,63 +2433,127 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEffectiveCapacity_Total_get_htlc_maximum_msat")] public static extern long LDKEffectiveCapacity_Total_get_htlc_maximum_msat(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEffectiveCapacity_HintMaxHTLC_get_amount_msat")] public static extern long LDKEffectiveCapacity_HintMaxHTLC_get_amount_msat(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPayee_ty_from_ptr")] public static extern long LDKPayee_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPayee_Blinded_get_route_hints")] public static extern long[] LDKPayee_Blinded_get_route_hints(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPayee_Blinded_get_route_hints")] public static extern long LDKPayee_Blinded_get_route_hints(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPayee_Blinded_get_features")] public static extern long LDKPayee_Blinded_get_features(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPayee_Clear_get_node_id")] public static extern byte[] LDKPayee_Clear_get_node_id(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPayee_Clear_get_route_hints")] public static extern long[] LDKPayee_Clear_get_route_hints(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPayee_Clear_get_node_id")] public static extern long LDKPayee_Clear_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPayee_Clear_get_route_hints")] public static extern long LDKPayee_Clear_get_route_hints(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPayee_Clear_get_features")] public static extern long LDKPayee_Clear_get_features(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPayee_Clear_get_final_cltv_expiry_delta")] public static extern int LDKPayee_Clear_get_final_cltv_expiry_delta(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKDestination_ty_from_ptr")] public static extern long LDKDestination_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKDestination_Node_get_node")] public static extern byte[] LDKDestination_Node_get_node(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKDestination_BlindedPath_get_blinded_path")] public static extern long LDKDestination_BlindedPath_get_blinded_path(long ptr);
+       public interface LDKScore {
+               long write();
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKScore_new")] public static extern long LDKScore_new_native(long impl_idx, long ScoreLookUp, long ScoreUpdate);
+       public static long[] LDKScore_new(LDKScore impl, long ScoreLookUp, long ScoreUpdate) {
+               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] = LDKScore_new_native(i, ScoreLookUp, ScoreUpdate);
+               ret[1] = i;
+               return ret;
+       }
+       // 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(byte[] _sender, byte[][] _peers, long _destination);
+               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;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageRouter_new")] public static extern long LDKMessageRouter_new(LDKMessageRouter impl);
        // 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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _sender, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _peers, long _destination);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOnionMessageContents_ty_from_ptr")] public static extern long LDKOnionMessageContents_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOnionMessageContents_Offers_get_offers")] public static extern long LDKOnionMessageContents_Offers_get_offers(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOnionMessageContents_Custom_get_custom")] public static extern long LDKOnionMessageContents_Custom_get_custom(long ptr);
+       [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(byte[] _claim_id, long[] _must_spend, long[] _must_pay_to, int _target_feerate_sat_per_1000_weight);
-               long sign_tx(byte[] _tx);
+               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);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCoinSelectionSource_new")] public static extern long LDKCoinSelectionSource_new_native(long impl_idx);
+       public static long[] LDKCoinSelectionSource_new(LDKCoinSelectionSource 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] = LDKCoinSelectionSource_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCoinSelectionSource_new")] public static extern long LDKCoinSelectionSource_new(LDKCoinSelectionSource impl);
        // 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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _claim_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _must_spend, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _must_pay_to, int _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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _tx);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CoinSelectionSource_sign_tx")] public static extern long CoinSelectionSource_sign_tx(long _this_arg, long _tx);
        public interface LDKWalletSource {
                long list_confirmed_utxos();
                long get_change_script();
-               long sign_tx(byte[] _tx);
+               long sign_tx(long tx);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKWalletSource_new")] public static extern long LDKWalletSource_new_native(long impl_idx);
+       public static long[] LDKWalletSource_new(LDKWalletSource 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] = LDKWalletSource_new_native(i);
+               ret[1] = i;
+               return ret;
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKWalletSource_new")] public static extern long LDKWalletSource_new(LDKWalletSource impl);
        // LDKCResult_CVec_UtxoZNoneZ WalletSource_list_confirmed_utxos LDKWalletSource *NONNULL_PTR this_arg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WalletSource_list_confirmed_utxos")] public static extern long WalletSource_list_confirmed_utxos(long _this_arg);
-       // LDKCResult_ScriptNoneZ WalletSource_get_change_script LDKWalletSource *NONNULL_PTR 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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _tx);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WalletSource_sign_tx")] public static extern long WalletSource_sign_tx(long _this_arg, long _tx);
        [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);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKFallback_ty_from_ptr")] public static extern long LDKFallback_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKFallback_SegWitProgram_get_version")] public static extern byte LDKFallback_SegWitProgram_get_version(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKFallback_SegWitProgram_get_program")] public static extern byte[] LDKFallback_SegWitProgram_get_program(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKFallback_PubKeyHash_get_pub_key_hash")] public static extern byte[] LDKFallback_PubKeyHash_get_pub_key_hash(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKFallback_ScriptHash_get_script_hash")] public static extern byte[] LDKFallback_ScriptHash_get_script_hash(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKFallback_SegWitProgram_get_program")] public static extern long LDKFallback_SegWitProgram_get_program(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKFallback_PubKeyHash_get_pub_key_hash")] public static extern long LDKFallback_PubKeyHash_get_pub_key_hash(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKFallback_ScriptHash_get_script_hash")] public static extern long LDKFallback_ScriptHash_get_script_hash(long ptr);
        // struct LDKStr _ldk_get_compiled_version(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK__ldk_get_compiled_version")] public static extern string _ldk_get_compiled_version();
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK__ldk_get_compiled_version")] public static extern long _ldk_get_compiled_version();
        // struct LDKStr _ldk_c_bindings_get_compiled_version(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK__ldk_c_bindings_get_compiled_version")] public static extern string _ldk_c_bindings_get_compiled_version();
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK__ldk_c_bindings_get_compiled_version")] public static extern long _ldk_c_bindings_get_compiled_version();
        // struct LDKSixteenBytes U128_le_bytes(struct LDKU128 val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_U128_le_bytes")] public static extern byte[] U128_le_bytes([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [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 byte[] U128_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _le_bytes);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_U128_new")] public static extern long U128_new(long _le_bytes);
        // struct LDKBigEndianScalar BigEndianScalar_new(struct LDKThirtyTwoBytes big_endian_bytes);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BigEndianScalar_new")] public static extern long BigEndianScalar_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bech32Error_clone_ptr")] public static extern long Bech32Error_clone_ptr(long _arg);
        // struct LDKBech32Error Bech32Error_clone(const struct LDKBech32Error *NONNULL_PTR orig);
@@ -1821,15 +2561,15 @@ internal class bindings {
        // void Bech32Error_free(struct LDKBech32Error o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bech32Error_free")] public static extern void Bech32Error_free(long _o);
        // void Transaction_free(struct LDKTransaction _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Transaction_free")] public static extern void Transaction_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] __res);
+       [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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] __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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _witness, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _script_sig, int _sequence, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _previous_txid, int _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 LDKTxOut TxOut_new(struct LDKCVec_u8Z script_pubkey, uint64_t value);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxOut_new")] public static extern long TxOut_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _script_pubkey, long _value);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxOut_new")] public static extern long TxOut_new(long _script_pubkey, long _value);
        // 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);
@@ -1837,19 +2577,7 @@ internal class bindings {
        // struct LDKTxOut TxOut_clone(const struct LDKTxOut *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxOut_clone")] public static extern long TxOut_clone(long _orig);
        // void Str_free(struct LDKStr _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Str_free")] public static extern void Str_free(string __res);
-       // struct LDKCOption_DurationZ COption_DurationZ_some(uint64_t o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_DurationZ_some")] public static extern long COption_DurationZ_some(long _o);
-       // struct LDKCOption_DurationZ COption_DurationZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_DurationZ_none")] public static extern long COption_DurationZ_none();
-       // void COption_DurationZ_free(struct LDKCOption_DurationZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_DurationZ_free")] public static extern void COption_DurationZ_free(long __res);
-       // uint64_t COption_DurationZ_clone_ptr(LDKCOption_DurationZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_DurationZ_clone_ptr")] public static extern long COption_DurationZ_clone_ptr(long _arg);
-       // struct LDKCOption_DurationZ COption_DurationZ_clone(const struct LDKCOption_DurationZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_DurationZ_clone")] public static extern long COption_DurationZ_clone(long _orig);
-       // void CVec_BlindedPathZ_free(struct LDKCVec_BlindedPathZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_BlindedPathZ_free")] public static extern void CVec_BlindedPathZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Str_free")] public static extern void Str_free(long __res);
        // struct LDKCOption_u64Z COption_u64Z_some(uint64_t o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u64Z_some")] public static extern long COption_u64Z_some(long _o);
        // struct LDKCOption_u64Z COption_u64Z_none(void);
@@ -1860,6 +2588,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u64Z_clone_ptr")] public static extern long COption_u64Z_clone_ptr(long _arg);
        // struct LDKCOption_u64Z COption_u64Z_clone(const struct LDKCOption_u64Z *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u64Z_clone")] public static extern long COption_u64Z_clone(long _orig);
+       // void CVec_BlindedPathZ_free(struct LDKCVec_BlindedPathZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_BlindedPathZ_free")] public static extern void CVec_BlindedPathZ_free(long __res);
        // struct LDKCResult_RefundBolt12ParseErrorZ CResult_RefundBolt12ParseErrorZ_ok(struct LDKRefund o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RefundBolt12ParseErrorZ_ok")] public static extern long CResult_RefundBolt12ParseErrorZ_ok(long _o);
        // struct LDKCResult_RefundBolt12ParseErrorZ CResult_RefundBolt12ParseErrorZ_err(struct LDKBolt12ParseError e);
@@ -1872,6 +2602,18 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RefundBolt12ParseErrorZ_clone_ptr")] public static extern long CResult_RefundBolt12ParseErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_RefundBolt12ParseErrorZ CResult_RefundBolt12ParseErrorZ_clone(const struct LDKCResult_RefundBolt12ParseErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RefundBolt12ParseErrorZ_clone")] public static extern long CResult_RefundBolt12ParseErrorZ_clone(long _orig);
+       // struct LDKCResult_RetryDecodeErrorZ CResult_RetryDecodeErrorZ_ok(struct LDKRetry o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RetryDecodeErrorZ_ok")] public static extern long CResult_RetryDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_RetryDecodeErrorZ CResult_RetryDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RetryDecodeErrorZ_err")] public static extern long CResult_RetryDecodeErrorZ_err(long _e);
+       // bool CResult_RetryDecodeErrorZ_is_ok(const struct LDKCResult_RetryDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RetryDecodeErrorZ_is_ok")] public static extern bool CResult_RetryDecodeErrorZ_is_ok(long _o);
+       // void CResult_RetryDecodeErrorZ_free(struct LDKCResult_RetryDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RetryDecodeErrorZ_free")] public static extern void CResult_RetryDecodeErrorZ_free(long __res);
+       // uint64_t CResult_RetryDecodeErrorZ_clone_ptr(LDKCResult_RetryDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RetryDecodeErrorZ_clone_ptr")] public static extern long CResult_RetryDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_RetryDecodeErrorZ CResult_RetryDecodeErrorZ_clone(const struct LDKCResult_RetryDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RetryDecodeErrorZ_clone")] public static extern long CResult_RetryDecodeErrorZ_clone(long _orig);
        // struct LDKCResult_NoneAPIErrorZ CResult_NoneAPIErrorZ_ok(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneAPIErrorZ_ok")] public static extern long CResult_NoneAPIErrorZ_ok();
        // struct LDKCResult_NoneAPIErrorZ CResult_NoneAPIErrorZ_err(struct LDKAPIError e);
@@ -1885,23 +2627,23 @@ internal class bindings {
        // struct LDKCResult_NoneAPIErrorZ CResult_NoneAPIErrorZ_clone(const struct LDKCResult_NoneAPIErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneAPIErrorZ_clone")] public static extern long CResult_NoneAPIErrorZ_clone(long _orig);
        // void CVec_CResult_NoneAPIErrorZZ_free(struct LDKCVec_CResult_NoneAPIErrorZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_CResult_NoneAPIErrorZZ_free")] public static extern void CVec_CResult_NoneAPIErrorZZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_CResult_NoneAPIErrorZZ_free")] public static extern void CVec_CResult_NoneAPIErrorZZ_free(long __res);
        // void CVec_APIErrorZ_free(struct LDKCVec_APIErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_APIErrorZ_free")] public static extern void CVec_APIErrorZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
-       // struct LDKCOption_PaymentSecretZ COption_PaymentSecretZ_some(struct LDKThirtyTwoBytes o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentSecretZ_some")] public static extern long COption_PaymentSecretZ_some([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCOption_PaymentSecretZ COption_PaymentSecretZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentSecretZ_none")] public static extern long COption_PaymentSecretZ_none();
-       // void COption_PaymentSecretZ_free(struct LDKCOption_PaymentSecretZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentSecretZ_free")] public static extern void COption_PaymentSecretZ_free(long __res);
-       // uint64_t COption_PaymentSecretZ_clone_ptr(LDKCOption_PaymentSecretZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentSecretZ_clone_ptr")] public static extern long COption_PaymentSecretZ_clone_ptr(long _arg);
-       // struct LDKCOption_PaymentSecretZ COption_PaymentSecretZ_clone(const struct LDKCOption_PaymentSecretZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentSecretZ_clone")] public static extern long COption_PaymentSecretZ_clone(long _orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_APIErrorZ_free")] public static extern void CVec_APIErrorZ_free(long __res);
+       // struct LDKCOption_ThirtyTwoBytesZ COption_ThirtyTwoBytesZ_some(struct LDKThirtyTwoBytes o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ThirtyTwoBytesZ_some")] public static extern long COption_ThirtyTwoBytesZ_some(long _o);
+       // struct LDKCOption_ThirtyTwoBytesZ COption_ThirtyTwoBytesZ_none(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ThirtyTwoBytesZ_none")] public static extern long COption_ThirtyTwoBytesZ_none();
+       // void COption_ThirtyTwoBytesZ_free(struct LDKCOption_ThirtyTwoBytesZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ThirtyTwoBytesZ_free")] public static extern void COption_ThirtyTwoBytesZ_free(long __res);
+       // uint64_t COption_ThirtyTwoBytesZ_clone_ptr(LDKCOption_ThirtyTwoBytesZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ThirtyTwoBytesZ_clone_ptr")] public static extern long COption_ThirtyTwoBytesZ_clone_ptr(long _arg);
+       // struct LDKCOption_ThirtyTwoBytesZ COption_ThirtyTwoBytesZ_clone(const struct LDKCOption_ThirtyTwoBytesZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ThirtyTwoBytesZ_clone")] public static extern long COption_ThirtyTwoBytesZ_clone(long _orig);
        // void CVec_u8Z_free(struct LDKCVec_u8Z _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_u8Z_free")] public static extern void CVec_u8Z_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_u8Z_free")] public static extern void CVec_u8Z_free(long __res);
        // struct LDKCOption_CVec_u8ZZ COption_CVec_u8ZZ_some(struct LDKCVec_u8Z o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_u8ZZ_some")] public static extern long COption_CVec_u8ZZ_some([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_u8ZZ_some")] public static extern long COption_CVec_u8ZZ_some(long _o);
        // struct LDKCOption_CVec_u8ZZ COption_CVec_u8ZZ_none(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_u8ZZ_none")] public static extern long COption_CVec_u8ZZ_none();
        // void COption_CVec_u8ZZ_free(struct LDKCOption_CVec_u8ZZ _res);
@@ -1922,6 +2664,52 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_clone_ptr")] public static extern long CResult_RecipientOnionFieldsDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_RecipientOnionFieldsDecodeErrorZ CResult_RecipientOnionFieldsDecodeErrorZ_clone(const struct LDKCResult_RecipientOnionFieldsDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecipientOnionFieldsDecodeErrorZ_clone")] public static extern long CResult_RecipientOnionFieldsDecodeErrorZ_clone(long _orig);
+       // uint64_t C2Tuple_u64CVec_u8ZZ_clone_ptr(LDKC2Tuple_u64CVec_u8ZZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u64CVec_u8ZZ_clone_ptr")] public static extern long C2Tuple_u64CVec_u8ZZ_clone_ptr(long _arg);
+       // struct LDKC2Tuple_u64CVec_u8ZZ C2Tuple_u64CVec_u8ZZ_clone(const struct LDKC2Tuple_u64CVec_u8ZZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u64CVec_u8ZZ_clone")] public static extern long C2Tuple_u64CVec_u8ZZ_clone(long _orig);
+       // struct LDKC2Tuple_u64CVec_u8ZZ C2Tuple_u64CVec_u8ZZ_new(uint64_t a, struct LDKCVec_u8Z b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u64CVec_u8ZZ_new")] public static extern long C2Tuple_u64CVec_u8ZZ_new(long _a, long _b);
+       // void C2Tuple_u64CVec_u8ZZ_free(struct LDKC2Tuple_u64CVec_u8ZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u64CVec_u8ZZ_free")] public static extern void C2Tuple_u64CVec_u8ZZ_free(long __res);
+       // void CVec_C2Tuple_u64CVec_u8ZZZ_free(struct LDKCVec_C2Tuple_u64CVec_u8ZZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_u64CVec_u8ZZZ_free")] public static extern void CVec_C2Tuple_u64CVec_u8ZZZ_free(long __res);
+       // struct LDKCResult_RecipientOnionFieldsNoneZ CResult_RecipientOnionFieldsNoneZ_ok(struct LDKRecipientOnionFields o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecipientOnionFieldsNoneZ_ok")] public static extern long CResult_RecipientOnionFieldsNoneZ_ok(long _o);
+       // struct LDKCResult_RecipientOnionFieldsNoneZ CResult_RecipientOnionFieldsNoneZ_err(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecipientOnionFieldsNoneZ_err")] public static extern long CResult_RecipientOnionFieldsNoneZ_err();
+       // bool CResult_RecipientOnionFieldsNoneZ_is_ok(const struct LDKCResult_RecipientOnionFieldsNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecipientOnionFieldsNoneZ_is_ok")] public static extern bool CResult_RecipientOnionFieldsNoneZ_is_ok(long _o);
+       // void CResult_RecipientOnionFieldsNoneZ_free(struct LDKCResult_RecipientOnionFieldsNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecipientOnionFieldsNoneZ_free")] public static extern void CResult_RecipientOnionFieldsNoneZ_free(long __res);
+       // uint64_t CResult_RecipientOnionFieldsNoneZ_clone_ptr(LDKCResult_RecipientOnionFieldsNoneZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecipientOnionFieldsNoneZ_clone_ptr")] public static extern long CResult_RecipientOnionFieldsNoneZ_clone_ptr(long _arg);
+       // struct LDKCResult_RecipientOnionFieldsNoneZ CResult_RecipientOnionFieldsNoneZ_clone(const struct LDKCResult_RecipientOnionFieldsNoneZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecipientOnionFieldsNoneZ_clone")] public static extern long CResult_RecipientOnionFieldsNoneZ_clone(long _orig);
+       // void CVec_ThirtyTwoBytesZ_free(struct LDKCVec_ThirtyTwoBytesZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_ThirtyTwoBytesZ_free")] public static extern void CVec_ThirtyTwoBytesZ_free(long __res);
+       // struct LDKCOption_CVec_ThirtyTwoBytesZZ COption_CVec_ThirtyTwoBytesZZ_some(struct LDKCVec_ThirtyTwoBytesZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_ThirtyTwoBytesZZ_some")] public static extern long COption_CVec_ThirtyTwoBytesZZ_some(long _o);
+       // struct LDKCOption_CVec_ThirtyTwoBytesZZ COption_CVec_ThirtyTwoBytesZZ_none(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_ThirtyTwoBytesZZ_none")] public static extern long COption_CVec_ThirtyTwoBytesZZ_none();
+       // void COption_CVec_ThirtyTwoBytesZZ_free(struct LDKCOption_CVec_ThirtyTwoBytesZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_ThirtyTwoBytesZZ_free")] public static extern void COption_CVec_ThirtyTwoBytesZZ_free(long __res);
+       // uint64_t COption_CVec_ThirtyTwoBytesZZ_clone_ptr(LDKCOption_CVec_ThirtyTwoBytesZZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_ThirtyTwoBytesZZ_clone_ptr")] public static extern long COption_CVec_ThirtyTwoBytesZZ_clone_ptr(long _arg);
+       // struct LDKCOption_CVec_ThirtyTwoBytesZZ COption_CVec_ThirtyTwoBytesZZ_clone(const struct LDKCOption_CVec_ThirtyTwoBytesZZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_ThirtyTwoBytesZZ_clone")] public static extern long COption_CVec_ThirtyTwoBytesZZ_clone(long _orig);
+       // struct LDKCResult_ThirtyTwoBytesNoneZ CResult_ThirtyTwoBytesNoneZ_ok(struct LDKThirtyTwoBytes o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesNoneZ_ok")] public static extern long CResult_ThirtyTwoBytesNoneZ_ok(long _o);
+       // struct LDKCResult_ThirtyTwoBytesNoneZ CResult_ThirtyTwoBytesNoneZ_err(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesNoneZ_err")] public static extern long CResult_ThirtyTwoBytesNoneZ_err();
+       // bool CResult_ThirtyTwoBytesNoneZ_is_ok(const struct LDKCResult_ThirtyTwoBytesNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesNoneZ_is_ok")] public static extern bool CResult_ThirtyTwoBytesNoneZ_is_ok(long _o);
+       // void CResult_ThirtyTwoBytesNoneZ_free(struct LDKCResult_ThirtyTwoBytesNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesNoneZ_free")] public static extern void CResult_ThirtyTwoBytesNoneZ_free(long __res);
+       // uint64_t CResult_ThirtyTwoBytesNoneZ_clone_ptr(LDKCResult_ThirtyTwoBytesNoneZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesNoneZ_clone_ptr")] public static extern long CResult_ThirtyTwoBytesNoneZ_clone_ptr(long _arg);
+       // struct LDKCResult_ThirtyTwoBytesNoneZ CResult_ThirtyTwoBytesNoneZ_clone(const struct LDKCResult_ThirtyTwoBytesNoneZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesNoneZ_clone")] public static extern long CResult_ThirtyTwoBytesNoneZ_clone(long _orig);
        // struct LDKCResult_BlindedPayInfoDecodeErrorZ CResult_BlindedPayInfoDecodeErrorZ_ok(struct LDKBlindedPayInfo o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedPayInfoDecodeErrorZ_ok")] public static extern long CResult_BlindedPayInfoDecodeErrorZ_ok(long _o);
        // struct LDKCResult_BlindedPayInfoDecodeErrorZ CResult_BlindedPayInfoDecodeErrorZ_err(struct LDKDecodeError e);
@@ -1971,41 +2759,63 @@ internal class bindings {
        // struct LDKCResult_SpendableOutputDescriptorDecodeErrorZ CResult_SpendableOutputDescriptorDecodeErrorZ_clone(const struct LDKCResult_SpendableOutputDescriptorDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_clone")] public static extern long CResult_SpendableOutputDescriptorDecodeErrorZ_clone(long _orig);
        // void CVec_SpendableOutputDescriptorZ_free(struct LDKCVec_SpendableOutputDescriptorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_SpendableOutputDescriptorZ_free")] public static extern void CVec_SpendableOutputDescriptorZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_SpendableOutputDescriptorZ_free")] public static extern void CVec_SpendableOutputDescriptorZ_free(long __res);
        // void CVec_TxOutZ_free(struct LDKCVec_TxOutZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_TxOutZ_free")] public static extern void CVec_TxOutZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
-       // struct LDKCOption_PackedLockTimeZ COption_PackedLockTimeZ_some(uint32_t o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PackedLockTimeZ_some")] public static extern long COption_PackedLockTimeZ_some(int _o);
-       // struct LDKCOption_PackedLockTimeZ COption_PackedLockTimeZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PackedLockTimeZ_none")] public static extern long COption_PackedLockTimeZ_none();
-       // void COption_PackedLockTimeZ_free(struct LDKCOption_PackedLockTimeZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PackedLockTimeZ_free")] public static extern void COption_PackedLockTimeZ_free(long __res);
-       // uint64_t COption_PackedLockTimeZ_clone_ptr(LDKCOption_PackedLockTimeZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PackedLockTimeZ_clone_ptr")] public static extern long COption_PackedLockTimeZ_clone_ptr(long _arg);
-       // struct LDKCOption_PackedLockTimeZ COption_PackedLockTimeZ_clone(const struct LDKCOption_PackedLockTimeZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PackedLockTimeZ_clone")] public static extern long COption_PackedLockTimeZ_clone(long _orig);
-       // uint64_t C2Tuple_PartiallySignedTransactionusizeZ_clone_ptr(LDKC2Tuple_PartiallySignedTransactionusizeZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PartiallySignedTransactionusizeZ_clone_ptr")] public static extern long C2Tuple_PartiallySignedTransactionusizeZ_clone_ptr(long _arg);
-       // struct LDKC2Tuple_PartiallySignedTransactionusizeZ C2Tuple_PartiallySignedTransactionusizeZ_clone(const struct LDKC2Tuple_PartiallySignedTransactionusizeZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PartiallySignedTransactionusizeZ_clone")] public static extern long C2Tuple_PartiallySignedTransactionusizeZ_clone(long _orig);
-       // struct LDKC2Tuple_PartiallySignedTransactionusizeZ C2Tuple_PartiallySignedTransactionusizeZ_new(struct LDKCVec_u8Z a, uintptr_t b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PartiallySignedTransactionusizeZ_new")] public static extern long C2Tuple_PartiallySignedTransactionusizeZ_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a, long _b);
-       // void C2Tuple_PartiallySignedTransactionusizeZ_free(struct LDKC2Tuple_PartiallySignedTransactionusizeZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PartiallySignedTransactionusizeZ_free")] public static extern void C2Tuple_PartiallySignedTransactionusizeZ_free(long __res);
-       // struct LDKCResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_ok(struct LDKC2Tuple_PartiallySignedTransactionusizeZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_ok")] public static extern long CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_ok(long _o);
-       // struct LDKCResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_err(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_err")] public static extern long CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_err();
-       // bool CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_is_ok(const struct LDKCResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_is_ok")] public static extern bool CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_is_ok(long _o);
-       // void CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_free(struct LDKCResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_free")] public static extern void CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_free(long __res);
-       // uint64_t CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_clone_ptr(LDKCResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_clone_ptr")] public static extern long CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_clone_ptr(long _arg);
-       // struct LDKCResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_clone(const struct LDKCResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_clone")] public static extern long CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_clone(long _orig);
-       // void CVec_PaymentPreimageZ_free(struct LDKCVec_PaymentPreimageZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_PaymentPreimageZ_free")] public static extern void CVec_PaymentPreimageZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_TxOutZ_free")] public static extern void CVec_TxOutZ_free(long __res);
+       // struct LDKCOption_u32Z COption_u32Z_some(uint32_t o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u32Z_some")] public static extern long COption_u32Z_some(int _o);
+       // struct LDKCOption_u32Z COption_u32Z_none(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u32Z_none")] public static extern long COption_u32Z_none();
+       // void COption_u32Z_free(struct LDKCOption_u32Z _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u32Z_free")] public static extern void COption_u32Z_free(long __res);
+       // uint64_t COption_u32Z_clone_ptr(LDKCOption_u32Z *NONNULL_PTR arg);
+       [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);
+       // 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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_err")] public static extern long CResult_ChannelDerivationParametersDecodeErrorZ_err(long _e);
+       // bool CResult_ChannelDerivationParametersDecodeErrorZ_is_ok(const struct LDKCResult_ChannelDerivationParametersDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_is_ok")] public static extern bool CResult_ChannelDerivationParametersDecodeErrorZ_is_ok(long _o);
+       // void CResult_ChannelDerivationParametersDecodeErrorZ_free(struct LDKCResult_ChannelDerivationParametersDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_free")] public static extern void CResult_ChannelDerivationParametersDecodeErrorZ_free(long __res);
+       // uint64_t CResult_ChannelDerivationParametersDecodeErrorZ_clone_ptr(LDKCResult_ChannelDerivationParametersDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_clone_ptr")] public static extern long CResult_ChannelDerivationParametersDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_ChannelDerivationParametersDecodeErrorZ CResult_ChannelDerivationParametersDecodeErrorZ_clone(const struct LDKCResult_ChannelDerivationParametersDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_clone")] public static extern long CResult_ChannelDerivationParametersDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_HTLCDescriptorDecodeErrorZ CResult_HTLCDescriptorDecodeErrorZ_ok(struct LDKHTLCDescriptor o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_ok")] public static extern long CResult_HTLCDescriptorDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_HTLCDescriptorDecodeErrorZ CResult_HTLCDescriptorDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_err")] public static extern long CResult_HTLCDescriptorDecodeErrorZ_err(long _e);
+       // bool CResult_HTLCDescriptorDecodeErrorZ_is_ok(const struct LDKCResult_HTLCDescriptorDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_is_ok")] public static extern bool CResult_HTLCDescriptorDecodeErrorZ_is_ok(long _o);
+       // void CResult_HTLCDescriptorDecodeErrorZ_free(struct LDKCResult_HTLCDescriptorDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_free")] public static extern void CResult_HTLCDescriptorDecodeErrorZ_free(long __res);
+       // uint64_t CResult_HTLCDescriptorDecodeErrorZ_clone_ptr(LDKCResult_HTLCDescriptorDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_clone_ptr")] public static extern long CResult_HTLCDescriptorDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_HTLCDescriptorDecodeErrorZ CResult_HTLCDescriptorDecodeErrorZ_clone(const struct LDKCResult_HTLCDescriptorDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HTLCDescriptorDecodeErrorZ_clone")] public static extern long CResult_HTLCDescriptorDecodeErrorZ_clone(long _orig);
        // struct LDKCResult_NoneNoneZ CResult_NoneNoneZ_ok(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneNoneZ_ok")] public static extern long CResult_NoneNoneZ_ok();
        // struct LDKCResult_NoneNoneZ CResult_NoneNoneZ_err(void);
@@ -2018,42 +2828,42 @@ 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_SignatureZ_free(struct LDKCVec_SignatureZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_SignatureZ_free")] public static extern void CVec_SignatureZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] __res);
-       // uint64_t C2Tuple_SignatureCVec_SignatureZZ_clone_ptr(LDKC2Tuple_SignatureCVec_SignatureZZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_SignatureCVec_SignatureZZ_clone_ptr")] public static extern long C2Tuple_SignatureCVec_SignatureZZ_clone_ptr(long _arg);
-       // struct LDKC2Tuple_SignatureCVec_SignatureZZ C2Tuple_SignatureCVec_SignatureZZ_clone(const struct LDKC2Tuple_SignatureCVec_SignatureZZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_SignatureCVec_SignatureZZ_clone")] public static extern long C2Tuple_SignatureCVec_SignatureZZ_clone(long _orig);
-       // struct LDKC2Tuple_SignatureCVec_SignatureZZ C2Tuple_SignatureCVec_SignatureZZ_new(struct LDKSignature a, struct LDKCVec_SignatureZ b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_SignatureCVec_SignatureZZ_new")] public static extern long C2Tuple_SignatureCVec_SignatureZZ_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _b);
-       // void C2Tuple_SignatureCVec_SignatureZZ_free(struct LDKC2Tuple_SignatureCVec_SignatureZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_SignatureCVec_SignatureZZ_free")] public static extern void C2Tuple_SignatureCVec_SignatureZZ_free(long __res);
-       // struct LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_ok(struct LDKC2Tuple_SignatureCVec_SignatureZZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_ok")] public static extern long CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_ok(long _o);
-       // struct LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_err(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_err")] public static extern long CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_err();
-       // bool CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_is_ok(const struct LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_is_ok")] public static extern bool CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_is_ok(long _o);
-       // void CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_free(struct LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_free")] public static extern void CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_free(long __res);
-       // uint64_t CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_clone_ptr(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_clone_ptr")] public static extern long CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_clone_ptr(long _arg);
-       // struct LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_clone(const struct LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_clone")] public static extern long CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_clone(long _orig);
-       // struct LDKCResult_SignatureNoneZ CResult_SignatureNoneZ_ok(struct LDKSignature o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SignatureNoneZ_ok")] public static extern long CResult_SignatureNoneZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCResult_SignatureNoneZ CResult_SignatureNoneZ_err(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SignatureNoneZ_err")] public static extern long CResult_SignatureNoneZ_err();
-       // bool CResult_SignatureNoneZ_is_ok(const struct LDKCResult_SignatureNoneZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SignatureNoneZ_is_ok")] public static extern bool CResult_SignatureNoneZ_is_ok(long _o);
-       // void CResult_SignatureNoneZ_free(struct LDKCResult_SignatureNoneZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SignatureNoneZ_free")] public static extern void CResult_SignatureNoneZ_free(long __res);
-       // uint64_t CResult_SignatureNoneZ_clone_ptr(LDKCResult_SignatureNoneZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SignatureNoneZ_clone_ptr")] public static extern long CResult_SignatureNoneZ_clone_ptr(long _arg);
-       // struct LDKCResult_SignatureNoneZ CResult_SignatureNoneZ_clone(const struct LDKCResult_SignatureNoneZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SignatureNoneZ_clone")] public static extern long CResult_SignatureNoneZ_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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeyNoneZ_err")] public static extern long CResult_PublicKeyNoneZ_err();
        // bool CResult_PublicKeyNoneZ_is_ok(const struct LDKCResult_PublicKeyNoneZ *NONNULL_PTR o);
@@ -2064,32 +2874,20 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeyNoneZ_clone_ptr")] public static extern long CResult_PublicKeyNoneZ_clone_ptr(long _arg);
        // struct LDKCResult_PublicKeyNoneZ CResult_PublicKeyNoneZ_clone(const struct LDKCResult_PublicKeyNoneZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeyNoneZ_clone")] public static extern long CResult_PublicKeyNoneZ_clone(long _orig);
-       // struct LDKCOption_ScalarZ COption_ScalarZ_some(struct LDKBigEndianScalar o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ScalarZ_some")] public static extern long COption_ScalarZ_some(long _o);
-       // struct LDKCOption_ScalarZ COption_ScalarZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ScalarZ_none")] public static extern long COption_ScalarZ_none();
-       // void COption_ScalarZ_free(struct LDKCOption_ScalarZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ScalarZ_free")] public static extern void COption_ScalarZ_free(long __res);
-       // uint64_t COption_ScalarZ_clone_ptr(LDKCOption_ScalarZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ScalarZ_clone_ptr")] public static extern long COption_ScalarZ_clone_ptr(long _arg);
-       // struct LDKCOption_ScalarZ COption_ScalarZ_clone(const struct LDKCOption_ScalarZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ScalarZ_clone")] public static extern long COption_ScalarZ_clone(long _orig);
-       // struct LDKCResult_SharedSecretNoneZ CResult_SharedSecretNoneZ_ok(struct LDKThirtyTwoBytes o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SharedSecretNoneZ_ok")] public static extern long CResult_SharedSecretNoneZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCResult_SharedSecretNoneZ CResult_SharedSecretNoneZ_err(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SharedSecretNoneZ_err")] public static extern long CResult_SharedSecretNoneZ_err();
-       // bool CResult_SharedSecretNoneZ_is_ok(const struct LDKCResult_SharedSecretNoneZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SharedSecretNoneZ_is_ok")] public static extern bool CResult_SharedSecretNoneZ_is_ok(long _o);
-       // void CResult_SharedSecretNoneZ_free(struct LDKCResult_SharedSecretNoneZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SharedSecretNoneZ_free")] public static extern void CResult_SharedSecretNoneZ_free(long __res);
-       // uint64_t CResult_SharedSecretNoneZ_clone_ptr(LDKCResult_SharedSecretNoneZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SharedSecretNoneZ_clone_ptr")] public static extern long CResult_SharedSecretNoneZ_clone_ptr(long _arg);
-       // struct LDKCResult_SharedSecretNoneZ CResult_SharedSecretNoneZ_clone(const struct LDKCResult_SharedSecretNoneZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SharedSecretNoneZ_clone")] public static extern long CResult_SharedSecretNoneZ_clone(long _orig);
+       // struct LDKCOption_BigEndianScalarZ COption_BigEndianScalarZ_some(struct LDKBigEndianScalar o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_BigEndianScalarZ_some")] public static extern long COption_BigEndianScalarZ_some(long _o);
+       // struct LDKCOption_BigEndianScalarZ COption_BigEndianScalarZ_none(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_BigEndianScalarZ_none")] public static extern long COption_BigEndianScalarZ_none();
+       // void COption_BigEndianScalarZ_free(struct LDKCOption_BigEndianScalarZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_BigEndianScalarZ_free")] public static extern void COption_BigEndianScalarZ_free(long __res);
+       // uint64_t COption_BigEndianScalarZ_clone_ptr(LDKCOption_BigEndianScalarZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_BigEndianScalarZ_clone_ptr")] public static extern long COption_BigEndianScalarZ_clone_ptr(long _arg);
+       // struct LDKCOption_BigEndianScalarZ COption_BigEndianScalarZ_clone(const struct LDKCOption_BigEndianScalarZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_BigEndianScalarZ_clone")] public static extern long COption_BigEndianScalarZ_clone(long _orig);
        // void CVec_U5Z_free(struct LDKCVec_U5Z _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_U5Z_free")] public static extern void CVec_U5Z_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_U5Z_free")] public static extern void CVec_U5Z_free(long __res);
        // struct LDKCResult_RecoverableSignatureNoneZ CResult_RecoverableSignatureNoneZ_ok(struct LDKRecoverableSignature o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecoverableSignatureNoneZ_ok")] public static extern long CResult_RecoverableSignatureNoneZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecoverableSignatureNoneZ_ok")] public static extern long CResult_RecoverableSignatureNoneZ_ok(long _o);
        // struct LDKCResult_RecoverableSignatureNoneZ CResult_RecoverableSignatureNoneZ_err(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecoverableSignatureNoneZ_err")] public static extern long CResult_RecoverableSignatureNoneZ_err();
        // bool CResult_RecoverableSignatureNoneZ_is_ok(const struct LDKCResult_RecoverableSignatureNoneZ *NONNULL_PTR o);
@@ -2100,6 +2898,18 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecoverableSignatureNoneZ_clone_ptr")] public static extern long CResult_RecoverableSignatureNoneZ_clone_ptr(long _arg);
        // struct LDKCResult_RecoverableSignatureNoneZ CResult_RecoverableSignatureNoneZ_clone(const struct LDKCResult_RecoverableSignatureNoneZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RecoverableSignatureNoneZ_clone")] public static extern long CResult_RecoverableSignatureNoneZ_clone(long _orig);
+       // struct LDKCResult_SchnorrSignatureNoneZ CResult_SchnorrSignatureNoneZ_ok(struct LDKSchnorrSignature o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SchnorrSignatureNoneZ_ok")] public static extern long CResult_SchnorrSignatureNoneZ_ok(long _o);
+       // struct LDKCResult_SchnorrSignatureNoneZ CResult_SchnorrSignatureNoneZ_err(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SchnorrSignatureNoneZ_err")] public static extern long CResult_SchnorrSignatureNoneZ_err();
+       // bool CResult_SchnorrSignatureNoneZ_is_ok(const struct LDKCResult_SchnorrSignatureNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SchnorrSignatureNoneZ_is_ok")] public static extern bool CResult_SchnorrSignatureNoneZ_is_ok(long _o);
+       // void CResult_SchnorrSignatureNoneZ_free(struct LDKCResult_SchnorrSignatureNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SchnorrSignatureNoneZ_free")] public static extern void CResult_SchnorrSignatureNoneZ_free(long __res);
+       // uint64_t CResult_SchnorrSignatureNoneZ_clone_ptr(LDKCResult_SchnorrSignatureNoneZ *NONNULL_PTR arg);
+       [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_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);
@@ -2112,18 +2922,18 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone_ptr")] public static extern long CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone(const struct LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone")] public static extern long CResult_WriteableEcdsaChannelSignerDecodeErrorZ_clone(long _orig);
-       // struct LDKCResult_ScriptNoneZ CResult_ScriptNoneZ_ok(struct LDKCVec_u8Z o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ScriptNoneZ_ok")] public static extern long CResult_ScriptNoneZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCResult_ScriptNoneZ CResult_ScriptNoneZ_err(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ScriptNoneZ_err")] public static extern long CResult_ScriptNoneZ_err();
-       // bool CResult_ScriptNoneZ_is_ok(const struct LDKCResult_ScriptNoneZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ScriptNoneZ_is_ok")] public static extern bool CResult_ScriptNoneZ_is_ok(long _o);
-       // void CResult_ScriptNoneZ_free(struct LDKCResult_ScriptNoneZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ScriptNoneZ_free")] public static extern void CResult_ScriptNoneZ_free(long __res);
-       // uint64_t CResult_ScriptNoneZ_clone_ptr(LDKCResult_ScriptNoneZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ScriptNoneZ_clone_ptr")] public static extern long CResult_ScriptNoneZ_clone_ptr(long _arg);
-       // struct LDKCResult_ScriptNoneZ CResult_ScriptNoneZ_clone(const struct LDKCResult_ScriptNoneZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ScriptNoneZ_clone")] public static extern long CResult_ScriptNoneZ_clone(long _orig);
+       // struct LDKCResult_CVec_u8ZNoneZ CResult_CVec_u8ZNoneZ_ok(struct LDKCVec_u8Z o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZNoneZ_ok")] public static extern long CResult_CVec_u8ZNoneZ_ok(long _o);
+       // struct LDKCResult_CVec_u8ZNoneZ CResult_CVec_u8ZNoneZ_err(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZNoneZ_err")] public static extern long CResult_CVec_u8ZNoneZ_err();
+       // bool CResult_CVec_u8ZNoneZ_is_ok(const struct LDKCResult_CVec_u8ZNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZNoneZ_is_ok")] public static extern bool CResult_CVec_u8ZNoneZ_is_ok(long _o);
+       // void CResult_CVec_u8ZNoneZ_free(struct LDKCResult_CVec_u8ZNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZNoneZ_free")] public static extern void CResult_CVec_u8ZNoneZ_free(long __res);
+       // uint64_t CResult_CVec_u8ZNoneZ_clone_ptr(LDKCResult_CVec_u8ZNoneZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZNoneZ_clone_ptr")] public static extern long CResult_CVec_u8ZNoneZ_clone_ptr(long _arg);
+       // struct LDKCResult_CVec_u8ZNoneZ CResult_CVec_u8ZNoneZ_clone(const struct LDKCResult_CVec_u8ZNoneZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZNoneZ_clone")] public static extern long CResult_CVec_u8ZNoneZ_clone(long _orig);
        // struct LDKCResult_ShutdownScriptNoneZ CResult_ShutdownScriptNoneZ_ok(struct LDKShutdownScript o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ShutdownScriptNoneZ_ok")] public static extern long CResult_ShutdownScriptNoneZ_ok(long _o);
        // struct LDKCResult_ShutdownScriptNoneZ CResult_ShutdownScriptNoneZ_err(void);
@@ -2136,10 +2946,30 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ShutdownScriptNoneZ_clone_ptr")] public static extern long CResult_ShutdownScriptNoneZ_clone_ptr(long _arg);
        // struct LDKCResult_ShutdownScriptNoneZ CResult_ShutdownScriptNoneZ_clone(const struct LDKCResult_ShutdownScriptNoneZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ShutdownScriptNoneZ_clone")] public static extern long CResult_ShutdownScriptNoneZ_clone(long _orig);
+       // struct LDKCOption_u16Z COption_u16Z_some(uint16_t o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u16Z_some")] public static extern long COption_u16Z_some(short _o);
+       // struct LDKCOption_u16Z COption_u16Z_none(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u16Z_none")] public static extern long COption_u16Z_none();
+       // void COption_u16Z_free(struct LDKCOption_u16Z _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u16Z_free")] public static extern void COption_u16Z_free(long __res);
+       // uint64_t COption_u16Z_clone_ptr(LDKCOption_u16Z *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u16Z_clone_ptr")] public static extern long COption_u16Z_clone_ptr(long _arg);
+       // struct LDKCOption_u16Z COption_u16Z_clone(const struct LDKCOption_u16Z *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u16Z_clone")] public static extern long COption_u16Z_clone(long _orig);
+       // struct LDKCOption_boolZ COption_boolZ_some(bool o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_boolZ_some")] public static extern long COption_boolZ_some(bool _o);
+       // struct LDKCOption_boolZ COption_boolZ_none(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_boolZ_none")] public static extern long COption_boolZ_none();
+       // void COption_boolZ_free(struct LDKCOption_boolZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_boolZ_free")] public static extern void COption_boolZ_free(long __res);
+       // uint64_t COption_boolZ_clone_ptr(LDKCOption_boolZ *NONNULL_PTR arg);
+       [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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] __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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _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);
@@ -2162,20 +2992,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_InMemorySignerDecodeErrorZ_clone_ptr")] public static extern long CResult_InMemorySignerDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_InMemorySignerDecodeErrorZ CResult_InMemorySignerDecodeErrorZ_clone(const struct LDKCResult_InMemorySignerDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_InMemorySignerDecodeErrorZ_clone")] public static extern long CResult_InMemorySignerDecodeErrorZ_clone(long _orig);
-       // struct LDKCResult_PartiallySignedTransactionNoneZ CResult_PartiallySignedTransactionNoneZ_ok(struct LDKCVec_u8Z o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PartiallySignedTransactionNoneZ_ok")] public static extern long CResult_PartiallySignedTransactionNoneZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCResult_PartiallySignedTransactionNoneZ CResult_PartiallySignedTransactionNoneZ_err(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PartiallySignedTransactionNoneZ_err")] public static extern long CResult_PartiallySignedTransactionNoneZ_err();
-       // bool CResult_PartiallySignedTransactionNoneZ_is_ok(const struct LDKCResult_PartiallySignedTransactionNoneZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PartiallySignedTransactionNoneZ_is_ok")] public static extern bool CResult_PartiallySignedTransactionNoneZ_is_ok(long _o);
-       // void CResult_PartiallySignedTransactionNoneZ_free(struct LDKCResult_PartiallySignedTransactionNoneZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PartiallySignedTransactionNoneZ_free")] public static extern void CResult_PartiallySignedTransactionNoneZ_free(long __res);
-       // uint64_t CResult_PartiallySignedTransactionNoneZ_clone_ptr(LDKCResult_PartiallySignedTransactionNoneZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PartiallySignedTransactionNoneZ_clone_ptr")] public static extern long CResult_PartiallySignedTransactionNoneZ_clone_ptr(long _arg);
-       // struct LDKCResult_PartiallySignedTransactionNoneZ CResult_PartiallySignedTransactionNoneZ_clone(const struct LDKCResult_PartiallySignedTransactionNoneZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PartiallySignedTransactionNoneZ_clone")] public static extern long CResult_PartiallySignedTransactionNoneZ_clone(long _orig);
        // struct LDKCResult_TransactionNoneZ CResult_TransactionNoneZ_ok(struct LDKTransaction o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_TransactionNoneZ_ok")] public static extern long CResult_TransactionNoneZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_TransactionNoneZ_ok")] public static extern long CResult_TransactionNoneZ_ok(long _o);
        // struct LDKCResult_TransactionNoneZ CResult_TransactionNoneZ_err(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_TransactionNoneZ_err")] public static extern long CResult_TransactionNoneZ_err();
        // bool CResult_TransactionNoneZ_is_ok(const struct LDKCResult_TransactionNoneZ *NONNULL_PTR o);
@@ -2192,20 +3010,20 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_WriteableScoreZ_none")] public static extern long COption_WriteableScoreZ_none();
        // void COption_WriteableScoreZ_free(struct LDKCOption_WriteableScoreZ _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_WriteableScoreZ_free")] public static extern void COption_WriteableScoreZ_free(long __res);
-       // struct LDKCResult_NoneErrorZ CResult_NoneErrorZ_ok(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneErrorZ_ok")] public static extern long CResult_NoneErrorZ_ok();
-       // struct LDKCResult_NoneErrorZ CResult_NoneErrorZ_err(enum LDKIOError e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneErrorZ_err")] public static extern long CResult_NoneErrorZ_err(IOError _e);
-       // bool CResult_NoneErrorZ_is_ok(const struct LDKCResult_NoneErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneErrorZ_is_ok")] public static extern bool CResult_NoneErrorZ_is_ok(long _o);
-       // void CResult_NoneErrorZ_free(struct LDKCResult_NoneErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneErrorZ_free")] public static extern void CResult_NoneErrorZ_free(long __res);
-       // uint64_t CResult_NoneErrorZ_clone_ptr(LDKCResult_NoneErrorZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneErrorZ_clone_ptr")] public static extern long CResult_NoneErrorZ_clone_ptr(long _arg);
-       // struct LDKCResult_NoneErrorZ CResult_NoneErrorZ_clone(const struct LDKCResult_NoneErrorZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneErrorZ_clone")] public static extern long CResult_NoneErrorZ_clone(long _orig);
+       // struct LDKCResult_NoneIOErrorZ CResult_NoneIOErrorZ_ok(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneIOErrorZ_ok")] public static extern long CResult_NoneIOErrorZ_ok();
+       // struct LDKCResult_NoneIOErrorZ CResult_NoneIOErrorZ_err(enum LDKIOError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneIOErrorZ_err")] public static extern long CResult_NoneIOErrorZ_err(IOError _e);
+       // bool CResult_NoneIOErrorZ_is_ok(const struct LDKCResult_NoneIOErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneIOErrorZ_is_ok")] public static extern bool CResult_NoneIOErrorZ_is_ok(long _o);
+       // void CResult_NoneIOErrorZ_free(struct LDKCResult_NoneIOErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneIOErrorZ_free")] public static extern void CResult_NoneIOErrorZ_free(long __res);
+       // uint64_t CResult_NoneIOErrorZ_clone_ptr(LDKCResult_NoneIOErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneIOErrorZ_clone_ptr")] public static extern long CResult_NoneIOErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_NoneIOErrorZ CResult_NoneIOErrorZ_clone(const struct LDKCResult_NoneIOErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneIOErrorZ_clone")] public static extern long CResult_NoneIOErrorZ_clone(long _orig);
        // void CVec_ChannelDetailsZ_free(struct LDKCVec_ChannelDetailsZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_ChannelDetailsZ_free")] public static extern void CVec_ChannelDetailsZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_ChannelDetailsZ_free")] public static extern void CVec_ChannelDetailsZ_free(long __res);
        // struct LDKCResult_RouteLightningErrorZ CResult_RouteLightningErrorZ_ok(struct LDKRoute o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RouteLightningErrorZ_ok")] public static extern long CResult_RouteLightningErrorZ_ok(long _o);
        // struct LDKCResult_RouteLightningErrorZ CResult_RouteLightningErrorZ_err(struct LDKLightningError e);
@@ -2243,7 +3061,7 @@ internal class bindings {
        // struct LDKCResult_RouteHopDecodeErrorZ CResult_RouteHopDecodeErrorZ_clone(const struct LDKCResult_RouteHopDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RouteHopDecodeErrorZ_clone")] public static extern long CResult_RouteHopDecodeErrorZ_clone(long _orig);
        // void CVec_BlindedHopZ_free(struct LDKCVec_BlindedHopZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_BlindedHopZ_free")] public static extern void CVec_BlindedHopZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_BlindedHopZ_free")] public static extern void CVec_BlindedHopZ_free(long __res);
        // struct LDKCResult_BlindedTailDecodeErrorZ CResult_BlindedTailDecodeErrorZ_ok(struct LDKBlindedTail o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedTailDecodeErrorZ_ok")] public static extern long CResult_BlindedTailDecodeErrorZ_ok(long _o);
        // struct LDKCResult_BlindedTailDecodeErrorZ CResult_BlindedTailDecodeErrorZ_err(struct LDKDecodeError e);
@@ -2257,19 +3075,9 @@ internal class bindings {
        // struct LDKCResult_BlindedTailDecodeErrorZ CResult_BlindedTailDecodeErrorZ_clone(const struct LDKCResult_BlindedTailDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedTailDecodeErrorZ_clone")] public static extern long CResult_BlindedTailDecodeErrorZ_clone(long _orig);
        // void CVec_RouteHopZ_free(struct LDKCVec_RouteHopZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_RouteHopZ_free")] public static extern void CVec_RouteHopZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
-       // struct LDKCOption_u32Z COption_u32Z_some(uint32_t o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u32Z_some")] public static extern long COption_u32Z_some(int _o);
-       // struct LDKCOption_u32Z COption_u32Z_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u32Z_none")] public static extern long COption_u32Z_none();
-       // void COption_u32Z_free(struct LDKCOption_u32Z _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u32Z_free")] public static extern void COption_u32Z_free(long __res);
-       // uint64_t COption_u32Z_clone_ptr(LDKCOption_u32Z *NONNULL_PTR arg);
-       [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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_RouteHopZ_free")] public static extern void CVec_RouteHopZ_free(long __res);
        // void CVec_PathZ_free(struct LDKCVec_PathZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_PathZ_free")] public static extern void CVec_PathZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_PathZ_free")] public static extern void CVec_PathZ_free(long __res);
        // struct LDKCResult_RouteDecodeErrorZ CResult_RouteDecodeErrorZ_ok(struct LDKRoute o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RouteDecodeErrorZ_ok")] public static extern long CResult_RouteDecodeErrorZ_ok(long _o);
        // struct LDKCResult_RouteDecodeErrorZ CResult_RouteDecodeErrorZ_err(struct LDKDecodeError e);
@@ -2295,7 +3103,7 @@ internal class bindings {
        // struct LDKCResult_RouteParametersDecodeErrorZ CResult_RouteParametersDecodeErrorZ_clone(const struct LDKCResult_RouteParametersDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RouteParametersDecodeErrorZ_clone")] public static extern long CResult_RouteParametersDecodeErrorZ_clone(long _orig);
        // void CVec_u64Z_free(struct LDKCVec_u64Z _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_u64Z_free")] public static extern void CVec_u64Z_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_u64Z_free")] public static extern void CVec_u64Z_free(long __res);
        // struct LDKCResult_PaymentParametersDecodeErrorZ CResult_PaymentParametersDecodeErrorZ_ok(struct LDKPaymentParameters o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentParametersDecodeErrorZ_ok")] public static extern long CResult_PaymentParametersDecodeErrorZ_ok(long _o);
        // struct LDKCResult_PaymentParametersDecodeErrorZ CResult_PaymentParametersDecodeErrorZ_err(struct LDKDecodeError e);
@@ -2317,11 +3125,11 @@ internal class bindings {
        // 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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_RouteHintHopZ_free")] public static extern void CVec_RouteHintHopZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_RouteHintHopZ_free")] public static extern void CVec_RouteHintHopZ_free(long __res);
        // struct LDKCResult_RouteHintDecodeErrorZ CResult_RouteHintDecodeErrorZ_ok(struct LDKRouteHint o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RouteHintDecodeErrorZ_ok")] public static extern long CResult_RouteHintDecodeErrorZ_ok(long _o);
        // struct LDKCResult_RouteHintDecodeErrorZ CResult_RouteHintDecodeErrorZ_err(struct LDKDecodeError e);
@@ -2347,7 +3155,7 @@ internal class bindings {
        // 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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] __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);
@@ -2361,7 +3169,7 @@ internal class bindings {
        // struct LDKCResult_FixedPenaltyScorerDecodeErrorZ CResult_FixedPenaltyScorerDecodeErrorZ_clone(const struct LDKCResult_FixedPenaltyScorerDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_clone")] public static extern long CResult_FixedPenaltyScorerDecodeErrorZ_clone(long _orig);
        // void CVec_NodeIdZ_free(struct LDKCVec_NodeIdZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_NodeIdZ_free")] public static extern void CVec_NodeIdZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_NodeIdZ_free")] public static extern void CVec_NodeIdZ_free(long __res);
        // uint64_t C2Tuple_u64u64Z_clone_ptr(LDKC2Tuple_u64u64Z *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u64u64Z_clone_ptr")] public static extern long C2Tuple_u64u64Z_clone_ptr(long _arg);
        // struct LDKC2Tuple_u64u64Z C2Tuple_u64u64Z_clone(const struct LDKC2Tuple_u64u64Z *NONNULL_PTR orig);
@@ -2380,32 +3188,30 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_C2Tuple_u64u64ZZ_clone_ptr")] public static extern long COption_C2Tuple_u64u64ZZ_clone_ptr(long _arg);
        // struct LDKCOption_C2Tuple_u64u64ZZ COption_C2Tuple_u64u64ZZ_clone(const struct LDKCOption_C2Tuple_u64u64ZZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_C2Tuple_u64u64ZZ_clone")] public static extern long COption_C2Tuple_u64u64ZZ_clone(long _orig);
-       // uint64_t C2Tuple_Z_clone_ptr(LDKC2Tuple_Z *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_Z_clone_ptr")] public static extern long C2Tuple_Z_clone_ptr(long _arg);
-       // struct LDKC2Tuple_Z C2Tuple_Z_clone(const struct LDKC2Tuple_Z *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_Z_clone")] public static extern long C2Tuple_Z_clone(long _orig);
-       // struct LDKC2Tuple_Z C2Tuple_Z_new(struct LDKEightU16s a, struct LDKEightU16s b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_Z_new")] public static extern long C2Tuple_Z_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] short[] _a, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] short[] _b);
+       // struct LDKC2Tuple_Z C2Tuple_Z_new(struct LDKThirtyTwoU16s a, struct LDKThirtyTwoU16s b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_Z_new")] public static extern long C2Tuple_Z_new(long _a, long _b);
        // void C2Tuple_Z_free(struct LDKC2Tuple_Z _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_Z_free")] public static extern void C2Tuple_Z_free(long __res);
-       // uint64_t C2Tuple__u168_u168Z_clone_ptr(LDKC2Tuple__u168_u168Z *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple__u168_u168Z_clone_ptr")] public static extern long C2Tuple__u168_u168Z_clone_ptr(long _arg);
-       // struct LDKC2Tuple__u168_u168Z C2Tuple__u168_u168Z_clone(const struct LDKC2Tuple__u168_u168Z *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple__u168_u168Z_clone")] public static extern long C2Tuple__u168_u168Z_clone(long _orig);
-       // struct LDKC2Tuple__u168_u168Z C2Tuple__u168_u168Z_new(struct LDKEightU16s a, struct LDKEightU16s b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple__u168_u168Z_new")] public static extern long C2Tuple__u168_u168Z_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] short[] _a, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] short[] _b);
-       // void C2Tuple__u168_u168Z_free(struct LDKC2Tuple__u168_u168Z _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple__u168_u168Z_free")] public static extern void C2Tuple__u168_u168Z_free(long __res);
-       // struct LDKCOption_C2Tuple_EightU16sEightU16sZZ COption_C2Tuple_EightU16sEightU16sZZ_some(struct LDKC2Tuple__u168_u168Z o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_C2Tuple_EightU16sEightU16sZZ_some")] public static extern long COption_C2Tuple_EightU16sEightU16sZZ_some(long _o);
-       // struct LDKCOption_C2Tuple_EightU16sEightU16sZZ COption_C2Tuple_EightU16sEightU16sZZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_C2Tuple_EightU16sEightU16sZZ_none")] public static extern long COption_C2Tuple_EightU16sEightU16sZZ_none();
-       // void COption_C2Tuple_EightU16sEightU16sZZ_free(struct LDKCOption_C2Tuple_EightU16sEightU16sZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_C2Tuple_EightU16sEightU16sZZ_free")] public static extern void COption_C2Tuple_EightU16sEightU16sZZ_free(long __res);
-       // uint64_t COption_C2Tuple_EightU16sEightU16sZZ_clone_ptr(LDKCOption_C2Tuple_EightU16sEightU16sZZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_C2Tuple_EightU16sEightU16sZZ_clone_ptr")] public static extern long COption_C2Tuple_EightU16sEightU16sZZ_clone_ptr(long _arg);
-       // struct LDKCOption_C2Tuple_EightU16sEightU16sZZ COption_C2Tuple_EightU16sEightU16sZZ_clone(const struct LDKCOption_C2Tuple_EightU16sEightU16sZZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_C2Tuple_EightU16sEightU16sZZ_clone")] public static extern long COption_C2Tuple_EightU16sEightU16sZZ_clone(long _orig);
+       // struct LDKC2Tuple__u1632_u1632Z C2Tuple__u1632_u1632Z_new(struct LDKThirtyTwoU16s a, struct LDKThirtyTwoU16s b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple__u1632_u1632Z_new")] public static extern long C2Tuple__u1632_u1632Z_new(long _a, long _b);
+       // void C2Tuple__u1632_u1632Z_free(struct LDKC2Tuple__u1632_u1632Z _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple__u1632_u1632Z_free")] public static extern void C2Tuple__u1632_u1632Z_free(long __res);
+       // struct LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_some(struct LDKC2Tuple__u1632_u1632Z o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_some")] public static extern long COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_some(long _o);
+       // struct LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_none(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_none")] public static extern long COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_none();
+       // void COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_free(struct LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_free")] public static extern void COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_free(long __res);
+       // struct LDKCOption_f64Z COption_f64Z_some(double o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_f64Z_some")] public static extern long COption_f64Z_some(double _o);
+       // struct LDKCOption_f64Z COption_f64Z_none(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_f64Z_none")] public static extern long COption_f64Z_none();
+       // void COption_f64Z_free(struct LDKCOption_f64Z _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_f64Z_free")] public static extern void COption_f64Z_free(long __res);
+       // uint64_t COption_f64Z_clone_ptr(LDKCOption_f64Z *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_f64Z_clone_ptr")] public static extern long COption_f64Z_clone_ptr(long _arg);
+       // struct LDKCOption_f64Z COption_f64Z_clone(const struct LDKCOption_f64Z *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_f64Z_clone")] public static extern long COption_f64Z_clone(long _orig);
        // struct LDKCResult_ProbabilisticScorerDecodeErrorZ CResult_ProbabilisticScorerDecodeErrorZ_ok(struct LDKProbabilisticScorer o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ProbabilisticScorerDecodeErrorZ_ok")] public static extern long CResult_ProbabilisticScorerDecodeErrorZ_ok(long _o);
        // struct LDKCResult_ProbabilisticScorerDecodeErrorZ CResult_ProbabilisticScorerDecodeErrorZ_err(struct LDKDecodeError e);
@@ -2419,43 +3225,45 @@ internal class bindings {
        // struct LDKC2Tuple_usizeTransactionZ C2Tuple_usizeTransactionZ_clone(const struct LDKC2Tuple_usizeTransactionZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_usizeTransactionZ_clone")] public static extern long C2Tuple_usizeTransactionZ_clone(long _orig);
        // struct LDKC2Tuple_usizeTransactionZ C2Tuple_usizeTransactionZ_new(uintptr_t a, struct LDKTransaction b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_usizeTransactionZ_new")] public static extern long C2Tuple_usizeTransactionZ_new(long _a, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_usizeTransactionZ_new")] public static extern long C2Tuple_usizeTransactionZ_new(long _a, long _b);
        // void C2Tuple_usizeTransactionZ_free(struct LDKC2Tuple_usizeTransactionZ _res);
        [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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
-       // struct LDKCOption_BlockHashZ COption_BlockHashZ_some(struct LDKThirtyTwoBytes o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_BlockHashZ_some")] public static extern long COption_BlockHashZ_some([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCOption_BlockHashZ COption_BlockHashZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_BlockHashZ_none")] public static extern long COption_BlockHashZ_none();
-       // void COption_BlockHashZ_free(struct LDKCOption_BlockHashZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_BlockHashZ_free")] public static extern void COption_BlockHashZ_free(long __res);
-       // uint64_t COption_BlockHashZ_clone_ptr(LDKCOption_BlockHashZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_BlockHashZ_clone_ptr")] public static extern long COption_BlockHashZ_clone_ptr(long _arg);
-       // struct LDKCOption_BlockHashZ COption_BlockHashZ_clone(const struct LDKCOption_BlockHashZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_BlockHashZ_clone")] public static extern long COption_BlockHashZ_clone(long _orig);
-       // uint64_t C2Tuple_TxidCOption_BlockHashZZ_clone_ptr(LDKC2Tuple_TxidCOption_BlockHashZZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCOption_BlockHashZZ_clone_ptr")] public static extern long C2Tuple_TxidCOption_BlockHashZZ_clone_ptr(long _arg);
-       // struct LDKC2Tuple_TxidCOption_BlockHashZZ C2Tuple_TxidCOption_BlockHashZZ_clone(const struct LDKC2Tuple_TxidCOption_BlockHashZZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCOption_BlockHashZZ_clone")] public static extern long C2Tuple_TxidCOption_BlockHashZZ_clone(long _orig);
-       // struct LDKC2Tuple_TxidCOption_BlockHashZZ C2Tuple_TxidCOption_BlockHashZZ_new(struct LDKThirtyTwoBytes a, struct LDKCOption_BlockHashZ b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCOption_BlockHashZZ_new")] public static extern long C2Tuple_TxidCOption_BlockHashZZ_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a, long _b);
-       // void C2Tuple_TxidCOption_BlockHashZZ_free(struct LDKC2Tuple_TxidCOption_BlockHashZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCOption_BlockHashZZ_free")] public static extern void C2Tuple_TxidCOption_BlockHashZZ_free(long __res);
-       // void CVec_C2Tuple_TxidCOption_BlockHashZZZ_free(struct LDKCVec_C2Tuple_TxidCOption_BlockHashZZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_TxidCOption_BlockHashZZZ_free")] public static extern void CVec_C2Tuple_TxidCOption_BlockHashZZZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __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);
+       // 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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_err")] public static extern long CResult_ChannelMonitorUpdateStatusNoneZ_err();
+       // bool CResult_ChannelMonitorUpdateStatusNoneZ_is_ok(const struct LDKCResult_ChannelMonitorUpdateStatusNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_is_ok")] public static extern bool CResult_ChannelMonitorUpdateStatusNoneZ_is_ok(long _o);
+       // void CResult_ChannelMonitorUpdateStatusNoneZ_free(struct LDKCResult_ChannelMonitorUpdateStatusNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_free")] public static extern void CResult_ChannelMonitorUpdateStatusNoneZ_free(long __res);
+       // uint64_t CResult_ChannelMonitorUpdateStatusNoneZ_clone_ptr(LDKCResult_ChannelMonitorUpdateStatusNoneZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_clone_ptr")] public static extern long CResult_ChannelMonitorUpdateStatusNoneZ_clone_ptr(long _arg);
+       // struct LDKCResult_ChannelMonitorUpdateStatusNoneZ CResult_ChannelMonitorUpdateStatusNoneZ_clone(const struct LDKCResult_ChannelMonitorUpdateStatusNoneZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_clone")] public static extern long CResult_ChannelMonitorUpdateStatusNoneZ_clone(long _orig);
        // void CVec_MonitorEventZ_free(struct LDKCVec_MonitorEventZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_MonitorEventZ_free")] public static extern void CVec_MonitorEventZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_MonitorEventZ_free")] public static extern void CVec_MonitorEventZ_free(long __res);
        // uint64_t C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone_ptr(LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone_ptr")] public static extern long C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone_ptr(long _arg);
        // struct LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone(const struct LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone")] public static extern long C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_clone(long _orig);
        // struct LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_new(struct LDKOutPoint a, struct LDKCVec_MonitorEventZ b, struct LDKPublicKey c);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_new")] public static extern long C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_new(long _a, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _b, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _c);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_new")] public static extern long C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_new(long _a, long _b, long _c);
        // void C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_free(struct LDKC3Tuple_OutPointCVec_MonitorEventZPublicKeyZ _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_free")] public static extern void C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_free(long __res);
        // void CVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ_free(struct LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ_free")] public static extern void CVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ_free")] public static extern void CVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ_free(long __res);
        // struct LDKCResult_InitFeaturesDecodeErrorZ CResult_InitFeaturesDecodeErrorZ_ok(struct LDKInitFeatures o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_InitFeaturesDecodeErrorZ_ok")] public static extern long CResult_InitFeaturesDecodeErrorZ_ok(long _o);
        // struct LDKCResult_InitFeaturesDecodeErrorZ CResult_InitFeaturesDecodeErrorZ_err(struct LDKDecodeError e);
@@ -2540,8 +3348,6 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_clone_ptr")] public static extern long CResult_ChannelTypeFeaturesDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_ChannelTypeFeaturesDecodeErrorZ CResult_ChannelTypeFeaturesDecodeErrorZ_clone(const struct LDKCResult_ChannelTypeFeaturesDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelTypeFeaturesDecodeErrorZ_clone")] public static extern long CResult_ChannelTypeFeaturesDecodeErrorZ_clone(long _orig);
-       // void CVec_ChainHashZ_free(struct LDKCVec_ChainHashZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_ChainHashZ_free")] public static extern void CVec_ChainHashZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] __res);
        // struct LDKCResult_OfferBolt12ParseErrorZ CResult_OfferBolt12ParseErrorZ_ok(struct LDKOffer o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OfferBolt12ParseErrorZ_ok")] public static extern long CResult_OfferBolt12ParseErrorZ_ok(long _o);
        // struct LDKCResult_OfferBolt12ParseErrorZ CResult_OfferBolt12ParseErrorZ_err(struct LDKBolt12ParseError e);
@@ -2554,18 +3360,18 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OfferBolt12ParseErrorZ_clone_ptr")] public static extern long CResult_OfferBolt12ParseErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_OfferBolt12ParseErrorZ CResult_OfferBolt12ParseErrorZ_clone(const struct LDKCResult_OfferBolt12ParseErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OfferBolt12ParseErrorZ_clone")] public static extern long CResult_OfferBolt12ParseErrorZ_clone(long _orig);
-       // struct LDKCResult_PublicKeyErrorZ CResult_PublicKeyErrorZ_ok(struct LDKPublicKey o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeyErrorZ_ok")] public static extern long CResult_PublicKeyErrorZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCResult_PublicKeyErrorZ CResult_PublicKeyErrorZ_err(enum LDKSecp256k1Error e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeyErrorZ_err")] public static extern long CResult_PublicKeyErrorZ_err(Secp256k1Error _e);
-       // bool CResult_PublicKeyErrorZ_is_ok(const struct LDKCResult_PublicKeyErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeyErrorZ_is_ok")] public static extern bool CResult_PublicKeyErrorZ_is_ok(long _o);
-       // void CResult_PublicKeyErrorZ_free(struct LDKCResult_PublicKeyErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeyErrorZ_free")] public static extern void CResult_PublicKeyErrorZ_free(long __res);
-       // uint64_t CResult_PublicKeyErrorZ_clone_ptr(LDKCResult_PublicKeyErrorZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeyErrorZ_clone_ptr")] public static extern long CResult_PublicKeyErrorZ_clone_ptr(long _arg);
-       // struct LDKCResult_PublicKeyErrorZ CResult_PublicKeyErrorZ_clone(const struct LDKCResult_PublicKeyErrorZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeyErrorZ_clone")] public static extern long CResult_PublicKeyErrorZ_clone(long _orig);
+       // struct LDKCResult_PublicKeySecp256k1ErrorZ CResult_PublicKeySecp256k1ErrorZ_ok(struct LDKPublicKey o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeySecp256k1ErrorZ_ok")] public static extern long CResult_PublicKeySecp256k1ErrorZ_ok(long _o);
+       // struct LDKCResult_PublicKeySecp256k1ErrorZ CResult_PublicKeySecp256k1ErrorZ_err(enum LDKSecp256k1Error e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeySecp256k1ErrorZ_err")] public static extern long CResult_PublicKeySecp256k1ErrorZ_err(Secp256k1Error _e);
+       // bool CResult_PublicKeySecp256k1ErrorZ_is_ok(const struct LDKCResult_PublicKeySecp256k1ErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeySecp256k1ErrorZ_is_ok")] public static extern bool CResult_PublicKeySecp256k1ErrorZ_is_ok(long _o);
+       // void CResult_PublicKeySecp256k1ErrorZ_free(struct LDKCResult_PublicKeySecp256k1ErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeySecp256k1ErrorZ_free")] public static extern void CResult_PublicKeySecp256k1ErrorZ_free(long __res);
+       // uint64_t CResult_PublicKeySecp256k1ErrorZ_clone_ptr(LDKCResult_PublicKeySecp256k1ErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeySecp256k1ErrorZ_clone_ptr")] public static extern long CResult_PublicKeySecp256k1ErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_PublicKeySecp256k1ErrorZ CResult_PublicKeySecp256k1ErrorZ_clone(const struct LDKCResult_PublicKeySecp256k1ErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeySecp256k1ErrorZ_clone")] public static extern long CResult_PublicKeySecp256k1ErrorZ_clone(long _orig);
        // struct LDKCResult_NodeIdDecodeErrorZ CResult_NodeIdDecodeErrorZ_ok(struct LDKNodeId o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NodeIdDecodeErrorZ_ok")] public static extern long CResult_NodeIdDecodeErrorZ_ok(long _o);
        // struct LDKCResult_NodeIdDecodeErrorZ CResult_NodeIdDecodeErrorZ_err(struct LDKDecodeError e);
@@ -2649,7 +3455,7 @@ internal class bindings {
        // struct LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone(const struct LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone")] public static extern long COption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone(long _orig);
        // void CVec_MessageSendEventZ_free(struct LDKCVec_MessageSendEventZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_MessageSendEventZ_free")] public static extern void CVec_MessageSendEventZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_MessageSendEventZ_free")] public static extern void CVec_MessageSendEventZ_free(long __res);
        // struct LDKCResult_ChannelUpdateInfoDecodeErrorZ CResult_ChannelUpdateInfoDecodeErrorZ_ok(struct LDKChannelUpdateInfo o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelUpdateInfoDecodeErrorZ_ok")] public static extern long CResult_ChannelUpdateInfoDecodeErrorZ_ok(long _o);
        // struct LDKCResult_ChannelUpdateInfoDecodeErrorZ CResult_ChannelUpdateInfoDecodeErrorZ_err(struct LDKDecodeError e);
@@ -2686,8 +3492,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RoutingFeesDecodeErrorZ_clone_ptr")] public static extern long CResult_RoutingFeesDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_RoutingFeesDecodeErrorZ CResult_RoutingFeesDecodeErrorZ_clone(const struct LDKCResult_RoutingFeesDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RoutingFeesDecodeErrorZ_clone")] public static extern long CResult_RoutingFeesDecodeErrorZ_clone(long _orig);
-       // void CVec_NetAddressZ_free(struct LDKCVec_NetAddressZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_NetAddressZ_free")] public static extern void CVec_NetAddressZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       // void CVec_SocketAddressZ_free(struct LDKCVec_SocketAddressZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_SocketAddressZ_free")] public static extern void CVec_SocketAddressZ_free(long __res);
        // struct LDKCResult_NodeAnnouncementInfoDecodeErrorZ CResult_NodeAnnouncementInfoDecodeErrorZ_ok(struct LDKNodeAnnouncementInfo o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NodeAnnouncementInfoDecodeErrorZ_ok")] public static extern long CResult_NodeAnnouncementInfoDecodeErrorZ_ok(long _o);
        // struct LDKCResult_NodeAnnouncementInfoDecodeErrorZ CResult_NodeAnnouncementInfoDecodeErrorZ_err(struct LDKDecodeError e);
@@ -2732,32 +3538,22 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NetworkGraphDecodeErrorZ_is_ok")] public static extern bool CResult_NetworkGraphDecodeErrorZ_is_ok(long _o);
        // void CResult_NetworkGraphDecodeErrorZ_free(struct LDKCResult_NetworkGraphDecodeErrorZ _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NetworkGraphDecodeErrorZ_free")] public static extern void CResult_NetworkGraphDecodeErrorZ_free(long __res);
-       // struct LDKCOption_CVec_NetAddressZZ COption_CVec_NetAddressZZ_some(struct LDKCVec_NetAddressZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_NetAddressZZ_some")] public static extern long COption_CVec_NetAddressZZ_some([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _o);
-       // struct LDKCOption_CVec_NetAddressZZ COption_CVec_NetAddressZZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_NetAddressZZ_none")] public static extern long COption_CVec_NetAddressZZ_none();
-       // void COption_CVec_NetAddressZZ_free(struct LDKCOption_CVec_NetAddressZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_NetAddressZZ_free")] public static extern void COption_CVec_NetAddressZZ_free(long __res);
-       // uint64_t COption_CVec_NetAddressZZ_clone_ptr(LDKCOption_CVec_NetAddressZZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_NetAddressZZ_clone_ptr")] public static extern long COption_CVec_NetAddressZZ_clone_ptr(long _arg);
-       // struct LDKCOption_CVec_NetAddressZZ COption_CVec_NetAddressZZ_clone(const struct LDKCOption_CVec_NetAddressZZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_NetAddressZZ_clone")] public static extern long COption_CVec_NetAddressZZ_clone(long _orig);
-       // struct LDKCOption_PaymentPreimageZ COption_PaymentPreimageZ_some(struct LDKThirtyTwoBytes o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentPreimageZ_some")] public static extern long COption_PaymentPreimageZ_some([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCOption_PaymentPreimageZ COption_PaymentPreimageZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentPreimageZ_none")] public static extern long COption_PaymentPreimageZ_none();
-       // void COption_PaymentPreimageZ_free(struct LDKCOption_PaymentPreimageZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentPreimageZ_free")] public static extern void COption_PaymentPreimageZ_free(long __res);
-       // uint64_t COption_PaymentPreimageZ_clone_ptr(LDKCOption_PaymentPreimageZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentPreimageZ_clone_ptr")] public static extern long COption_PaymentPreimageZ_clone_ptr(long _arg);
-       // struct LDKCOption_PaymentPreimageZ COption_PaymentPreimageZ_clone(const struct LDKCOption_PaymentPreimageZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentPreimageZ_clone")] public static extern long COption_PaymentPreimageZ_clone(long _orig);
+       // struct LDKCOption_CVec_SocketAddressZZ COption_CVec_SocketAddressZZ_some(struct LDKCVec_SocketAddressZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_SocketAddressZZ_some")] public static extern long COption_CVec_SocketAddressZZ_some(long _o);
+       // struct LDKCOption_CVec_SocketAddressZZ COption_CVec_SocketAddressZZ_none(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_SocketAddressZZ_none")] public static extern long COption_CVec_SocketAddressZZ_none();
+       // void COption_CVec_SocketAddressZZ_free(struct LDKCOption_CVec_SocketAddressZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_SocketAddressZZ_free")] public static extern void COption_CVec_SocketAddressZZ_free(long __res);
+       // uint64_t COption_CVec_SocketAddressZZ_clone_ptr(LDKCOption_CVec_SocketAddressZZ *NONNULL_PTR arg);
+       [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);
        // void CVec_HTLCOutputInCommitmentZ_free(struct LDKCVec_HTLCOutputInCommitmentZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_HTLCOutputInCommitmentZ_free")] public static extern void CVec_HTLCOutputInCommitmentZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_HTLCDescriptorZ_free")] public static extern void CVec_HTLCDescriptorZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_HTLCDescriptorZ_free")] public static extern void CVec_HTLCDescriptorZ_free(long __res);
        // void CVec_UtxoZ_free(struct LDKCVec_UtxoZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_UtxoZ_free")] public static extern void CVec_UtxoZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_UtxoZ_free")] public static extern void CVec_UtxoZ_free(long __res);
        // struct LDKCOption_TxOutZ COption_TxOutZ_some(struct LDKTxOut o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_TxOutZ_some")] public static extern long COption_TxOutZ_some(long _o);
        // struct LDKCOption_TxOutZ COption_TxOutZ_none(void);
@@ -2769,7 +3565,7 @@ internal class bindings {
        // struct LDKCOption_TxOutZ COption_TxOutZ_clone(const struct LDKCOption_TxOutZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_TxOutZ_clone")] public static extern long COption_TxOutZ_clone(long _orig);
        // void CVec_InputZ_free(struct LDKCVec_InputZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_InputZ_free")] public static extern void CVec_InputZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_InputZ_free")] public static extern void CVec_InputZ_free(long __res);
        // struct LDKCResult_CoinSelectionNoneZ CResult_CoinSelectionNoneZ_ok(struct LDKCoinSelection o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CoinSelectionNoneZ_ok")] public static extern long CResult_CoinSelectionNoneZ_ok(long _o);
        // struct LDKCResult_CoinSelectionNoneZ CResult_CoinSelectionNoneZ_err(void);
@@ -2783,7 +3579,7 @@ internal class bindings {
        // struct LDKCResult_CoinSelectionNoneZ CResult_CoinSelectionNoneZ_clone(const struct LDKCResult_CoinSelectionNoneZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CoinSelectionNoneZ_clone")] public static extern long CResult_CoinSelectionNoneZ_clone(long _orig);
        // struct LDKCResult_CVec_UtxoZNoneZ CResult_CVec_UtxoZNoneZ_ok(struct LDKCVec_UtxoZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_UtxoZNoneZ_ok")] public static extern long CResult_CVec_UtxoZNoneZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_UtxoZNoneZ_ok")] public static extern long CResult_CVec_UtxoZNoneZ_ok(long _o);
        // struct LDKCResult_CVec_UtxoZNoneZ CResult_CVec_UtxoZNoneZ_err(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_UtxoZNoneZ_err")] public static extern long CResult_CVec_UtxoZNoneZ_err();
        // bool CResult_CVec_UtxoZNoneZ_is_ok(const struct LDKCResult_CVec_UtxoZNoneZ *NONNULL_PTR o);
@@ -2794,16 +3590,24 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_UtxoZNoneZ_clone_ptr")] public static extern long CResult_CVec_UtxoZNoneZ_clone_ptr(long _arg);
        // struct LDKCResult_CVec_UtxoZNoneZ CResult_CVec_UtxoZNoneZ_clone(const struct LDKCResult_CVec_UtxoZNoneZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_UtxoZNoneZ_clone")] public static extern long CResult_CVec_UtxoZNoneZ_clone(long _orig);
-       // struct LDKCOption_u16Z COption_u16Z_some(uint16_t o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u16Z_some")] public static extern long COption_u16Z_some(short _o);
-       // struct LDKCOption_u16Z COption_u16Z_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u16Z_none")] public static extern long COption_u16Z_none();
-       // void COption_u16Z_free(struct LDKCOption_u16Z _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u16Z_free")] public static extern void COption_u16Z_free(long __res);
-       // uint64_t COption_u16Z_clone_ptr(LDKCOption_u16Z *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u16Z_clone_ptr")] public static extern long COption_u16Z_clone_ptr(long _arg);
-       // struct LDKCOption_u16Z COption_u16Z_clone(const struct LDKCOption_u16Z *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u16Z_clone")] public static extern long COption_u16Z_clone(long _orig);
+       // uint64_t C2Tuple_u64u16Z_clone_ptr(LDKC2Tuple_u64u16Z *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u64u16Z_clone_ptr")] public static extern long C2Tuple_u64u16Z_clone_ptr(long _arg);
+       // struct LDKC2Tuple_u64u16Z C2Tuple_u64u16Z_clone(const struct LDKC2Tuple_u64u16Z *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u64u16Z_clone")] public static extern long C2Tuple_u64u16Z_clone(long _orig);
+       // struct LDKC2Tuple_u64u16Z C2Tuple_u64u16Z_new(uint64_t a, uint16_t b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u64u16Z_new")] public static extern long C2Tuple_u64u16Z_new(long _a, short _b);
+       // void C2Tuple_u64u16Z_free(struct LDKC2Tuple_u64u16Z _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u64u16Z_free")] public static extern void C2Tuple_u64u16Z_free(long __res);
+       // struct LDKCOption_C2Tuple_u64u16ZZ COption_C2Tuple_u64u16ZZ_some(struct LDKC2Tuple_u64u16Z o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_C2Tuple_u64u16ZZ_some")] public static extern long COption_C2Tuple_u64u16ZZ_some(long _o);
+       // struct LDKCOption_C2Tuple_u64u16ZZ COption_C2Tuple_u64u16ZZ_none(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_C2Tuple_u64u16ZZ_none")] public static extern long COption_C2Tuple_u64u16ZZ_none();
+       // void COption_C2Tuple_u64u16ZZ_free(struct LDKCOption_C2Tuple_u64u16ZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_C2Tuple_u64u16ZZ_free")] public static extern void COption_C2Tuple_u64u16ZZ_free(long __res);
+       // uint64_t COption_C2Tuple_u64u16ZZ_clone_ptr(LDKCOption_C2Tuple_u64u16ZZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_C2Tuple_u64u16ZZ_clone_ptr")] public static extern long COption_C2Tuple_u64u16ZZ_clone_ptr(long _arg);
+       // struct LDKCOption_C2Tuple_u64u16ZZ COption_C2Tuple_u64u16ZZ_clone(const struct LDKCOption_C2Tuple_u64u16ZZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_C2Tuple_u64u16ZZ_clone")] public static extern long COption_C2Tuple_u64u16ZZ_clone(long _orig);
        // struct LDKCOption_ChannelShutdownStateZ COption_ChannelShutdownStateZ_some(enum LDKChannelShutdownState o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ChannelShutdownStateZ_some")] public static extern long COption_ChannelShutdownStateZ_some(ChannelShutdownState _o);
        // struct LDKCOption_ChannelShutdownStateZ COption_ChannelShutdownStateZ_none(void);
@@ -2814,30 +3618,20 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ChannelShutdownStateZ_clone_ptr")] public static extern long COption_ChannelShutdownStateZ_clone_ptr(long _arg);
        // struct LDKCOption_ChannelShutdownStateZ COption_ChannelShutdownStateZ_clone(const struct LDKCOption_ChannelShutdownStateZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ChannelShutdownStateZ_clone")] public static extern long COption_ChannelShutdownStateZ_clone(long _orig);
-       // struct LDKCOption_PaymentHashZ COption_PaymentHashZ_some(struct LDKThirtyTwoBytes o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentHashZ_some")] public static extern long COption_PaymentHashZ_some([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCOption_PaymentHashZ COption_PaymentHashZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentHashZ_none")] public static extern long COption_PaymentHashZ_none();
-       // void COption_PaymentHashZ_free(struct LDKCOption_PaymentHashZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentHashZ_free")] public static extern void COption_PaymentHashZ_free(long __res);
-       // uint64_t COption_PaymentHashZ_clone_ptr(LDKCOption_PaymentHashZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentHashZ_clone_ptr")] public static extern long COption_PaymentHashZ_clone_ptr(long _arg);
-       // struct LDKCOption_PaymentHashZ COption_PaymentHashZ_clone(const struct LDKCOption_PaymentHashZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentHashZ_clone")] public static extern long COption_PaymentHashZ_clone(long _orig);
-       // struct LDKCResult__u832APIErrorZ CResult__u832APIErrorZ_ok(struct LDKThirtyTwoBytes o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult__u832APIErrorZ_ok")] public static extern long CResult__u832APIErrorZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCResult__u832APIErrorZ CResult__u832APIErrorZ_err(struct LDKAPIError e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult__u832APIErrorZ_err")] public static extern long CResult__u832APIErrorZ_err(long _e);
-       // bool CResult__u832APIErrorZ_is_ok(const struct LDKCResult__u832APIErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult__u832APIErrorZ_is_ok")] public static extern bool CResult__u832APIErrorZ_is_ok(long _o);
-       // void CResult__u832APIErrorZ_free(struct LDKCResult__u832APIErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult__u832APIErrorZ_free")] public static extern void CResult__u832APIErrorZ_free(long __res);
-       // uint64_t CResult__u832APIErrorZ_clone_ptr(LDKCResult__u832APIErrorZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult__u832APIErrorZ_clone_ptr")] public static extern long CResult__u832APIErrorZ_clone_ptr(long _arg);
-       // struct LDKCResult__u832APIErrorZ CResult__u832APIErrorZ_clone(const struct LDKCResult__u832APIErrorZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult__u832APIErrorZ_clone")] public static extern long CResult__u832APIErrorZ_clone(long _orig);
+       // struct LDKCResult_ThirtyTwoBytesAPIErrorZ CResult_ThirtyTwoBytesAPIErrorZ_ok(struct LDKThirtyTwoBytes o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_ok")] public static extern long CResult_ThirtyTwoBytesAPIErrorZ_ok(long _o);
+       // struct LDKCResult_ThirtyTwoBytesAPIErrorZ CResult_ThirtyTwoBytesAPIErrorZ_err(struct LDKAPIError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_err")] public static extern long CResult_ThirtyTwoBytesAPIErrorZ_err(long _e);
+       // bool CResult_ThirtyTwoBytesAPIErrorZ_is_ok(const struct LDKCResult_ThirtyTwoBytesAPIErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_is_ok")] public static extern bool CResult_ThirtyTwoBytesAPIErrorZ_is_ok(long _o);
+       // void CResult_ThirtyTwoBytesAPIErrorZ_free(struct LDKCResult_ThirtyTwoBytesAPIErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_free")] public static extern void CResult_ThirtyTwoBytesAPIErrorZ_free(long __res);
+       // uint64_t CResult_ThirtyTwoBytesAPIErrorZ_clone_ptr(LDKCResult_ThirtyTwoBytesAPIErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_clone_ptr")] public static extern long CResult_ThirtyTwoBytesAPIErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_ThirtyTwoBytesAPIErrorZ CResult_ThirtyTwoBytesAPIErrorZ_clone(const struct LDKCResult_ThirtyTwoBytesAPIErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesAPIErrorZ_clone")] public static extern long CResult_ThirtyTwoBytesAPIErrorZ_clone(long _orig);
        // void CVec_RecentPaymentDetailsZ_free(struct LDKCVec_RecentPaymentDetailsZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_RecentPaymentDetailsZ_free")] public static extern void CVec_RecentPaymentDetailsZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_RecentPaymentDetailsZ_free")] public static extern void CVec_RecentPaymentDetailsZ_free(long __res);
        // struct LDKCResult_NonePaymentSendFailureZ CResult_NonePaymentSendFailureZ_ok(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NonePaymentSendFailureZ_ok")] public static extern long CResult_NonePaymentSendFailureZ_ok();
        // struct LDKCResult_NonePaymentSendFailureZ CResult_NonePaymentSendFailureZ_err(struct LDKPaymentSendFailure e);
@@ -2862,106 +3656,128 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneRetryableSendFailureZ_clone_ptr")] public static extern long CResult_NoneRetryableSendFailureZ_clone_ptr(long _arg);
        // struct LDKCResult_NoneRetryableSendFailureZ CResult_NoneRetryableSendFailureZ_clone(const struct LDKCResult_NoneRetryableSendFailureZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneRetryableSendFailureZ_clone")] public static extern long CResult_NoneRetryableSendFailureZ_clone(long _orig);
-       // struct LDKCResult_PaymentHashPaymentSendFailureZ CResult_PaymentHashPaymentSendFailureZ_ok(struct LDKThirtyTwoBytes o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentHashPaymentSendFailureZ_ok")] public static extern long CResult_PaymentHashPaymentSendFailureZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCResult_PaymentHashPaymentSendFailureZ CResult_PaymentHashPaymentSendFailureZ_err(struct LDKPaymentSendFailure e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentHashPaymentSendFailureZ_err")] public static extern long CResult_PaymentHashPaymentSendFailureZ_err(long _e);
-       // bool CResult_PaymentHashPaymentSendFailureZ_is_ok(const struct LDKCResult_PaymentHashPaymentSendFailureZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentHashPaymentSendFailureZ_is_ok")] public static extern bool CResult_PaymentHashPaymentSendFailureZ_is_ok(long _o);
-       // void CResult_PaymentHashPaymentSendFailureZ_free(struct LDKCResult_PaymentHashPaymentSendFailureZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentHashPaymentSendFailureZ_free")] public static extern void CResult_PaymentHashPaymentSendFailureZ_free(long __res);
-       // uint64_t CResult_PaymentHashPaymentSendFailureZ_clone_ptr(LDKCResult_PaymentHashPaymentSendFailureZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentHashPaymentSendFailureZ_clone_ptr")] public static extern long CResult_PaymentHashPaymentSendFailureZ_clone_ptr(long _arg);
-       // struct LDKCResult_PaymentHashPaymentSendFailureZ CResult_PaymentHashPaymentSendFailureZ_clone(const struct LDKCResult_PaymentHashPaymentSendFailureZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentHashPaymentSendFailureZ_clone")] public static extern long CResult_PaymentHashPaymentSendFailureZ_clone(long _orig);
-       // struct LDKCResult_PaymentHashRetryableSendFailureZ CResult_PaymentHashRetryableSendFailureZ_ok(struct LDKThirtyTwoBytes o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentHashRetryableSendFailureZ_ok")] public static extern long CResult_PaymentHashRetryableSendFailureZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCResult_PaymentHashRetryableSendFailureZ CResult_PaymentHashRetryableSendFailureZ_err(enum LDKRetryableSendFailure e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentHashRetryableSendFailureZ_err")] public static extern long CResult_PaymentHashRetryableSendFailureZ_err(RetryableSendFailure _e);
-       // bool CResult_PaymentHashRetryableSendFailureZ_is_ok(const struct LDKCResult_PaymentHashRetryableSendFailureZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentHashRetryableSendFailureZ_is_ok")] public static extern bool CResult_PaymentHashRetryableSendFailureZ_is_ok(long _o);
-       // void CResult_PaymentHashRetryableSendFailureZ_free(struct LDKCResult_PaymentHashRetryableSendFailureZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentHashRetryableSendFailureZ_free")] public static extern void CResult_PaymentHashRetryableSendFailureZ_free(long __res);
-       // uint64_t CResult_PaymentHashRetryableSendFailureZ_clone_ptr(LDKCResult_PaymentHashRetryableSendFailureZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentHashRetryableSendFailureZ_clone_ptr")] public static extern long CResult_PaymentHashRetryableSendFailureZ_clone_ptr(long _arg);
-       // struct LDKCResult_PaymentHashRetryableSendFailureZ CResult_PaymentHashRetryableSendFailureZ_clone(const struct LDKCResult_PaymentHashRetryableSendFailureZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentHashRetryableSendFailureZ_clone")] public static extern long CResult_PaymentHashRetryableSendFailureZ_clone(long _orig);
-       // uint64_t C2Tuple_PaymentHashPaymentIdZ_clone_ptr(LDKC2Tuple_PaymentHashPaymentIdZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PaymentHashPaymentIdZ_clone_ptr")] public static extern long C2Tuple_PaymentHashPaymentIdZ_clone_ptr(long _arg);
-       // struct LDKC2Tuple_PaymentHashPaymentIdZ C2Tuple_PaymentHashPaymentIdZ_clone(const struct LDKC2Tuple_PaymentHashPaymentIdZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PaymentHashPaymentIdZ_clone")] public static extern long C2Tuple_PaymentHashPaymentIdZ_clone(long _orig);
-       // struct LDKC2Tuple_PaymentHashPaymentIdZ C2Tuple_PaymentHashPaymentIdZ_new(struct LDKThirtyTwoBytes a, struct LDKThirtyTwoBytes b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PaymentHashPaymentIdZ_new")] public static extern long C2Tuple_PaymentHashPaymentIdZ_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _b);
-       // void C2Tuple_PaymentHashPaymentIdZ_free(struct LDKC2Tuple_PaymentHashPaymentIdZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PaymentHashPaymentIdZ_free")] public static extern void C2Tuple_PaymentHashPaymentIdZ_free(long __res);
-       // struct LDKCResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_ok(struct LDKC2Tuple_PaymentHashPaymentIdZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_ok")] public static extern long CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_ok(long _o);
-       // struct LDKCResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_err(struct LDKPaymentSendFailure e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_err")] public static extern long CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_err(long _e);
-       // bool CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_is_ok(const struct LDKCResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_is_ok")] public static extern bool CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_is_ok(long _o);
-       // void CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_free(struct LDKCResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_free")] public static extern void CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_free(long __res);
-       // uint64_t CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_clone_ptr(LDKCResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_clone_ptr")] public static extern long CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_clone_ptr(long _arg);
-       // struct LDKCResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_clone(const struct LDKCResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_clone")] public static extern long CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_clone(long _orig);
-       // void CVec_ThirtyTwoBytesZ_free(struct LDKCVec_ThirtyTwoBytesZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_ThirtyTwoBytesZ_free")] public static extern void CVec_ThirtyTwoBytesZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] __res);
-       // uint64_t C2Tuple_PaymentHashPaymentSecretZ_clone_ptr(LDKC2Tuple_PaymentHashPaymentSecretZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PaymentHashPaymentSecretZ_clone_ptr")] public static extern long C2Tuple_PaymentHashPaymentSecretZ_clone_ptr(long _arg);
-       // struct LDKC2Tuple_PaymentHashPaymentSecretZ C2Tuple_PaymentHashPaymentSecretZ_clone(const struct LDKC2Tuple_PaymentHashPaymentSecretZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PaymentHashPaymentSecretZ_clone")] public static extern long C2Tuple_PaymentHashPaymentSecretZ_clone(long _orig);
-       // struct LDKC2Tuple_PaymentHashPaymentSecretZ C2Tuple_PaymentHashPaymentSecretZ_new(struct LDKThirtyTwoBytes a, struct LDKThirtyTwoBytes b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PaymentHashPaymentSecretZ_new")] public static extern long C2Tuple_PaymentHashPaymentSecretZ_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _b);
-       // void C2Tuple_PaymentHashPaymentSecretZ_free(struct LDKC2Tuple_PaymentHashPaymentSecretZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PaymentHashPaymentSecretZ_free")] public static extern void C2Tuple_PaymentHashPaymentSecretZ_free(long __res);
-       // struct LDKCResult_C2Tuple_PaymentHashPaymentSecretZNoneZ CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_ok(struct LDKC2Tuple_PaymentHashPaymentSecretZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_ok")] public static extern long CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_ok(long _o);
-       // struct LDKCResult_C2Tuple_PaymentHashPaymentSecretZNoneZ CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_err(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_err")] public static extern long CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_err();
-       // bool CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_is_ok(const struct LDKCResult_C2Tuple_PaymentHashPaymentSecretZNoneZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_is_ok")] public static extern bool CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_is_ok(long _o);
-       // void CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_free(struct LDKCResult_C2Tuple_PaymentHashPaymentSecretZNoneZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_free")] public static extern void CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_free(long __res);
-       // uint64_t CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_clone_ptr(LDKCResult_C2Tuple_PaymentHashPaymentSecretZNoneZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_clone_ptr")] public static extern long CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_clone_ptr(long _arg);
-       // struct LDKCResult_C2Tuple_PaymentHashPaymentSecretZNoneZ CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_clone(const struct LDKCResult_C2Tuple_PaymentHashPaymentSecretZNoneZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_clone")] public static extern long CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_clone(long _orig);
-       // struct LDKCResult_PaymentSecretNoneZ CResult_PaymentSecretNoneZ_ok(struct LDKThirtyTwoBytes o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentSecretNoneZ_ok")] public static extern long CResult_PaymentSecretNoneZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCResult_PaymentSecretNoneZ CResult_PaymentSecretNoneZ_err(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentSecretNoneZ_err")] public static extern long CResult_PaymentSecretNoneZ_err();
-       // bool CResult_PaymentSecretNoneZ_is_ok(const struct LDKCResult_PaymentSecretNoneZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentSecretNoneZ_is_ok")] public static extern bool CResult_PaymentSecretNoneZ_is_ok(long _o);
-       // void CResult_PaymentSecretNoneZ_free(struct LDKCResult_PaymentSecretNoneZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentSecretNoneZ_free")] public static extern void CResult_PaymentSecretNoneZ_free(long __res);
-       // uint64_t CResult_PaymentSecretNoneZ_clone_ptr(LDKCResult_PaymentSecretNoneZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentSecretNoneZ_clone_ptr")] public static extern long CResult_PaymentSecretNoneZ_clone_ptr(long _arg);
-       // struct LDKCResult_PaymentSecretNoneZ CResult_PaymentSecretNoneZ_clone(const struct LDKCResult_PaymentSecretNoneZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentSecretNoneZ_clone")] public static extern long CResult_PaymentSecretNoneZ_clone(long _orig);
-       // struct LDKCResult_PaymentPreimageAPIErrorZ CResult_PaymentPreimageAPIErrorZ_ok(struct LDKThirtyTwoBytes o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentPreimageAPIErrorZ_ok")] public static extern long CResult_PaymentPreimageAPIErrorZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCResult_PaymentPreimageAPIErrorZ CResult_PaymentPreimageAPIErrorZ_err(struct LDKAPIError e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentPreimageAPIErrorZ_err")] public static extern long CResult_PaymentPreimageAPIErrorZ_err(long _e);
-       // bool CResult_PaymentPreimageAPIErrorZ_is_ok(const struct LDKCResult_PaymentPreimageAPIErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentPreimageAPIErrorZ_is_ok")] public static extern bool CResult_PaymentPreimageAPIErrorZ_is_ok(long _o);
-       // void CResult_PaymentPreimageAPIErrorZ_free(struct LDKCResult_PaymentPreimageAPIErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentPreimageAPIErrorZ_free")] public static extern void CResult_PaymentPreimageAPIErrorZ_free(long __res);
-       // uint64_t CResult_PaymentPreimageAPIErrorZ_clone_ptr(LDKCResult_PaymentPreimageAPIErrorZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentPreimageAPIErrorZ_clone_ptr")] public static extern long CResult_PaymentPreimageAPIErrorZ_clone_ptr(long _arg);
-       // struct LDKCResult_PaymentPreimageAPIErrorZ CResult_PaymentPreimageAPIErrorZ_clone(const struct LDKCResult_PaymentPreimageAPIErrorZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentPreimageAPIErrorZ_clone")] public static extern long CResult_PaymentPreimageAPIErrorZ_clone(long _orig);
-       // struct LDKCOption_CVec_ChainHashZZ COption_CVec_ChainHashZZ_some(struct LDKCVec_ChainHashZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_ChainHashZZ_some")] public static extern long COption_CVec_ChainHashZZ_some([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _o);
-       // struct LDKCOption_CVec_ChainHashZZ COption_CVec_ChainHashZZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_ChainHashZZ_none")] public static extern long COption_CVec_ChainHashZZ_none();
-       // void COption_CVec_ChainHashZZ_free(struct LDKCOption_CVec_ChainHashZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_ChainHashZZ_free")] public static extern void COption_CVec_ChainHashZZ_free(long __res);
-       // uint64_t COption_CVec_ChainHashZZ_clone_ptr(LDKCOption_CVec_ChainHashZZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_ChainHashZZ_clone_ptr")] public static extern long COption_CVec_ChainHashZZ_clone_ptr(long _arg);
-       // struct LDKCOption_CVec_ChainHashZZ COption_CVec_ChainHashZZ_clone(const struct LDKCOption_CVec_ChainHashZZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_ChainHashZZ_clone")] public static extern long COption_CVec_ChainHashZZ_clone(long _orig);
+       // struct LDKCResult_ThirtyTwoBytesPaymentSendFailureZ CResult_ThirtyTwoBytesPaymentSendFailureZ_ok(struct LDKThirtyTwoBytes o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_ok")] public static extern long CResult_ThirtyTwoBytesPaymentSendFailureZ_ok(long _o);
+       // struct LDKCResult_ThirtyTwoBytesPaymentSendFailureZ CResult_ThirtyTwoBytesPaymentSendFailureZ_err(struct LDKPaymentSendFailure e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_err")] public static extern long CResult_ThirtyTwoBytesPaymentSendFailureZ_err(long _e);
+       // bool CResult_ThirtyTwoBytesPaymentSendFailureZ_is_ok(const struct LDKCResult_ThirtyTwoBytesPaymentSendFailureZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_is_ok")] public static extern bool CResult_ThirtyTwoBytesPaymentSendFailureZ_is_ok(long _o);
+       // void CResult_ThirtyTwoBytesPaymentSendFailureZ_free(struct LDKCResult_ThirtyTwoBytesPaymentSendFailureZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_free")] public static extern void CResult_ThirtyTwoBytesPaymentSendFailureZ_free(long __res);
+       // uint64_t CResult_ThirtyTwoBytesPaymentSendFailureZ_clone_ptr(LDKCResult_ThirtyTwoBytesPaymentSendFailureZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_clone_ptr")] public static extern long CResult_ThirtyTwoBytesPaymentSendFailureZ_clone_ptr(long _arg);
+       // struct LDKCResult_ThirtyTwoBytesPaymentSendFailureZ CResult_ThirtyTwoBytesPaymentSendFailureZ_clone(const struct LDKCResult_ThirtyTwoBytesPaymentSendFailureZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesPaymentSendFailureZ_clone")] public static extern long CResult_ThirtyTwoBytesPaymentSendFailureZ_clone(long _orig);
+       // struct LDKCResult_ThirtyTwoBytesRetryableSendFailureZ CResult_ThirtyTwoBytesRetryableSendFailureZ_ok(struct LDKThirtyTwoBytes o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_ok")] public static extern long CResult_ThirtyTwoBytesRetryableSendFailureZ_ok(long _o);
+       // struct LDKCResult_ThirtyTwoBytesRetryableSendFailureZ CResult_ThirtyTwoBytesRetryableSendFailureZ_err(enum LDKRetryableSendFailure e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_err")] public static extern long CResult_ThirtyTwoBytesRetryableSendFailureZ_err(RetryableSendFailure _e);
+       // bool CResult_ThirtyTwoBytesRetryableSendFailureZ_is_ok(const struct LDKCResult_ThirtyTwoBytesRetryableSendFailureZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_is_ok")] public static extern bool CResult_ThirtyTwoBytesRetryableSendFailureZ_is_ok(long _o);
+       // void CResult_ThirtyTwoBytesRetryableSendFailureZ_free(struct LDKCResult_ThirtyTwoBytesRetryableSendFailureZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_free")] public static extern void CResult_ThirtyTwoBytesRetryableSendFailureZ_free(long __res);
+       // uint64_t CResult_ThirtyTwoBytesRetryableSendFailureZ_clone_ptr(LDKCResult_ThirtyTwoBytesRetryableSendFailureZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_clone_ptr")] public static extern long CResult_ThirtyTwoBytesRetryableSendFailureZ_clone_ptr(long _arg);
+       // struct LDKCResult_ThirtyTwoBytesRetryableSendFailureZ CResult_ThirtyTwoBytesRetryableSendFailureZ_clone(const struct LDKCResult_ThirtyTwoBytesRetryableSendFailureZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesRetryableSendFailureZ_clone")] public static extern long CResult_ThirtyTwoBytesRetryableSendFailureZ_clone(long _orig);
+       // uint64_t C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone_ptr")] public static extern long C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone_ptr(long _arg);
+       // struct LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone(const struct LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone")] public static extern long C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone(long _orig);
+       // struct LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_new(struct LDKThirtyTwoBytes a, struct LDKThirtyTwoBytes b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_new")] public static extern long C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_new(long _a, long _b);
+       // void C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_free(struct LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_free")] public static extern void C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_free(long __res);
+       // struct LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_ok(struct LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_ok")] public static extern long CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_ok(long _o);
+       // struct LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_err(struct LDKPaymentSendFailure e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_err")] public static extern long CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_err(long _e);
+       // bool CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_is_ok(const struct LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_is_ok")] public static extern bool CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_is_ok(long _o);
+       // void CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_free(struct LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_free")] public static extern void CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_free(long __res);
+       // uint64_t CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone_ptr(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone_ptr")] public static extern long CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone_ptr(long _arg);
+       // struct LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone(const struct LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone")] public static extern long CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone(long _orig);
+       // void CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ_free(struct LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ_free")] public static extern void CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ_free(long __res);
+       // struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_ok(struct LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_ok")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_ok(long _o);
+       // struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_err(struct LDKProbeSendFailure e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_err")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_err(long _e);
+       // bool CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_is_ok(const struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_is_ok")] public static extern bool CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_is_ok(long _o);
+       // void CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_free(struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_free")] public static extern void CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_free(long __res);
+       // uint64_t CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone_ptr(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone_ptr")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone_ptr(long _arg);
+       // struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone(const struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone(long _orig);
+       // uint64_t C2Tuple_ThirtyTwoBytesPublicKeyZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesPublicKeyZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_clone_ptr")] public static extern long C2Tuple_ThirtyTwoBytesPublicKeyZ_clone_ptr(long _arg);
+       // struct LDKC2Tuple_ThirtyTwoBytesPublicKeyZ C2Tuple_ThirtyTwoBytesPublicKeyZ_clone(const struct LDKC2Tuple_ThirtyTwoBytesPublicKeyZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_clone")] public static extern long C2Tuple_ThirtyTwoBytesPublicKeyZ_clone(long _orig);
+       // struct LDKC2Tuple_ThirtyTwoBytesPublicKeyZ C2Tuple_ThirtyTwoBytesPublicKeyZ_new(struct LDKThirtyTwoBytes a, struct LDKPublicKey b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_new")] public static extern long C2Tuple_ThirtyTwoBytesPublicKeyZ_new(long _a, long _b);
+       // void C2Tuple_ThirtyTwoBytesPublicKeyZ_free(struct LDKC2Tuple_ThirtyTwoBytesPublicKeyZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesPublicKeyZ_free")] public static extern void C2Tuple_ThirtyTwoBytesPublicKeyZ_free(long __res);
+       // void CVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ_free(struct LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ_free")] public static extern void CVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ_free(long __res);
+       // struct LDKCOption_StrZ COption_StrZ_some(struct LDKStr o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_StrZ_some")] public static extern long COption_StrZ_some(long _o);
+       // struct LDKCOption_StrZ COption_StrZ_none(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_StrZ_none")] public static extern long COption_StrZ_none();
+       // void COption_StrZ_free(struct LDKCOption_StrZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_StrZ_free")] public static extern void COption_StrZ_free(long __res);
+       // uint64_t COption_StrZ_clone_ptr(LDKCOption_StrZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_StrZ_clone_ptr")] public static extern long COption_StrZ_clone_ptr(long _arg);
+       // struct LDKCOption_StrZ COption_StrZ_clone(const struct LDKCOption_StrZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_StrZ_clone")] public static extern long COption_StrZ_clone(long _orig);
+       // struct LDKCResult_NoneBolt12SemanticErrorZ CResult_NoneBolt12SemanticErrorZ_ok(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneBolt12SemanticErrorZ_ok")] public static extern long CResult_NoneBolt12SemanticErrorZ_ok();
+       // struct LDKCResult_NoneBolt12SemanticErrorZ CResult_NoneBolt12SemanticErrorZ_err(enum LDKBolt12SemanticError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneBolt12SemanticErrorZ_err")] public static extern long CResult_NoneBolt12SemanticErrorZ_err(Bolt12SemanticError _e);
+       // bool CResult_NoneBolt12SemanticErrorZ_is_ok(const struct LDKCResult_NoneBolt12SemanticErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneBolt12SemanticErrorZ_is_ok")] public static extern bool CResult_NoneBolt12SemanticErrorZ_is_ok(long _o);
+       // void CResult_NoneBolt12SemanticErrorZ_free(struct LDKCResult_NoneBolt12SemanticErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneBolt12SemanticErrorZ_free")] public static extern void CResult_NoneBolt12SemanticErrorZ_free(long __res);
+       // uint64_t CResult_NoneBolt12SemanticErrorZ_clone_ptr(LDKCResult_NoneBolt12SemanticErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneBolt12SemanticErrorZ_clone_ptr")] public static extern long CResult_NoneBolt12SemanticErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_NoneBolt12SemanticErrorZ CResult_NoneBolt12SemanticErrorZ_clone(const struct LDKCResult_NoneBolt12SemanticErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneBolt12SemanticErrorZ_clone")] public static extern long CResult_NoneBolt12SemanticErrorZ_clone(long _orig);
+       // struct LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_ok(struct LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_ok")] public static extern long CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_ok(long _o);
+       // struct LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_err(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_err")] public static extern long CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_err();
+       // bool CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_is_ok(const struct LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_is_ok")] public static extern bool CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_is_ok(long _o);
+       // void CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_free(struct LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_free")] public static extern void CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_free(long __res);
+       // uint64_t CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone_ptr(LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone_ptr")] public static extern long CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone_ptr(long _arg);
+       // struct LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone(const struct LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone")] public static extern long CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone(long _orig);
+       // struct LDKCOption_OffersMessageZ COption_OffersMessageZ_some(struct LDKOffersMessage o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_OffersMessageZ_some")] public static extern long COption_OffersMessageZ_some(long _o);
+       // struct LDKCOption_OffersMessageZ COption_OffersMessageZ_none(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_OffersMessageZ_none")] public static extern long COption_OffersMessageZ_none();
+       // void COption_OffersMessageZ_free(struct LDKCOption_OffersMessageZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_OffersMessageZ_free")] public static extern void COption_OffersMessageZ_free(long __res);
+       // uint64_t COption_OffersMessageZ_clone_ptr(LDKCOption_OffersMessageZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_OffersMessageZ_clone_ptr")] public static extern long COption_OffersMessageZ_clone_ptr(long _arg);
+       // struct LDKCOption_OffersMessageZ COption_OffersMessageZ_clone(const struct LDKCOption_OffersMessageZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_OffersMessageZ_clone")] public static extern long COption_OffersMessageZ_clone(long _orig);
+       // uint64_t C3Tuple_OffersMessageDestinationBlindedPathZ_clone_ptr(LDKC3Tuple_OffersMessageDestinationBlindedPathZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_clone_ptr")] public static extern long C3Tuple_OffersMessageDestinationBlindedPathZ_clone_ptr(long _arg);
+       // struct LDKC3Tuple_OffersMessageDestinationBlindedPathZ C3Tuple_OffersMessageDestinationBlindedPathZ_clone(const struct LDKC3Tuple_OffersMessageDestinationBlindedPathZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_clone")] public static extern long C3Tuple_OffersMessageDestinationBlindedPathZ_clone(long _orig);
+       // struct LDKC3Tuple_OffersMessageDestinationBlindedPathZ C3Tuple_OffersMessageDestinationBlindedPathZ_new(struct LDKOffersMessage a, struct LDKDestination b, struct LDKBlindedPath c);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_new")] public static extern long C3Tuple_OffersMessageDestinationBlindedPathZ_new(long _a, long _b, long _c);
+       // void C3Tuple_OffersMessageDestinationBlindedPathZ_free(struct LDKC3Tuple_OffersMessageDestinationBlindedPathZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OffersMessageDestinationBlindedPathZ_free")] public static extern void C3Tuple_OffersMessageDestinationBlindedPathZ_free(long __res);
+       // void CVec_C3Tuple_OffersMessageDestinationBlindedPathZZ_free(struct LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C3Tuple_OffersMessageDestinationBlindedPathZZ_free")] public static extern void CVec_C3Tuple_OffersMessageDestinationBlindedPathZZ_free(long __res);
        // struct LDKCResult_CounterpartyForwardingInfoDecodeErrorZ CResult_CounterpartyForwardingInfoDecodeErrorZ_ok(struct LDKCounterpartyForwardingInfo o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CounterpartyForwardingInfoDecodeErrorZ_ok")] public static extern long CResult_CounterpartyForwardingInfoDecodeErrorZ_ok(long _o);
        // struct LDKCResult_CounterpartyForwardingInfoDecodeErrorZ CResult_CounterpartyForwardingInfoDecodeErrorZ_err(struct LDKDecodeError e);
@@ -3023,19 +3839,19 @@ internal class bindings {
        // struct LDKCResult_ChannelShutdownStateDecodeErrorZ CResult_ChannelShutdownStateDecodeErrorZ_clone(const struct LDKCResult_ChannelShutdownStateDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_clone")] public static extern long CResult_ChannelShutdownStateDecodeErrorZ_clone(long _orig);
        // void CVec_ChannelMonitorZ_free(struct LDKCVec_ChannelMonitorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_ChannelMonitorZ_free")] public static extern void CVec_ChannelMonitorZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
-       // struct LDKC2Tuple_BlockHashChannelManagerZ C2Tuple_BlockHashChannelManagerZ_new(struct LDKThirtyTwoBytes a, struct LDKChannelManager b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlockHashChannelManagerZ_new")] public static extern long C2Tuple_BlockHashChannelManagerZ_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a, long _b);
-       // void C2Tuple_BlockHashChannelManagerZ_free(struct LDKC2Tuple_BlockHashChannelManagerZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlockHashChannelManagerZ_free")] public static extern void C2Tuple_BlockHashChannelManagerZ_free(long __res);
-       // struct LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_ok(struct LDKC2Tuple_BlockHashChannelManagerZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_ok")] public static extern long CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_ok(long _o);
-       // struct LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_err(struct LDKDecodeError e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_err")] public static extern long CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_err(long _e);
-       // bool CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_is_ok(const struct LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_is_ok")] public static extern bool CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_is_ok(long _o);
-       // void CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_free(struct LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_free")] public static extern void CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_free(long __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_ChannelMonitorZ_free")] public static extern void CVec_ChannelMonitorZ_free(long __res);
+       // struct LDKC2Tuple_ThirtyTwoBytesChannelManagerZ C2Tuple_ThirtyTwoBytesChannelManagerZ_new(struct LDKThirtyTwoBytes a, struct LDKChannelManager b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_new")] public static extern long C2Tuple_ThirtyTwoBytesChannelManagerZ_new(long _a, long _b);
+       // void C2Tuple_ThirtyTwoBytesChannelManagerZ_free(struct LDKC2Tuple_ThirtyTwoBytesChannelManagerZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_free")] public static extern void C2Tuple_ThirtyTwoBytesChannelManagerZ_free(long __res);
+       // struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_ok(struct LDKC2Tuple_ThirtyTwoBytesChannelManagerZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_ok")] public static extern long CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_err")] public static extern long CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_err(long _e);
+       // bool CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_is_ok(const struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_is_ok")] public static extern bool CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_is_ok(long _o);
+       // void CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_free(struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_free")] public static extern void CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_free(long __res);
        // struct LDKCResult_MaxDustHTLCExposureDecodeErrorZ CResult_MaxDustHTLCExposureDecodeErrorZ_ok(struct LDKMaxDustHTLCExposure o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_MaxDustHTLCExposureDecodeErrorZ_ok")] public static extern long CResult_MaxDustHTLCExposureDecodeErrorZ_ok(long _o);
        // struct LDKCResult_MaxDustHTLCExposureDecodeErrorZ CResult_MaxDustHTLCExposureDecodeErrorZ_err(struct LDKDecodeError e);
@@ -3138,36 +3954,38 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HTLCUpdateDecodeErrorZ_clone_ptr")] public static extern long CResult_HTLCUpdateDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_HTLCUpdateDecodeErrorZ CResult_HTLCUpdateDecodeErrorZ_clone(const struct LDKCResult_HTLCUpdateDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HTLCUpdateDecodeErrorZ_clone")] public static extern long CResult_HTLCUpdateDecodeErrorZ_clone(long _orig);
-       // uint64_t C2Tuple_OutPointScriptZ_clone_ptr(LDKC2Tuple_OutPointScriptZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointScriptZ_clone_ptr")] public static extern long C2Tuple_OutPointScriptZ_clone_ptr(long _arg);
-       // struct LDKC2Tuple_OutPointScriptZ C2Tuple_OutPointScriptZ_clone(const struct LDKC2Tuple_OutPointScriptZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointScriptZ_clone")] public static extern long C2Tuple_OutPointScriptZ_clone(long _orig);
-       // struct LDKC2Tuple_OutPointScriptZ C2Tuple_OutPointScriptZ_new(struct LDKOutPoint a, struct LDKCVec_u8Z b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointScriptZ_new")] public static extern long C2Tuple_OutPointScriptZ_new(long _a, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _b);
-       // void C2Tuple_OutPointScriptZ_free(struct LDKC2Tuple_OutPointScriptZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointScriptZ_free")] public static extern void C2Tuple_OutPointScriptZ_free(long __res);
-       // uint64_t C2Tuple_u32ScriptZ_clone_ptr(LDKC2Tuple_u32ScriptZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u32ScriptZ_clone_ptr")] public static extern long C2Tuple_u32ScriptZ_clone_ptr(long _arg);
-       // struct LDKC2Tuple_u32ScriptZ C2Tuple_u32ScriptZ_clone(const struct LDKC2Tuple_u32ScriptZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u32ScriptZ_clone")] public static extern long C2Tuple_u32ScriptZ_clone(long _orig);
-       // struct LDKC2Tuple_u32ScriptZ C2Tuple_u32ScriptZ_new(uint32_t a, struct LDKCVec_u8Z b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u32ScriptZ_new")] public static extern long C2Tuple_u32ScriptZ_new(int _a, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _b);
-       // void C2Tuple_u32ScriptZ_free(struct LDKC2Tuple_u32ScriptZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u32ScriptZ_free")] public static extern void C2Tuple_u32ScriptZ_free(long __res);
-       // void CVec_C2Tuple_u32ScriptZZ_free(struct LDKCVec_C2Tuple_u32ScriptZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_u32ScriptZZ_free")] public static extern void CVec_C2Tuple_u32ScriptZZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
-       // uint64_t C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_clone_ptr(LDKC2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_clone_ptr")] public static extern long C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_clone_ptr(long _arg);
-       // struct LDKC2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_clone(const struct LDKC2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_clone")] public static extern long C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_clone(long _orig);
-       // struct LDKC2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_new(struct LDKThirtyTwoBytes a, struct LDKCVec_C2Tuple_u32ScriptZZ b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_new")] public static extern long C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _b);
-       // void C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_free(struct LDKC2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_free")] public static extern void C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_free(long __res);
-       // void CVec_C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZZ_free(struct LDKCVec_C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZZ_free")] public static extern void CVec_C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       // uint64_t C2Tuple_OutPointCVec_u8ZZ_clone_ptr(LDKC2Tuple_OutPointCVec_u8ZZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointCVec_u8ZZ_clone_ptr")] public static extern long C2Tuple_OutPointCVec_u8ZZ_clone_ptr(long _arg);
+       // struct LDKC2Tuple_OutPointCVec_u8ZZ C2Tuple_OutPointCVec_u8ZZ_clone(const struct LDKC2Tuple_OutPointCVec_u8ZZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointCVec_u8ZZ_clone")] public static extern long C2Tuple_OutPointCVec_u8ZZ_clone(long _orig);
+       // struct LDKC2Tuple_OutPointCVec_u8ZZ C2Tuple_OutPointCVec_u8ZZ_new(struct LDKOutPoint a, struct LDKCVec_u8Z b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointCVec_u8ZZ_new")] public static extern long C2Tuple_OutPointCVec_u8ZZ_new(long _a, long _b);
+       // void C2Tuple_OutPointCVec_u8ZZ_free(struct LDKC2Tuple_OutPointCVec_u8ZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointCVec_u8ZZ_free")] public static extern void C2Tuple_OutPointCVec_u8ZZ_free(long __res);
+       // uint64_t C2Tuple_u32CVec_u8ZZ_clone_ptr(LDKC2Tuple_u32CVec_u8ZZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u32CVec_u8ZZ_clone_ptr")] public static extern long C2Tuple_u32CVec_u8ZZ_clone_ptr(long _arg);
+       // struct LDKC2Tuple_u32CVec_u8ZZ C2Tuple_u32CVec_u8ZZ_clone(const struct LDKC2Tuple_u32CVec_u8ZZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u32CVec_u8ZZ_clone")] public static extern long C2Tuple_u32CVec_u8ZZ_clone(long _orig);
+       // struct LDKC2Tuple_u32CVec_u8ZZ C2Tuple_u32CVec_u8ZZ_new(uint32_t a, struct LDKCVec_u8Z b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u32CVec_u8ZZ_new")] public static extern long C2Tuple_u32CVec_u8ZZ_new(int _a, long _b);
+       // void C2Tuple_u32CVec_u8ZZ_free(struct LDKC2Tuple_u32CVec_u8ZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u32CVec_u8ZZ_free")] public static extern void C2Tuple_u32CVec_u8ZZ_free(long __res);
+       // void CVec_C2Tuple_u32CVec_u8ZZZ_free(struct LDKCVec_C2Tuple_u32CVec_u8ZZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_u32CVec_u8ZZZ_free")] public static extern void CVec_C2Tuple_u32CVec_u8ZZZ_free(long __res);
+       // uint64_t C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone_ptr")] public static extern long C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone_ptr(long _arg);
+       // struct LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone(const struct LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone")] public static extern long C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone(long _orig);
+       // struct LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_new(struct LDKThirtyTwoBytes a, struct LDKCVec_C2Tuple_u32CVec_u8ZZZ b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_new")] public static extern long C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_new(long _a, long _b);
+       // void C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_free(struct LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_free")] public static extern void C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_free(long __res);
+       // void CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ_free(struct LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ_free")] public static extern void CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ_free(long __res);
+       // void CVec_CommitmentTransactionZ_free(struct LDKCVec_CommitmentTransactionZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_CommitmentTransactionZ_free")] public static extern void CVec_CommitmentTransactionZ_free(long __res);
        // void CVec_TransactionZ_free(struct LDKCVec_TransactionZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_TransactionZ_free")] public static extern void CVec_TransactionZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_TransactionZ_free")] public static extern void CVec_TransactionZ_free(long __res);
        // uint64_t C2Tuple_u32TxOutZ_clone_ptr(LDKC2Tuple_u32TxOutZ *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u32TxOutZ_clone_ptr")] public static extern long C2Tuple_u32TxOutZ_clone_ptr(long _arg);
        // struct LDKC2Tuple_u32TxOutZ C2Tuple_u32TxOutZ_clone(const struct LDKC2Tuple_u32TxOutZ *NONNULL_PTR orig);
@@ -3177,81 +3995,81 @@ internal class bindings {
        // void C2Tuple_u32TxOutZ_free(struct LDKC2Tuple_u32TxOutZ _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_u32TxOutZ_free")] public static extern void C2Tuple_u32TxOutZ_free(long __res);
        // void CVec_C2Tuple_u32TxOutZZ_free(struct LDKCVec_C2Tuple_u32TxOutZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_u32TxOutZZ_free")] public static extern void CVec_C2Tuple_u32TxOutZZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
-       // uint64_t C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_clone_ptr(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_clone_ptr")] public static extern long C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_clone_ptr(long _arg);
-       // struct LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_clone(const struct LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_clone")] public static extern long C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_clone(long _orig);
-       // struct LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_new(struct LDKThirtyTwoBytes a, struct LDKCVec_C2Tuple_u32TxOutZZ b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_new")] public static extern long C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _b);
-       // void C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_free(struct LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_free")] public static extern void C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_free(long __res);
-       // void CVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ_free(struct LDKCVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ_free")] public static extern void CVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_u32TxOutZZ_free")] public static extern void CVec_C2Tuple_u32TxOutZZ_free(long __res);
+       // uint64_t C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone_ptr")] public static extern long C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone_ptr(long _arg);
+       // struct LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone(const struct LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone")] public static extern long C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone(long _orig);
+       // struct LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_new(struct LDKThirtyTwoBytes a, struct LDKCVec_C2Tuple_u32TxOutZZ b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_new")] public static extern long C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_new(long _a, long _b);
+       // void C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_free(struct LDKC2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_free")] public static extern void C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_free(long __res);
+       // void CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ_free(struct LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ_free")] public static extern void CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ_free(long __res);
        // void CVec_BalanceZ_free(struct LDKCVec_BalanceZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_BalanceZ_free")] public static extern void CVec_BalanceZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
-       // uint64_t C2Tuple_BlockHashChannelMonitorZ_clone_ptr(LDKC2Tuple_BlockHashChannelMonitorZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlockHashChannelMonitorZ_clone_ptr")] public static extern long C2Tuple_BlockHashChannelMonitorZ_clone_ptr(long _arg);
-       // struct LDKC2Tuple_BlockHashChannelMonitorZ C2Tuple_BlockHashChannelMonitorZ_clone(const struct LDKC2Tuple_BlockHashChannelMonitorZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlockHashChannelMonitorZ_clone")] public static extern long C2Tuple_BlockHashChannelMonitorZ_clone(long _orig);
-       // struct LDKC2Tuple_BlockHashChannelMonitorZ C2Tuple_BlockHashChannelMonitorZ_new(struct LDKThirtyTwoBytes a, struct LDKChannelMonitor b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlockHashChannelMonitorZ_new")] public static extern long C2Tuple_BlockHashChannelMonitorZ_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a, long _b);
-       // void C2Tuple_BlockHashChannelMonitorZ_free(struct LDKC2Tuple_BlockHashChannelMonitorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlockHashChannelMonitorZ_free")] public static extern void C2Tuple_BlockHashChannelMonitorZ_free(long __res);
-       // struct LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_ok(struct LDKC2Tuple_BlockHashChannelMonitorZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_ok")] public static extern long CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_ok(long _o);
-       // struct LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_err(struct LDKDecodeError e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_err")] public static extern long CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_err(long _e);
-       // bool CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_is_ok(const struct LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_is_ok")] public static extern bool CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_is_ok(long _o);
-       // void CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_free(struct LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_free")] public static extern void CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_free(long __res);
-       // uint64_t CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_clone_ptr(LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_clone_ptr")] public static extern long CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_clone_ptr(long _arg);
-       // struct LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_clone(const struct LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_clone")] public static extern long CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_clone(long _orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_BalanceZ_free")] public static extern void CVec_BalanceZ_free(long __res);
+       // uint64_t C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone_ptr")] public static extern long C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone_ptr(long _arg);
+       // struct LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone(const struct LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone")] public static extern long C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone(long _orig);
+       // struct LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ C2Tuple_ThirtyTwoBytesChannelMonitorZ_new(struct LDKThirtyTwoBytes a, struct LDKChannelMonitor b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_new")] public static extern long C2Tuple_ThirtyTwoBytesChannelMonitorZ_new(long _a, long _b);
+       // void C2Tuple_ThirtyTwoBytesChannelMonitorZ_free(struct LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_free")] public static extern void C2Tuple_ThirtyTwoBytesChannelMonitorZ_free(long __res);
+       // struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_ok(struct LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_ok")] public static extern long CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_err")] public static extern long CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_err(long _e);
+       // bool CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_is_ok(const struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_is_ok")] public static extern bool CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_is_ok(long _o);
+       // void CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_free(struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_free")] public static extern void CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_free(long __res);
+       // uint64_t CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone_ptr(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone_ptr")] public static extern long CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone(const struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone")] public static extern long CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone(long _orig);
        // uint64_t C2Tuple_PublicKeyTypeZ_clone_ptr(LDKC2Tuple_PublicKeyTypeZ *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyTypeZ_clone_ptr")] public static extern long C2Tuple_PublicKeyTypeZ_clone_ptr(long _arg);
        // struct LDKC2Tuple_PublicKeyTypeZ C2Tuple_PublicKeyTypeZ_clone(const struct LDKC2Tuple_PublicKeyTypeZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyTypeZ_clone")] public static extern long C2Tuple_PublicKeyTypeZ_clone(long _orig);
        // struct LDKC2Tuple_PublicKeyTypeZ C2Tuple_PublicKeyTypeZ_new(struct LDKPublicKey a, struct LDKType b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyTypeZ_new")] public static extern long C2Tuple_PublicKeyTypeZ_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a, long _b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyTypeZ_new")] public static extern long C2Tuple_PublicKeyTypeZ_new(long _a, long _b);
        // void C2Tuple_PublicKeyTypeZ_free(struct LDKC2Tuple_PublicKeyTypeZ _res);
        [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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
-       // struct LDKCOption_OffersMessageZ COption_OffersMessageZ_some(struct LDKOffersMessage o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_OffersMessageZ_some")] public static extern long COption_OffersMessageZ_some(long _o);
-       // struct LDKCOption_OffersMessageZ COption_OffersMessageZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_OffersMessageZ_none")] public static extern long COption_OffersMessageZ_none();
-       // void COption_OffersMessageZ_free(struct LDKCOption_OffersMessageZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_OffersMessageZ_free")] public static extern void COption_OffersMessageZ_free(long __res);
-       // uint64_t COption_OffersMessageZ_clone_ptr(LDKCOption_OffersMessageZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_OffersMessageZ_clone_ptr")] public static extern long COption_OffersMessageZ_clone_ptr(long _arg);
-       // struct LDKCOption_OffersMessageZ COption_OffersMessageZ_clone(const struct LDKCOption_OffersMessageZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_OffersMessageZ_clone")] public static extern long COption_OffersMessageZ_clone(long _orig);
-       // struct LDKCOption_CustomOnionMessageContentsZ COption_CustomOnionMessageContentsZ_some(struct LDKCustomOnionMessageContents o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CustomOnionMessageContentsZ_some")] public static extern long COption_CustomOnionMessageContentsZ_some(long _o);
-       // struct LDKCOption_CustomOnionMessageContentsZ COption_CustomOnionMessageContentsZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CustomOnionMessageContentsZ_none")] public static extern long COption_CustomOnionMessageContentsZ_none();
-       // void COption_CustomOnionMessageContentsZ_free(struct LDKCOption_CustomOnionMessageContentsZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CustomOnionMessageContentsZ_free")] public static extern void COption_CustomOnionMessageContentsZ_free(long __res);
-       // uint64_t COption_CustomOnionMessageContentsZ_clone_ptr(LDKCOption_CustomOnionMessageContentsZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CustomOnionMessageContentsZ_clone_ptr")] public static extern long COption_CustomOnionMessageContentsZ_clone_ptr(long _arg);
-       // struct LDKCOption_CustomOnionMessageContentsZ COption_CustomOnionMessageContentsZ_clone(const struct LDKCOption_CustomOnionMessageContentsZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CustomOnionMessageContentsZ_clone")] public static extern long COption_CustomOnionMessageContentsZ_clone(long _orig);
-       // struct LDKCResult_COption_CustomOnionMessageContentsZDecodeErrorZ CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_ok(struct LDKCOption_CustomOnionMessageContentsZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_ok")] public static extern long CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_ok(long _o);
-       // struct LDKCResult_COption_CustomOnionMessageContentsZDecodeErrorZ CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_err(struct LDKDecodeError e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_err")] public static extern long CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_err(long _e);
-       // bool CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_is_ok(const struct LDKCResult_COption_CustomOnionMessageContentsZDecodeErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_is_ok")] public static extern bool CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_is_ok(long _o);
-       // void CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_free(struct LDKCResult_COption_CustomOnionMessageContentsZDecodeErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_free")] public static extern void CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_free(long __res);
-       // uint64_t CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_clone_ptr(LDKCResult_COption_CustomOnionMessageContentsZDecodeErrorZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_clone_ptr")] public static extern long CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_clone_ptr(long _arg);
-       // struct LDKCResult_COption_CustomOnionMessageContentsZDecodeErrorZ CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_clone(const struct LDKCResult_COption_CustomOnionMessageContentsZDecodeErrorZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_clone")] public static extern long CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_clone(long _orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_PublicKeyTypeZZ_free")] public static extern void CVec_C2Tuple_PublicKeyTypeZZ_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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_OnionMessageContentsZ_none")] public static extern long COption_OnionMessageContentsZ_none();
+       // void COption_OnionMessageContentsZ_free(struct LDKCOption_OnionMessageContentsZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_OnionMessageContentsZ_free")] public static extern void COption_OnionMessageContentsZ_free(long __res);
+       // uint64_t COption_OnionMessageContentsZ_clone_ptr(LDKCOption_OnionMessageContentsZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_OnionMessageContentsZ_clone_ptr")] public static extern long COption_OnionMessageContentsZ_clone_ptr(long _arg);
+       // struct LDKCOption_OnionMessageContentsZ COption_OnionMessageContentsZ_clone(const struct LDKCOption_OnionMessageContentsZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_OnionMessageContentsZ_clone")] public static extern long COption_OnionMessageContentsZ_clone(long _orig);
+       // struct LDKCResult_COption_OnionMessageContentsZDecodeErrorZ CResult_COption_OnionMessageContentsZDecodeErrorZ_ok(struct LDKCOption_OnionMessageContentsZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_ok")] public static extern long CResult_COption_OnionMessageContentsZDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_COption_OnionMessageContentsZDecodeErrorZ CResult_COption_OnionMessageContentsZDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_err")] public static extern long CResult_COption_OnionMessageContentsZDecodeErrorZ_err(long _e);
+       // bool CResult_COption_OnionMessageContentsZDecodeErrorZ_is_ok(const struct LDKCResult_COption_OnionMessageContentsZDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_is_ok")] public static extern bool CResult_COption_OnionMessageContentsZDecodeErrorZ_is_ok(long _o);
+       // void CResult_COption_OnionMessageContentsZDecodeErrorZ_free(struct LDKCResult_COption_OnionMessageContentsZDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_free")] public static extern void CResult_COption_OnionMessageContentsZDecodeErrorZ_free(long __res);
+       // uint64_t CResult_COption_OnionMessageContentsZDecodeErrorZ_clone_ptr(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_clone_ptr")] public static extern long CResult_COption_OnionMessageContentsZDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_COption_OnionMessageContentsZDecodeErrorZ CResult_COption_OnionMessageContentsZDecodeErrorZ_clone(const struct LDKCResult_COption_OnionMessageContentsZDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_OnionMessageContentsZDecodeErrorZ_clone")] public static extern long CResult_COption_OnionMessageContentsZDecodeErrorZ_clone(long _orig);
+       // uint64_t C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone_ptr(LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone_ptr")] public static extern long C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone_ptr(long _arg);
+       // struct LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone(const struct LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone")] public static extern long C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone(long _orig);
+       // struct LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ C3Tuple_OnionMessageContentsDestinationBlindedPathZ_new(struct LDKOnionMessageContents a, struct LDKDestination b, struct LDKBlindedPath c);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_new")] public static extern long C3Tuple_OnionMessageContentsDestinationBlindedPathZ_new(long _a, long _b, long _c);
+       // void C3Tuple_OnionMessageContentsDestinationBlindedPathZ_free(struct LDKC3Tuple_OnionMessageContentsDestinationBlindedPathZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_OnionMessageContentsDestinationBlindedPathZ_free")] public static extern void C3Tuple_OnionMessageContentsDestinationBlindedPathZ_free(long __res);
+       // void CVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ_free(struct LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ_free")] public static extern void CVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ_free(long __res);
        // struct LDKCOption_TypeZ COption_TypeZ_some(struct LDKType o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_TypeZ_some")] public static extern long COption_TypeZ_some(long _o);
        // struct LDKCOption_TypeZ COption_TypeZ_none(void);
@@ -3274,28 +4092,28 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_TypeZDecodeErrorZ_clone_ptr")] public static extern long CResult_COption_TypeZDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_COption_TypeZDecodeErrorZ CResult_COption_TypeZDecodeErrorZ_clone(const struct LDKCResult_COption_TypeZDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_TypeZDecodeErrorZ_clone")] public static extern long CResult_COption_TypeZDecodeErrorZ_clone(long _orig);
-       // struct LDKCOption_NetAddressZ COption_NetAddressZ_some(struct LDKNetAddress o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_NetAddressZ_some")] public static extern long COption_NetAddressZ_some(long _o);
-       // struct LDKCOption_NetAddressZ COption_NetAddressZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_NetAddressZ_none")] public static extern long COption_NetAddressZ_none();
-       // void COption_NetAddressZ_free(struct LDKCOption_NetAddressZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_NetAddressZ_free")] public static extern void COption_NetAddressZ_free(long __res);
-       // uint64_t COption_NetAddressZ_clone_ptr(LDKCOption_NetAddressZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_NetAddressZ_clone_ptr")] public static extern long COption_NetAddressZ_clone_ptr(long _arg);
-       // struct LDKCOption_NetAddressZ COption_NetAddressZ_clone(const struct LDKCOption_NetAddressZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_NetAddressZ_clone")] public static extern long COption_NetAddressZ_clone(long _orig);
-       // uint64_t C2Tuple_PublicKeyCOption_NetAddressZZ_clone_ptr(LDKC2Tuple_PublicKeyCOption_NetAddressZZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCOption_NetAddressZZ_clone_ptr")] public static extern long C2Tuple_PublicKeyCOption_NetAddressZZ_clone_ptr(long _arg);
-       // struct LDKC2Tuple_PublicKeyCOption_NetAddressZZ C2Tuple_PublicKeyCOption_NetAddressZZ_clone(const struct LDKC2Tuple_PublicKeyCOption_NetAddressZZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCOption_NetAddressZZ_clone")] public static extern long C2Tuple_PublicKeyCOption_NetAddressZZ_clone(long _orig);
-       // struct LDKC2Tuple_PublicKeyCOption_NetAddressZZ C2Tuple_PublicKeyCOption_NetAddressZZ_new(struct LDKPublicKey a, struct LDKCOption_NetAddressZ b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCOption_NetAddressZZ_new")] public static extern long C2Tuple_PublicKeyCOption_NetAddressZZ_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a, long _b);
-       // void C2Tuple_PublicKeyCOption_NetAddressZZ_free(struct LDKC2Tuple_PublicKeyCOption_NetAddressZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCOption_NetAddressZZ_free")] public static extern void C2Tuple_PublicKeyCOption_NetAddressZZ_free(long __res);
-       // void CVec_C2Tuple_PublicKeyCOption_NetAddressZZZ_free(struct LDKCVec_C2Tuple_PublicKeyCOption_NetAddressZZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_PublicKeyCOption_NetAddressZZZ_free")] public static extern void CVec_C2Tuple_PublicKeyCOption_NetAddressZZZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       // struct LDKCOption_SocketAddressZ COption_SocketAddressZ_some(struct LDKSocketAddress o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_SocketAddressZ_some")] public static extern long COption_SocketAddressZ_some(long _o);
+       // struct LDKCOption_SocketAddressZ COption_SocketAddressZ_none(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_SocketAddressZ_none")] public static extern long COption_SocketAddressZ_none();
+       // void COption_SocketAddressZ_free(struct LDKCOption_SocketAddressZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_SocketAddressZ_free")] public static extern void COption_SocketAddressZ_free(long __res);
+       // uint64_t COption_SocketAddressZ_clone_ptr(LDKCOption_SocketAddressZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_SocketAddressZ_clone_ptr")] public static extern long COption_SocketAddressZ_clone_ptr(long _arg);
+       // struct LDKCOption_SocketAddressZ COption_SocketAddressZ_clone(const struct LDKCOption_SocketAddressZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_SocketAddressZ_clone")] public static extern long COption_SocketAddressZ_clone(long _orig);
+       // uint64_t C2Tuple_PublicKeyCOption_SocketAddressZZ_clone_ptr(LDKC2Tuple_PublicKeyCOption_SocketAddressZZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_clone_ptr")] public static extern long C2Tuple_PublicKeyCOption_SocketAddressZZ_clone_ptr(long _arg);
+       // struct LDKC2Tuple_PublicKeyCOption_SocketAddressZZ C2Tuple_PublicKeyCOption_SocketAddressZZ_clone(const struct LDKC2Tuple_PublicKeyCOption_SocketAddressZZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_clone")] public static extern long C2Tuple_PublicKeyCOption_SocketAddressZZ_clone(long _orig);
+       // struct LDKC2Tuple_PublicKeyCOption_SocketAddressZZ C2Tuple_PublicKeyCOption_SocketAddressZZ_new(struct LDKPublicKey a, struct LDKCOption_SocketAddressZ b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_new")] public static extern long C2Tuple_PublicKeyCOption_SocketAddressZZ_new(long _a, long _b);
+       // void C2Tuple_PublicKeyCOption_SocketAddressZZ_free(struct LDKC2Tuple_PublicKeyCOption_SocketAddressZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCOption_SocketAddressZZ_free")] public static extern void C2Tuple_PublicKeyCOption_SocketAddressZZ_free(long __res);
+       // void CVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ_free(struct LDKCVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ_free")] public static extern void CVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ_free(long __res);
        // struct LDKCResult_CVec_u8ZPeerHandleErrorZ CResult_CVec_u8ZPeerHandleErrorZ_ok(struct LDKCVec_u8Z o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_ok")] public static extern long CResult_CVec_u8ZPeerHandleErrorZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_ok")] public static extern long CResult_CVec_u8ZPeerHandleErrorZ_ok(long _o);
        // struct LDKCResult_CVec_u8ZPeerHandleErrorZ CResult_CVec_u8ZPeerHandleErrorZ_err(struct LDKPeerHandleError e);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZPeerHandleErrorZ_err")] public static extern long CResult_CVec_u8ZPeerHandleErrorZ_err(long _e);
        // bool CResult_CVec_u8ZPeerHandleErrorZ_is_ok(const struct LDKCResult_CVec_u8ZPeerHandleErrorZ *NONNULL_PTR o);
@@ -3338,38 +4156,80 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_u32GraphSyncErrorZ_is_ok")] public static extern bool CResult_u32GraphSyncErrorZ_is_ok(long _o);
        // void CResult_u32GraphSyncErrorZ_free(struct LDKCResult_u32GraphSyncErrorZ _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_u32GraphSyncErrorZ_free")] public static extern void CResult_u32GraphSyncErrorZ_free(long __res);
-       // struct LDKCOption_KeyPairZ COption_KeyPairZ_some(struct LDKSecretKey o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_KeyPairZ_some")] public static extern long COption_KeyPairZ_some([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCOption_KeyPairZ COption_KeyPairZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_KeyPairZ_none")] public static extern long COption_KeyPairZ_none();
-       // void COption_KeyPairZ_free(struct LDKCOption_KeyPairZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_KeyPairZ_free")] public static extern void COption_KeyPairZ_free(long __res);
-       // uint64_t COption_KeyPairZ_clone_ptr(LDKCOption_KeyPairZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_KeyPairZ_clone_ptr")] public static extern long COption_KeyPairZ_clone_ptr(long _arg);
-       // struct LDKCOption_KeyPairZ COption_KeyPairZ_clone(const struct LDKCOption_KeyPairZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_KeyPairZ_clone")] public static extern long COption_KeyPairZ_clone(long _orig);
-       // struct LDKCResult_COption_KeyPairZNoneZ CResult_COption_KeyPairZNoneZ_ok(struct LDKCOption_KeyPairZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_KeyPairZNoneZ_ok")] public static extern long CResult_COption_KeyPairZNoneZ_ok(long _o);
-       // struct LDKCResult_COption_KeyPairZNoneZ CResult_COption_KeyPairZNoneZ_err(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_KeyPairZNoneZ_err")] public static extern long CResult_COption_KeyPairZNoneZ_err();
-       // bool CResult_COption_KeyPairZNoneZ_is_ok(const struct LDKCResult_COption_KeyPairZNoneZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_KeyPairZNoneZ_is_ok")] public static extern bool CResult_COption_KeyPairZNoneZ_is_ok(long _o);
-       // void CResult_COption_KeyPairZNoneZ_free(struct LDKCResult_COption_KeyPairZNoneZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_KeyPairZNoneZ_free")] public static extern void CResult_COption_KeyPairZNoneZ_free(long __res);
-       // uint64_t CResult_COption_KeyPairZNoneZ_clone_ptr(LDKCResult_COption_KeyPairZNoneZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_KeyPairZNoneZ_clone_ptr")] public static extern long CResult_COption_KeyPairZNoneZ_clone_ptr(long _arg);
-       // struct LDKCResult_COption_KeyPairZNoneZ CResult_COption_KeyPairZNoneZ_clone(const struct LDKCResult_COption_KeyPairZNoneZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_KeyPairZNoneZ_clone")] public static extern long CResult_COption_KeyPairZNoneZ_clone(long _orig);
-       // struct LDKCOption_ScriptZ COption_ScriptZ_some(struct LDKCVec_u8Z o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ScriptZ_some")] public static extern long COption_ScriptZ_some([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCOption_ScriptZ COption_ScriptZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ScriptZ_none")] public static extern long COption_ScriptZ_none();
-       // void COption_ScriptZ_free(struct LDKCOption_ScriptZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ScriptZ_free")] public static extern void COption_ScriptZ_free(long __res);
-       // uint64_t COption_ScriptZ_clone_ptr(LDKCOption_ScriptZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ScriptZ_clone_ptr")] public static extern long COption_ScriptZ_clone_ptr(long _arg);
-       // struct LDKCOption_ScriptZ COption_ScriptZ_clone(const struct LDKCOption_ScriptZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_ScriptZ_clone")] public static extern long COption_ScriptZ_clone(long _orig);
+       // struct LDKCResult_CVec_u8ZIOErrorZ CResult_CVec_u8ZIOErrorZ_ok(struct LDKCVec_u8Z o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZIOErrorZ_ok")] public static extern long CResult_CVec_u8ZIOErrorZ_ok(long _o);
+       // struct LDKCResult_CVec_u8ZIOErrorZ CResult_CVec_u8ZIOErrorZ_err(enum LDKIOError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZIOErrorZ_err")] public static extern long CResult_CVec_u8ZIOErrorZ_err(IOError _e);
+       // bool CResult_CVec_u8ZIOErrorZ_is_ok(const struct LDKCResult_CVec_u8ZIOErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZIOErrorZ_is_ok")] public static extern bool CResult_CVec_u8ZIOErrorZ_is_ok(long _o);
+       // void CResult_CVec_u8ZIOErrorZ_free(struct LDKCResult_CVec_u8ZIOErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZIOErrorZ_free")] public static extern void CResult_CVec_u8ZIOErrorZ_free(long __res);
+       // uint64_t CResult_CVec_u8ZIOErrorZ_clone_ptr(LDKCResult_CVec_u8ZIOErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZIOErrorZ_clone_ptr")] public static extern long CResult_CVec_u8ZIOErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_CVec_u8ZIOErrorZ CResult_CVec_u8ZIOErrorZ_clone(const struct LDKCResult_CVec_u8ZIOErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_u8ZIOErrorZ_clone")] public static extern long CResult_CVec_u8ZIOErrorZ_clone(long _orig);
+       // void CVec_StrZ_free(struct LDKCVec_StrZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_StrZ_free")] public static extern void CVec_StrZ_free(long __res);
+       // struct LDKCResult_CVec_StrZIOErrorZ CResult_CVec_StrZIOErrorZ_ok(struct LDKCVec_StrZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_StrZIOErrorZ_ok")] public static extern long CResult_CVec_StrZIOErrorZ_ok(long _o);
+       // struct LDKCResult_CVec_StrZIOErrorZ CResult_CVec_StrZIOErrorZ_err(enum LDKIOError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_StrZIOErrorZ_err")] public static extern long CResult_CVec_StrZIOErrorZ_err(IOError _e);
+       // bool CResult_CVec_StrZIOErrorZ_is_ok(const struct LDKCResult_CVec_StrZIOErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_StrZIOErrorZ_is_ok")] public static extern bool CResult_CVec_StrZIOErrorZ_is_ok(long _o);
+       // void CResult_CVec_StrZIOErrorZ_free(struct LDKCResult_CVec_StrZIOErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_StrZIOErrorZ_free")] public static extern void CResult_CVec_StrZIOErrorZ_free(long __res);
+       // uint64_t CResult_CVec_StrZIOErrorZ_clone_ptr(LDKCResult_CVec_StrZIOErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_StrZIOErrorZ_clone_ptr")] public static extern long CResult_CVec_StrZIOErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_CVec_StrZIOErrorZ CResult_CVec_StrZIOErrorZ_clone(const struct LDKCResult_CVec_StrZIOErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_StrZIOErrorZ_clone")] public static extern long CResult_CVec_StrZIOErrorZ_clone(long _orig);
+       // void CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ_free(struct LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ_free")] public static extern void CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ_free(long __res);
+       // struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_ok(struct LDKCVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_ok")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_ok(long _o);
+       // struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_err(enum LDKIOError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_err")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_err(IOError _e);
+       // bool CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_is_ok(const struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_is_ok")] public static extern bool CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_is_ok(long _o);
+       // void CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_free(struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_free")] public static extern void CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_free(long __res);
+       // uint64_t CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone_ptr(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone_ptr")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone(const struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone(long _orig);
+       // struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_ok(struct LDKC2Tuple_ThirtyTwoBytesChannelMonitorZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_ok")] public static extern long CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_ok(long _o);
+       // struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_err(enum LDKIOError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_err")] public static extern long CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_err(IOError _e);
+       // bool CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_is_ok(const struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_is_ok")] public static extern bool CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_is_ok(long _o);
+       // void CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_free(struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_free")] public static extern void CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_free(long __res);
+       // uint64_t CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone_ptr(LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone_ptr")] public static extern long CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone(const struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone")] public static extern long CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone(long _orig);
+       // struct LDKCOption_SecretKeyZ COption_SecretKeyZ_some(struct LDKSecretKey o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_SecretKeyZ_some")] public static extern long COption_SecretKeyZ_some(long _o);
+       // struct LDKCOption_SecretKeyZ COption_SecretKeyZ_none(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_SecretKeyZ_none")] public static extern long COption_SecretKeyZ_none();
+       // void COption_SecretKeyZ_free(struct LDKCOption_SecretKeyZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_SecretKeyZ_free")] public static extern void COption_SecretKeyZ_free(long __res);
+       // uint64_t COption_SecretKeyZ_clone_ptr(LDKCOption_SecretKeyZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_SecretKeyZ_clone_ptr")] public static extern long COption_SecretKeyZ_clone_ptr(long _arg);
+       // struct LDKCOption_SecretKeyZ COption_SecretKeyZ_clone(const struct LDKCOption_SecretKeyZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_SecretKeyZ_clone")] public static extern long COption_SecretKeyZ_clone(long _orig);
+       // struct LDKCResult_VerifiedInvoiceRequestNoneZ CResult_VerifiedInvoiceRequestNoneZ_ok(struct LDKVerifiedInvoiceRequest o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_ok")] public static extern long CResult_VerifiedInvoiceRequestNoneZ_ok(long _o);
+       // struct LDKCResult_VerifiedInvoiceRequestNoneZ CResult_VerifiedInvoiceRequestNoneZ_err(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_err")] public static extern long CResult_VerifiedInvoiceRequestNoneZ_err();
+       // bool CResult_VerifiedInvoiceRequestNoneZ_is_ok(const struct LDKCResult_VerifiedInvoiceRequestNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_is_ok")] public static extern bool CResult_VerifiedInvoiceRequestNoneZ_is_ok(long _o);
+       // void CResult_VerifiedInvoiceRequestNoneZ_free(struct LDKCResult_VerifiedInvoiceRequestNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_free")] public static extern void CResult_VerifiedInvoiceRequestNoneZ_free(long __res);
+       // uint64_t CResult_VerifiedInvoiceRequestNoneZ_clone_ptr(LDKCResult_VerifiedInvoiceRequestNoneZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_clone_ptr")] public static extern long CResult_VerifiedInvoiceRequestNoneZ_clone_ptr(long _arg);
+       // struct LDKCResult_VerifiedInvoiceRequestNoneZ CResult_VerifiedInvoiceRequestNoneZ_clone(const struct LDKCResult_VerifiedInvoiceRequestNoneZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_VerifiedInvoiceRequestNoneZ_clone")] public static extern long CResult_VerifiedInvoiceRequestNoneZ_clone(long _orig);
        // enum LDKCOption_NoneZ COption_NoneZ_some(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_NoneZ_some")] public static extern COption_NoneZ COption_NoneZ_some();
        // enum LDKCOption_NoneZ COption_NoneZ_none(void);
@@ -3377,7 +4237,7 @@ internal class bindings {
        // void COption_NoneZ_free(enum LDKCOption_NoneZ _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_NoneZ_free")] public static extern void COption_NoneZ_free(COption_NoneZ __res);
        // void CVec_WitnessZ_free(struct LDKCVec_WitnessZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_WitnessZ_free")] public static extern void CVec_WitnessZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_WitnessZ_free")] public static extern void CVec_WitnessZ_free(long __res);
        // struct LDKCOption_i64Z COption_i64Z_some(int64_t o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_i64Z_some")] public static extern long COption_i64Z_some(long _o);
        // struct LDKCOption_i64Z COption_i64Z_none(void);
@@ -3388,36 +4248,38 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_i64Z_clone_ptr")] public static extern long COption_i64Z_clone_ptr(long _arg);
        // struct LDKCOption_i64Z COption_i64Z_clone(const struct LDKCOption_i64Z *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_i64Z_clone")] public static extern long COption_i64Z_clone(long _orig);
-       // struct LDKCOption_TxidZ COption_TxidZ_some(struct LDKThirtyTwoBytes o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_TxidZ_some")] public static extern long COption_TxidZ_some([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCOption_TxidZ COption_TxidZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_TxidZ_none")] public static extern long COption_TxidZ_none();
-       // void COption_TxidZ_free(struct LDKCOption_TxidZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_TxidZ_free")] public static extern void COption_TxidZ_free(long __res);
-       // uint64_t COption_TxidZ_clone_ptr(LDKCOption_TxidZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_TxidZ_clone_ptr")] public static extern long COption_TxidZ_clone_ptr(long _arg);
-       // struct LDKCOption_TxidZ COption_TxidZ_clone(const struct LDKCOption_TxidZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_TxidZ_clone")] public static extern long COption_TxidZ_clone(long _orig);
-       // struct LDKCResult_NetAddressDecodeErrorZ CResult_NetAddressDecodeErrorZ_ok(struct LDKNetAddress o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NetAddressDecodeErrorZ_ok")] public static extern long CResult_NetAddressDecodeErrorZ_ok(long _o);
-       // struct LDKCResult_NetAddressDecodeErrorZ CResult_NetAddressDecodeErrorZ_err(struct LDKDecodeError e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NetAddressDecodeErrorZ_err")] public static extern long CResult_NetAddressDecodeErrorZ_err(long _e);
-       // bool CResult_NetAddressDecodeErrorZ_is_ok(const struct LDKCResult_NetAddressDecodeErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NetAddressDecodeErrorZ_is_ok")] public static extern bool CResult_NetAddressDecodeErrorZ_is_ok(long _o);
-       // void CResult_NetAddressDecodeErrorZ_free(struct LDKCResult_NetAddressDecodeErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NetAddressDecodeErrorZ_free")] public static extern void CResult_NetAddressDecodeErrorZ_free(long __res);
-       // uint64_t CResult_NetAddressDecodeErrorZ_clone_ptr(LDKCResult_NetAddressDecodeErrorZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NetAddressDecodeErrorZ_clone_ptr")] public static extern long CResult_NetAddressDecodeErrorZ_clone_ptr(long _arg);
-       // struct LDKCResult_NetAddressDecodeErrorZ CResult_NetAddressDecodeErrorZ_clone(const struct LDKCResult_NetAddressDecodeErrorZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NetAddressDecodeErrorZ_clone")] public static extern long CResult_NetAddressDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_SocketAddressDecodeErrorZ CResult_SocketAddressDecodeErrorZ_ok(struct LDKSocketAddress o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SocketAddressDecodeErrorZ_ok")] public static extern long CResult_SocketAddressDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_SocketAddressDecodeErrorZ CResult_SocketAddressDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SocketAddressDecodeErrorZ_err")] public static extern long CResult_SocketAddressDecodeErrorZ_err(long _e);
+       // bool CResult_SocketAddressDecodeErrorZ_is_ok(const struct LDKCResult_SocketAddressDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SocketAddressDecodeErrorZ_is_ok")] public static extern bool CResult_SocketAddressDecodeErrorZ_is_ok(long _o);
+       // void CResult_SocketAddressDecodeErrorZ_free(struct LDKCResult_SocketAddressDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SocketAddressDecodeErrorZ_free")] public static extern void CResult_SocketAddressDecodeErrorZ_free(long __res);
+       // uint64_t CResult_SocketAddressDecodeErrorZ_clone_ptr(LDKCResult_SocketAddressDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SocketAddressDecodeErrorZ_clone_ptr")] public static extern long CResult_SocketAddressDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_SocketAddressDecodeErrorZ CResult_SocketAddressDecodeErrorZ_clone(const struct LDKCResult_SocketAddressDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SocketAddressDecodeErrorZ_clone")] public static extern long CResult_SocketAddressDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_SocketAddressSocketAddressParseErrorZ CResult_SocketAddressSocketAddressParseErrorZ_ok(struct LDKSocketAddress o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_ok")] public static extern long CResult_SocketAddressSocketAddressParseErrorZ_ok(long _o);
+       // struct LDKCResult_SocketAddressSocketAddressParseErrorZ CResult_SocketAddressSocketAddressParseErrorZ_err(enum LDKSocketAddressParseError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_err")] public static extern long CResult_SocketAddressSocketAddressParseErrorZ_err(SocketAddressParseError _e);
+       // bool CResult_SocketAddressSocketAddressParseErrorZ_is_ok(const struct LDKCResult_SocketAddressSocketAddressParseErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_is_ok")] public static extern bool CResult_SocketAddressSocketAddressParseErrorZ_is_ok(long _o);
+       // void CResult_SocketAddressSocketAddressParseErrorZ_free(struct LDKCResult_SocketAddressSocketAddressParseErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_free")] public static extern void CResult_SocketAddressSocketAddressParseErrorZ_free(long __res);
+       // uint64_t CResult_SocketAddressSocketAddressParseErrorZ_clone_ptr(LDKCResult_SocketAddressSocketAddressParseErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_clone_ptr")] public static extern long CResult_SocketAddressSocketAddressParseErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_SocketAddressSocketAddressParseErrorZ CResult_SocketAddressSocketAddressParseErrorZ_clone(const struct LDKCResult_SocketAddressSocketAddressParseErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SocketAddressSocketAddressParseErrorZ_clone")] public static extern long CResult_SocketAddressSocketAddressParseErrorZ_clone(long _orig);
        // void CVec_UpdateAddHTLCZ_free(struct LDKCVec_UpdateAddHTLCZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_UpdateAddHTLCZ_free")] public static extern void CVec_UpdateAddHTLCZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_UpdateAddHTLCZ_free")] public static extern void CVec_UpdateAddHTLCZ_free(long __res);
        // void CVec_UpdateFulfillHTLCZ_free(struct LDKCVec_UpdateFulfillHTLCZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_UpdateFulfillHTLCZ_free")] public static extern void CVec_UpdateFulfillHTLCZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_UpdateFulfillHTLCZ_free")] public static extern void CVec_UpdateFulfillHTLCZ_free(long __res);
        // void CVec_UpdateFailHTLCZ_free(struct LDKCVec_UpdateFailHTLCZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_UpdateFailHTLCZ_free")] public static extern void CVec_UpdateFailHTLCZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_UpdateFailHTLCZ_free")] public static extern void CVec_UpdateFailHTLCZ_free(long __res);
        // void CVec_UpdateFailMalformedHTLCZ_free(struct LDKCVec_UpdateFailMalformedHTLCZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_UpdateFailMalformedHTLCZ_free")] public static extern void CVec_UpdateFailMalformedHTLCZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_UpdateFailMalformedHTLCZ_free")] public static extern void CVec_UpdateFailMalformedHTLCZ_free(long __res);
        // struct LDKCResult_AcceptChannelDecodeErrorZ CResult_AcceptChannelDecodeErrorZ_ok(struct LDKAcceptChannel o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_AcceptChannelDecodeErrorZ_ok")] public static extern long CResult_AcceptChannelDecodeErrorZ_ok(long _o);
        // struct LDKCResult_AcceptChannelDecodeErrorZ CResult_AcceptChannelDecodeErrorZ_err(struct LDKDecodeError e);
@@ -3959,7 +4821,7 @@ internal class bindings {
        // struct LDKCResult_GossipTimestampFilterDecodeErrorZ CResult_GossipTimestampFilterDecodeErrorZ_clone(const struct LDKCResult_GossipTimestampFilterDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_GossipTimestampFilterDecodeErrorZ_clone")] public static extern long CResult_GossipTimestampFilterDecodeErrorZ_clone(long _orig);
        // void CVec_PhantomRouteHintsZ_free(struct LDKCVec_PhantomRouteHintsZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_PhantomRouteHintsZ_free")] public static extern void CVec_PhantomRouteHintsZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_PhantomRouteHintsZ_free")] public static extern void CVec_PhantomRouteHintsZ_free(long __res);
        // struct LDKCResult_Bolt11InvoiceSignOrCreationErrorZ CResult_Bolt11InvoiceSignOrCreationErrorZ_ok(struct LDKBolt11Invoice o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_ok")] public static extern long CResult_Bolt11InvoiceSignOrCreationErrorZ_ok(long _o);
        // struct LDKCResult_Bolt11InvoiceSignOrCreationErrorZ CResult_Bolt11InvoiceSignOrCreationErrorZ_err(struct LDKSignOrCreationError e);
@@ -3973,7 +4835,7 @@ internal class bindings {
        // struct LDKCResult_Bolt11InvoiceSignOrCreationErrorZ CResult_Bolt11InvoiceSignOrCreationErrorZ_clone(const struct LDKCResult_Bolt11InvoiceSignOrCreationErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_Bolt11InvoiceSignOrCreationErrorZ_clone")] public static extern long CResult_Bolt11InvoiceSignOrCreationErrorZ_clone(long _orig);
        // void CVec_FutureZ_free(struct LDKCVec_FutureZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_FutureZ_free")] public static extern void CVec_FutureZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_FutureZ_free")] public static extern void CVec_FutureZ_free(long __res);
        // struct LDKCResult_OffersMessageDecodeErrorZ CResult_OffersMessageDecodeErrorZ_ok(struct LDKOffersMessage o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OffersMessageDecodeErrorZ_ok")] public static extern long CResult_OffersMessageDecodeErrorZ_ok(long _o);
        // struct LDKCResult_OffersMessageDecodeErrorZ CResult_OffersMessageDecodeErrorZ_err(struct LDKDecodeError e);
@@ -4116,18 +4978,28 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_TrustedCommitmentTransactionNoneZ_is_ok")] public static extern bool CResult_TrustedCommitmentTransactionNoneZ_is_ok(long _o);
        // void CResult_TrustedCommitmentTransactionNoneZ_free(struct LDKCResult_TrustedCommitmentTransactionNoneZ _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_TrustedCommitmentTransactionNoneZ_free")] public static extern void CResult_TrustedCommitmentTransactionNoneZ_free(long __res);
-       // struct LDKCResult_CVec_SignatureZNoneZ CResult_CVec_SignatureZNoneZ_ok(struct LDKCVec_SignatureZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_SignatureZNoneZ_ok")] public static extern long CResult_CVec_SignatureZNoneZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _o);
-       // struct LDKCResult_CVec_SignatureZNoneZ CResult_CVec_SignatureZNoneZ_err(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_SignatureZNoneZ_err")] public static extern long CResult_CVec_SignatureZNoneZ_err();
-       // bool CResult_CVec_SignatureZNoneZ_is_ok(const struct LDKCResult_CVec_SignatureZNoneZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_SignatureZNoneZ_is_ok")] public static extern bool CResult_CVec_SignatureZNoneZ_is_ok(long _o);
-       // void CResult_CVec_SignatureZNoneZ_free(struct LDKCResult_CVec_SignatureZNoneZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_SignatureZNoneZ_free")] public static extern void CResult_CVec_SignatureZNoneZ_free(long __res);
-       // uint64_t CResult_CVec_SignatureZNoneZ_clone_ptr(LDKCResult_CVec_SignatureZNoneZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_SignatureZNoneZ_clone_ptr")] public static extern long CResult_CVec_SignatureZNoneZ_clone_ptr(long _arg);
-       // struct LDKCResult_CVec_SignatureZNoneZ CResult_CVec_SignatureZNoneZ_clone(const struct LDKCResult_CVec_SignatureZNoneZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_SignatureZNoneZ_clone")] public static extern long CResult_CVec_SignatureZNoneZ_clone(long _orig);
+       // struct LDKCResult_CVec_ECDSASignatureZNoneZ CResult_CVec_ECDSASignatureZNoneZ_ok(struct LDKCVec_ECDSASignatureZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_ok")] public static extern long CResult_CVec_ECDSASignatureZNoneZ_ok(long _o);
+       // struct LDKCResult_CVec_ECDSASignatureZNoneZ CResult_CVec_ECDSASignatureZNoneZ_err(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_err")] public static extern long CResult_CVec_ECDSASignatureZNoneZ_err();
+       // bool CResult_CVec_ECDSASignatureZNoneZ_is_ok(const struct LDKCResult_CVec_ECDSASignatureZNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_is_ok")] public static extern bool CResult_CVec_ECDSASignatureZNoneZ_is_ok(long _o);
+       // void CResult_CVec_ECDSASignatureZNoneZ_free(struct LDKCResult_CVec_ECDSASignatureZNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_free")] public static extern void CResult_CVec_ECDSASignatureZNoneZ_free(long __res);
+       // uint64_t CResult_CVec_ECDSASignatureZNoneZ_clone_ptr(LDKCResult_CVec_ECDSASignatureZNoneZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_clone_ptr")] public static extern long CResult_CVec_ECDSASignatureZNoneZ_clone_ptr(long _arg);
+       // struct LDKCResult_CVec_ECDSASignatureZNoneZ CResult_CVec_ECDSASignatureZNoneZ_clone(const struct LDKCResult_CVec_ECDSASignatureZNoneZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_ECDSASignatureZNoneZ_clone")] public static extern long CResult_CVec_ECDSASignatureZNoneZ_clone(long _orig);
+       // struct LDKCOption_usizeZ COption_usizeZ_some(uintptr_t o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_usizeZ_some")] public static extern long COption_usizeZ_some(long _o);
+       // struct LDKCOption_usizeZ COption_usizeZ_none(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_usizeZ_none")] public static extern long COption_usizeZ_none();
+       // void COption_usizeZ_free(struct LDKCOption_usizeZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_usizeZ_free")] public static extern void COption_usizeZ_free(long __res);
+       // uint64_t COption_usizeZ_clone_ptr(LDKCOption_usizeZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_usizeZ_clone_ptr")] public static extern long COption_usizeZ_clone_ptr(long _arg);
+       // struct LDKCOption_usizeZ COption_usizeZ_clone(const struct LDKCOption_usizeZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_usizeZ_clone")] public static extern long COption_usizeZ_clone(long _orig);
        // struct LDKCResult_ShutdownScriptDecodeErrorZ CResult_ShutdownScriptDecodeErrorZ_ok(struct LDKShutdownScript o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ShutdownScriptDecodeErrorZ_ok")] public static extern long CResult_ShutdownScriptDecodeErrorZ_ok(long _o);
        // struct LDKCResult_ShutdownScriptDecodeErrorZ CResult_ShutdownScriptDecodeErrorZ_err(struct LDKDecodeError e);
@@ -4164,6 +5036,18 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentPurposeDecodeErrorZ_clone_ptr")] public static extern long CResult_PaymentPurposeDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_PaymentPurposeDecodeErrorZ CResult_PaymentPurposeDecodeErrorZ_clone(const struct LDKCResult_PaymentPurposeDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentPurposeDecodeErrorZ_clone")] public static extern long CResult_PaymentPurposeDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_ClaimedHTLCDecodeErrorZ CResult_ClaimedHTLCDecodeErrorZ_ok(struct LDKClaimedHTLC o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_ok")] public static extern long CResult_ClaimedHTLCDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_ClaimedHTLCDecodeErrorZ CResult_ClaimedHTLCDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_err")] public static extern long CResult_ClaimedHTLCDecodeErrorZ_err(long _e);
+       // bool CResult_ClaimedHTLCDecodeErrorZ_is_ok(const struct LDKCResult_ClaimedHTLCDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_is_ok")] public static extern bool CResult_ClaimedHTLCDecodeErrorZ_is_ok(long _o);
+       // void CResult_ClaimedHTLCDecodeErrorZ_free(struct LDKCResult_ClaimedHTLCDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_free")] public static extern void CResult_ClaimedHTLCDecodeErrorZ_free(long __res);
+       // uint64_t CResult_ClaimedHTLCDecodeErrorZ_clone_ptr(LDKCResult_ClaimedHTLCDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_clone_ptr")] public static extern long CResult_ClaimedHTLCDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_ClaimedHTLCDecodeErrorZ CResult_ClaimedHTLCDecodeErrorZ_clone(const struct LDKCResult_ClaimedHTLCDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ClaimedHTLCDecodeErrorZ_clone")] public static extern long CResult_ClaimedHTLCDecodeErrorZ_clone(long _orig);
        // struct LDKCOption_PathFailureZ COption_PathFailureZ_some(struct LDKPathFailure o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PathFailureZ_some")] public static extern long COption_PathFailureZ_some(long _o);
        // struct LDKCOption_PathFailureZ COption_PathFailureZ_none(void);
@@ -4242,26 +5126,18 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_clone_ptr")] public static extern long CResult_PaymentFailureReasonDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_PaymentFailureReasonDecodeErrorZ CResult_PaymentFailureReasonDecodeErrorZ_clone(const struct LDKCResult_PaymentFailureReasonDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentFailureReasonDecodeErrorZ_clone")] public static extern long CResult_PaymentFailureReasonDecodeErrorZ_clone(long _orig);
-       // struct LDKCOption_u128Z COption_u128Z_some(struct LDKU128 o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u128Z_some")] public static extern long COption_u128Z_some([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCOption_u128Z COption_u128Z_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u128Z_none")] public static extern long COption_u128Z_none();
-       // void COption_u128Z_free(struct LDKCOption_u128Z _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u128Z_free")] public static extern void COption_u128Z_free(long __res);
-       // uint64_t COption_u128Z_clone_ptr(LDKCOption_u128Z *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u128Z_clone_ptr")] public static extern long COption_u128Z_clone_ptr(long _arg);
-       // struct LDKCOption_u128Z COption_u128Z_clone(const struct LDKCOption_u128Z *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u128Z_clone")] public static extern long COption_u128Z_clone(long _orig);
-       // struct LDKCOption_PaymentIdZ COption_PaymentIdZ_some(struct LDKThirtyTwoBytes o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentIdZ_some")] public static extern long COption_PaymentIdZ_some([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCOption_PaymentIdZ COption_PaymentIdZ_none(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentIdZ_none")] public static extern long COption_PaymentIdZ_none();
-       // void COption_PaymentIdZ_free(struct LDKCOption_PaymentIdZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentIdZ_free")] public static extern void COption_PaymentIdZ_free(long __res);
-       // uint64_t COption_PaymentIdZ_clone_ptr(LDKCOption_PaymentIdZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentIdZ_clone_ptr")] public static extern long COption_PaymentIdZ_clone_ptr(long _arg);
-       // struct LDKCOption_PaymentIdZ COption_PaymentIdZ_clone(const struct LDKCOption_PaymentIdZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentIdZ_clone")] public static extern long COption_PaymentIdZ_clone(long _orig);
+       // struct LDKCOption_U128Z COption_U128Z_some(struct LDKU128 o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_U128Z_some")] public static extern long COption_U128Z_some(long _o);
+       // struct LDKCOption_U128Z COption_U128Z_none(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_U128Z_none")] public static extern long COption_U128Z_none();
+       // void COption_U128Z_free(struct LDKCOption_U128Z _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_U128Z_free")] public static extern void COption_U128Z_free(long __res);
+       // uint64_t COption_U128Z_clone_ptr(LDKCOption_U128Z *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_U128Z_clone_ptr")] public static extern long COption_U128Z_clone_ptr(long _arg);
+       // struct LDKCOption_U128Z COption_U128Z_clone(const struct LDKCOption_U128Z *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_U128Z_clone")] public static extern long COption_U128Z_clone(long _orig);
+       // void CVec_ClaimedHTLCZ_free(struct LDKCVec_ClaimedHTLCZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_ClaimedHTLCZ_free")] public static extern void CVec_ClaimedHTLCZ_free(long __res);
        // struct LDKCOption_PaymentFailureReasonZ COption_PaymentFailureReasonZ_some(enum LDKPaymentFailureReason o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_PaymentFailureReasonZ_some")] public static extern long COption_PaymentFailureReasonZ_some(PaymentFailureReason _o);
        // struct LDKCOption_PaymentFailureReasonZ COption_PaymentFailureReasonZ_none(void);
@@ -4294,20 +5170,6 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_EventZDecodeErrorZ_clone_ptr")] public static extern long CResult_COption_EventZDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_COption_EventZDecodeErrorZ CResult_COption_EventZDecodeErrorZ_clone(const struct LDKCResult_COption_EventZDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_COption_EventZDecodeErrorZ_clone")] public static extern long CResult_COption_EventZDecodeErrorZ_clone(long _orig);
-       // void CVec_C2Tuple_BlockHashChannelMonitorZZ_free(struct LDKCVec_C2Tuple_BlockHashChannelMonitorZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_BlockHashChannelMonitorZZ_free")] public static extern void CVec_C2Tuple_BlockHashChannelMonitorZZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
-       // struct LDKCResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_ok(struct LDKCVec_C2Tuple_BlockHashChannelMonitorZZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_ok")] public static extern long CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _o);
-       // struct LDKCResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_err(enum LDKIOError e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_err")] public static extern long CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_err(IOError _e);
-       // bool CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_is_ok(const struct LDKCResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_is_ok")] public static extern bool CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_is_ok(long _o);
-       // void CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_free(struct LDKCResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_free")] public static extern void CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_free(long __res);
-       // uint64_t CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_clone_ptr(LDKCResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_clone_ptr")] public static extern long CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_clone_ptr(long _arg);
-       // struct LDKCResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_clone(const struct LDKCResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_clone")] public static extern long CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_clone(long _orig);
        // struct LDKCResult_SiPrefixBolt11ParseErrorZ CResult_SiPrefixBolt11ParseErrorZ_ok(enum LDKSiPrefix o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SiPrefixBolt11ParseErrorZ_ok")] public static extern long CResult_SiPrefixBolt11ParseErrorZ_ok(SiPrefix _o);
        // struct LDKCResult_SiPrefixBolt11ParseErrorZ CResult_SiPrefixBolt11ParseErrorZ_err(struct LDKBolt11ParseError e);
@@ -4349,23 +5211,23 @@ internal class bindings {
        // struct LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_clone(const struct LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_clone")] public static extern long C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_clone(long _orig);
        // struct LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_new(struct LDKRawBolt11Invoice a, struct LDKThirtyTwoBytes b, struct LDKBolt11InvoiceSignature c);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_new")] public static extern long C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_new(long _a, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _b, long _c);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_new")] public static extern long C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_new(long _a, long _b, long _c);
        // void C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_free(struct LDKC3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_free")] public static extern void C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_free(long __res);
-       // struct LDKCResult_PayeePubKeyErrorZ CResult_PayeePubKeyErrorZ_ok(struct LDKPayeePubKey o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PayeePubKeyErrorZ_ok")] public static extern long CResult_PayeePubKeyErrorZ_ok(long _o);
-       // struct LDKCResult_PayeePubKeyErrorZ CResult_PayeePubKeyErrorZ_err(enum LDKSecp256k1Error e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PayeePubKeyErrorZ_err")] public static extern long CResult_PayeePubKeyErrorZ_err(Secp256k1Error _e);
-       // bool CResult_PayeePubKeyErrorZ_is_ok(const struct LDKCResult_PayeePubKeyErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PayeePubKeyErrorZ_is_ok")] public static extern bool CResult_PayeePubKeyErrorZ_is_ok(long _o);
-       // void CResult_PayeePubKeyErrorZ_free(struct LDKCResult_PayeePubKeyErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PayeePubKeyErrorZ_free")] public static extern void CResult_PayeePubKeyErrorZ_free(long __res);
-       // uint64_t CResult_PayeePubKeyErrorZ_clone_ptr(LDKCResult_PayeePubKeyErrorZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PayeePubKeyErrorZ_clone_ptr")] public static extern long CResult_PayeePubKeyErrorZ_clone_ptr(long _arg);
-       // struct LDKCResult_PayeePubKeyErrorZ CResult_PayeePubKeyErrorZ_clone(const struct LDKCResult_PayeePubKeyErrorZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PayeePubKeyErrorZ_clone")] public static extern long CResult_PayeePubKeyErrorZ_clone(long _orig);
+       // struct LDKCResult_PayeePubKeySecp256k1ErrorZ CResult_PayeePubKeySecp256k1ErrorZ_ok(struct LDKPayeePubKey o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_ok")] public static extern long CResult_PayeePubKeySecp256k1ErrorZ_ok(long _o);
+       // struct LDKCResult_PayeePubKeySecp256k1ErrorZ CResult_PayeePubKeySecp256k1ErrorZ_err(enum LDKSecp256k1Error e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_err")] public static extern long CResult_PayeePubKeySecp256k1ErrorZ_err(Secp256k1Error _e);
+       // bool CResult_PayeePubKeySecp256k1ErrorZ_is_ok(const struct LDKCResult_PayeePubKeySecp256k1ErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_is_ok")] public static extern bool CResult_PayeePubKeySecp256k1ErrorZ_is_ok(long _o);
+       // void CResult_PayeePubKeySecp256k1ErrorZ_free(struct LDKCResult_PayeePubKeySecp256k1ErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_free")] public static extern void CResult_PayeePubKeySecp256k1ErrorZ_free(long __res);
+       // uint64_t CResult_PayeePubKeySecp256k1ErrorZ_clone_ptr(LDKCResult_PayeePubKeySecp256k1ErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_clone_ptr")] public static extern long CResult_PayeePubKeySecp256k1ErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_PayeePubKeySecp256k1ErrorZ CResult_PayeePubKeySecp256k1ErrorZ_clone(const struct LDKCResult_PayeePubKeySecp256k1ErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PayeePubKeySecp256k1ErrorZ_clone")] public static extern long CResult_PayeePubKeySecp256k1ErrorZ_clone(long _orig);
        // void CVec_PrivateRouteZ_free(struct LDKCVec_PrivateRouteZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_PrivateRouteZ_free")] public static extern void CVec_PrivateRouteZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_PrivateRouteZ_free")] public static extern void CVec_PrivateRouteZ_free(long __res);
        // struct LDKCResult_PositiveTimestampCreationErrorZ CResult_PositiveTimestampCreationErrorZ_ok(struct LDKPositiveTimestamp o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PositiveTimestampCreationErrorZ_ok")] public static extern long CResult_PositiveTimestampCreationErrorZ_ok(long _o);
        // struct LDKCResult_PositiveTimestampCreationErrorZ CResult_PositiveTimestampCreationErrorZ_err(enum LDKCreationError e);
@@ -4402,8 +5264,6 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone_ptr")] public static extern long CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone(const struct LDKCResult_Bolt11InvoiceBolt11SemanticErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone")] public static extern long CResult_Bolt11InvoiceBolt11SemanticErrorZ_clone(long _orig);
-       // void CVec_AddressZ_free(struct LDKCVec_AddressZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_AddressZ_free")] public static extern void CVec_AddressZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] string[] __res);
        // struct LDKCResult_DescriptionCreationErrorZ CResult_DescriptionCreationErrorZ_ok(struct LDKDescription o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DescriptionCreationErrorZ_ok")] public static extern long CResult_DescriptionCreationErrorZ_ok(long _o);
        // struct LDKCResult_DescriptionCreationErrorZ CResult_DescriptionCreationErrorZ_err(enum LDKCreationError e);
@@ -4500,18 +5360,54 @@ 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_PaymentIdPaymentErrorZ CResult_PaymentIdPaymentErrorZ_ok(struct LDKThirtyTwoBytes o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentIdPaymentErrorZ_ok")] public static extern long CResult_PaymentIdPaymentErrorZ_ok([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _o);
-       // struct LDKCResult_PaymentIdPaymentErrorZ CResult_PaymentIdPaymentErrorZ_err(struct LDKPaymentError e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentIdPaymentErrorZ_err")] public static extern long CResult_PaymentIdPaymentErrorZ_err(long _e);
-       // bool CResult_PaymentIdPaymentErrorZ_is_ok(const struct LDKCResult_PaymentIdPaymentErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentIdPaymentErrorZ_is_ok")] public static extern bool CResult_PaymentIdPaymentErrorZ_is_ok(long _o);
-       // void CResult_PaymentIdPaymentErrorZ_free(struct LDKCResult_PaymentIdPaymentErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentIdPaymentErrorZ_free")] public static extern void CResult_PaymentIdPaymentErrorZ_free(long __res);
-       // uint64_t CResult_PaymentIdPaymentErrorZ_clone_ptr(LDKCResult_PaymentIdPaymentErrorZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentIdPaymentErrorZ_clone_ptr")] public static extern long CResult_PaymentIdPaymentErrorZ_clone_ptr(long _arg);
-       // struct LDKCResult_PaymentIdPaymentErrorZ CResult_PaymentIdPaymentErrorZ_clone(const struct LDKCResult_PaymentIdPaymentErrorZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentIdPaymentErrorZ_clone")] public static extern long CResult_PaymentIdPaymentErrorZ_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);
+       // 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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentRelayDecodeErrorZ_err")] public static extern long CResult_PaymentRelayDecodeErrorZ_err(long _e);
+       // bool CResult_PaymentRelayDecodeErrorZ_is_ok(const struct LDKCResult_PaymentRelayDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentRelayDecodeErrorZ_is_ok")] public static extern bool CResult_PaymentRelayDecodeErrorZ_is_ok(long _o);
+       // void CResult_PaymentRelayDecodeErrorZ_free(struct LDKCResult_PaymentRelayDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentRelayDecodeErrorZ_free")] public static extern void CResult_PaymentRelayDecodeErrorZ_free(long __res);
+       // uint64_t CResult_PaymentRelayDecodeErrorZ_clone_ptr(LDKCResult_PaymentRelayDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentRelayDecodeErrorZ_clone_ptr")] public static extern long CResult_PaymentRelayDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_PaymentRelayDecodeErrorZ CResult_PaymentRelayDecodeErrorZ_clone(const struct LDKCResult_PaymentRelayDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentRelayDecodeErrorZ_clone")] public static extern long CResult_PaymentRelayDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_PaymentConstraintsDecodeErrorZ CResult_PaymentConstraintsDecodeErrorZ_ok(struct LDKPaymentConstraints o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_ok")] public static extern long CResult_PaymentConstraintsDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_PaymentConstraintsDecodeErrorZ CResult_PaymentConstraintsDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_err")] public static extern long CResult_PaymentConstraintsDecodeErrorZ_err(long _e);
+       // bool CResult_PaymentConstraintsDecodeErrorZ_is_ok(const struct LDKCResult_PaymentConstraintsDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_is_ok")] public static extern bool CResult_PaymentConstraintsDecodeErrorZ_is_ok(long _o);
+       // void CResult_PaymentConstraintsDecodeErrorZ_free(struct LDKCResult_PaymentConstraintsDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_free")] public static extern void CResult_PaymentConstraintsDecodeErrorZ_free(long __res);
+       // uint64_t CResult_PaymentConstraintsDecodeErrorZ_clone_ptr(LDKCResult_PaymentConstraintsDecodeErrorZ *NONNULL_PTR arg);
+       [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);
@@ -4524,18 +5420,30 @@ internal class bindings {
        [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_StringErrorZ CResult_StringErrorZ_ok(struct LDKStr o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StringErrorZ_ok")] public static extern long CResult_StringErrorZ_ok(string _o);
-       // struct LDKCResult_StringErrorZ CResult_StringErrorZ_err(enum LDKSecp256k1Error e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StringErrorZ_err")] public static extern long CResult_StringErrorZ_err(Secp256k1Error _e);
-       // bool CResult_StringErrorZ_is_ok(const struct LDKCResult_StringErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StringErrorZ_is_ok")] public static extern bool CResult_StringErrorZ_is_ok(long _o);
-       // void CResult_StringErrorZ_free(struct LDKCResult_StringErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StringErrorZ_free")] public static extern void CResult_StringErrorZ_free(long __res);
-       // uint64_t CResult_StringErrorZ_clone_ptr(LDKCResult_StringErrorZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StringErrorZ_clone_ptr")] public static extern long CResult_StringErrorZ_clone_ptr(long _arg);
-       // struct LDKCResult_StringErrorZ CResult_StringErrorZ_clone(const struct LDKCResult_StringErrorZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StringErrorZ_clone")] public static extern long CResult_StringErrorZ_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);
+       // 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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StrSecp256k1ErrorZ_err")] public static extern long CResult_StrSecp256k1ErrorZ_err(Secp256k1Error _e);
+       // bool CResult_StrSecp256k1ErrorZ_is_ok(const struct LDKCResult_StrSecp256k1ErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StrSecp256k1ErrorZ_is_ok")] public static extern bool CResult_StrSecp256k1ErrorZ_is_ok(long _o);
+       // void CResult_StrSecp256k1ErrorZ_free(struct LDKCResult_StrSecp256k1ErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StrSecp256k1ErrorZ_free")] public static extern void CResult_StrSecp256k1ErrorZ_free(long __res);
+       // uint64_t CResult_StrSecp256k1ErrorZ_clone_ptr(LDKCResult_StrSecp256k1ErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StrSecp256k1ErrorZ_clone_ptr")] public static extern long CResult_StrSecp256k1ErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_StrSecp256k1ErrorZ CResult_StrSecp256k1ErrorZ_clone(const struct LDKCResult_StrSecp256k1ErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StrSecp256k1ErrorZ_clone")] public static extern long CResult_StrSecp256k1ErrorZ_clone(long _orig);
        // struct LDKCResult_TxOutUtxoLookupErrorZ CResult_TxOutUtxoLookupErrorZ_ok(struct LDKTxOut o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_TxOutUtxoLookupErrorZ_ok")] public static extern long CResult_TxOutUtxoLookupErrorZ_ok(long _o);
        // struct LDKCResult_TxOutUtxoLookupErrorZ CResult_TxOutUtxoLookupErrorZ_err(enum LDKUtxoLookupError e);
@@ -4560,6 +5468,30 @@ internal class bindings {
        [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);
+       // 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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PeeledOnionNoneZ_err")] public static extern long CResult_PeeledOnionNoneZ_err();
+       // bool CResult_PeeledOnionNoneZ_is_ok(const struct LDKCResult_PeeledOnionNoneZ *NONNULL_PTR o);
+       [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);
@@ -4580,6 +5512,18 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedPathNoneZ_clone_ptr")] public static extern long CResult_BlindedPathNoneZ_clone_ptr(long _arg);
        // struct LDKCResult_BlindedPathNoneZ CResult_BlindedPathNoneZ_clone(const struct LDKCResult_BlindedPathNoneZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedPathNoneZ_clone")] public static extern long CResult_BlindedPathNoneZ_clone(long _orig);
+       // struct LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_ok(struct LDKC2Tuple_BlindedPayInfoBlindedPathZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_ok")] public static extern long CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_ok(long _o);
+       // struct LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_err(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_err")] public static extern long CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_err();
+       // bool CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_is_ok(const struct LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_is_ok")] public static extern bool CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_is_ok(long _o);
+       // void CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_free(struct LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_free")] public static extern void CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_free(long __res);
+       // uint64_t CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone_ptr(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ *NONNULL_PTR arg);
+       [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);
        // 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);
@@ -4631,19 +5575,19 @@ internal class bindings {
        // void CResult_LockedChannelMonitorNoneZ_free(struct LDKCResult_LockedChannelMonitorNoneZ _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_LockedChannelMonitorNoneZ_free")] public static extern void CResult_LockedChannelMonitorNoneZ_free(long __res);
        // void CVec_OutPointZ_free(struct LDKCVec_OutPointZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_OutPointZ_free")] public static extern void CVec_OutPointZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_OutPointZ_free")] public static extern void CVec_OutPointZ_free(long __res);
        // void CVec_MonitorUpdateIdZ_free(struct LDKCVec_MonitorUpdateIdZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_MonitorUpdateIdZ_free")] public static extern void CVec_MonitorUpdateIdZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_MonitorUpdateIdZ_free")] public static extern void CVec_MonitorUpdateIdZ_free(long __res);
        // uint64_t C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone_ptr(LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone_ptr")] public static extern long C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone_ptr(long _arg);
        // struct LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone(const struct LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone")] public static extern long C2Tuple_OutPointCVec_MonitorUpdateIdZZ_clone(long _orig);
        // struct LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ C2Tuple_OutPointCVec_MonitorUpdateIdZZ_new(struct LDKOutPoint a, struct LDKCVec_MonitorUpdateIdZ b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_new")] public static extern long C2Tuple_OutPointCVec_MonitorUpdateIdZZ_new(long _a, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_new")] public static extern long C2Tuple_OutPointCVec_MonitorUpdateIdZZ_new(long _a, long _b);
        // void C2Tuple_OutPointCVec_MonitorUpdateIdZZ_free(struct LDKC2Tuple_OutPointCVec_MonitorUpdateIdZZ _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_OutPointCVec_MonitorUpdateIdZZ_free")] public static extern void C2Tuple_OutPointCVec_MonitorUpdateIdZZ_free(long __res);
        // void CVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ_free(struct LDKCVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ_free")] public static extern void CVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ_free([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] __res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ_free")] public static extern void CVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ_free(long __res);
        // void APIError_free(struct LDKAPIError this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_APIError_free")] public static extern void APIError_free(long _this_ptr);
        // uint64_t APIError_clone_ptr(LDKAPIError *NONNULL_PTR arg);
@@ -4651,13 +5595,13 @@ internal class bindings {
        // struct LDKAPIError APIError_clone(const struct LDKAPIError *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_APIError_clone")] public static extern long APIError_clone(long _orig);
        // struct LDKAPIError APIError_apimisuse_error(struct LDKStr err);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_APIError_apimisuse_error")] public static extern long APIError_apimisuse_error(string _err);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_APIError_apimisuse_error")] public static extern long APIError_apimisuse_error(long _err);
        // struct LDKAPIError APIError_fee_rate_too_high(struct LDKStr err, uint32_t feerate);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_APIError_fee_rate_too_high")] public static extern long APIError_fee_rate_too_high(string _err, int _feerate);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_APIError_fee_rate_too_high")] public static extern long APIError_fee_rate_too_high(long _err, int _feerate);
        // struct LDKAPIError APIError_invalid_route(struct LDKStr err);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_APIError_invalid_route")] public static extern long APIError_invalid_route(string _err);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_APIError_invalid_route")] public static extern long APIError_invalid_route(long _err);
        // struct LDKAPIError APIError_channel_unavailable(struct LDKStr err);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_APIError_channel_unavailable")] public static extern long APIError_channel_unavailable(string _err);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_APIError_channel_unavailable")] public static extern long APIError_channel_unavailable(long _err);
        // struct LDKAPIError APIError_monitor_update_in_progress(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_APIError_monitor_update_in_progress")] public static extern long APIError_monitor_update_in_progress();
        // struct LDKAPIError APIError_incompatible_shutdown_script(struct LDKShutdownScript script);
@@ -4665,9 +5609,9 @@ internal class bindings {
        // bool APIError_eq(const struct LDKAPIError *NONNULL_PTR a, const struct LDKAPIError *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_APIError_eq")] public static extern bool APIError_eq(long _a, long _b);
        // struct LDKCVec_u8Z APIError_write(const struct LDKAPIError *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_APIError_write")] public static extern byte[] APIError_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_APIError_write")] public static extern long APIError_write(long _obj);
        // struct LDKCResult_COption_APIErrorZDecodeErrorZ APIError_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_APIError_read")] public static extern long APIError_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_APIError_read")] public static extern long APIError_read(long _ser);
        // void BigSize_free(struct LDKBigSize this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BigSize_free")] public static extern void BigSize_free(long _this_obj);
        // uint64_t BigSize_get_a(const struct LDKBigSize *NONNULL_PTR this_ptr);
@@ -4685,9 +5629,9 @@ internal class bindings {
        // bool BigSize_eq(const struct LDKBigSize *NONNULL_PTR a, const struct LDKBigSize *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BigSize_eq")] public static extern bool BigSize_eq(long _a, long _b);
        // struct LDKCVec_u8Z BigSize_write(const struct LDKBigSize *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BigSize_write")] public static extern byte[] BigSize_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BigSize_write")] public static extern long BigSize_write(long _obj);
        // struct LDKCResult_BigSizeDecodeErrorZ BigSize_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BigSize_read")] public static extern long BigSize_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BigSize_read")] public static extern long BigSize_read(long _ser);
        // void Hostname_free(struct LDKHostname this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Hostname_free")] public static extern void Hostname_free(long _this_obj);
        // uint64_t Hostname_clone_ptr(LDKHostname *NONNULL_PTR arg);
@@ -4699,9 +5643,9 @@ internal class bindings {
        // MUST_USE_RES uint8_t Hostname_len(const struct LDKHostname *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Hostname_len")] public static extern byte Hostname_len(long _this_arg);
        // struct LDKCVec_u8Z Hostname_write(const struct LDKHostname *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Hostname_write")] public static extern byte[] Hostname_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Hostname_write")] public static extern long Hostname_write(long _obj);
        // struct LDKCResult_HostnameDecodeErrorZ Hostname_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Hostname_read")] public static extern long Hostname_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Hostname_read")] public static extern long Hostname_read(long _ser);
        // void TransactionU16LenLimited_free(struct LDKTransactionU16LenLimited this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TransactionU16LenLimited_free")] public static extern void TransactionU16LenLimited_free(long _this_obj);
        // uint64_t TransactionU16LenLimited_clone_ptr(LDKTransactionU16LenLimited *NONNULL_PTR arg);
@@ -4711,31 +5655,47 @@ internal class bindings {
        // 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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TransactionU16LenLimited_new")] public static extern long TransactionU16LenLimited_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _transaction);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TransactionU16LenLimited_new")] public static extern long TransactionU16LenLimited_new(long _transaction);
        // MUST_USE_RES struct LDKTransaction TransactionU16LenLimited_into_transaction(struct LDKTransactionU16LenLimited this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TransactionU16LenLimited_into_transaction")] public static extern byte[] TransactionU16LenLimited_into_transaction(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TransactionU16LenLimited_into_transaction")] public static extern long TransactionU16LenLimited_into_transaction(long _this_arg);
        // struct LDKCVec_u8Z TransactionU16LenLimited_write(const struct LDKTransactionU16LenLimited *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TransactionU16LenLimited_write")] public static extern byte[] TransactionU16LenLimited_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TransactionU16LenLimited_write")] public static extern long TransactionU16LenLimited_write(long _obj);
        // struct LDKCResult_TransactionU16LenLimitedDecodeErrorZ TransactionU16LenLimited_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TransactionU16LenLimited_read")] public static extern long TransactionU16LenLimited_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
-       // struct LDKCResult_StringErrorZ sign(struct LDKu8slice msg, const uint8_t (*sk)[32]);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_sign")] public static extern long sign([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _msg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _sk);
-       // struct LDKCResult_PublicKeyErrorZ recover_pk(struct LDKu8slice msg, struct LDKStr sig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_recover_pk")] public static extern long recover_pk([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _msg, string _sig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TransactionU16LenLimited_read")] public static extern long TransactionU16LenLimited_read(long _ser);
+       // struct LDKCResult_StrSecp256k1ErrorZ sign(struct LDKu8slice msg, const uint8_t (*sk)[32]);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_sign")] public static extern long sign(long _msg, long _sk);
+       // struct LDKCResult_PublicKeySecp256k1ErrorZ recover_pk(struct LDKu8slice msg, struct LDKStr sig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_recover_pk")] public static extern long recover_pk(long _msg, long _sig);
        // bool verify(struct LDKu8slice msg, struct LDKStr sig, struct LDKPublicKey pk);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_verify")] public static extern bool verify([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _msg, string _sig, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _pk);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_verify")] public static extern bool verify(long _msg, long _sig, long _pk);
        // struct LDKCVec_u8Z construct_invoice_preimage(struct LDKu8slice hrp_bytes, struct LDKCVec_U5Z data_without_signature);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_construct_invoice_preimage")] public static extern byte[] construct_invoice_preimage([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _hrp_bytes, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _data_without_signature);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_construct_invoice_preimage")] public static extern long construct_invoice_preimage(long _hrp_bytes, long _data_without_signature);
+       // void KVStore_free(struct LDKKVStore this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_KVStore_free")] public static extern void KVStore_free(long _this_ptr);
        // void Persister_free(struct LDKPersister this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Persister_free")] public static extern void Persister_free(long _this_ptr);
+       // struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ read_channel_monitors(struct LDKKVStore kv_store, struct LDKEntropySource entropy_source, struct LDKSignerProvider signer_provider);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_read_channel_monitors")] public static extern long read_channel_monitors(long _kv_store, long _entropy_source, long _signer_provider);
+       // void MonitorUpdatingPersister_free(struct LDKMonitorUpdatingPersister this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorUpdatingPersister_free")] public static extern void MonitorUpdatingPersister_free(long _this_obj);
+       // MUST_USE_RES struct LDKMonitorUpdatingPersister MonitorUpdatingPersister_new(struct LDKKVStore kv_store, struct LDKLogger logger, uint64_t maximum_pending_updates, struct LDKEntropySource entropy_source, struct LDKSignerProvider signer_provider);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorUpdatingPersister_new")] public static extern long MonitorUpdatingPersister_new(long _kv_store, long _logger, long _maximum_pending_updates, long _entropy_source, long _signer_provider);
+       // MUST_USE_RES struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ MonitorUpdatingPersister_read_all_channel_monitors_with_updates(const struct LDKMonitorUpdatingPersister *NONNULL_PTR this_arg, const struct LDKBroadcasterInterface *NONNULL_PTR broadcaster, const struct LDKFeeEstimator *NONNULL_PTR fee_estimator);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorUpdatingPersister_read_all_channel_monitors_with_updates")] public static extern long MonitorUpdatingPersister_read_all_channel_monitors_with_updates(long _this_arg, long _broadcaster, long _fee_estimator);
+       // MUST_USE_RES struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ MonitorUpdatingPersister_read_channel_monitor_with_updates(const struct LDKMonitorUpdatingPersister *NONNULL_PTR this_arg, const struct LDKBroadcasterInterface *NONNULL_PTR broadcaster, const struct LDKFeeEstimator *NONNULL_PTR fee_estimator, struct LDKStr monitor_key);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorUpdatingPersister_read_channel_monitor_with_updates")] public static extern long MonitorUpdatingPersister_read_channel_monitor_with_updates(long _this_arg, long _broadcaster, long _fee_estimator, long _monitor_key);
+       // MUST_USE_RES struct LDKCResult_NoneIOErrorZ MonitorUpdatingPersister_cleanup_stale_updates(const struct LDKMonitorUpdatingPersister *NONNULL_PTR this_arg, bool lazy);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorUpdatingPersister_cleanup_stale_updates")] public static extern long MonitorUpdatingPersister_cleanup_stale_updates(long _this_arg, bool _lazy);
+       // struct LDKPersist MonitorUpdatingPersister_as_Persist(const struct LDKMonitorUpdatingPersister *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorUpdatingPersister_as_Persist")] public static extern long MonitorUpdatingPersister_as_Persist(long _this_arg);
        // void UntrustedString_free(struct LDKUntrustedString this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UntrustedString_free")] public static extern void UntrustedString_free(long _this_obj);
        // struct LDKStr UntrustedString_get_a(const struct LDKUntrustedString *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UntrustedString_get_a")] public static extern string UntrustedString_get_a(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UntrustedString_get_a")] public static extern long UntrustedString_get_a(long _this_ptr);
        // void UntrustedString_set_a(struct LDKUntrustedString *NONNULL_PTR this_ptr, struct LDKStr val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UntrustedString_set_a")] public static extern void UntrustedString_set_a(long _this_ptr, string _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UntrustedString_set_a")] public static extern void UntrustedString_set_a(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKUntrustedString UntrustedString_new(struct LDKStr a_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UntrustedString_new")] public static extern long UntrustedString_new(string _a_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UntrustedString_new")] public static extern long UntrustedString_new(long _a_arg);
        // uint64_t UntrustedString_clone_ptr(LDKUntrustedString *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UntrustedString_clone_ptr")] public static extern long UntrustedString_clone_ptr(long _arg);
        // struct LDKUntrustedString UntrustedString_clone(const struct LDKUntrustedString *NONNULL_PTR orig);
@@ -4743,17 +5703,17 @@ internal class bindings {
        // 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);
        // struct LDKCVec_u8Z UntrustedString_write(const struct LDKUntrustedString *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UntrustedString_write")] public static extern byte[] UntrustedString_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UntrustedString_write")] public static extern long UntrustedString_write(long _obj);
        // struct LDKCResult_UntrustedStringDecodeErrorZ UntrustedString_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UntrustedString_read")] public static extern long UntrustedString_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UntrustedString_read")] public static extern long UntrustedString_read(long _ser);
        // void PrintableString_free(struct LDKPrintableString this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PrintableString_free")] public static extern void PrintableString_free(long _this_obj);
        // struct LDKStr PrintableString_get_a(const struct LDKPrintableString *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PrintableString_get_a")] public static extern string PrintableString_get_a(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PrintableString_get_a")] public static extern long PrintableString_get_a(long _this_ptr);
        // void PrintableString_set_a(struct LDKPrintableString *NONNULL_PTR this_ptr, struct LDKStr val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PrintableString_set_a")] public static extern void PrintableString_set_a(long _this_ptr, string _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PrintableString_set_a")] public static extern void PrintableString_set_a(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKPrintableString PrintableString_new(struct LDKStr a_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PrintableString_new")] public static extern long PrintableString_new(string _a_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PrintableString_new")] public static extern long PrintableString_new(long _a_arg);
        // void FutureCallback_free(struct LDKFutureCallback this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FutureCallback_free")] public static extern void FutureCallback_free(long _this_ptr);
        // void Future_free(struct LDKFuture this_obj);
@@ -4775,7 +5735,7 @@ internal class bindings {
        // MUST_USE_RES struct LDKSleeper Sleeper_from_two_futures(struct LDKFuture fut_a, struct LDKFuture fut_b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Sleeper_from_two_futures")] public static extern long Sleeper_from_two_futures(long _fut_a, long _fut_b);
        // MUST_USE_RES struct LDKSleeper Sleeper_new(struct LDKCVec_FutureZ futures);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Sleeper_new")] public static extern long Sleeper_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _futures);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Sleeper_new")] public static extern long Sleeper_new(long _futures);
        // void Sleeper_wait(const struct LDKSleeper *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Sleeper_wait")] public static extern void Sleeper_wait(long _this_arg);
        // MUST_USE_RES bool Sleeper_wait_timeout(const struct LDKSleeper *NONNULL_PTR this_arg, uint64_t max_wait);
@@ -4807,17 +5767,17 @@ internal class bindings {
        // 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 LDKStr Record_get_args(const struct LDKRecord *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_get_args")] public static extern string Record_get_args(long _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_set_args")] public static extern void Record_set_args(long _this_ptr, string _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_set_args")] public static extern void Record_set_args(long _this_ptr, long _val);
        // struct LDKStr Record_get_module_path(const struct LDKRecord *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_get_module_path")] public static extern string Record_get_module_path(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_get_module_path")] public static extern long Record_get_module_path(long _this_ptr);
        // void Record_set_module_path(struct LDKRecord *NONNULL_PTR this_ptr, struct LDKStr val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_set_module_path")] public static extern void Record_set_module_path(long _this_ptr, string _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_set_module_path")] public static extern void Record_set_module_path(long _this_ptr, long _val);
        // struct LDKStr Record_get_file(const struct LDKRecord *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_get_file")] public static extern string Record_get_file(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_get_file")] public static extern long Record_get_file(long _this_ptr);
        // void Record_set_file(struct LDKRecord *NONNULL_PTR this_ptr, struct LDKStr val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_set_file")] public static extern void Record_set_file(long _this_ptr, string _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_set_file")] public static extern void Record_set_file(long _this_ptr, long _val);
        // uint32_t Record_get_line(const struct LDKRecord *NONNULL_PTR this_ptr);
        [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);
@@ -4941,9 +5901,9 @@ internal class bindings {
        // bool MaxDustHTLCExposure_eq(const struct LDKMaxDustHTLCExposure *NONNULL_PTR a, const struct LDKMaxDustHTLCExposure *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MaxDustHTLCExposure_eq")] public static extern bool MaxDustHTLCExposure_eq(long _a, long _b);
        // struct LDKCVec_u8Z MaxDustHTLCExposure_write(const struct LDKMaxDustHTLCExposure *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MaxDustHTLCExposure_write")] public static extern byte[] MaxDustHTLCExposure_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MaxDustHTLCExposure_write")] public static extern long MaxDustHTLCExposure_write(long _obj);
        // struct LDKCResult_MaxDustHTLCExposureDecodeErrorZ MaxDustHTLCExposure_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MaxDustHTLCExposure_read")] public static extern long MaxDustHTLCExposure_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MaxDustHTLCExposure_read")] public static extern long MaxDustHTLCExposure_read(long _ser);
        // void ChannelConfig_free(struct LDKChannelConfig this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelConfig_free")] public static extern void ChannelConfig_free(long _this_obj);
        // uint32_t ChannelConfig_get_forwarding_fee_proportional_millionths(const struct LDKChannelConfig *NONNULL_PTR this_ptr);
@@ -4983,9 +5943,9 @@ internal class bindings {
        // MUST_USE_RES struct LDKChannelConfig ChannelConfig_default(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelConfig_default")] public static extern long ChannelConfig_default();
        // struct LDKCVec_u8Z ChannelConfig_write(const struct LDKChannelConfig *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelConfig_write")] public static extern byte[] ChannelConfig_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelConfig_write")] public static extern long ChannelConfig_write(long _obj);
        // struct LDKCResult_ChannelConfigDecodeErrorZ ChannelConfig_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelConfig_read")] public static extern long ChannelConfig_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelConfig_read")] public static extern long ChannelConfig_read(long _ser);
        // void ChannelConfigUpdate_free(struct LDKChannelConfigUpdate this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelConfigUpdate_free")] public static extern void ChannelConfigUpdate_free(long _this_obj);
        // struct LDKCOption_u32Z ChannelConfigUpdate_get_forwarding_fee_proportional_millionths(const struct LDKChannelConfigUpdate *NONNULL_PTR this_ptr);
@@ -5065,9 +6025,9 @@ internal class bindings {
        // MUST_USE_RES struct LDKBestBlock BestBlock_from_network(enum LDKNetwork network);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BestBlock_from_network")] public static extern long BestBlock_from_network(Network _network);
        // MUST_USE_RES struct LDKBestBlock BestBlock_new(struct LDKThirtyTwoBytes block_hash, uint32_t height);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BestBlock_new")] public static extern long BestBlock_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _block_hash, int _height);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BestBlock_new")] public static extern long BestBlock_new(long _block_hash, int _height);
        // MUST_USE_RES struct LDKThirtyTwoBytes BestBlock_block_hash(const struct LDKBestBlock *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BestBlock_block_hash")] public static extern byte[] BestBlock_block_hash(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BestBlock_block_hash")] public static extern long BestBlock_block_hash(long _this_arg);
        // MUST_USE_RES uint32_t BestBlock_height(const struct LDKBestBlock *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BestBlock_height")] public static extern int BestBlock_height(long _this_arg);
        // void Listen_free(struct LDKListen this_ptr);
@@ -5080,8 +6040,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitorUpdateStatus_completed")] public static extern ChannelMonitorUpdateStatus ChannelMonitorUpdateStatus_completed();
        // enum LDKChannelMonitorUpdateStatus ChannelMonitorUpdateStatus_in_progress(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitorUpdateStatus_in_progress")] public static extern ChannelMonitorUpdateStatus ChannelMonitorUpdateStatus_in_progress();
-       // enum LDKChannelMonitorUpdateStatus ChannelMonitorUpdateStatus_permanent_failure(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitorUpdateStatus_permanent_failure")] public static extern ChannelMonitorUpdateStatus ChannelMonitorUpdateStatus_permanent_failure();
+       // enum LDKChannelMonitorUpdateStatus ChannelMonitorUpdateStatus_unrecoverable_error(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitorUpdateStatus_unrecoverable_error")] public static extern ChannelMonitorUpdateStatus ChannelMonitorUpdateStatus_unrecoverable_error();
        // bool ChannelMonitorUpdateStatus_eq(const enum LDKChannelMonitorUpdateStatus *NONNULL_PTR a, const enum LDKChannelMonitorUpdateStatus *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitorUpdateStatus_eq")] public static extern bool ChannelMonitorUpdateStatus_eq(long _a, long _b);
        // void Watch_free(struct LDKWatch this_ptr);
@@ -5090,20 +6050,20 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Filter_free")] public static extern void Filter_free(long _this_ptr);
        // void WatchedOutput_free(struct LDKWatchedOutput this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WatchedOutput_free")] public static extern void WatchedOutput_free(long _this_obj);
-       // struct LDKCOption_BlockHashZ WatchedOutput_get_block_hash(const struct LDKWatchedOutput *NONNULL_PTR this_ptr);
+       // struct LDKCOption_ThirtyTwoBytesZ WatchedOutput_get_block_hash(const struct LDKWatchedOutput *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WatchedOutput_get_block_hash")] public static extern long WatchedOutput_get_block_hash(long _this_ptr);
-       // void WatchedOutput_set_block_hash(struct LDKWatchedOutput *NONNULL_PTR this_ptr, struct LDKCOption_BlockHashZ val);
+       // void WatchedOutput_set_block_hash(struct LDKWatchedOutput *NONNULL_PTR this_ptr, struct LDKCOption_ThirtyTwoBytesZ val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WatchedOutput_set_block_hash")] public static extern void WatchedOutput_set_block_hash(long _this_ptr, long _val);
        // struct LDKOutPoint WatchedOutput_get_outpoint(const struct LDKWatchedOutput *NONNULL_PTR this_ptr);
        [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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WatchedOutput_get_script_pubkey")] public static extern byte[] WatchedOutput_get_script_pubkey(long _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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // MUST_USE_RES struct LDKWatchedOutput WatchedOutput_new(struct LDKCOption_BlockHashZ block_hash_arg, struct LDKOutPoint outpoint_arg, struct LDKCVec_u8Z script_pubkey_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WatchedOutput_new")] public static extern long WatchedOutput_new(long _block_hash_arg, long _outpoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _script_pubkey_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WatchedOutput_set_script_pubkey")] public static extern void WatchedOutput_set_script_pubkey(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKWatchedOutput WatchedOutput_new(struct LDKCOption_ThirtyTwoBytesZ block_hash_arg, struct LDKOutPoint outpoint_arg, struct LDKCVec_u8Z script_pubkey_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WatchedOutput_new")] public static extern long WatchedOutput_new(long _block_hash_arg, long _outpoint_arg, long _script_pubkey_arg);
        // uint64_t WatchedOutput_clone_ptr(LDKWatchedOutput *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WatchedOutput_clone_ptr")] public static extern long WatchedOutput_clone_ptr(long _arg);
        // struct LDKWatchedOutput WatchedOutput_clone(const struct LDKWatchedOutput *NONNULL_PTR orig);
@@ -5116,14 +6076,20 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BroadcasterInterface_free")] public static extern void BroadcasterInterface_free(long _this_ptr);
        // enum LDKConfirmationTarget ConfirmationTarget_clone(const enum LDKConfirmationTarget *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ConfirmationTarget_clone")] public static extern ConfirmationTarget ConfirmationTarget_clone(long _orig);
-       // enum LDKConfirmationTarget ConfirmationTarget_mempool_minimum(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ConfirmationTarget_mempool_minimum")] public static extern ConfirmationTarget ConfirmationTarget_mempool_minimum();
-       // enum LDKConfirmationTarget ConfirmationTarget_background(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ConfirmationTarget_background")] public static extern ConfirmationTarget ConfirmationTarget_background();
-       // enum LDKConfirmationTarget ConfirmationTarget_normal(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ConfirmationTarget_normal")] public static extern ConfirmationTarget ConfirmationTarget_normal();
-       // enum LDKConfirmationTarget ConfirmationTarget_high_priority(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ConfirmationTarget_high_priority")] public static extern ConfirmationTarget ConfirmationTarget_high_priority();
+       // 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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ConfirmationTarget_min_allowed_non_anchor_channel_remote_fee")] public static extern ConfirmationTarget ConfirmationTarget_min_allowed_non_anchor_channel_remote_fee();
+       // enum LDKConfirmationTarget ConfirmationTarget_anchor_channel_fee(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ConfirmationTarget_anchor_channel_fee")] public static extern ConfirmationTarget ConfirmationTarget_anchor_channel_fee();
+       // enum LDKConfirmationTarget ConfirmationTarget_non_anchor_channel_fee(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ConfirmationTarget_non_anchor_channel_fee")] public static extern ConfirmationTarget ConfirmationTarget_non_anchor_channel_fee();
+       // enum LDKConfirmationTarget ConfirmationTarget_channel_close_minimum(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ConfirmationTarget_channel_close_minimum")] public static extern ConfirmationTarget ConfirmationTarget_channel_close_minimum();
        // uint64_t ConfirmationTarget_hash(const enum LDKConfirmationTarget *NONNULL_PTR o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ConfirmationTarget_hash")] public static extern long ConfirmationTarget_hash(long _o);
        // bool ConfirmationTarget_eq(const enum LDKConfirmationTarget *NONNULL_PTR a, const enum LDKConfirmationTarget *NONNULL_PTR b);
@@ -5149,13 +6115,13 @@ internal class bindings {
        // MUST_USE_RES struct LDKChainMonitor ChainMonitor_new(struct LDKCOption_FilterZ chain_source, struct LDKBroadcasterInterface broadcaster, struct LDKLogger logger, struct LDKFeeEstimator feeest, struct LDKPersist persister);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChainMonitor_new")] public static extern long ChainMonitor_new(long _chain_source, long _broadcaster, long _logger, long _feeest, long _persister);
        // MUST_USE_RES struct LDKCVec_BalanceZ ChainMonitor_get_claimable_balances(const struct LDKChainMonitor *NONNULL_PTR this_arg, struct LDKCVec_ChannelDetailsZ ignored_channels);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChainMonitor_get_claimable_balances")] public static extern long[] ChainMonitor_get_claimable_balances(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _ignored_channels);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChainMonitor_get_claimable_balances")] public static extern long ChainMonitor_get_claimable_balances(long _this_arg, long _ignored_channels);
        // MUST_USE_RES struct LDKCResult_LockedChannelMonitorNoneZ ChainMonitor_get_monitor(const struct LDKChainMonitor *NONNULL_PTR this_arg, struct LDKOutPoint funding_txo);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChainMonitor_get_monitor")] public static extern long ChainMonitor_get_monitor(long _this_arg, long _funding_txo);
        // MUST_USE_RES struct LDKCVec_OutPointZ ChainMonitor_list_monitors(const struct LDKChainMonitor *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChainMonitor_list_monitors")] public static extern long[] ChainMonitor_list_monitors(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChainMonitor_list_monitors")] public static extern long ChainMonitor_list_monitors(long _this_arg);
        // MUST_USE_RES struct LDKCVec_C2Tuple_OutPointCVec_MonitorUpdateIdZZZ ChainMonitor_list_pending_monitor_updates(const struct LDKChainMonitor *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChainMonitor_list_pending_monitor_updates")] public static extern long[] ChainMonitor_list_pending_monitor_updates(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChainMonitor_list_pending_monitor_updates")] public static extern long ChainMonitor_list_pending_monitor_updates(long _this_arg);
        // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChainMonitor_channel_monitor_updated(const struct LDKChainMonitor *NONNULL_PTR this_arg, struct LDKOutPoint funding_txo, struct LDKMonitorUpdateId completed_update_id);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChainMonitor_channel_monitor_updated")] public static extern long ChainMonitor_channel_monitor_updated(long _this_arg, long _funding_txo, long _completed_update_id);
        // MUST_USE_RES struct LDKFuture ChainMonitor_get_update_future(const struct LDKChainMonitor *NONNULL_PTR this_arg);
@@ -5183,9 +6149,9 @@ internal class bindings {
        // bool ChannelMonitorUpdate_eq(const struct LDKChannelMonitorUpdate *NONNULL_PTR a, const struct LDKChannelMonitorUpdate *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitorUpdate_eq")] public static extern bool ChannelMonitorUpdate_eq(long _a, long _b);
        // struct LDKCVec_u8Z ChannelMonitorUpdate_write(const struct LDKChannelMonitorUpdate *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitorUpdate_write")] public static extern byte[] ChannelMonitorUpdate_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitorUpdate_write")] public static extern long ChannelMonitorUpdate_write(long _obj);
        // struct LDKCResult_ChannelMonitorUpdateDecodeErrorZ ChannelMonitorUpdate_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitorUpdate_read")] public static extern long ChannelMonitorUpdate_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitorUpdate_read")] public static extern long ChannelMonitorUpdate_read(long _ser);
        // void MonitorEvent_free(struct LDKMonitorEvent this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorEvent_free")] public static extern void MonitorEvent_free(long _this_ptr);
        // uint64_t MonitorEvent_clone_ptr(LDKMonitorEvent *NONNULL_PTR arg);
@@ -5194,18 +6160,16 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorEvent_clone")] public static extern long MonitorEvent_clone(long _orig);
        // struct LDKMonitorEvent MonitorEvent_htlcevent(struct LDKHTLCUpdate a);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorEvent_htlcevent")] public static extern long MonitorEvent_htlcevent(long _a);
-       // struct LDKMonitorEvent MonitorEvent_commitment_tx_confirmed(struct LDKOutPoint a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorEvent_commitment_tx_confirmed")] public static extern long MonitorEvent_commitment_tx_confirmed(long _a);
+       // struct LDKMonitorEvent MonitorEvent_holder_force_closed(struct LDKOutPoint a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorEvent_holder_force_closed")] public static extern long MonitorEvent_holder_force_closed(long _a);
        // struct LDKMonitorEvent MonitorEvent_completed(struct LDKOutPoint funding_txo, uint64_t monitor_update_id);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorEvent_completed")] public static extern long MonitorEvent_completed(long _funding_txo, long _monitor_update_id);
-       // struct LDKMonitorEvent MonitorEvent_update_failed(struct LDKOutPoint a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorEvent_update_failed")] public static extern long MonitorEvent_update_failed(long _a);
        // bool MonitorEvent_eq(const struct LDKMonitorEvent *NONNULL_PTR a, const struct LDKMonitorEvent *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorEvent_eq")] public static extern bool MonitorEvent_eq(long _a, long _b);
        // struct LDKCVec_u8Z MonitorEvent_write(const struct LDKMonitorEvent *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorEvent_write")] public static extern byte[] MonitorEvent_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorEvent_write")] public static extern long MonitorEvent_write(long _obj);
        // struct LDKCResult_COption_MonitorEventZDecodeErrorZ MonitorEvent_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorEvent_read")] public static extern long MonitorEvent_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MonitorEvent_read")] public static extern long MonitorEvent_read(long _ser);
        // void HTLCUpdate_free(struct LDKHTLCUpdate this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCUpdate_free")] public static extern void HTLCUpdate_free(long _this_obj);
        // uint64_t HTLCUpdate_clone_ptr(LDKHTLCUpdate *NONNULL_PTR arg);
@@ -5215,9 +6179,9 @@ internal class bindings {
        // bool HTLCUpdate_eq(const struct LDKHTLCUpdate *NONNULL_PTR a, const struct LDKHTLCUpdate *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCUpdate_eq")] public static extern bool HTLCUpdate_eq(long _a, long _b);
        // struct LDKCVec_u8Z HTLCUpdate_write(const struct LDKHTLCUpdate *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCUpdate_write")] public static extern byte[] HTLCUpdate_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCUpdate_write")] public static extern long HTLCUpdate_write(long _obj);
        // struct LDKCResult_HTLCUpdateDecodeErrorZ HTLCUpdate_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCUpdate_read")] public static extern long HTLCUpdate_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCUpdate_read")] public static extern long HTLCUpdate_read(long _ser);
        // void Balance_free(struct LDKBalance this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Balance_free")] public static extern void Balance_free(long _this_ptr);
        // uint64_t Balance_clone_ptr(LDKBalance *NONNULL_PTR arg);
@@ -5229,11 +6193,11 @@ internal class bindings {
        // struct LDKBalance Balance_claimable_awaiting_confirmations(uint64_t amount_satoshis, uint32_t confirmation_height);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Balance_claimable_awaiting_confirmations")] public static extern long Balance_claimable_awaiting_confirmations(long _amount_satoshis, int _confirmation_height);
        // struct LDKBalance Balance_contentious_claimable(uint64_t amount_satoshis, uint32_t timeout_height, struct LDKThirtyTwoBytes payment_hash, struct LDKThirtyTwoBytes payment_preimage);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Balance_contentious_claimable")] public static extern long Balance_contentious_claimable(long _amount_satoshis, int _timeout_height, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_preimage);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Balance_contentious_claimable")] public static extern long Balance_contentious_claimable(long _amount_satoshis, int _timeout_height, long _payment_hash, long _payment_preimage);
        // struct LDKBalance Balance_maybe_timeout_claimable_htlc(uint64_t amount_satoshis, uint32_t claimable_height, struct LDKThirtyTwoBytes payment_hash);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Balance_maybe_timeout_claimable_htlc")] public static extern long Balance_maybe_timeout_claimable_htlc(long _amount_satoshis, int _claimable_height, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Balance_maybe_timeout_claimable_htlc")] public static extern long Balance_maybe_timeout_claimable_htlc(long _amount_satoshis, int _claimable_height, long _payment_hash);
        // struct LDKBalance Balance_maybe_preimage_claimable_htlc(uint64_t amount_satoshis, uint32_t expiry_height, struct LDKThirtyTwoBytes payment_hash);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Balance_maybe_preimage_claimable_htlc")] public static extern long Balance_maybe_preimage_claimable_htlc(long _amount_satoshis, int _expiry_height, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Balance_maybe_preimage_claimable_htlc")] public static extern long Balance_maybe_preimage_claimable_htlc(long _amount_satoshis, int _expiry_height, long _payment_hash);
        // struct LDKBalance Balance_counterparty_revoked_output_claimable(uint64_t amount_satoshis);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Balance_counterparty_revoked_output_claimable")] public static extern long Balance_counterparty_revoked_output_claimable(long _amount_satoshis);
        // bool Balance_eq(const struct LDKBalance *NONNULL_PTR a, const struct LDKBalance *NONNULL_PTR b);
@@ -5247,57 +6211,65 @@ internal class bindings {
        // struct LDKChannelMonitor ChannelMonitor_clone(const struct LDKChannelMonitor *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_clone")] public static extern long ChannelMonitor_clone(long _orig);
        // struct LDKCVec_u8Z ChannelMonitor_write(const struct LDKChannelMonitor *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_write")] public static extern byte[] ChannelMonitor_write(long _obj);
-       // MUST_USE_RES struct LDKCResult_NoneNoneZ ChannelMonitor_update_monitor(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const struct LDKChannelMonitorUpdate *NONNULL_PTR updates, const struct LDKBroadcasterInterface *NONNULL_PTR broadcaster, struct LDKFeeEstimator fee_estimator, const struct LDKLogger *NONNULL_PTR logger);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_write")] public static extern long ChannelMonitor_write(long _obj);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ ChannelMonitor_update_monitor(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const struct LDKChannelMonitorUpdate *NONNULL_PTR updates, const struct LDKBroadcasterInterface *NONNULL_PTR broadcaster, const struct LDKFeeEstimator *NONNULL_PTR fee_estimator, const struct LDKLogger *NONNULL_PTR logger);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_update_monitor")] public static extern long ChannelMonitor_update_monitor(long _this_arg, long _updates, long _broadcaster, long _fee_estimator, long _logger);
        // MUST_USE_RES uint64_t ChannelMonitor_get_latest_update_id(const struct LDKChannelMonitor *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_get_latest_update_id")] public static extern long ChannelMonitor_get_latest_update_id(long _this_arg);
-       // MUST_USE_RES struct LDKC2Tuple_OutPointScriptZ ChannelMonitor_get_funding_txo(const struct LDKChannelMonitor *NONNULL_PTR this_arg);
+       // MUST_USE_RES struct LDKC2Tuple_OutPointCVec_u8ZZ ChannelMonitor_get_funding_txo(const struct LDKChannelMonitor *NONNULL_PTR this_arg);
        [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_TxidCVec_C2Tuple_u32ScriptZZZZ 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);
+       // 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);
        // 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);
+       [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);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_process_pending_events")] public static extern void ChannelMonitor_process_pending_events(long _this_arg, long _handler);
+       // MUST_USE_RES struct LDKCommitmentTransaction ChannelMonitor_initial_counterparty_commitment_tx(const struct LDKChannelMonitor *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_initial_counterparty_commitment_tx")] public static extern long ChannelMonitor_initial_counterparty_commitment_tx(long _this_arg);
+       // MUST_USE_RES struct LDKCVec_CommitmentTransactionZ ChannelMonitor_counterparty_commitment_txs_from_update(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const struct LDKChannelMonitorUpdate *NONNULL_PTR update);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_counterparty_commitment_txs_from_update")] public static extern long ChannelMonitor_counterparty_commitment_txs_from_update(long _this_arg, long _update);
+       // MUST_USE_RES struct LDKCResult_TransactionNoneZ ChannelMonitor_sign_to_local_justice_tx(const struct LDKChannelMonitor *NONNULL_PTR this_arg, struct LDKTransaction justice_tx, uintptr_t input_idx, uint64_t value, uint64_t commitment_number);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_sign_to_local_justice_tx")] public static extern long ChannelMonitor_sign_to_local_justice_tx(long _this_arg, long _justice_tx, long _input_idx, long _value, long _commitment_number);
        // MUST_USE_RES struct LDKPublicKey ChannelMonitor_get_counterparty_node_id(const struct LDKChannelMonitor *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_get_counterparty_node_id")] public static extern byte[] ChannelMonitor_get_counterparty_node_id(long _this_arg);
+       [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 byte[][] ChannelMonitor_get_latest_holder_commitment_txn(long _this_arg, long _logger);
-       // MUST_USE_RES struct LDKCVec_C2Tuple_TxidCVec_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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_block_connected")] public static extern long[] ChannelMonitor_block_connected(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _header, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _txdata, int _height, long _broadcaster, long _fee_estimator, long _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);
+       [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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_block_disconnected")] public static extern void ChannelMonitor_block_disconnected(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _header, int _height, long _broadcaster, long _fee_estimator, long _logger);
-       // MUST_USE_RES struct LDKCVec_C2Tuple_TxidCVec_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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_transactions_confirmed")] public static extern long[] ChannelMonitor_transactions_confirmed(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _header, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _txdata, int _height, long _broadcaster, long _fee_estimator, long _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);
+       [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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_transaction_unconfirmed")] public static extern void ChannelMonitor_transaction_unconfirmed(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _txid, long _broadcaster, long _fee_estimator, long _logger);
-       // MUST_USE_RES struct LDKCVec_C2Tuple_TxidCVec_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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_best_block_updated")] public static extern long[] ChannelMonitor_best_block_updated(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _header, int _height, long _broadcaster, long _fee_estimator, long _logger);
-       // MUST_USE_RES struct LDKCVec_C2Tuple_TxidCOption_BlockHashZZZ 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);
+       [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);
+       [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);
+       [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);
        [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);
        // MUST_USE_RES struct LDKCVec_BalanceZ ChannelMonitor_get_claimable_balances(const struct LDKChannelMonitor *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_get_claimable_balances")] public static extern long[] ChannelMonitor_get_claimable_balances(long _this_arg);
-       // struct LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ C2Tuple_BlockHashChannelMonitorZ_read(struct LDKu8slice ser, const struct LDKEntropySource *NONNULL_PTR arg_a, const struct LDKSignerProvider *NONNULL_PTR arg_b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlockHashChannelMonitorZ_read")] public static extern long C2Tuple_BlockHashChannelMonitorZ_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser, long _arg_a, long _arg_b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_get_claimable_balances")] public static extern long ChannelMonitor_get_claimable_balances(long _this_arg);
+       // struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ C2Tuple_ThirtyTwoBytesChannelMonitorZ_read(struct LDKu8slice ser, const struct LDKEntropySource *NONNULL_PTR arg_a, const struct LDKSignerProvider *NONNULL_PTR arg_b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesChannelMonitorZ_read")] public static extern long C2Tuple_ThirtyTwoBytesChannelMonitorZ_read(long _ser, long _arg_a, long _arg_b);
        // void OutPoint_free(struct LDKOutPoint this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_free")] public static extern void OutPoint_free(long _this_obj);
        // const uint8_t (*OutPoint_get_txid(const struct LDKOutPoint *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_get_txid")] public static extern byte[] OutPoint_get_txid(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_get_txid")] public static extern long OutPoint_get_txid(long _this_ptr);
        // void OutPoint_set_txid(struct LDKOutPoint *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_set_txid")] public static extern void OutPoint_set_txid(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_set_txid")] public static extern void OutPoint_set_txid(long _this_ptr, long _val);
        // uint16_t OutPoint_get_index(const struct LDKOutPoint *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_get_index")] public static extern short OutPoint_get_index(long _this_ptr);
        // void OutPoint_set_index(struct LDKOutPoint *NONNULL_PTR this_ptr, uint16_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_set_index")] public static extern void OutPoint_set_index(long _this_ptr, short _val);
        // MUST_USE_RES struct LDKOutPoint OutPoint_new(struct LDKThirtyTwoBytes txid_arg, uint16_t index_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_new")] public static extern long OutPoint_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _txid_arg, short _index_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_new")] public static extern long OutPoint_new(long _txid_arg, short _index_arg);
        // uint64_t OutPoint_clone_ptr(LDKOutPoint *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_clone_ptr")] public static extern long OutPoint_clone_ptr(long _arg);
        // struct LDKOutPoint OutPoint_clone(const struct LDKOutPoint *NONNULL_PTR orig);
@@ -5307,19 +6279,25 @@ internal class bindings {
        // uint64_t OutPoint_hash(const struct LDKOutPoint *NONNULL_PTR o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_hash")] public static extern long OutPoint_hash(long _o);
        // MUST_USE_RES struct LDKThirtyTwoBytes OutPoint_to_channel_id(const struct LDKOutPoint *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_to_channel_id")] public static extern byte[] OutPoint_to_channel_id(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_to_channel_id")] public static extern long OutPoint_to_channel_id(long _this_arg);
        // struct LDKCVec_u8Z OutPoint_write(const struct LDKOutPoint *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_write")] public static extern byte[] OutPoint_write(long _obj);
+       [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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
-       // enum LDKFailureCode FailureCode_clone(const enum LDKFailureCode *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FailureCode_clone")] public static extern FailureCode FailureCode_clone(long _orig);
-       // enum LDKFailureCode FailureCode_temporary_node_failure(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FailureCode_temporary_node_failure")] public static extern FailureCode FailureCode_temporary_node_failure();
-       // enum LDKFailureCode FailureCode_required_node_feature_missing(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FailureCode_required_node_feature_missing")] public static extern FailureCode FailureCode_required_node_feature_missing();
-       // enum LDKFailureCode FailureCode_incorrect_or_unknown_payment_details(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FailureCode_incorrect_or_unknown_payment_details")] public static extern FailureCode FailureCode_incorrect_or_unknown_payment_details();
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_read")] public static extern long OutPoint_read(long _ser);
+       // 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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FailureCode_clone_ptr")] public static extern long FailureCode_clone_ptr(long _arg);
+       // struct LDKFailureCode FailureCode_clone(const struct LDKFailureCode *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FailureCode_clone")] public static extern long FailureCode_clone(long _orig);
+       // struct LDKFailureCode FailureCode_temporary_node_failure(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FailureCode_temporary_node_failure")] public static extern long FailureCode_temporary_node_failure();
+       // struct LDKFailureCode FailureCode_required_node_feature_missing(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FailureCode_required_node_feature_missing")] public static extern long FailureCode_required_node_feature_missing();
+       // struct LDKFailureCode FailureCode_incorrect_or_unknown_payment_details(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FailureCode_incorrect_or_unknown_payment_details")] public static extern long FailureCode_incorrect_or_unknown_payment_details();
+       // struct LDKFailureCode FailureCode_invalid_onion_payload(struct LDKCOption_C2Tuple_u64u16ZZ a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FailureCode_invalid_onion_payload")] public static extern long FailureCode_invalid_onion_payload(long _a);
        // void ChannelManager_free(struct LDKChannelManager this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_free")] public static extern void ChannelManager_free(long _this_obj);
        // void ChainParameters_free(struct LDKChainParameters this_obj);
@@ -5361,9 +6339,9 @@ internal class bindings {
        // void ChannelCounterparty_free(struct LDKChannelCounterparty this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelCounterparty_free")] public static extern void ChannelCounterparty_free(long _this_obj);
        // struct LDKPublicKey ChannelCounterparty_get_node_id(const struct LDKChannelCounterparty *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelCounterparty_get_node_id")] public static extern byte[] ChannelCounterparty_get_node_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelCounterparty_get_node_id")] public static extern long ChannelCounterparty_get_node_id(long _this_ptr);
        // void ChannelCounterparty_set_node_id(struct LDKChannelCounterparty *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelCounterparty_set_node_id")] public static extern void ChannelCounterparty_set_node_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelCounterparty_set_node_id")] public static extern void ChannelCounterparty_set_node_id(long _this_ptr, long _val);
        // struct LDKInitFeatures ChannelCounterparty_get_features(const struct LDKChannelCounterparty *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelCounterparty_get_features")] public static extern long ChannelCounterparty_get_features(long _this_ptr);
        // void ChannelCounterparty_set_features(struct LDKChannelCounterparty *NONNULL_PTR this_ptr, struct LDKInitFeatures val);
@@ -5385,7 +6363,7 @@ internal class bindings {
        // void ChannelCounterparty_set_outbound_htlc_maximum_msat(struct LDKChannelCounterparty *NONNULL_PTR this_ptr, struct LDKCOption_u64Z val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelCounterparty_set_outbound_htlc_maximum_msat")] public static extern void ChannelCounterparty_set_outbound_htlc_maximum_msat(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKChannelCounterparty ChannelCounterparty_new(struct LDKPublicKey node_id_arg, struct LDKInitFeatures features_arg, uint64_t unspendable_punishment_reserve_arg, struct LDKCounterpartyForwardingInfo forwarding_info_arg, struct LDKCOption_u64Z outbound_htlc_minimum_msat_arg, struct LDKCOption_u64Z outbound_htlc_maximum_msat_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelCounterparty_new")] public static extern long ChannelCounterparty_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id_arg, long _features_arg, long _unspendable_punishment_reserve_arg, long _forwarding_info_arg, long _outbound_htlc_minimum_msat_arg, long _outbound_htlc_maximum_msat_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelCounterparty_new")] public static extern long ChannelCounterparty_new(long _node_id_arg, long _features_arg, long _unspendable_punishment_reserve_arg, long _forwarding_info_arg, long _outbound_htlc_minimum_msat_arg, long _outbound_htlc_maximum_msat_arg);
        // uint64_t ChannelCounterparty_clone_ptr(LDKChannelCounterparty *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelCounterparty_clone_ptr")] public static extern long ChannelCounterparty_clone_ptr(long _arg);
        // struct LDKChannelCounterparty ChannelCounterparty_clone(const struct LDKChannelCounterparty *NONNULL_PTR orig);
@@ -5393,9 +6371,9 @@ internal class bindings {
        // void ChannelDetails_free(struct LDKChannelDetails this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_free")] public static extern void ChannelDetails_free(long _this_obj);
        // const uint8_t (*ChannelDetails_get_channel_id(const struct LDKChannelDetails *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_get_channel_id")] public static extern byte[] ChannelDetails_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_get_channel_id")] public static extern long ChannelDetails_get_channel_id(long _this_ptr);
        // void ChannelDetails_set_channel_id(struct LDKChannelDetails *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_set_channel_id")] public static extern void ChannelDetails_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_set_channel_id")] public static extern void ChannelDetails_set_channel_id(long _this_ptr, long _val);
        // struct LDKChannelCounterparty ChannelDetails_get_counterparty(const struct LDKChannelDetails *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_get_counterparty")] public static extern long ChannelDetails_get_counterparty(long _this_ptr);
        // void ChannelDetails_set_counterparty(struct LDKChannelDetails *NONNULL_PTR this_ptr, struct LDKChannelCounterparty val);
@@ -5429,9 +6407,9 @@ internal class bindings {
        // void ChannelDetails_set_unspendable_punishment_reserve(struct LDKChannelDetails *NONNULL_PTR this_ptr, struct LDKCOption_u64Z val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_set_unspendable_punishment_reserve")] public static extern void ChannelDetails_set_unspendable_punishment_reserve(long _this_ptr, long _val);
        // struct LDKU128 ChannelDetails_get_user_channel_id(const struct LDKChannelDetails *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_get_user_channel_id")] public static extern byte[] ChannelDetails_get_user_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_get_user_channel_id")] public static extern long ChannelDetails_get_user_channel_id(long _this_ptr);
        // void ChannelDetails_set_user_channel_id(struct LDKChannelDetails *NONNULL_PTR this_ptr, struct LDKU128 val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_set_user_channel_id")] public static extern void ChannelDetails_set_user_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_set_user_channel_id")] public static extern void ChannelDetails_set_user_channel_id(long _this_ptr, long _val);
        // struct LDKCOption_u32Z ChannelDetails_get_feerate_sat_per_1000_weight(const struct LDKChannelDetails *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_get_feerate_sat_per_1000_weight")] public static extern long ChannelDetails_get_feerate_sat_per_1000_weight(long _this_ptr);
        // void ChannelDetails_set_feerate_sat_per_1000_weight(struct LDKChannelDetails *NONNULL_PTR this_ptr, struct LDKCOption_u32Z val);
@@ -5501,7 +6479,7 @@ internal class bindings {
        // void ChannelDetails_set_config(struct LDKChannelDetails *NONNULL_PTR this_ptr, struct LDKChannelConfig val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_set_config")] public static extern void ChannelDetails_set_config(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKChannelDetails ChannelDetails_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKChannelCounterparty counterparty_arg, struct LDKOutPoint funding_txo_arg, struct LDKChannelTypeFeatures channel_type_arg, struct LDKCOption_u64Z short_channel_id_arg, struct LDKCOption_u64Z outbound_scid_alias_arg, struct LDKCOption_u64Z inbound_scid_alias_arg, uint64_t channel_value_satoshis_arg, struct LDKCOption_u64Z unspendable_punishment_reserve_arg, struct LDKU128 user_channel_id_arg, struct LDKCOption_u32Z feerate_sat_per_1000_weight_arg, uint64_t balance_msat_arg, uint64_t outbound_capacity_msat_arg, uint64_t next_outbound_htlc_limit_msat_arg, uint64_t next_outbound_htlc_minimum_msat_arg, uint64_t inbound_capacity_msat_arg, struct LDKCOption_u32Z confirmations_required_arg, struct LDKCOption_u32Z confirmations_arg, struct LDKCOption_u16Z force_close_spend_delay_arg, bool is_outbound_arg, bool is_channel_ready_arg, struct LDKCOption_ChannelShutdownStateZ channel_shutdown_state_arg, bool is_usable_arg, bool is_public_arg, struct LDKCOption_u64Z inbound_htlc_minimum_msat_arg, struct LDKCOption_u64Z inbound_htlc_maximum_msat_arg, struct LDKChannelConfig config_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_new")] public static extern long ChannelDetails_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, long _counterparty_arg, long _funding_txo_arg, long _channel_type_arg, long _short_channel_id_arg, long _outbound_scid_alias_arg, long _inbound_scid_alias_arg, long _channel_value_satoshis_arg, long _unspendable_punishment_reserve_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _user_channel_id_arg, long _feerate_sat_per_1000_weight_arg, long _balance_msat_arg, long _outbound_capacity_msat_arg, long _next_outbound_htlc_limit_msat_arg, long _next_outbound_htlc_minimum_msat_arg, long _inbound_capacity_msat_arg, long _confirmations_required_arg, long _confirmations_arg, long _force_close_spend_delay_arg, bool _is_outbound_arg, bool _is_channel_ready_arg, long _channel_shutdown_state_arg, bool _is_usable_arg, bool _is_public_arg, long _inbound_htlc_minimum_msat_arg, long _inbound_htlc_maximum_msat_arg, long _config_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_new")] public static extern long ChannelDetails_new(long _channel_id_arg, long _counterparty_arg, long _funding_txo_arg, long _channel_type_arg, long _short_channel_id_arg, long _outbound_scid_alias_arg, long _inbound_scid_alias_arg, long _channel_value_satoshis_arg, long _unspendable_punishment_reserve_arg, long _user_channel_id_arg, long _feerate_sat_per_1000_weight_arg, long _balance_msat_arg, long _outbound_capacity_msat_arg, long _next_outbound_htlc_limit_msat_arg, long _next_outbound_htlc_minimum_msat_arg, long _inbound_capacity_msat_arg, long _confirmations_required_arg, long _confirmations_arg, long _force_close_spend_delay_arg, bool _is_outbound_arg, bool _is_channel_ready_arg, long _channel_shutdown_state_arg, bool _is_usable_arg, bool _is_public_arg, long _inbound_htlc_minimum_msat_arg, long _inbound_htlc_maximum_msat_arg, long _config_arg);
        // uint64_t ChannelDetails_clone_ptr(LDKChannelDetails *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_clone_ptr")] public static extern long ChannelDetails_clone_ptr(long _arg);
        // struct LDKChannelDetails ChannelDetails_clone(const struct LDKChannelDetails *NONNULL_PTR orig);
@@ -5530,28 +6508,30 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecentPaymentDetails_clone_ptr")] public static extern long RecentPaymentDetails_clone_ptr(long _arg);
        // struct LDKRecentPaymentDetails RecentPaymentDetails_clone(const struct LDKRecentPaymentDetails *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecentPaymentDetails_clone")] public static extern long RecentPaymentDetails_clone(long _orig);
-       // struct LDKRecentPaymentDetails RecentPaymentDetails_pending(struct LDKThirtyTwoBytes payment_hash, uint64_t total_msat);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecentPaymentDetails_pending")] public static extern long RecentPaymentDetails_pending([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, long _total_msat);
-       // struct LDKRecentPaymentDetails RecentPaymentDetails_fulfilled(struct LDKCOption_PaymentHashZ payment_hash);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecentPaymentDetails_fulfilled")] public static extern long RecentPaymentDetails_fulfilled(long _payment_hash);
-       // struct LDKRecentPaymentDetails RecentPaymentDetails_abandoned(struct LDKThirtyTwoBytes payment_hash);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecentPaymentDetails_abandoned")] public static extern long RecentPaymentDetails_abandoned([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash);
+       // struct LDKRecentPaymentDetails RecentPaymentDetails_awaiting_invoice(struct LDKThirtyTwoBytes payment_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecentPaymentDetails_awaiting_invoice")] public static extern long RecentPaymentDetails_awaiting_invoice(long _payment_id);
+       // struct LDKRecentPaymentDetails RecentPaymentDetails_pending(struct LDKThirtyTwoBytes payment_id, struct LDKThirtyTwoBytes payment_hash, uint64_t total_msat);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecentPaymentDetails_pending")] public static extern long RecentPaymentDetails_pending(long _payment_id, long _payment_hash, long _total_msat);
+       // struct LDKRecentPaymentDetails RecentPaymentDetails_fulfilled(struct LDKThirtyTwoBytes payment_id, struct LDKCOption_ThirtyTwoBytesZ payment_hash);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecentPaymentDetails_fulfilled")] public static extern long RecentPaymentDetails_fulfilled(long _payment_id, long _payment_hash);
+       // struct LDKRecentPaymentDetails RecentPaymentDetails_abandoned(struct LDKThirtyTwoBytes payment_id, struct LDKThirtyTwoBytes payment_hash);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecentPaymentDetails_abandoned")] public static extern long RecentPaymentDetails_abandoned(long _payment_id, long _payment_hash);
        // void PhantomRouteHints_free(struct LDKPhantomRouteHints this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_free")] public static extern void PhantomRouteHints_free(long _this_obj);
        // struct LDKCVec_ChannelDetailsZ PhantomRouteHints_get_channels(const struct LDKPhantomRouteHints *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_get_channels")] public static extern long[] PhantomRouteHints_get_channels(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_get_channels")] public static extern long PhantomRouteHints_get_channels(long _this_ptr);
        // void PhantomRouteHints_set_channels(struct LDKPhantomRouteHints *NONNULL_PTR this_ptr, struct LDKCVec_ChannelDetailsZ val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_set_channels")] public static extern void PhantomRouteHints_set_channels(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_set_channels")] public static extern void PhantomRouteHints_set_channels(long _this_ptr, long _val);
        // uint64_t PhantomRouteHints_get_phantom_scid(const struct LDKPhantomRouteHints *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_get_phantom_scid")] public static extern long PhantomRouteHints_get_phantom_scid(long _this_ptr);
        // void PhantomRouteHints_set_phantom_scid(struct LDKPhantomRouteHints *NONNULL_PTR this_ptr, uint64_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_set_phantom_scid")] public static extern void PhantomRouteHints_set_phantom_scid(long _this_ptr, long _val);
        // struct LDKPublicKey PhantomRouteHints_get_real_node_pubkey(const struct LDKPhantomRouteHints *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_get_real_node_pubkey")] public static extern byte[] PhantomRouteHints_get_real_node_pubkey(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_get_real_node_pubkey")] public static extern long PhantomRouteHints_get_real_node_pubkey(long _this_ptr);
        // void PhantomRouteHints_set_real_node_pubkey(struct LDKPhantomRouteHints *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_set_real_node_pubkey")] public static extern void PhantomRouteHints_set_real_node_pubkey(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_set_real_node_pubkey")] public static extern void PhantomRouteHints_set_real_node_pubkey(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKPhantomRouteHints PhantomRouteHints_new(struct LDKCVec_ChannelDetailsZ channels_arg, uint64_t phantom_scid_arg, struct LDKPublicKey real_node_pubkey_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_new")] public static extern long PhantomRouteHints_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _channels_arg, long _phantom_scid_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _real_node_pubkey_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_new")] public static extern long PhantomRouteHints_new(long _channels_arg, long _phantom_scid_arg, long _real_node_pubkey_arg);
        // uint64_t PhantomRouteHints_clone_ptr(LDKPhantomRouteHints *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_clone_ptr")] public static extern long PhantomRouteHints_clone_ptr(long _arg);
        // struct LDKPhantomRouteHints PhantomRouteHints_clone(const struct LDKPhantomRouteHints *NONNULL_PTR orig);
@@ -5560,72 +6540,84 @@ 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__u832APIErrorZ 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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_network_key, long _channel_value_satoshis, long _push_msat, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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 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 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);
+       [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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_list_usable_channels")] public static extern long[] ChannelManager_list_usable_channels(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_list_usable_channels")] public static extern long ChannelManager_list_usable_channels(long _this_arg);
        // MUST_USE_RES struct LDKCVec_ChannelDetailsZ ChannelManager_list_channels_with_counterparty(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKPublicKey counterparty_node_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_list_channels_with_counterparty")] public static extern long[] ChannelManager_list_channels_with_counterparty(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _counterparty_node_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_list_channels_with_counterparty")] public static extern long ChannelManager_list_channels_with_counterparty(long _this_arg, long _counterparty_node_id);
        // MUST_USE_RES struct LDKCVec_RecentPaymentDetailsZ ChannelManager_list_recent_payments(const struct LDKChannelManager *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_list_recent_payments")] public static extern long[] ChannelManager_list_recent_payments(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_list_recent_payments")] public static extern long ChannelManager_list_recent_payments(long _this_arg);
        // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChannelManager_close_channel(const struct LDKChannelManager *NONNULL_PTR this_arg, const uint8_t (*channel_id)[32], struct LDKPublicKey counterparty_node_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_close_channel")] public static extern long ChannelManager_close_channel(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _counterparty_node_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_close_channel")] public static extern long ChannelManager_close_channel(long _this_arg, long _channel_id, long _counterparty_node_id);
        // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChannelManager_close_channel_with_feerate_and_script(const struct LDKChannelManager *NONNULL_PTR this_arg, const uint8_t (*channel_id)[32], struct LDKPublicKey counterparty_node_id, struct LDKCOption_u32Z target_feerate_sats_per_1000_weight, struct LDKShutdownScript shutdown_script);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_close_channel_with_feerate_and_script")] public static extern long ChannelManager_close_channel_with_feerate_and_script(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _counterparty_node_id, long _target_feerate_sats_per_1000_weight, long _shutdown_script);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_close_channel_with_feerate_and_script")] public static extern long ChannelManager_close_channel_with_feerate_and_script(long _this_arg, long _channel_id, long _counterparty_node_id, long _target_feerate_sats_per_1000_weight, long _shutdown_script);
        // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChannelManager_force_close_broadcasting_latest_txn(const struct LDKChannelManager *NONNULL_PTR this_arg, const uint8_t (*channel_id)[32], struct LDKPublicKey counterparty_node_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_force_close_broadcasting_latest_txn")] public static extern long ChannelManager_force_close_broadcasting_latest_txn(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _counterparty_node_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_force_close_broadcasting_latest_txn")] public static extern long ChannelManager_force_close_broadcasting_latest_txn(long _this_arg, long _channel_id, long _counterparty_node_id);
        // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChannelManager_force_close_without_broadcasting_txn(const struct LDKChannelManager *NONNULL_PTR this_arg, const uint8_t (*channel_id)[32], struct LDKPublicKey counterparty_node_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_force_close_without_broadcasting_txn")] public static extern long ChannelManager_force_close_without_broadcasting_txn(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _counterparty_node_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_force_close_without_broadcasting_txn")] public static extern long ChannelManager_force_close_without_broadcasting_txn(long _this_arg, long _channel_id, long _counterparty_node_id);
        // void ChannelManager_force_close_all_channels_broadcasting_latest_txn(const struct LDKChannelManager *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_force_close_all_channels_broadcasting_latest_txn")] public static extern void ChannelManager_force_close_all_channels_broadcasting_latest_txn(long _this_arg);
        // void ChannelManager_force_close_all_channels_without_broadcasting_txn(const struct LDKChannelManager *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_force_close_all_channels_without_broadcasting_txn")] public static extern void ChannelManager_force_close_all_channels_without_broadcasting_txn(long _this_arg);
        // MUST_USE_RES struct LDKCResult_NonePaymentSendFailureZ ChannelManager_send_payment_with_route(const struct LDKChannelManager *NONNULL_PTR this_arg, const struct LDKRoute *NONNULL_PTR route, struct LDKThirtyTwoBytes payment_hash, struct LDKRecipientOnionFields recipient_onion, struct LDKThirtyTwoBytes payment_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_send_payment_with_route")] public static extern long ChannelManager_send_payment_with_route(long _this_arg, long _route, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, long _recipient_onion, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_send_payment_with_route")] public static extern long ChannelManager_send_payment_with_route(long _this_arg, long _route, long _payment_hash, long _recipient_onion, long _payment_id);
        // MUST_USE_RES struct LDKCResult_NoneRetryableSendFailureZ ChannelManager_send_payment(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKThirtyTwoBytes payment_hash, struct LDKRecipientOnionFields recipient_onion, struct LDKThirtyTwoBytes payment_id, struct LDKRouteParameters route_params, struct LDKRetry retry_strategy);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_send_payment")] public static extern long ChannelManager_send_payment(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, long _recipient_onion, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_id, long _route_params, long _retry_strategy);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_send_payment")] public static extern long ChannelManager_send_payment(long _this_arg, long _payment_hash, long _recipient_onion, long _payment_id, long _route_params, long _retry_strategy);
        // void ChannelManager_abandon_payment(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKThirtyTwoBytes payment_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_abandon_payment")] public static extern void ChannelManager_abandon_payment(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_id);
-       // MUST_USE_RES struct LDKCResult_PaymentHashPaymentSendFailureZ ChannelManager_send_spontaneous_payment(const struct LDKChannelManager *NONNULL_PTR this_arg, const struct LDKRoute *NONNULL_PTR route, struct LDKCOption_PaymentPreimageZ payment_preimage, struct LDKRecipientOnionFields recipient_onion, struct LDKThirtyTwoBytes payment_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_send_spontaneous_payment")] public static extern long ChannelManager_send_spontaneous_payment(long _this_arg, long _route, long _payment_preimage, long _recipient_onion, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_id);
-       // MUST_USE_RES struct LDKCResult_PaymentHashRetryableSendFailureZ ChannelManager_send_spontaneous_payment_with_retry(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKCOption_PaymentPreimageZ payment_preimage, struct LDKRecipientOnionFields recipient_onion, struct LDKThirtyTwoBytes payment_id, struct LDKRouteParameters route_params, struct LDKRetry retry_strategy);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_send_spontaneous_payment_with_retry")] public static extern long ChannelManager_send_spontaneous_payment_with_retry(long _this_arg, long _payment_preimage, long _recipient_onion, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_id, long _route_params, long _retry_strategy);
-       // MUST_USE_RES struct LDKCResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ ChannelManager_send_probe(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKPath path);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_abandon_payment")] public static extern void ChannelManager_abandon_payment(long _this_arg, long _payment_id);
+       // MUST_USE_RES struct LDKCResult_ThirtyTwoBytesPaymentSendFailureZ ChannelManager_send_spontaneous_payment(const struct LDKChannelManager *NONNULL_PTR this_arg, const struct LDKRoute *NONNULL_PTR route, struct LDKCOption_ThirtyTwoBytesZ payment_preimage, struct LDKRecipientOnionFields recipient_onion, struct LDKThirtyTwoBytes payment_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_send_spontaneous_payment")] public static extern long ChannelManager_send_spontaneous_payment(long _this_arg, long _route, long _payment_preimage, long _recipient_onion, long _payment_id);
+       // MUST_USE_RES struct LDKCResult_ThirtyTwoBytesRetryableSendFailureZ ChannelManager_send_spontaneous_payment_with_retry(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKCOption_ThirtyTwoBytesZ payment_preimage, struct LDKRecipientOnionFields recipient_onion, struct LDKThirtyTwoBytes payment_id, struct LDKRouteParameters route_params, struct LDKRetry retry_strategy);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_send_spontaneous_payment_with_retry")] public static extern long ChannelManager_send_spontaneous_payment_with_retry(long _this_arg, long _payment_preimage, long _recipient_onion, long _payment_id, long _route_params, long _retry_strategy);
+       // MUST_USE_RES struct LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ ChannelManager_send_probe(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKPath path);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_send_probe")] public static extern long ChannelManager_send_probe(long _this_arg, long _path);
+       // MUST_USE_RES struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ ChannelManager_send_spontaneous_preflight_probes(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKPublicKey node_id, uint64_t amount_msat, uint32_t final_cltv_expiry_delta, struct LDKCOption_u64Z liquidity_limit_multiplier);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_send_spontaneous_preflight_probes")] public static extern long ChannelManager_send_spontaneous_preflight_probes(long _this_arg, long _node_id, long _amount_msat, int _final_cltv_expiry_delta, long _liquidity_limit_multiplier);
+       // MUST_USE_RES struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ ChannelManager_send_preflight_probes(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKRouteParameters route_params, struct LDKCOption_u64Z liquidity_limit_multiplier);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_send_preflight_probes")] public static extern long ChannelManager_send_preflight_probes(long _this_arg, long _route_params, long _liquidity_limit_multiplier);
        // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChannelManager_funding_transaction_generated(const struct LDKChannelManager *NONNULL_PTR this_arg, const uint8_t (*temporary_channel_id)[32], struct LDKPublicKey counterparty_node_id, struct LDKTransaction funding_transaction);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_funding_transaction_generated")] public static extern long ChannelManager_funding_transaction_generated(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _temporary_channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _counterparty_node_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_transaction);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_funding_transaction_generated")] public static extern long ChannelManager_funding_transaction_generated(long _this_arg, long _temporary_channel_id, long _counterparty_node_id, long _funding_transaction);
+       // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChannelManager_batch_funding_transaction_generated(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKCVec_C2Tuple_ThirtyTwoBytesPublicKeyZZ temporary_channels, struct LDKTransaction funding_transaction);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_batch_funding_transaction_generated")] public static extern long ChannelManager_batch_funding_transaction_generated(long _this_arg, long _temporary_channels, long _funding_transaction);
        // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChannelManager_update_partial_channel_config(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKPublicKey counterparty_node_id, struct LDKCVec_ThirtyTwoBytesZ channel_ids, const struct LDKChannelConfigUpdate *NONNULL_PTR config_update);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_update_partial_channel_config")] public static extern long ChannelManager_update_partial_channel_config(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _counterparty_node_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _channel_ids, long _config_update);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_update_partial_channel_config")] public static extern long ChannelManager_update_partial_channel_config(long _this_arg, long _counterparty_node_id, long _channel_ids, long _config_update);
        // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChannelManager_update_channel_config(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKPublicKey counterparty_node_id, struct LDKCVec_ThirtyTwoBytesZ channel_ids, const struct LDKChannelConfig *NONNULL_PTR config);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_update_channel_config")] public static extern long ChannelManager_update_channel_config(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _counterparty_node_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _channel_ids, long _config);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_update_channel_config")] public static extern long ChannelManager_update_channel_config(long _this_arg, long _counterparty_node_id, long _channel_ids, long _config);
        // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChannelManager_forward_intercepted_htlc(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKThirtyTwoBytes intercept_id, const uint8_t (*next_hop_channel_id)[32], struct LDKPublicKey next_node_id, uint64_t amt_to_forward_msat);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_forward_intercepted_htlc")] public static extern long ChannelManager_forward_intercepted_htlc(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _intercept_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _next_hop_channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _next_node_id, long _amt_to_forward_msat);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_forward_intercepted_htlc")] public static extern long ChannelManager_forward_intercepted_htlc(long _this_arg, long _intercept_id, long _next_hop_channel_id, long _next_node_id, long _amt_to_forward_msat);
        // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChannelManager_fail_intercepted_htlc(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKThirtyTwoBytes intercept_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_fail_intercepted_htlc")] public static extern long ChannelManager_fail_intercepted_htlc(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _intercept_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_fail_intercepted_htlc")] public static extern long ChannelManager_fail_intercepted_htlc(long _this_arg, long _intercept_id);
        // void ChannelManager_process_pending_htlc_forwards(const struct LDKChannelManager *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_process_pending_htlc_forwards")] public static extern void ChannelManager_process_pending_htlc_forwards(long _this_arg);
        // void ChannelManager_timer_tick_occurred(const struct LDKChannelManager *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_timer_tick_occurred")] public static extern void ChannelManager_timer_tick_occurred(long _this_arg);
        // void ChannelManager_fail_htlc_backwards(const struct LDKChannelManager *NONNULL_PTR this_arg, const uint8_t (*payment_hash)[32]);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_fail_htlc_backwards")] public static extern void ChannelManager_fail_htlc_backwards(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash);
-       // void ChannelManager_fail_htlc_backwards_with_reason(const struct LDKChannelManager *NONNULL_PTR this_arg, const uint8_t (*payment_hash)[32], enum LDKFailureCode failure_code);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_fail_htlc_backwards_with_reason")] public static extern void ChannelManager_fail_htlc_backwards_with_reason(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, FailureCode _failure_code);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_fail_htlc_backwards")] public static extern void ChannelManager_fail_htlc_backwards(long _this_arg, long _payment_hash);
+       // void ChannelManager_fail_htlc_backwards_with_reason(const struct LDKChannelManager *NONNULL_PTR this_arg, const uint8_t (*payment_hash)[32], struct LDKFailureCode failure_code);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_fail_htlc_backwards_with_reason")] public static extern void ChannelManager_fail_htlc_backwards_with_reason(long _this_arg, long _payment_hash, long _failure_code);
        // void ChannelManager_claim_funds(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKThirtyTwoBytes payment_preimage);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_claim_funds")] public static extern void ChannelManager_claim_funds(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_preimage);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_claim_funds")] public static extern void ChannelManager_claim_funds(long _this_arg, long _payment_preimage);
+       // void ChannelManager_claim_funds_with_known_custom_tlvs(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKThirtyTwoBytes payment_preimage);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_claim_funds_with_known_custom_tlvs")] public static extern void ChannelManager_claim_funds_with_known_custom_tlvs(long _this_arg, long _payment_preimage);
        // MUST_USE_RES struct LDKPublicKey ChannelManager_get_our_node_id(const struct LDKChannelManager *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_get_our_node_id")] public static extern byte[] ChannelManager_get_our_node_id(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_get_our_node_id")] public static extern long ChannelManager_get_our_node_id(long _this_arg);
        // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChannelManager_accept_inbound_channel(const struct LDKChannelManager *NONNULL_PTR this_arg, const uint8_t (*temporary_channel_id)[32], struct LDKPublicKey counterparty_node_id, struct LDKU128 user_channel_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_accept_inbound_channel")] public static extern long ChannelManager_accept_inbound_channel(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _temporary_channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _counterparty_node_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _user_channel_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_accept_inbound_channel")] public static extern long ChannelManager_accept_inbound_channel(long _this_arg, long _temporary_channel_id, long _counterparty_node_id, long _user_channel_id);
        // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChannelManager_accept_inbound_channel_from_trusted_peer_0conf(const struct LDKChannelManager *NONNULL_PTR this_arg, const uint8_t (*temporary_channel_id)[32], struct LDKPublicKey counterparty_node_id, struct LDKU128 user_channel_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_accept_inbound_channel_from_trusted_peer_0conf")] public static extern long ChannelManager_accept_inbound_channel_from_trusted_peer_0conf(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _temporary_channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _counterparty_node_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _user_channel_id);
-       // MUST_USE_RES struct LDKCResult_C2Tuple_PaymentHashPaymentSecretZNoneZ ChannelManager_create_inbound_payment(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKCOption_u64Z min_value_msat, uint32_t invoice_expiry_delta_secs, struct LDKCOption_u16Z min_final_cltv_expiry_delta);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_accept_inbound_channel_from_trusted_peer_0conf")] public static extern long ChannelManager_accept_inbound_channel_from_trusted_peer_0conf(long _this_arg, long _temporary_channel_id, long _counterparty_node_id, long _user_channel_id);
+       // MUST_USE_RES struct LDKCResult_NoneBolt12SemanticErrorZ ChannelManager_pay_for_offer(const struct LDKChannelManager *NONNULL_PTR this_arg, const struct LDKOffer *NONNULL_PTR offer, struct LDKCOption_u64Z quantity, struct LDKCOption_u64Z amount_msats, struct LDKCOption_StrZ payer_note, struct LDKThirtyTwoBytes payment_id, struct LDKRetry retry_strategy, struct LDKCOption_u64Z max_total_routing_fee_msat);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_pay_for_offer")] public static extern long ChannelManager_pay_for_offer(long _this_arg, long _offer, long _quantity, long _amount_msats, long _payer_note, long _payment_id, long _retry_strategy, long _max_total_routing_fee_msat);
+       // MUST_USE_RES struct LDKCResult_NoneBolt12SemanticErrorZ ChannelManager_request_refund_payment(const struct LDKChannelManager *NONNULL_PTR this_arg, const struct LDKRefund *NONNULL_PTR refund);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_request_refund_payment")] public static extern long ChannelManager_request_refund_payment(long _this_arg, long _refund);
+       // MUST_USE_RES struct LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ ChannelManager_create_inbound_payment(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKCOption_u64Z min_value_msat, uint32_t invoice_expiry_delta_secs, struct LDKCOption_u16Z min_final_cltv_expiry_delta);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_create_inbound_payment")] public static extern long ChannelManager_create_inbound_payment(long _this_arg, long _min_value_msat, int _invoice_expiry_delta_secs, long _min_final_cltv_expiry_delta);
-       // MUST_USE_RES struct LDKCResult_PaymentSecretNoneZ ChannelManager_create_inbound_payment_for_hash(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKThirtyTwoBytes payment_hash, struct LDKCOption_u64Z min_value_msat, uint32_t invoice_expiry_delta_secs, struct LDKCOption_u16Z min_final_cltv_expiry);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_create_inbound_payment_for_hash")] public static extern long ChannelManager_create_inbound_payment_for_hash(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, long _min_value_msat, int _invoice_expiry_delta_secs, long _min_final_cltv_expiry);
-       // MUST_USE_RES struct LDKCResult_PaymentPreimageAPIErrorZ ChannelManager_get_payment_preimage(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKThirtyTwoBytes payment_hash, struct LDKThirtyTwoBytes payment_secret);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_get_payment_preimage")] public static extern long ChannelManager_get_payment_preimage(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_secret);
+       // MUST_USE_RES struct LDKCResult_ThirtyTwoBytesNoneZ ChannelManager_create_inbound_payment_for_hash(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKThirtyTwoBytes payment_hash, struct LDKCOption_u64Z min_value_msat, uint32_t invoice_expiry_delta_secs, struct LDKCOption_u16Z min_final_cltv_expiry);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_create_inbound_payment_for_hash")] public static extern long ChannelManager_create_inbound_payment_for_hash(long _this_arg, long _payment_hash, long _min_value_msat, int _invoice_expiry_delta_secs, long _min_final_cltv_expiry);
+       // MUST_USE_RES struct LDKCResult_ThirtyTwoBytesAPIErrorZ ChannelManager_get_payment_preimage(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKThirtyTwoBytes payment_hash, struct LDKThirtyTwoBytes payment_secret);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_get_payment_preimage")] public static extern long ChannelManager_get_payment_preimage(long _this_arg, long _payment_hash, long _payment_secret);
        // MUST_USE_RES uint64_t ChannelManager_get_phantom_scid(const struct LDKChannelManager *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_get_phantom_scid")] public static extern long ChannelManager_get_phantom_scid(long _this_arg);
        // MUST_USE_RES struct LDKPhantomRouteHints ChannelManager_get_phantom_route_hints(const struct LDKChannelManager *NONNULL_PTR this_arg);
@@ -5642,8 +6634,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_as_Listen")] public static extern long ChannelManager_as_Listen(long _this_arg);
        // struct LDKConfirm ChannelManager_as_Confirm(const struct LDKChannelManager *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_as_Confirm")] public static extern long ChannelManager_as_Confirm(long _this_arg);
-       // MUST_USE_RES struct LDKFuture ChannelManager_get_persistable_update_future(const struct LDKChannelManager *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_get_persistable_update_future")] public static extern long ChannelManager_get_persistable_update_future(long _this_arg);
+       // MUST_USE_RES struct LDKFuture ChannelManager_get_event_or_persistence_needed_future(const struct LDKChannelManager *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_get_event_or_persistence_needed_future")] public static extern long ChannelManager_get_event_or_persistence_needed_future(long _this_arg);
+       // MUST_USE_RES bool ChannelManager_get_and_clear_needs_persistence(const struct LDKChannelManager *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_get_and_clear_needs_persistence")] public static extern bool ChannelManager_get_and_clear_needs_persistence(long _this_arg);
        // MUST_USE_RES struct LDKBestBlock ChannelManager_current_best_block(const struct LDKChannelManager *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_current_best_block")] public static extern long ChannelManager_current_best_block(long _this_arg);
        // MUST_USE_RES struct LDKNodeFeatures ChannelManager_node_features(const struct LDKChannelManager *NONNULL_PTR this_arg);
@@ -5656,30 +6650,32 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_init_features")] public static extern long ChannelManager_init_features(long _this_arg);
        // struct LDKChannelMessageHandler ChannelManager_as_ChannelMessageHandler(const struct LDKChannelManager *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_as_ChannelMessageHandler")] public static extern long ChannelManager_as_ChannelMessageHandler(long _this_arg);
+       // struct LDKOffersMessageHandler ChannelManager_as_OffersMessageHandler(const struct LDKChannelManager *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_as_OffersMessageHandler")] public static extern long ChannelManager_as_OffersMessageHandler(long _this_arg);
        // struct LDKInitFeatures provided_init_features(const struct LDKUserConfig *NONNULL_PTR config);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_provided_init_features")] public static extern long provided_init_features(long _config);
        // struct LDKCVec_u8Z CounterpartyForwardingInfo_write(const struct LDKCounterpartyForwardingInfo *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyForwardingInfo_write")] public static extern byte[] CounterpartyForwardingInfo_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyForwardingInfo_write")] public static extern long CounterpartyForwardingInfo_write(long _obj);
        // struct LDKCResult_CounterpartyForwardingInfoDecodeErrorZ CounterpartyForwardingInfo_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyForwardingInfo_read")] public static extern long CounterpartyForwardingInfo_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyForwardingInfo_read")] public static extern long CounterpartyForwardingInfo_read(long _ser);
        // struct LDKCVec_u8Z ChannelCounterparty_write(const struct LDKChannelCounterparty *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelCounterparty_write")] public static extern byte[] ChannelCounterparty_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelCounterparty_write")] public static extern long ChannelCounterparty_write(long _obj);
        // struct LDKCResult_ChannelCounterpartyDecodeErrorZ ChannelCounterparty_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelCounterparty_read")] public static extern long ChannelCounterparty_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelCounterparty_read")] public static extern long ChannelCounterparty_read(long _ser);
        // struct LDKCVec_u8Z ChannelDetails_write(const struct LDKChannelDetails *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_write")] public static extern byte[] ChannelDetails_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_write")] public static extern long ChannelDetails_write(long _obj);
        // struct LDKCResult_ChannelDetailsDecodeErrorZ ChannelDetails_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_read")] public static extern long ChannelDetails_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDetails_read")] public static extern long ChannelDetails_read(long _ser);
        // struct LDKCVec_u8Z PhantomRouteHints_write(const struct LDKPhantomRouteHints *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_write")] public static extern byte[] PhantomRouteHints_write(long _obj);
+       [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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_read")] public static extern long PhantomRouteHints_read(long _ser);
        // struct LDKCVec_u8Z ChannelManager_write(const struct LDKChannelManager *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_write")] public static extern byte[] ChannelManager_write(long _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelShutdownState_write")] public static extern byte[] ChannelShutdownState_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelShutdownState_write")] public static extern long ChannelShutdownState_write(long _obj);
        // struct LDKCResult_ChannelShutdownStateDecodeErrorZ ChannelShutdownState_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelShutdownState_read")] public static extern long ChannelShutdownState_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelShutdownState_read")] public static extern long ChannelShutdownState_read(long _ser);
        // void ChannelManagerReadArgs_free(struct LDKChannelManagerReadArgs this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManagerReadArgs_free")] public static extern void ChannelManagerReadArgs_free(long _this_obj);
        // const struct LDKEntropySource *ChannelManagerReadArgs_get_entropy_source(const struct LDKChannelManagerReadArgs *NONNULL_PTR this_ptr);
@@ -5719,17 +6715,17 @@ internal class bindings {
        // void ChannelManagerReadArgs_set_default_config(struct LDKChannelManagerReadArgs *NONNULL_PTR this_ptr, struct LDKUserConfig val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManagerReadArgs_set_default_config")] public static extern void ChannelManagerReadArgs_set_default_config(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKChannelManagerReadArgs ChannelManagerReadArgs_new(struct LDKEntropySource entropy_source, struct LDKNodeSigner node_signer, struct LDKSignerProvider signer_provider, struct LDKFeeEstimator fee_estimator, struct LDKWatch chain_monitor, struct LDKBroadcasterInterface tx_broadcaster, struct LDKRouter router, struct LDKLogger logger, struct LDKUserConfig default_config, struct LDKCVec_ChannelMonitorZ channel_monitors);
-       [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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _channel_monitors);
-       // struct LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ C2Tuple_BlockHashChannelManagerZ_read(struct LDKu8slice ser, struct LDKChannelManagerReadArgs arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlockHashChannelManagerZ_read")] public static extern long C2Tuple_BlockHashChannelManagerZ_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser, long _arg);
+       [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 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]);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ExpandedKey_new")] public static extern long ExpandedKey_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _key_material);
-       // struct LDKCResult_C2Tuple_PaymentHashPaymentSecretZNoneZ create(const struct LDKExpandedKey *NONNULL_PTR keys, struct LDKCOption_u64Z min_value_msat, uint32_t invoice_expiry_delta_secs, const struct LDKEntropySource *NONNULL_PTR entropy_source, uint64_t current_time, struct LDKCOption_u16Z min_final_cltv_expiry_delta);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ExpandedKey_new")] public static extern long ExpandedKey_new(long _key_material);
+       // struct LDKCResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ create(const struct LDKExpandedKey *NONNULL_PTR keys, struct LDKCOption_u64Z min_value_msat, uint32_t invoice_expiry_delta_secs, const struct LDKEntropySource *NONNULL_PTR entropy_source, uint64_t current_time, struct LDKCOption_u16Z min_final_cltv_expiry_delta);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_create")] public static extern long create(long _keys, long _min_value_msat, int _invoice_expiry_delta_secs, long _entropy_source, long _current_time, long _min_final_cltv_expiry_delta);
-       // struct LDKCResult_PaymentSecretNoneZ create_from_hash(const struct LDKExpandedKey *NONNULL_PTR keys, struct LDKCOption_u64Z min_value_msat, struct LDKThirtyTwoBytes payment_hash, uint32_t invoice_expiry_delta_secs, uint64_t current_time, struct LDKCOption_u16Z min_final_cltv_expiry_delta);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_create_from_hash")] public static extern long create_from_hash(long _keys, long _min_value_msat, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, int _invoice_expiry_delta_secs, long _current_time, long _min_final_cltv_expiry_delta);
+       // struct LDKCResult_ThirtyTwoBytesNoneZ create_from_hash(const struct LDKExpandedKey *NONNULL_PTR keys, struct LDKCOption_u64Z min_value_msat, struct LDKThirtyTwoBytes payment_hash, uint32_t invoice_expiry_delta_secs, uint64_t current_time, struct LDKCOption_u16Z min_final_cltv_expiry_delta);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_create_from_hash")] public static extern long create_from_hash(long _keys, long _min_value_msat, long _payment_hash, int _invoice_expiry_delta_secs, long _current_time, long _min_final_cltv_expiry_delta);
        // void DecodeError_free(struct LDKDecodeError this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DecodeError_free")] public static extern void DecodeError_free(long _this_ptr);
        // uint64_t DecodeError_clone_ptr(LDKDecodeError *NONNULL_PTR arg);
@@ -5758,15 +6754,15 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Init_get_features")] public static extern long Init_get_features(long _this_ptr);
        // void Init_set_features(struct LDKInit *NONNULL_PTR this_ptr, struct LDKInitFeatures val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Init_set_features")] public static extern void Init_set_features(long _this_ptr, long _val);
-       // struct LDKCOption_CVec_ChainHashZZ Init_get_networks(const struct LDKInit *NONNULL_PTR this_ptr);
+       // struct LDKCOption_CVec_ThirtyTwoBytesZZ Init_get_networks(const struct LDKInit *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Init_get_networks")] public static extern long Init_get_networks(long _this_ptr);
-       // void Init_set_networks(struct LDKInit *NONNULL_PTR this_ptr, struct LDKCOption_CVec_ChainHashZZ val);
+       // void Init_set_networks(struct LDKInit *NONNULL_PTR this_ptr, struct LDKCOption_CVec_ThirtyTwoBytesZZ val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Init_set_networks")] public static extern void Init_set_networks(long _this_ptr, long _val);
-       // struct LDKCOption_NetAddressZ Init_get_remote_network_address(const struct LDKInit *NONNULL_PTR this_ptr);
+       // struct LDKCOption_SocketAddressZ Init_get_remote_network_address(const struct LDKInit *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Init_get_remote_network_address")] public static extern long Init_get_remote_network_address(long _this_ptr);
-       // void Init_set_remote_network_address(struct LDKInit *NONNULL_PTR this_ptr, struct LDKCOption_NetAddressZ val);
+       // void Init_set_remote_network_address(struct LDKInit *NONNULL_PTR this_ptr, struct LDKCOption_SocketAddressZ val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Init_set_remote_network_address")] public static extern void Init_set_remote_network_address(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKInit Init_new(struct LDKInitFeatures features_arg, struct LDKCOption_CVec_ChainHashZZ networks_arg, struct LDKCOption_NetAddressZ remote_network_address_arg);
+       // MUST_USE_RES struct LDKInit Init_new(struct LDKInitFeatures features_arg, struct LDKCOption_CVec_ThirtyTwoBytesZZ networks_arg, struct LDKCOption_SocketAddressZ remote_network_address_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Init_new")] public static extern long Init_new(long _features_arg, long _networks_arg, long _remote_network_address_arg);
        // uint64_t Init_clone_ptr(LDKInit *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Init_clone_ptr")] public static extern long Init_clone_ptr(long _arg);
@@ -5777,15 +6773,15 @@ internal class bindings {
        // void ErrorMessage_free(struct LDKErrorMessage this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_free")] public static extern void ErrorMessage_free(long _this_obj);
        // const uint8_t (*ErrorMessage_get_channel_id(const struct LDKErrorMessage *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_get_channel_id")] public static extern byte[] ErrorMessage_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_get_channel_id")] public static extern long ErrorMessage_get_channel_id(long _this_ptr);
        // void ErrorMessage_set_channel_id(struct LDKErrorMessage *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_set_channel_id")] public static extern void ErrorMessage_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_set_channel_id")] public static extern void ErrorMessage_set_channel_id(long _this_ptr, long _val);
        // struct LDKStr ErrorMessage_get_data(const struct LDKErrorMessage *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_get_data")] public static extern string ErrorMessage_get_data(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_get_data")] public static extern long ErrorMessage_get_data(long _this_ptr);
        // void ErrorMessage_set_data(struct LDKErrorMessage *NONNULL_PTR this_ptr, struct LDKStr val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_set_data")] public static extern void ErrorMessage_set_data(long _this_ptr, string _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_set_data")] public static extern void ErrorMessage_set_data(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKErrorMessage ErrorMessage_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKStr data_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_new")] public static extern long ErrorMessage_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, string _data_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_new")] public static extern long ErrorMessage_new(long _channel_id_arg, long _data_arg);
        // uint64_t ErrorMessage_clone_ptr(LDKErrorMessage *NONNULL_PTR arg);
        [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);
@@ -5795,15 +6791,15 @@ internal class bindings {
        // void WarningMessage_free(struct LDKWarningMessage this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_free")] public static extern void WarningMessage_free(long _this_obj);
        // const uint8_t (*WarningMessage_get_channel_id(const struct LDKWarningMessage *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_get_channel_id")] public static extern byte[] WarningMessage_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_get_channel_id")] public static extern long WarningMessage_get_channel_id(long _this_ptr);
        // void WarningMessage_set_channel_id(struct LDKWarningMessage *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_set_channel_id")] public static extern void WarningMessage_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_set_channel_id")] public static extern void WarningMessage_set_channel_id(long _this_ptr, long _val);
        // struct LDKStr WarningMessage_get_data(const struct LDKWarningMessage *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_get_data")] public static extern string WarningMessage_get_data(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_get_data")] public static extern long WarningMessage_get_data(long _this_ptr);
        // void WarningMessage_set_data(struct LDKWarningMessage *NONNULL_PTR this_ptr, struct LDKStr val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_set_data")] public static extern void WarningMessage_set_data(long _this_ptr, string _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_set_data")] public static extern void WarningMessage_set_data(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKWarningMessage WarningMessage_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKStr data_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_new")] public static extern long WarningMessage_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, string _data_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_new")] public static extern long WarningMessage_new(long _channel_id_arg, long _data_arg);
        // uint64_t WarningMessage_clone_ptr(LDKWarningMessage *NONNULL_PTR arg);
        [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);
@@ -5845,13 +6841,13 @@ internal class bindings {
        // void OpenChannel_free(struct LDKOpenChannel this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_free")] public static extern void OpenChannel_free(long _this_obj);
        // const uint8_t (*OpenChannel_get_chain_hash(const struct LDKOpenChannel *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_chain_hash")] public static extern byte[] OpenChannel_get_chain_hash(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_chain_hash")] public static extern long OpenChannel_get_chain_hash(long _this_ptr);
        // void OpenChannel_set_chain_hash(struct LDKOpenChannel *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_chain_hash")] public static extern void OpenChannel_set_chain_hash(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_chain_hash")] public static extern void OpenChannel_set_chain_hash(long _this_ptr, long _val);
        // const uint8_t (*OpenChannel_get_temporary_channel_id(const struct LDKOpenChannel *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_temporary_channel_id")] public static extern byte[] OpenChannel_get_temporary_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_temporary_channel_id")] public static extern long OpenChannel_get_temporary_channel_id(long _this_ptr);
        // void OpenChannel_set_temporary_channel_id(struct LDKOpenChannel *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_temporary_channel_id")] public static extern void OpenChannel_set_temporary_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_temporary_channel_id")] public static extern void OpenChannel_set_temporary_channel_id(long _this_ptr, long _val);
        // uint64_t OpenChannel_get_funding_satoshis(const struct LDKOpenChannel *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_funding_satoshis")] public static extern long OpenChannel_get_funding_satoshis(long _this_ptr);
        // void OpenChannel_set_funding_satoshis(struct LDKOpenChannel *NONNULL_PTR this_ptr, uint64_t val);
@@ -5889,43 +6885,43 @@ internal class bindings {
        // void OpenChannel_set_max_accepted_htlcs(struct LDKOpenChannel *NONNULL_PTR this_ptr, uint16_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_max_accepted_htlcs")] public static extern void OpenChannel_set_max_accepted_htlcs(long _this_ptr, short _val);
        // struct LDKPublicKey OpenChannel_get_funding_pubkey(const struct LDKOpenChannel *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_funding_pubkey")] public static extern byte[] OpenChannel_get_funding_pubkey(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_funding_pubkey")] public static extern long OpenChannel_get_funding_pubkey(long _this_ptr);
        // void OpenChannel_set_funding_pubkey(struct LDKOpenChannel *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_funding_pubkey")] public static extern void OpenChannel_set_funding_pubkey(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_funding_pubkey")] public static extern void OpenChannel_set_funding_pubkey(long _this_ptr, long _val);
        // struct LDKPublicKey OpenChannel_get_revocation_basepoint(const struct LDKOpenChannel *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_revocation_basepoint")] public static extern byte[] OpenChannel_get_revocation_basepoint(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_revocation_basepoint")] public static extern long OpenChannel_get_revocation_basepoint(long _this_ptr);
        // void OpenChannel_set_revocation_basepoint(struct LDKOpenChannel *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_revocation_basepoint")] public static extern void OpenChannel_set_revocation_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_revocation_basepoint")] public static extern void OpenChannel_set_revocation_basepoint(long _this_ptr, long _val);
        // struct LDKPublicKey OpenChannel_get_payment_point(const struct LDKOpenChannel *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_payment_point")] public static extern byte[] OpenChannel_get_payment_point(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_payment_point")] public static extern long OpenChannel_get_payment_point(long _this_ptr);
        // void OpenChannel_set_payment_point(struct LDKOpenChannel *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_payment_point")] public static extern void OpenChannel_set_payment_point(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_payment_point")] public static extern void OpenChannel_set_payment_point(long _this_ptr, long _val);
        // struct LDKPublicKey OpenChannel_get_delayed_payment_basepoint(const struct LDKOpenChannel *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_delayed_payment_basepoint")] public static extern byte[] OpenChannel_get_delayed_payment_basepoint(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_delayed_payment_basepoint")] public static extern long OpenChannel_get_delayed_payment_basepoint(long _this_ptr);
        // void OpenChannel_set_delayed_payment_basepoint(struct LDKOpenChannel *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_delayed_payment_basepoint")] public static extern void OpenChannel_set_delayed_payment_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_delayed_payment_basepoint")] public static extern void OpenChannel_set_delayed_payment_basepoint(long _this_ptr, long _val);
        // struct LDKPublicKey OpenChannel_get_htlc_basepoint(const struct LDKOpenChannel *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_htlc_basepoint")] public static extern byte[] OpenChannel_get_htlc_basepoint(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_htlc_basepoint")] public static extern long OpenChannel_get_htlc_basepoint(long _this_ptr);
        // void OpenChannel_set_htlc_basepoint(struct LDKOpenChannel *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_htlc_basepoint")] public static extern void OpenChannel_set_htlc_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_htlc_basepoint")] public static extern void OpenChannel_set_htlc_basepoint(long _this_ptr, long _val);
        // struct LDKPublicKey OpenChannel_get_first_per_commitment_point(const struct LDKOpenChannel *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_first_per_commitment_point")] public static extern byte[] OpenChannel_get_first_per_commitment_point(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_first_per_commitment_point")] public static extern long OpenChannel_get_first_per_commitment_point(long _this_ptr);
        // void OpenChannel_set_first_per_commitment_point(struct LDKOpenChannel *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_first_per_commitment_point")] public static extern void OpenChannel_set_first_per_commitment_point(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_first_per_commitment_point")] public static extern void OpenChannel_set_first_per_commitment_point(long _this_ptr, long _val);
        // uint8_t OpenChannel_get_channel_flags(const struct LDKOpenChannel *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_channel_flags")] public static extern byte OpenChannel_get_channel_flags(long _this_ptr);
        // void OpenChannel_set_channel_flags(struct LDKOpenChannel *NONNULL_PTR this_ptr, uint8_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_channel_flags")] public static extern void OpenChannel_set_channel_flags(long _this_ptr, byte _val);
-       // struct LDKCOption_ScriptZ OpenChannel_get_shutdown_scriptpubkey(const struct LDKOpenChannel *NONNULL_PTR this_ptr);
+       // struct LDKCOption_CVec_u8ZZ OpenChannel_get_shutdown_scriptpubkey(const struct LDKOpenChannel *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_shutdown_scriptpubkey")] public static extern long OpenChannel_get_shutdown_scriptpubkey(long _this_ptr);
-       // void OpenChannel_set_shutdown_scriptpubkey(struct LDKOpenChannel *NONNULL_PTR this_ptr, struct LDKCOption_ScriptZ val);
+       // void OpenChannel_set_shutdown_scriptpubkey(struct LDKOpenChannel *NONNULL_PTR this_ptr, struct LDKCOption_CVec_u8ZZ val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_shutdown_scriptpubkey")] public static extern void OpenChannel_set_shutdown_scriptpubkey(long _this_ptr, long _val);
        // struct LDKChannelTypeFeatures OpenChannel_get_channel_type(const struct LDKOpenChannel *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_get_channel_type")] public static extern long OpenChannel_get_channel_type(long _this_ptr);
        // void OpenChannel_set_channel_type(struct LDKOpenChannel *NONNULL_PTR this_ptr, struct LDKChannelTypeFeatures val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_set_channel_type")] public static extern void OpenChannel_set_channel_type(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKOpenChannel OpenChannel_new(struct LDKThirtyTwoBytes chain_hash_arg, struct LDKThirtyTwoBytes temporary_channel_id_arg, uint64_t funding_satoshis_arg, uint64_t push_msat_arg, uint64_t dust_limit_satoshis_arg, uint64_t max_htlc_value_in_flight_msat_arg, uint64_t channel_reserve_satoshis_arg, uint64_t htlc_minimum_msat_arg, uint32_t feerate_per_kw_arg, uint16_t to_self_delay_arg, uint16_t max_accepted_htlcs_arg, 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, struct LDKPublicKey first_per_commitment_point_arg, uint8_t channel_flags_arg, struct LDKCOption_ScriptZ shutdown_scriptpubkey_arg, struct LDKChannelTypeFeatures channel_type_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_new")] public static extern long OpenChannel_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _chain_hash_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _temporary_channel_id_arg, long _funding_satoshis_arg, long _push_msat_arg, long _dust_limit_satoshis_arg, long _max_htlc_value_in_flight_msat_arg, long _channel_reserve_satoshis_arg, long _htlc_minimum_msat_arg, int _feerate_per_kw_arg, short _to_self_delay_arg, short _max_accepted_htlcs_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_pubkey_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _revocation_basepoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_point_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _delayed_payment_basepoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _htlc_basepoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _first_per_commitment_point_arg, byte _channel_flags_arg, long _shutdown_scriptpubkey_arg, long _channel_type_arg);
+       // MUST_USE_RES struct LDKOpenChannel OpenChannel_new(struct LDKThirtyTwoBytes chain_hash_arg, struct LDKThirtyTwoBytes temporary_channel_id_arg, uint64_t funding_satoshis_arg, uint64_t push_msat_arg, uint64_t dust_limit_satoshis_arg, uint64_t max_htlc_value_in_flight_msat_arg, uint64_t channel_reserve_satoshis_arg, uint64_t htlc_minimum_msat_arg, uint32_t feerate_per_kw_arg, uint16_t to_self_delay_arg, uint16_t max_accepted_htlcs_arg, 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, struct LDKPublicKey first_per_commitment_point_arg, uint8_t channel_flags_arg, struct LDKCOption_CVec_u8ZZ shutdown_scriptpubkey_arg, struct LDKChannelTypeFeatures channel_type_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_new")] public static extern long OpenChannel_new(long _chain_hash_arg, long _temporary_channel_id_arg, long _funding_satoshis_arg, long _push_msat_arg, long _dust_limit_satoshis_arg, long _max_htlc_value_in_flight_msat_arg, long _channel_reserve_satoshis_arg, long _htlc_minimum_msat_arg, int _feerate_per_kw_arg, short _to_self_delay_arg, short _max_accepted_htlcs_arg, long _funding_pubkey_arg, long _revocation_basepoint_arg, long _payment_point_arg, long _delayed_payment_basepoint_arg, long _htlc_basepoint_arg, long _first_per_commitment_point_arg, byte _channel_flags_arg, long _shutdown_scriptpubkey_arg, long _channel_type_arg);
        // uint64_t OpenChannel_clone_ptr(LDKOpenChannel *NONNULL_PTR arg);
        [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);
@@ -5935,13 +6931,13 @@ internal class bindings {
        // void OpenChannelV2_free(struct LDKOpenChannelV2 this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_free")] public static extern void OpenChannelV2_free(long _this_obj);
        // const uint8_t (*OpenChannelV2_get_chain_hash(const struct LDKOpenChannelV2 *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_chain_hash")] public static extern byte[] OpenChannelV2_get_chain_hash(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_chain_hash")] public static extern long OpenChannelV2_get_chain_hash(long _this_ptr);
        // void OpenChannelV2_set_chain_hash(struct LDKOpenChannelV2 *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_chain_hash")] public static extern void OpenChannelV2_set_chain_hash(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_chain_hash")] public static extern void OpenChannelV2_set_chain_hash(long _this_ptr, long _val);
        // const uint8_t (*OpenChannelV2_get_temporary_channel_id(const struct LDKOpenChannelV2 *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_temporary_channel_id")] public static extern byte[] OpenChannelV2_get_temporary_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_temporary_channel_id")] public static extern long OpenChannelV2_get_temporary_channel_id(long _this_ptr);
        // void OpenChannelV2_set_temporary_channel_id(struct LDKOpenChannelV2 *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_temporary_channel_id")] public static extern void OpenChannelV2_set_temporary_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_temporary_channel_id")] public static extern void OpenChannelV2_set_temporary_channel_id(long _this_ptr, long _val);
        // uint32_t OpenChannelV2_get_funding_feerate_sat_per_1000_weight(const struct LDKOpenChannelV2 *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_funding_feerate_sat_per_1000_weight")] public static extern int OpenChannelV2_get_funding_feerate_sat_per_1000_weight(long _this_ptr);
        // void OpenChannelV2_set_funding_feerate_sat_per_1000_weight(struct LDKOpenChannelV2 *NONNULL_PTR this_ptr, uint32_t val);
@@ -5979,40 +6975,40 @@ internal class bindings {
        // void OpenChannelV2_set_locktime(struct LDKOpenChannelV2 *NONNULL_PTR this_ptr, uint32_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_locktime")] public static extern void OpenChannelV2_set_locktime(long _this_ptr, int _val);
        // struct LDKPublicKey OpenChannelV2_get_funding_pubkey(const struct LDKOpenChannelV2 *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_funding_pubkey")] public static extern byte[] OpenChannelV2_get_funding_pubkey(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_funding_pubkey")] public static extern long OpenChannelV2_get_funding_pubkey(long _this_ptr);
        // void OpenChannelV2_set_funding_pubkey(struct LDKOpenChannelV2 *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_funding_pubkey")] public static extern void OpenChannelV2_set_funding_pubkey(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_funding_pubkey")] public static extern void OpenChannelV2_set_funding_pubkey(long _this_ptr, long _val);
        // struct LDKPublicKey OpenChannelV2_get_revocation_basepoint(const struct LDKOpenChannelV2 *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_revocation_basepoint")] public static extern byte[] OpenChannelV2_get_revocation_basepoint(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_revocation_basepoint")] public static extern long OpenChannelV2_get_revocation_basepoint(long _this_ptr);
        // void OpenChannelV2_set_revocation_basepoint(struct LDKOpenChannelV2 *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_revocation_basepoint")] public static extern void OpenChannelV2_set_revocation_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_revocation_basepoint")] public static extern void OpenChannelV2_set_revocation_basepoint(long _this_ptr, long _val);
        // struct LDKPublicKey OpenChannelV2_get_payment_basepoint(const struct LDKOpenChannelV2 *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_payment_basepoint")] public static extern byte[] OpenChannelV2_get_payment_basepoint(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_payment_basepoint")] public static extern long OpenChannelV2_get_payment_basepoint(long _this_ptr);
        // void OpenChannelV2_set_payment_basepoint(struct LDKOpenChannelV2 *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_payment_basepoint")] public static extern void OpenChannelV2_set_payment_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_payment_basepoint")] public static extern void OpenChannelV2_set_payment_basepoint(long _this_ptr, long _val);
        // struct LDKPublicKey OpenChannelV2_get_delayed_payment_basepoint(const struct LDKOpenChannelV2 *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_delayed_payment_basepoint")] public static extern byte[] OpenChannelV2_get_delayed_payment_basepoint(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_delayed_payment_basepoint")] public static extern long OpenChannelV2_get_delayed_payment_basepoint(long _this_ptr);
        // void OpenChannelV2_set_delayed_payment_basepoint(struct LDKOpenChannelV2 *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_delayed_payment_basepoint")] public static extern void OpenChannelV2_set_delayed_payment_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_delayed_payment_basepoint")] public static extern void OpenChannelV2_set_delayed_payment_basepoint(long _this_ptr, long _val);
        // struct LDKPublicKey OpenChannelV2_get_htlc_basepoint(const struct LDKOpenChannelV2 *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_htlc_basepoint")] public static extern byte[] OpenChannelV2_get_htlc_basepoint(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_htlc_basepoint")] public static extern long OpenChannelV2_get_htlc_basepoint(long _this_ptr);
        // void OpenChannelV2_set_htlc_basepoint(struct LDKOpenChannelV2 *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_htlc_basepoint")] public static extern void OpenChannelV2_set_htlc_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_htlc_basepoint")] public static extern void OpenChannelV2_set_htlc_basepoint(long _this_ptr, long _val);
        // struct LDKPublicKey OpenChannelV2_get_first_per_commitment_point(const struct LDKOpenChannelV2 *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_first_per_commitment_point")] public static extern byte[] OpenChannelV2_get_first_per_commitment_point(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_first_per_commitment_point")] public static extern long OpenChannelV2_get_first_per_commitment_point(long _this_ptr);
        // void OpenChannelV2_set_first_per_commitment_point(struct LDKOpenChannelV2 *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_first_per_commitment_point")] public static extern void OpenChannelV2_set_first_per_commitment_point(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_first_per_commitment_point")] public static extern void OpenChannelV2_set_first_per_commitment_point(long _this_ptr, long _val);
        // struct LDKPublicKey OpenChannelV2_get_second_per_commitment_point(const struct LDKOpenChannelV2 *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_second_per_commitment_point")] public static extern byte[] OpenChannelV2_get_second_per_commitment_point(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_second_per_commitment_point")] public static extern long OpenChannelV2_get_second_per_commitment_point(long _this_ptr);
        // void OpenChannelV2_set_second_per_commitment_point(struct LDKOpenChannelV2 *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_second_per_commitment_point")] public static extern void OpenChannelV2_set_second_per_commitment_point(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_second_per_commitment_point")] public static extern void OpenChannelV2_set_second_per_commitment_point(long _this_ptr, long _val);
        // uint8_t OpenChannelV2_get_channel_flags(const struct LDKOpenChannelV2 *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_channel_flags")] public static extern byte OpenChannelV2_get_channel_flags(long _this_ptr);
        // void OpenChannelV2_set_channel_flags(struct LDKOpenChannelV2 *NONNULL_PTR this_ptr, uint8_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_channel_flags")] public static extern void OpenChannelV2_set_channel_flags(long _this_ptr, byte _val);
-       // struct LDKCOption_ScriptZ OpenChannelV2_get_shutdown_scriptpubkey(const struct LDKOpenChannelV2 *NONNULL_PTR this_ptr);
+       // struct LDKCOption_CVec_u8ZZ OpenChannelV2_get_shutdown_scriptpubkey(const struct LDKOpenChannelV2 *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_shutdown_scriptpubkey")] public static extern long OpenChannelV2_get_shutdown_scriptpubkey(long _this_ptr);
-       // void OpenChannelV2_set_shutdown_scriptpubkey(struct LDKOpenChannelV2 *NONNULL_PTR this_ptr, struct LDKCOption_ScriptZ val);
+       // void OpenChannelV2_set_shutdown_scriptpubkey(struct LDKOpenChannelV2 *NONNULL_PTR this_ptr, struct LDKCOption_CVec_u8ZZ val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_shutdown_scriptpubkey")] public static extern void OpenChannelV2_set_shutdown_scriptpubkey(long _this_ptr, long _val);
        // struct LDKChannelTypeFeatures OpenChannelV2_get_channel_type(const struct LDKOpenChannelV2 *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_channel_type")] public static extern long OpenChannelV2_get_channel_type(long _this_ptr);
@@ -6022,8 +7018,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_get_require_confirmed_inputs")] public static extern COption_NoneZ OpenChannelV2_get_require_confirmed_inputs(long _this_ptr);
        // void OpenChannelV2_set_require_confirmed_inputs(struct LDKOpenChannelV2 *NONNULL_PTR this_ptr, enum LDKCOption_NoneZ val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_set_require_confirmed_inputs")] public static extern void OpenChannelV2_set_require_confirmed_inputs(long _this_ptr, COption_NoneZ _val);
-       // MUST_USE_RES struct LDKOpenChannelV2 OpenChannelV2_new(struct LDKThirtyTwoBytes chain_hash_arg, struct LDKThirtyTwoBytes temporary_channel_id_arg, uint32_t funding_feerate_sat_per_1000_weight_arg, uint32_t commitment_feerate_sat_per_1000_weight_arg, uint64_t funding_satoshis_arg, uint64_t dust_limit_satoshis_arg, uint64_t max_htlc_value_in_flight_msat_arg, uint64_t htlc_minimum_msat_arg, uint16_t to_self_delay_arg, uint16_t max_accepted_htlcs_arg, uint32_t locktime_arg, struct LDKPublicKey funding_pubkey_arg, struct LDKPublicKey revocation_basepoint_arg, struct LDKPublicKey payment_basepoint_arg, struct LDKPublicKey delayed_payment_basepoint_arg, struct LDKPublicKey htlc_basepoint_arg, struct LDKPublicKey first_per_commitment_point_arg, struct LDKPublicKey second_per_commitment_point_arg, uint8_t channel_flags_arg, struct LDKCOption_ScriptZ shutdown_scriptpubkey_arg, struct LDKChannelTypeFeatures channel_type_arg, enum LDKCOption_NoneZ require_confirmed_inputs_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_new")] public static extern long OpenChannelV2_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _chain_hash_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _temporary_channel_id_arg, int _funding_feerate_sat_per_1000_weight_arg, int _commitment_feerate_sat_per_1000_weight_arg, long _funding_satoshis_arg, long _dust_limit_satoshis_arg, long _max_htlc_value_in_flight_msat_arg, long _htlc_minimum_msat_arg, short _to_self_delay_arg, short _max_accepted_htlcs_arg, int _locktime_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_pubkey_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _revocation_basepoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_basepoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _delayed_payment_basepoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _htlc_basepoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _first_per_commitment_point_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _second_per_commitment_point_arg, byte _channel_flags_arg, long _shutdown_scriptpubkey_arg, long _channel_type_arg, COption_NoneZ _require_confirmed_inputs_arg);
+       // MUST_USE_RES struct LDKOpenChannelV2 OpenChannelV2_new(struct LDKThirtyTwoBytes chain_hash_arg, struct LDKThirtyTwoBytes temporary_channel_id_arg, uint32_t funding_feerate_sat_per_1000_weight_arg, uint32_t commitment_feerate_sat_per_1000_weight_arg, uint64_t funding_satoshis_arg, uint64_t dust_limit_satoshis_arg, uint64_t max_htlc_value_in_flight_msat_arg, uint64_t htlc_minimum_msat_arg, uint16_t to_self_delay_arg, uint16_t max_accepted_htlcs_arg, uint32_t locktime_arg, struct LDKPublicKey funding_pubkey_arg, struct LDKPublicKey revocation_basepoint_arg, struct LDKPublicKey payment_basepoint_arg, struct LDKPublicKey delayed_payment_basepoint_arg, struct LDKPublicKey htlc_basepoint_arg, struct LDKPublicKey first_per_commitment_point_arg, struct LDKPublicKey second_per_commitment_point_arg, uint8_t channel_flags_arg, struct LDKCOption_CVec_u8ZZ shutdown_scriptpubkey_arg, struct LDKChannelTypeFeatures channel_type_arg, enum LDKCOption_NoneZ require_confirmed_inputs_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_new")] public static extern long OpenChannelV2_new(long _chain_hash_arg, long _temporary_channel_id_arg, int _funding_feerate_sat_per_1000_weight_arg, int _commitment_feerate_sat_per_1000_weight_arg, long _funding_satoshis_arg, long _dust_limit_satoshis_arg, long _max_htlc_value_in_flight_msat_arg, long _htlc_minimum_msat_arg, short _to_self_delay_arg, short _max_accepted_htlcs_arg, int _locktime_arg, long _funding_pubkey_arg, long _revocation_basepoint_arg, long _payment_basepoint_arg, long _delayed_payment_basepoint_arg, long _htlc_basepoint_arg, long _first_per_commitment_point_arg, long _second_per_commitment_point_arg, byte _channel_flags_arg, long _shutdown_scriptpubkey_arg, long _channel_type_arg, COption_NoneZ _require_confirmed_inputs_arg);
        // uint64_t OpenChannelV2_clone_ptr(LDKOpenChannelV2 *NONNULL_PTR arg);
        [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);
@@ -6033,9 +7029,9 @@ internal class bindings {
        // void AcceptChannel_free(struct LDKAcceptChannel this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_free")] public static extern void AcceptChannel_free(long _this_obj);
        // const uint8_t (*AcceptChannel_get_temporary_channel_id(const struct LDKAcceptChannel *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_temporary_channel_id")] public static extern byte[] AcceptChannel_get_temporary_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_temporary_channel_id")] public static extern long AcceptChannel_get_temporary_channel_id(long _this_ptr);
        // void AcceptChannel_set_temporary_channel_id(struct LDKAcceptChannel *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_temporary_channel_id")] public static extern void AcceptChannel_set_temporary_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_temporary_channel_id")] public static extern void AcceptChannel_set_temporary_channel_id(long _this_ptr, long _val);
        // uint64_t AcceptChannel_get_dust_limit_satoshis(const struct LDKAcceptChannel *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_dust_limit_satoshis")] public static extern long AcceptChannel_get_dust_limit_satoshis(long _this_ptr);
        // void AcceptChannel_set_dust_limit_satoshis(struct LDKAcceptChannel *NONNULL_PTR this_ptr, uint64_t val);
@@ -6065,39 +7061,39 @@ internal class bindings {
        // void AcceptChannel_set_max_accepted_htlcs(struct LDKAcceptChannel *NONNULL_PTR this_ptr, uint16_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_max_accepted_htlcs")] public static extern void AcceptChannel_set_max_accepted_htlcs(long _this_ptr, short _val);
        // struct LDKPublicKey AcceptChannel_get_funding_pubkey(const struct LDKAcceptChannel *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_funding_pubkey")] public static extern byte[] AcceptChannel_get_funding_pubkey(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_funding_pubkey")] public static extern long AcceptChannel_get_funding_pubkey(long _this_ptr);
        // void AcceptChannel_set_funding_pubkey(struct LDKAcceptChannel *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_funding_pubkey")] public static extern void AcceptChannel_set_funding_pubkey(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_funding_pubkey")] public static extern void AcceptChannel_set_funding_pubkey(long _this_ptr, long _val);
        // struct LDKPublicKey AcceptChannel_get_revocation_basepoint(const struct LDKAcceptChannel *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_revocation_basepoint")] public static extern byte[] AcceptChannel_get_revocation_basepoint(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_revocation_basepoint")] public static extern long AcceptChannel_get_revocation_basepoint(long _this_ptr);
        // void AcceptChannel_set_revocation_basepoint(struct LDKAcceptChannel *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_revocation_basepoint")] public static extern void AcceptChannel_set_revocation_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_revocation_basepoint")] public static extern void AcceptChannel_set_revocation_basepoint(long _this_ptr, long _val);
        // struct LDKPublicKey AcceptChannel_get_payment_point(const struct LDKAcceptChannel *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_payment_point")] public static extern byte[] AcceptChannel_get_payment_point(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_payment_point")] public static extern long AcceptChannel_get_payment_point(long _this_ptr);
        // void AcceptChannel_set_payment_point(struct LDKAcceptChannel *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_payment_point")] public static extern void AcceptChannel_set_payment_point(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_payment_point")] public static extern void AcceptChannel_set_payment_point(long _this_ptr, long _val);
        // struct LDKPublicKey AcceptChannel_get_delayed_payment_basepoint(const struct LDKAcceptChannel *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_delayed_payment_basepoint")] public static extern byte[] AcceptChannel_get_delayed_payment_basepoint(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_delayed_payment_basepoint")] public static extern long AcceptChannel_get_delayed_payment_basepoint(long _this_ptr);
        // void AcceptChannel_set_delayed_payment_basepoint(struct LDKAcceptChannel *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_delayed_payment_basepoint")] public static extern void AcceptChannel_set_delayed_payment_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_delayed_payment_basepoint")] public static extern void AcceptChannel_set_delayed_payment_basepoint(long _this_ptr, long _val);
        // struct LDKPublicKey AcceptChannel_get_htlc_basepoint(const struct LDKAcceptChannel *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_htlc_basepoint")] public static extern byte[] AcceptChannel_get_htlc_basepoint(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_htlc_basepoint")] public static extern long AcceptChannel_get_htlc_basepoint(long _this_ptr);
        // void AcceptChannel_set_htlc_basepoint(struct LDKAcceptChannel *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_htlc_basepoint")] public static extern void AcceptChannel_set_htlc_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_htlc_basepoint")] public static extern void AcceptChannel_set_htlc_basepoint(long _this_ptr, long _val);
        // struct LDKPublicKey AcceptChannel_get_first_per_commitment_point(const struct LDKAcceptChannel *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_first_per_commitment_point")] public static extern byte[] AcceptChannel_get_first_per_commitment_point(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_first_per_commitment_point")] public static extern long AcceptChannel_get_first_per_commitment_point(long _this_ptr);
        // void AcceptChannel_set_first_per_commitment_point(struct LDKAcceptChannel *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_first_per_commitment_point")] public static extern void AcceptChannel_set_first_per_commitment_point(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // struct LDKCOption_ScriptZ AcceptChannel_get_shutdown_scriptpubkey(const struct LDKAcceptChannel *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_first_per_commitment_point")] public static extern void AcceptChannel_set_first_per_commitment_point(long _this_ptr, long _val);
+       // struct LDKCOption_CVec_u8ZZ AcceptChannel_get_shutdown_scriptpubkey(const struct LDKAcceptChannel *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_shutdown_scriptpubkey")] public static extern long AcceptChannel_get_shutdown_scriptpubkey(long _this_ptr);
-       // void AcceptChannel_set_shutdown_scriptpubkey(struct LDKAcceptChannel *NONNULL_PTR this_ptr, struct LDKCOption_ScriptZ val);
+       // void AcceptChannel_set_shutdown_scriptpubkey(struct LDKAcceptChannel *NONNULL_PTR this_ptr, struct LDKCOption_CVec_u8ZZ val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_shutdown_scriptpubkey")] public static extern void AcceptChannel_set_shutdown_scriptpubkey(long _this_ptr, long _val);
        // struct LDKChannelTypeFeatures AcceptChannel_get_channel_type(const struct LDKAcceptChannel *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_get_channel_type")] public static extern long AcceptChannel_get_channel_type(long _this_ptr);
        // void AcceptChannel_set_channel_type(struct LDKAcceptChannel *NONNULL_PTR this_ptr, struct LDKChannelTypeFeatures val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_set_channel_type")] public static extern void AcceptChannel_set_channel_type(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKAcceptChannel AcceptChannel_new(struct LDKThirtyTwoBytes temporary_channel_id_arg, uint64_t dust_limit_satoshis_arg, uint64_t max_htlc_value_in_flight_msat_arg, uint64_t channel_reserve_satoshis_arg, uint64_t htlc_minimum_msat_arg, uint32_t minimum_depth_arg, uint16_t to_self_delay_arg, uint16_t max_accepted_htlcs_arg, 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, struct LDKPublicKey first_per_commitment_point_arg, struct LDKCOption_ScriptZ shutdown_scriptpubkey_arg, struct LDKChannelTypeFeatures channel_type_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_new")] public static extern long AcceptChannel_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _temporary_channel_id_arg, long _dust_limit_satoshis_arg, long _max_htlc_value_in_flight_msat_arg, long _channel_reserve_satoshis_arg, long _htlc_minimum_msat_arg, int _minimum_depth_arg, short _to_self_delay_arg, short _max_accepted_htlcs_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_pubkey_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _revocation_basepoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_point_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _delayed_payment_basepoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _htlc_basepoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _first_per_commitment_point_arg, long _shutdown_scriptpubkey_arg, long _channel_type_arg);
+       // MUST_USE_RES struct LDKAcceptChannel AcceptChannel_new(struct LDKThirtyTwoBytes temporary_channel_id_arg, uint64_t dust_limit_satoshis_arg, uint64_t max_htlc_value_in_flight_msat_arg, uint64_t channel_reserve_satoshis_arg, uint64_t htlc_minimum_msat_arg, uint32_t minimum_depth_arg, uint16_t to_self_delay_arg, uint16_t max_accepted_htlcs_arg, 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, struct LDKPublicKey first_per_commitment_point_arg, struct LDKCOption_CVec_u8ZZ shutdown_scriptpubkey_arg, struct LDKChannelTypeFeatures channel_type_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_new")] public static extern long AcceptChannel_new(long _temporary_channel_id_arg, long _dust_limit_satoshis_arg, long _max_htlc_value_in_flight_msat_arg, long _channel_reserve_satoshis_arg, long _htlc_minimum_msat_arg, int _minimum_depth_arg, short _to_self_delay_arg, short _max_accepted_htlcs_arg, long _funding_pubkey_arg, long _revocation_basepoint_arg, long _payment_point_arg, long _delayed_payment_basepoint_arg, long _htlc_basepoint_arg, long _first_per_commitment_point_arg, long _shutdown_scriptpubkey_arg, long _channel_type_arg);
        // uint64_t AcceptChannel_clone_ptr(LDKAcceptChannel *NONNULL_PTR arg);
        [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);
@@ -6107,9 +7103,9 @@ internal class bindings {
        // void AcceptChannelV2_free(struct LDKAcceptChannelV2 this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_free")] public static extern void AcceptChannelV2_free(long _this_obj);
        // const uint8_t (*AcceptChannelV2_get_temporary_channel_id(const struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_temporary_channel_id")] public static extern byte[] AcceptChannelV2_get_temporary_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_temporary_channel_id")] public static extern long AcceptChannelV2_get_temporary_channel_id(long _this_ptr);
        // void AcceptChannelV2_set_temporary_channel_id(struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_temporary_channel_id")] public static extern void AcceptChannelV2_set_temporary_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_temporary_channel_id")] public static extern void AcceptChannelV2_set_temporary_channel_id(long _this_ptr, long _val);
        // uint64_t AcceptChannelV2_get_funding_satoshis(const struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_funding_satoshis")] public static extern long AcceptChannelV2_get_funding_satoshis(long _this_ptr);
        // void AcceptChannelV2_set_funding_satoshis(struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr, uint64_t val);
@@ -6139,36 +7135,36 @@ internal class bindings {
        // void AcceptChannelV2_set_max_accepted_htlcs(struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr, uint16_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_max_accepted_htlcs")] public static extern void AcceptChannelV2_set_max_accepted_htlcs(long _this_ptr, short _val);
        // struct LDKPublicKey AcceptChannelV2_get_funding_pubkey(const struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_funding_pubkey")] public static extern byte[] AcceptChannelV2_get_funding_pubkey(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_funding_pubkey")] public static extern long AcceptChannelV2_get_funding_pubkey(long _this_ptr);
        // void AcceptChannelV2_set_funding_pubkey(struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_funding_pubkey")] public static extern void AcceptChannelV2_set_funding_pubkey(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_funding_pubkey")] public static extern void AcceptChannelV2_set_funding_pubkey(long _this_ptr, long _val);
        // struct LDKPublicKey AcceptChannelV2_get_revocation_basepoint(const struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_revocation_basepoint")] public static extern byte[] AcceptChannelV2_get_revocation_basepoint(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_revocation_basepoint")] public static extern long AcceptChannelV2_get_revocation_basepoint(long _this_ptr);
        // void AcceptChannelV2_set_revocation_basepoint(struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_revocation_basepoint")] public static extern void AcceptChannelV2_set_revocation_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_revocation_basepoint")] public static extern void AcceptChannelV2_set_revocation_basepoint(long _this_ptr, long _val);
        // struct LDKPublicKey AcceptChannelV2_get_payment_basepoint(const struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_payment_basepoint")] public static extern byte[] AcceptChannelV2_get_payment_basepoint(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_payment_basepoint")] public static extern long AcceptChannelV2_get_payment_basepoint(long _this_ptr);
        // void AcceptChannelV2_set_payment_basepoint(struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_payment_basepoint")] public static extern void AcceptChannelV2_set_payment_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_payment_basepoint")] public static extern void AcceptChannelV2_set_payment_basepoint(long _this_ptr, long _val);
        // struct LDKPublicKey AcceptChannelV2_get_delayed_payment_basepoint(const struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_delayed_payment_basepoint")] public static extern byte[] AcceptChannelV2_get_delayed_payment_basepoint(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_delayed_payment_basepoint")] public static extern long AcceptChannelV2_get_delayed_payment_basepoint(long _this_ptr);
        // void AcceptChannelV2_set_delayed_payment_basepoint(struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_delayed_payment_basepoint")] public static extern void AcceptChannelV2_set_delayed_payment_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_delayed_payment_basepoint")] public static extern void AcceptChannelV2_set_delayed_payment_basepoint(long _this_ptr, long _val);
        // struct LDKPublicKey AcceptChannelV2_get_htlc_basepoint(const struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_htlc_basepoint")] public static extern byte[] AcceptChannelV2_get_htlc_basepoint(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_htlc_basepoint")] public static extern long AcceptChannelV2_get_htlc_basepoint(long _this_ptr);
        // void AcceptChannelV2_set_htlc_basepoint(struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_htlc_basepoint")] public static extern void AcceptChannelV2_set_htlc_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_htlc_basepoint")] public static extern void AcceptChannelV2_set_htlc_basepoint(long _this_ptr, long _val);
        // struct LDKPublicKey AcceptChannelV2_get_first_per_commitment_point(const struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_first_per_commitment_point")] public static extern byte[] AcceptChannelV2_get_first_per_commitment_point(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_first_per_commitment_point")] public static extern long AcceptChannelV2_get_first_per_commitment_point(long _this_ptr);
        // void AcceptChannelV2_set_first_per_commitment_point(struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_first_per_commitment_point")] public static extern void AcceptChannelV2_set_first_per_commitment_point(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_first_per_commitment_point")] public static extern void AcceptChannelV2_set_first_per_commitment_point(long _this_ptr, long _val);
        // struct LDKPublicKey AcceptChannelV2_get_second_per_commitment_point(const struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_second_per_commitment_point")] public static extern byte[] AcceptChannelV2_get_second_per_commitment_point(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_second_per_commitment_point")] public static extern long AcceptChannelV2_get_second_per_commitment_point(long _this_ptr);
        // void AcceptChannelV2_set_second_per_commitment_point(struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_second_per_commitment_point")] public static extern void AcceptChannelV2_set_second_per_commitment_point(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // struct LDKCOption_ScriptZ AcceptChannelV2_get_shutdown_scriptpubkey(const struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_second_per_commitment_point")] public static extern void AcceptChannelV2_set_second_per_commitment_point(long _this_ptr, long _val);
+       // struct LDKCOption_CVec_u8ZZ AcceptChannelV2_get_shutdown_scriptpubkey(const struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_shutdown_scriptpubkey")] public static extern long AcceptChannelV2_get_shutdown_scriptpubkey(long _this_ptr);
-       // void AcceptChannelV2_set_shutdown_scriptpubkey(struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr, struct LDKCOption_ScriptZ val);
+       // void AcceptChannelV2_set_shutdown_scriptpubkey(struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr, struct LDKCOption_CVec_u8ZZ val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_shutdown_scriptpubkey")] public static extern void AcceptChannelV2_set_shutdown_scriptpubkey(long _this_ptr, long _val);
        // struct LDKChannelTypeFeatures AcceptChannelV2_get_channel_type(const struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_channel_type")] public static extern long AcceptChannelV2_get_channel_type(long _this_ptr);
@@ -6178,8 +7174,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_get_require_confirmed_inputs")] public static extern COption_NoneZ AcceptChannelV2_get_require_confirmed_inputs(long _this_ptr);
        // void AcceptChannelV2_set_require_confirmed_inputs(struct LDKAcceptChannelV2 *NONNULL_PTR this_ptr, enum LDKCOption_NoneZ val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_set_require_confirmed_inputs")] public static extern void AcceptChannelV2_set_require_confirmed_inputs(long _this_ptr, COption_NoneZ _val);
-       // MUST_USE_RES struct LDKAcceptChannelV2 AcceptChannelV2_new(struct LDKThirtyTwoBytes temporary_channel_id_arg, uint64_t funding_satoshis_arg, uint64_t dust_limit_satoshis_arg, uint64_t max_htlc_value_in_flight_msat_arg, uint64_t htlc_minimum_msat_arg, uint32_t minimum_depth_arg, uint16_t to_self_delay_arg, uint16_t max_accepted_htlcs_arg, struct LDKPublicKey funding_pubkey_arg, struct LDKPublicKey revocation_basepoint_arg, struct LDKPublicKey payment_basepoint_arg, struct LDKPublicKey delayed_payment_basepoint_arg, struct LDKPublicKey htlc_basepoint_arg, struct LDKPublicKey first_per_commitment_point_arg, struct LDKPublicKey second_per_commitment_point_arg, struct LDKCOption_ScriptZ shutdown_scriptpubkey_arg, struct LDKChannelTypeFeatures channel_type_arg, enum LDKCOption_NoneZ require_confirmed_inputs_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_new")] public static extern long AcceptChannelV2_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _temporary_channel_id_arg, long _funding_satoshis_arg, long _dust_limit_satoshis_arg, long _max_htlc_value_in_flight_msat_arg, long _htlc_minimum_msat_arg, int _minimum_depth_arg, short _to_self_delay_arg, short _max_accepted_htlcs_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_pubkey_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _revocation_basepoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_basepoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _delayed_payment_basepoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _htlc_basepoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _first_per_commitment_point_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _second_per_commitment_point_arg, long _shutdown_scriptpubkey_arg, long _channel_type_arg, COption_NoneZ _require_confirmed_inputs_arg);
+       // MUST_USE_RES struct LDKAcceptChannelV2 AcceptChannelV2_new(struct LDKThirtyTwoBytes temporary_channel_id_arg, uint64_t funding_satoshis_arg, uint64_t dust_limit_satoshis_arg, uint64_t max_htlc_value_in_flight_msat_arg, uint64_t htlc_minimum_msat_arg, uint32_t minimum_depth_arg, uint16_t to_self_delay_arg, uint16_t max_accepted_htlcs_arg, struct LDKPublicKey funding_pubkey_arg, struct LDKPublicKey revocation_basepoint_arg, struct LDKPublicKey payment_basepoint_arg, struct LDKPublicKey delayed_payment_basepoint_arg, struct LDKPublicKey htlc_basepoint_arg, struct LDKPublicKey first_per_commitment_point_arg, struct LDKPublicKey second_per_commitment_point_arg, struct LDKCOption_CVec_u8ZZ shutdown_scriptpubkey_arg, struct LDKChannelTypeFeatures channel_type_arg, enum LDKCOption_NoneZ require_confirmed_inputs_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_new")] public static extern long AcceptChannelV2_new(long _temporary_channel_id_arg, long _funding_satoshis_arg, long _dust_limit_satoshis_arg, long _max_htlc_value_in_flight_msat_arg, long _htlc_minimum_msat_arg, int _minimum_depth_arg, short _to_self_delay_arg, short _max_accepted_htlcs_arg, long _funding_pubkey_arg, long _revocation_basepoint_arg, long _payment_basepoint_arg, long _delayed_payment_basepoint_arg, long _htlc_basepoint_arg, long _first_per_commitment_point_arg, long _second_per_commitment_point_arg, long _shutdown_scriptpubkey_arg, long _channel_type_arg, COption_NoneZ _require_confirmed_inputs_arg);
        // uint64_t AcceptChannelV2_clone_ptr(LDKAcceptChannelV2 *NONNULL_PTR arg);
        [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);
@@ -6189,23 +7185,23 @@ internal class bindings {
        // void FundingCreated_free(struct LDKFundingCreated this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_free")] public static extern void FundingCreated_free(long _this_obj);
        // const uint8_t (*FundingCreated_get_temporary_channel_id(const struct LDKFundingCreated *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_get_temporary_channel_id")] public static extern byte[] FundingCreated_get_temporary_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_get_temporary_channel_id")] public static extern long FundingCreated_get_temporary_channel_id(long _this_ptr);
        // void FundingCreated_set_temporary_channel_id(struct LDKFundingCreated *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_set_temporary_channel_id")] public static extern void FundingCreated_set_temporary_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_set_temporary_channel_id")] public static extern void FundingCreated_set_temporary_channel_id(long _this_ptr, long _val);
        // const uint8_t (*FundingCreated_get_funding_txid(const struct LDKFundingCreated *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_get_funding_txid")] public static extern byte[] FundingCreated_get_funding_txid(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_get_funding_txid")] public static extern long FundingCreated_get_funding_txid(long _this_ptr);
        // void FundingCreated_set_funding_txid(struct LDKFundingCreated *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_set_funding_txid")] public static extern void FundingCreated_set_funding_txid(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_set_funding_txid")] public static extern void FundingCreated_set_funding_txid(long _this_ptr, long _val);
        // uint16_t FundingCreated_get_funding_output_index(const struct LDKFundingCreated *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_get_funding_output_index")] public static extern short FundingCreated_get_funding_output_index(long _this_ptr);
        // void FundingCreated_set_funding_output_index(struct LDKFundingCreated *NONNULL_PTR this_ptr, uint16_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_set_funding_output_index")] public static extern void FundingCreated_set_funding_output_index(long _this_ptr, short _val);
-       // struct LDKSignature FundingCreated_get_signature(const struct LDKFundingCreated *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_get_signature")] public static extern byte[] FundingCreated_get_signature(long _this_ptr);
-       // void FundingCreated_set_signature(struct LDKFundingCreated *NONNULL_PTR this_ptr, struct LDKSignature val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_set_signature")] public static extern void FundingCreated_set_signature(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // MUST_USE_RES struct LDKFundingCreated FundingCreated_new(struct LDKThirtyTwoBytes temporary_channel_id_arg, struct LDKThirtyTwoBytes funding_txid_arg, uint16_t funding_output_index_arg, struct LDKSignature signature_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_new")] public static extern long FundingCreated_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _temporary_channel_id_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_txid_arg, short _funding_output_index_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _signature_arg);
+       // struct LDKECDSASignature FundingCreated_get_signature(const struct LDKFundingCreated *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_get_signature")] public static extern long FundingCreated_get_signature(long _this_ptr);
+       // void FundingCreated_set_signature(struct LDKFundingCreated *NONNULL_PTR this_ptr, struct LDKECDSASignature val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_set_signature")] public static extern void FundingCreated_set_signature(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKFundingCreated FundingCreated_new(struct LDKThirtyTwoBytes temporary_channel_id_arg, struct LDKThirtyTwoBytes funding_txid_arg, uint16_t funding_output_index_arg, struct LDKECDSASignature signature_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_new")] public static extern long FundingCreated_new(long _temporary_channel_id_arg, long _funding_txid_arg, short _funding_output_index_arg, long _signature_arg);
        // uint64_t FundingCreated_clone_ptr(LDKFundingCreated *NONNULL_PTR arg);
        [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);
@@ -6215,15 +7211,15 @@ internal class bindings {
        // void FundingSigned_free(struct LDKFundingSigned this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_free")] public static extern void FundingSigned_free(long _this_obj);
        // const uint8_t (*FundingSigned_get_channel_id(const struct LDKFundingSigned *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_get_channel_id")] public static extern byte[] FundingSigned_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_get_channel_id")] public static extern long FundingSigned_get_channel_id(long _this_ptr);
        // void FundingSigned_set_channel_id(struct LDKFundingSigned *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_set_channel_id")] public static extern void FundingSigned_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // struct LDKSignature FundingSigned_get_signature(const struct LDKFundingSigned *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_get_signature")] public static extern byte[] FundingSigned_get_signature(long _this_ptr);
-       // void FundingSigned_set_signature(struct LDKFundingSigned *NONNULL_PTR this_ptr, struct LDKSignature val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_set_signature")] public static extern void FundingSigned_set_signature(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // MUST_USE_RES struct LDKFundingSigned FundingSigned_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKSignature signature_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_new")] public static extern long FundingSigned_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _signature_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_set_channel_id")] public static extern void FundingSigned_set_channel_id(long _this_ptr, long _val);
+       // struct LDKECDSASignature FundingSigned_get_signature(const struct LDKFundingSigned *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_get_signature")] public static extern long FundingSigned_get_signature(long _this_ptr);
+       // void FundingSigned_set_signature(struct LDKFundingSigned *NONNULL_PTR this_ptr, struct LDKECDSASignature val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_set_signature")] public static extern void FundingSigned_set_signature(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKFundingSigned FundingSigned_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKECDSASignature signature_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_new")] public static extern long FundingSigned_new(long _channel_id_arg, long _signature_arg);
        // uint64_t FundingSigned_clone_ptr(LDKFundingSigned *NONNULL_PTR arg);
        [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);
@@ -6233,19 +7229,19 @@ internal class bindings {
        // void ChannelReady_free(struct LDKChannelReady this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_free")] public static extern void ChannelReady_free(long _this_obj);
        // const uint8_t (*ChannelReady_get_channel_id(const struct LDKChannelReady *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_get_channel_id")] public static extern byte[] ChannelReady_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_get_channel_id")] public static extern long ChannelReady_get_channel_id(long _this_ptr);
        // void ChannelReady_set_channel_id(struct LDKChannelReady *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_set_channel_id")] public static extern void ChannelReady_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_set_channel_id")] public static extern void ChannelReady_set_channel_id(long _this_ptr, long _val);
        // struct LDKPublicKey ChannelReady_get_next_per_commitment_point(const struct LDKChannelReady *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_get_next_per_commitment_point")] public static extern byte[] ChannelReady_get_next_per_commitment_point(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_get_next_per_commitment_point")] public static extern long ChannelReady_get_next_per_commitment_point(long _this_ptr);
        // void ChannelReady_set_next_per_commitment_point(struct LDKChannelReady *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_set_next_per_commitment_point")] public static extern void ChannelReady_set_next_per_commitment_point(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_set_next_per_commitment_point")] public static extern void ChannelReady_set_next_per_commitment_point(long _this_ptr, long _val);
        // struct LDKCOption_u64Z ChannelReady_get_short_channel_id_alias(const struct LDKChannelReady *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_get_short_channel_id_alias")] public static extern long ChannelReady_get_short_channel_id_alias(long _this_ptr);
        // void ChannelReady_set_short_channel_id_alias(struct LDKChannelReady *NONNULL_PTR this_ptr, struct LDKCOption_u64Z val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_set_short_channel_id_alias")] public static extern void ChannelReady_set_short_channel_id_alias(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKChannelReady ChannelReady_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKPublicKey next_per_commitment_point_arg, struct LDKCOption_u64Z short_channel_id_alias_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_new")] public static extern long ChannelReady_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _next_per_commitment_point_arg, long _short_channel_id_alias_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_new")] public static extern long ChannelReady_new(long _channel_id_arg, long _next_per_commitment_point_arg, long _short_channel_id_alias_arg);
        // uint64_t ChannelReady_clone_ptr(LDKChannelReady *NONNULL_PTR arg);
        [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);
@@ -6255,9 +7251,9 @@ internal class bindings {
        // 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];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_get_channel_id")] public static extern byte[] TxAddInput_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_get_channel_id")] public static extern long TxAddInput_get_channel_id(long _this_ptr);
        // void TxAddInput_set_channel_id(struct LDKTxAddInput *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_set_channel_id")] public static extern void TxAddInput_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_set_channel_id")] public static extern void TxAddInput_set_channel_id(long _this_ptr, long _val);
        // uint64_t TxAddInput_get_serial_id(const struct LDKTxAddInput *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_get_serial_id")] public static extern long TxAddInput_get_serial_id(long _this_ptr);
        // void TxAddInput_set_serial_id(struct LDKTxAddInput *NONNULL_PTR this_ptr, uint64_t val);
@@ -6275,7 +7271,7 @@ internal class bindings {
        // void TxAddInput_set_sequence(struct LDKTxAddInput *NONNULL_PTR this_ptr, uint32_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_set_sequence")] public static extern void TxAddInput_set_sequence(long _this_ptr, int _val);
        // MUST_USE_RES struct LDKTxAddInput TxAddInput_new(struct LDKThirtyTwoBytes channel_id_arg, uint64_t serial_id_arg, struct LDKTransactionU16LenLimited prevtx_arg, uint32_t prevtx_out_arg, uint32_t sequence_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_new")] public static extern long TxAddInput_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, long _serial_id_arg, long _prevtx_arg, int _prevtx_out_arg, int _sequence_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_new")] public static extern long TxAddInput_new(long _channel_id_arg, long _serial_id_arg, long _prevtx_arg, int _prevtx_out_arg, int _sequence_arg);
        // uint64_t TxAddInput_clone_ptr(LDKTxAddInput *NONNULL_PTR arg);
        [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);
@@ -6285,9 +7281,9 @@ internal class bindings {
        // void TxAddOutput_free(struct LDKTxAddOutput this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_free")] public static extern void TxAddOutput_free(long _this_obj);
        // const uint8_t (*TxAddOutput_get_channel_id(const struct LDKTxAddOutput *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_get_channel_id")] public static extern byte[] TxAddOutput_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_get_channel_id")] public static extern long TxAddOutput_get_channel_id(long _this_ptr);
        // void TxAddOutput_set_channel_id(struct LDKTxAddOutput *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_set_channel_id")] public static extern void TxAddOutput_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_set_channel_id")] public static extern void TxAddOutput_set_channel_id(long _this_ptr, long _val);
        // uint64_t TxAddOutput_get_serial_id(const struct LDKTxAddOutput *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_get_serial_id")] public static extern long TxAddOutput_get_serial_id(long _this_ptr);
        // void TxAddOutput_set_serial_id(struct LDKTxAddOutput *NONNULL_PTR this_ptr, uint64_t val);
@@ -6297,11 +7293,11 @@ internal class bindings {
        // 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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_get_script")] public static extern byte[] TxAddOutput_get_script(long _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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_set_script")] public static extern void TxAddOutput_set_script(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKTxAddOutput TxAddOutput_new(struct LDKThirtyTwoBytes channel_id_arg, uint64_t serial_id_arg, uint64_t sats_arg, struct LDKCVec_u8Z script_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_new")] public static extern long TxAddOutput_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, long _serial_id_arg, long _sats_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _script_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_new")] public static extern long TxAddOutput_new(long _channel_id_arg, long _serial_id_arg, long _sats_arg, long _script_arg);
        // uint64_t TxAddOutput_clone_ptr(LDKTxAddOutput *NONNULL_PTR arg);
        [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);
@@ -6311,15 +7307,15 @@ internal class bindings {
        // void TxRemoveInput_free(struct LDKTxRemoveInput this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_free")] public static extern void TxRemoveInput_free(long _this_obj);
        // const uint8_t (*TxRemoveInput_get_channel_id(const struct LDKTxRemoveInput *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_get_channel_id")] public static extern byte[] TxRemoveInput_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_get_channel_id")] public static extern long TxRemoveInput_get_channel_id(long _this_ptr);
        // void TxRemoveInput_set_channel_id(struct LDKTxRemoveInput *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_set_channel_id")] public static extern void TxRemoveInput_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_set_channel_id")] public static extern void TxRemoveInput_set_channel_id(long _this_ptr, long _val);
        // uint64_t TxRemoveInput_get_serial_id(const struct LDKTxRemoveInput *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_get_serial_id")] public static extern long TxRemoveInput_get_serial_id(long _this_ptr);
        // void TxRemoveInput_set_serial_id(struct LDKTxRemoveInput *NONNULL_PTR this_ptr, uint64_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_set_serial_id")] public static extern void TxRemoveInput_set_serial_id(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKTxRemoveInput TxRemoveInput_new(struct LDKThirtyTwoBytes channel_id_arg, uint64_t serial_id_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_new")] public static extern long TxRemoveInput_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, long _serial_id_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_new")] public static extern long TxRemoveInput_new(long _channel_id_arg, long _serial_id_arg);
        // uint64_t TxRemoveInput_clone_ptr(LDKTxRemoveInput *NONNULL_PTR arg);
        [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);
@@ -6329,15 +7325,15 @@ internal class bindings {
        // void TxRemoveOutput_free(struct LDKTxRemoveOutput this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_free")] public static extern void TxRemoveOutput_free(long _this_obj);
        // const uint8_t (*TxRemoveOutput_get_channel_id(const struct LDKTxRemoveOutput *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_get_channel_id")] public static extern byte[] TxRemoveOutput_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_get_channel_id")] public static extern long TxRemoveOutput_get_channel_id(long _this_ptr);
        // void TxRemoveOutput_set_channel_id(struct LDKTxRemoveOutput *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_set_channel_id")] public static extern void TxRemoveOutput_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_set_channel_id")] public static extern void TxRemoveOutput_set_channel_id(long _this_ptr, long _val);
        // uint64_t TxRemoveOutput_get_serial_id(const struct LDKTxRemoveOutput *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_get_serial_id")] public static extern long TxRemoveOutput_get_serial_id(long _this_ptr);
        // void TxRemoveOutput_set_serial_id(struct LDKTxRemoveOutput *NONNULL_PTR this_ptr, uint64_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_set_serial_id")] public static extern void TxRemoveOutput_set_serial_id(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKTxRemoveOutput TxRemoveOutput_new(struct LDKThirtyTwoBytes channel_id_arg, uint64_t serial_id_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_new")] public static extern long TxRemoveOutput_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, long _serial_id_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_new")] public static extern long TxRemoveOutput_new(long _channel_id_arg, long _serial_id_arg);
        // uint64_t TxRemoveOutput_clone_ptr(LDKTxRemoveOutput *NONNULL_PTR arg);
        [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);
@@ -6347,11 +7343,11 @@ internal class bindings {
        // void TxComplete_free(struct LDKTxComplete this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxComplete_free")] public static extern void TxComplete_free(long _this_obj);
        // const uint8_t (*TxComplete_get_channel_id(const struct LDKTxComplete *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxComplete_get_channel_id")] public static extern byte[] TxComplete_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxComplete_get_channel_id")] public static extern long TxComplete_get_channel_id(long _this_ptr);
        // void TxComplete_set_channel_id(struct LDKTxComplete *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxComplete_set_channel_id")] public static extern void TxComplete_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxComplete_set_channel_id")] public static extern void TxComplete_set_channel_id(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKTxComplete TxComplete_new(struct LDKThirtyTwoBytes channel_id_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxComplete_new")] public static extern long TxComplete_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxComplete_new")] public static extern long TxComplete_new(long _channel_id_arg);
        // uint64_t TxComplete_clone_ptr(LDKTxComplete *NONNULL_PTR arg);
        [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);
@@ -6361,19 +7357,19 @@ internal class bindings {
        // void TxSignatures_free(struct LDKTxSignatures this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_free")] public static extern void TxSignatures_free(long _this_obj);
        // const uint8_t (*TxSignatures_get_channel_id(const struct LDKTxSignatures *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_get_channel_id")] public static extern byte[] TxSignatures_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_get_channel_id")] public static extern long TxSignatures_get_channel_id(long _this_ptr);
        // void TxSignatures_set_channel_id(struct LDKTxSignatures *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_set_channel_id")] public static extern void TxSignatures_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_set_channel_id")] public static extern void TxSignatures_set_channel_id(long _this_ptr, long _val);
        // const uint8_t (*TxSignatures_get_tx_hash(const struct LDKTxSignatures *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_get_tx_hash")] public static extern byte[] TxSignatures_get_tx_hash(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_get_tx_hash")] public static extern long TxSignatures_get_tx_hash(long _this_ptr);
        // void TxSignatures_set_tx_hash(struct LDKTxSignatures *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_set_tx_hash")] public static extern void TxSignatures_set_tx_hash(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_set_tx_hash")] public static extern void TxSignatures_set_tx_hash(long _this_ptr, long _val);
        // struct LDKCVec_WitnessZ TxSignatures_get_witnesses(const struct LDKTxSignatures *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_get_witnesses")] public static extern byte[][] TxSignatures_get_witnesses(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_get_witnesses")] public static extern long TxSignatures_get_witnesses(long _this_ptr);
        // void TxSignatures_set_witnesses(struct LDKTxSignatures *NONNULL_PTR this_ptr, struct LDKCVec_WitnessZ val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_set_witnesses")] public static extern void TxSignatures_set_witnesses(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_set_witnesses")] public static extern void TxSignatures_set_witnesses(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKTxSignatures TxSignatures_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKThirtyTwoBytes tx_hash_arg, struct LDKCVec_WitnessZ witnesses_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_new")] public static extern long TxSignatures_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _tx_hash_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _witnesses_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_new")] public static extern long TxSignatures_new(long _channel_id_arg, long _tx_hash_arg, long _witnesses_arg);
        // uint64_t TxSignatures_clone_ptr(LDKTxSignatures *NONNULL_PTR arg);
        [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);
@@ -6383,9 +7379,9 @@ internal class bindings {
        // void TxInitRbf_free(struct LDKTxInitRbf this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_free")] public static extern void TxInitRbf_free(long _this_obj);
        // const uint8_t (*TxInitRbf_get_channel_id(const struct LDKTxInitRbf *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_get_channel_id")] public static extern byte[] TxInitRbf_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_get_channel_id")] public static extern long TxInitRbf_get_channel_id(long _this_ptr);
        // void TxInitRbf_set_channel_id(struct LDKTxInitRbf *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_set_channel_id")] public static extern void TxInitRbf_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_set_channel_id")] public static extern void TxInitRbf_set_channel_id(long _this_ptr, long _val);
        // uint32_t TxInitRbf_get_locktime(const struct LDKTxInitRbf *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_get_locktime")] public static extern int TxInitRbf_get_locktime(long _this_ptr);
        // void TxInitRbf_set_locktime(struct LDKTxInitRbf *NONNULL_PTR this_ptr, uint32_t val);
@@ -6399,7 +7395,7 @@ internal class bindings {
        // void TxInitRbf_set_funding_output_contribution(struct LDKTxInitRbf *NONNULL_PTR this_ptr, struct LDKCOption_i64Z val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_set_funding_output_contribution")] public static extern void TxInitRbf_set_funding_output_contribution(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKTxInitRbf TxInitRbf_new(struct LDKThirtyTwoBytes channel_id_arg, uint32_t locktime_arg, uint32_t feerate_sat_per_1000_weight_arg, struct LDKCOption_i64Z funding_output_contribution_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_new")] public static extern long TxInitRbf_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, int _locktime_arg, int _feerate_sat_per_1000_weight_arg, long _funding_output_contribution_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_new")] public static extern long TxInitRbf_new(long _channel_id_arg, int _locktime_arg, int _feerate_sat_per_1000_weight_arg, long _funding_output_contribution_arg);
        // uint64_t TxInitRbf_clone_ptr(LDKTxInitRbf *NONNULL_PTR arg);
        [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);
@@ -6409,15 +7405,15 @@ internal class bindings {
        // void TxAckRbf_free(struct LDKTxAckRbf this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_free")] public static extern void TxAckRbf_free(long _this_obj);
        // const uint8_t (*TxAckRbf_get_channel_id(const struct LDKTxAckRbf *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_get_channel_id")] public static extern byte[] TxAckRbf_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_get_channel_id")] public static extern long TxAckRbf_get_channel_id(long _this_ptr);
        // void TxAckRbf_set_channel_id(struct LDKTxAckRbf *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_set_channel_id")] public static extern void TxAckRbf_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_set_channel_id")] public static extern void TxAckRbf_set_channel_id(long _this_ptr, long _val);
        // struct LDKCOption_i64Z TxAckRbf_get_funding_output_contribution(const struct LDKTxAckRbf *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_get_funding_output_contribution")] public static extern long TxAckRbf_get_funding_output_contribution(long _this_ptr);
        // void TxAckRbf_set_funding_output_contribution(struct LDKTxAckRbf *NONNULL_PTR this_ptr, struct LDKCOption_i64Z val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_set_funding_output_contribution")] public static extern void TxAckRbf_set_funding_output_contribution(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKTxAckRbf TxAckRbf_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKCOption_i64Z funding_output_contribution_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_new")] public static extern long TxAckRbf_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, long _funding_output_contribution_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_new")] public static extern long TxAckRbf_new(long _channel_id_arg, long _funding_output_contribution_arg);
        // uint64_t TxAckRbf_clone_ptr(LDKTxAckRbf *NONNULL_PTR arg);
        [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);
@@ -6427,15 +7423,15 @@ internal class bindings {
        // void TxAbort_free(struct LDKTxAbort this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_free")] public static extern void TxAbort_free(long _this_obj);
        // const uint8_t (*TxAbort_get_channel_id(const struct LDKTxAbort *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_get_channel_id")] public static extern byte[] TxAbort_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_get_channel_id")] public static extern long TxAbort_get_channel_id(long _this_ptr);
        // void TxAbort_set_channel_id(struct LDKTxAbort *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_set_channel_id")] public static extern void TxAbort_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_set_channel_id")] public static extern void TxAbort_set_channel_id(long _this_ptr, long _val);
        // struct LDKCVec_u8Z TxAbort_get_data(const struct LDKTxAbort *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_get_data")] public static extern byte[] TxAbort_get_data(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_get_data")] public static extern long TxAbort_get_data(long _this_ptr);
        // void TxAbort_set_data(struct LDKTxAbort *NONNULL_PTR this_ptr, struct LDKCVec_u8Z val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_set_data")] public static extern void TxAbort_set_data(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_set_data")] public static extern void TxAbort_set_data(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKTxAbort TxAbort_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKCVec_u8Z data_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_new")] public static extern long TxAbort_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _data_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_new")] public static extern long TxAbort_new(long _channel_id_arg, long _data_arg);
        // uint64_t TxAbort_clone_ptr(LDKTxAbort *NONNULL_PTR arg);
        [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);
@@ -6445,15 +7441,15 @@ internal class bindings {
        // void Shutdown_free(struct LDKShutdown this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_free")] public static extern void Shutdown_free(long _this_obj);
        // const uint8_t (*Shutdown_get_channel_id(const struct LDKShutdown *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_get_channel_id")] public static extern byte[] Shutdown_get_channel_id(long _this_ptr);
+       [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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_get_scriptpubkey")] public static extern byte[] Shutdown_get_scriptpubkey(long _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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_set_scriptpubkey")] public static extern void Shutdown_set_scriptpubkey(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKShutdown Shutdown_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKCVec_u8Z scriptpubkey_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_new")] public static extern long Shutdown_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _scriptpubkey_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_new")] public static extern long Shutdown_new(long _channel_id_arg, long _scriptpubkey_arg);
        // uint64_t Shutdown_clone_ptr(LDKShutdown *NONNULL_PTR arg);
        [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);
@@ -6481,23 +7477,23 @@ internal class bindings {
        // void ClosingSigned_free(struct LDKClosingSigned this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_free")] public static extern void ClosingSigned_free(long _this_obj);
        // const uint8_t (*ClosingSigned_get_channel_id(const struct LDKClosingSigned *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_get_channel_id")] public static extern byte[] ClosingSigned_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_get_channel_id")] public static extern long ClosingSigned_get_channel_id(long _this_ptr);
        // void ClosingSigned_set_channel_id(struct LDKClosingSigned *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_set_channel_id")] public static extern void ClosingSigned_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_set_channel_id")] public static extern void ClosingSigned_set_channel_id(long _this_ptr, long _val);
        // uint64_t ClosingSigned_get_fee_satoshis(const struct LDKClosingSigned *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_get_fee_satoshis")] public static extern long ClosingSigned_get_fee_satoshis(long _this_ptr);
        // void ClosingSigned_set_fee_satoshis(struct LDKClosingSigned *NONNULL_PTR this_ptr, uint64_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_set_fee_satoshis")] public static extern void ClosingSigned_set_fee_satoshis(long _this_ptr, long _val);
-       // struct LDKSignature ClosingSigned_get_signature(const struct LDKClosingSigned *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_get_signature")] public static extern byte[] ClosingSigned_get_signature(long _this_ptr);
-       // void ClosingSigned_set_signature(struct LDKClosingSigned *NONNULL_PTR this_ptr, struct LDKSignature val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_set_signature")] public static extern void ClosingSigned_set_signature(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       // struct LDKECDSASignature ClosingSigned_get_signature(const struct LDKClosingSigned *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_get_signature")] public static extern long ClosingSigned_get_signature(long _this_ptr);
+       // void ClosingSigned_set_signature(struct LDKClosingSigned *NONNULL_PTR this_ptr, struct LDKECDSASignature val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_set_signature")] public static extern void ClosingSigned_set_signature(long _this_ptr, long _val);
        // struct LDKClosingSignedFeeRange ClosingSigned_get_fee_range(const struct LDKClosingSigned *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_get_fee_range")] public static extern long ClosingSigned_get_fee_range(long _this_ptr);
        // void ClosingSigned_set_fee_range(struct LDKClosingSigned *NONNULL_PTR this_ptr, struct LDKClosingSignedFeeRange val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_set_fee_range")] public static extern void ClosingSigned_set_fee_range(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKClosingSigned ClosingSigned_new(struct LDKThirtyTwoBytes channel_id_arg, uint64_t fee_satoshis_arg, struct LDKSignature signature_arg, struct LDKClosingSignedFeeRange fee_range_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_new")] public static extern long ClosingSigned_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, long _fee_satoshis_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _signature_arg, long _fee_range_arg);
+       // MUST_USE_RES struct LDKClosingSigned ClosingSigned_new(struct LDKThirtyTwoBytes channel_id_arg, uint64_t fee_satoshis_arg, struct LDKECDSASignature signature_arg, struct LDKClosingSignedFeeRange fee_range_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_new")] public static extern long ClosingSigned_new(long _channel_id_arg, long _fee_satoshis_arg, long _signature_arg, long _fee_range_arg);
        // uint64_t ClosingSigned_clone_ptr(LDKClosingSigned *NONNULL_PTR arg);
        [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);
@@ -6507,9 +7503,9 @@ internal class bindings {
        // void UpdateAddHTLC_free(struct LDKUpdateAddHTLC this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_free")] public static extern void UpdateAddHTLC_free(long _this_obj);
        // const uint8_t (*UpdateAddHTLC_get_channel_id(const struct LDKUpdateAddHTLC *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_get_channel_id")] public static extern byte[] UpdateAddHTLC_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_get_channel_id")] public static extern long UpdateAddHTLC_get_channel_id(long _this_ptr);
        // void UpdateAddHTLC_set_channel_id(struct LDKUpdateAddHTLC *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_set_channel_id")] public static extern void UpdateAddHTLC_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_set_channel_id")] public static extern void UpdateAddHTLC_set_channel_id(long _this_ptr, long _val);
        // uint64_t UpdateAddHTLC_get_htlc_id(const struct LDKUpdateAddHTLC *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_get_htlc_id")] public static extern long UpdateAddHTLC_get_htlc_id(long _this_ptr);
        // void UpdateAddHTLC_set_htlc_id(struct LDKUpdateAddHTLC *NONNULL_PTR this_ptr, uint64_t val);
@@ -6519,9 +7515,9 @@ internal class bindings {
        // void UpdateAddHTLC_set_amount_msat(struct LDKUpdateAddHTLC *NONNULL_PTR this_ptr, uint64_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_set_amount_msat")] public static extern void UpdateAddHTLC_set_amount_msat(long _this_ptr, long _val);
        // const uint8_t (*UpdateAddHTLC_get_payment_hash(const struct LDKUpdateAddHTLC *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_get_payment_hash")] public static extern byte[] UpdateAddHTLC_get_payment_hash(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_get_payment_hash")] public static extern long UpdateAddHTLC_get_payment_hash(long _this_ptr);
        // void UpdateAddHTLC_set_payment_hash(struct LDKUpdateAddHTLC *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_set_payment_hash")] public static extern void UpdateAddHTLC_set_payment_hash(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_set_payment_hash")] public static extern void UpdateAddHTLC_set_payment_hash(long _this_ptr, long _val);
        // uint32_t UpdateAddHTLC_get_cltv_expiry(const struct LDKUpdateAddHTLC *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_get_cltv_expiry")] public static extern int UpdateAddHTLC_get_cltv_expiry(long _this_ptr);
        // void UpdateAddHTLC_set_cltv_expiry(struct LDKUpdateAddHTLC *NONNULL_PTR this_ptr, uint32_t val);
@@ -6539,9 +7535,15 @@ internal class bindings {
        // void OnionMessage_free(struct LDKOnionMessage this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessage_free")] public static extern void OnionMessage_free(long _this_obj);
        // struct LDKPublicKey OnionMessage_get_blinding_point(const struct LDKOnionMessage *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessage_get_blinding_point")] public static extern byte[] OnionMessage_get_blinding_point(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessage_get_blinding_point")] public static extern long OnionMessage_get_blinding_point(long _this_ptr);
        // void OnionMessage_set_blinding_point(struct LDKOnionMessage *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessage_set_blinding_point")] public static extern void OnionMessage_set_blinding_point(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessage_set_blinding_point")] public static extern void OnionMessage_set_blinding_point(long _this_ptr, long _val);
+       // struct LDKPacket OnionMessage_get_onion_routing_packet(const struct LDKOnionMessage *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessage_get_onion_routing_packet")] public static extern long OnionMessage_get_onion_routing_packet(long _this_ptr);
+       // void OnionMessage_set_onion_routing_packet(struct LDKOnionMessage *NONNULL_PTR this_ptr, struct LDKPacket val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessage_set_onion_routing_packet")] public static extern void OnionMessage_set_onion_routing_packet(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKOnionMessage OnionMessage_new(struct LDKPublicKey blinding_point_arg, struct LDKPacket onion_routing_packet_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessage_new")] public static extern long OnionMessage_new(long _blinding_point_arg, long _onion_routing_packet_arg);
        // uint64_t OnionMessage_clone_ptr(LDKOnionMessage *NONNULL_PTR arg);
        [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);
@@ -6551,19 +7553,19 @@ internal class bindings {
        // void UpdateFulfillHTLC_free(struct LDKUpdateFulfillHTLC this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_free")] public static extern void UpdateFulfillHTLC_free(long _this_obj);
        // const uint8_t (*UpdateFulfillHTLC_get_channel_id(const struct LDKUpdateFulfillHTLC *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_get_channel_id")] public static extern byte[] UpdateFulfillHTLC_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_get_channel_id")] public static extern long UpdateFulfillHTLC_get_channel_id(long _this_ptr);
        // void UpdateFulfillHTLC_set_channel_id(struct LDKUpdateFulfillHTLC *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_set_channel_id")] public static extern void UpdateFulfillHTLC_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_set_channel_id")] public static extern void UpdateFulfillHTLC_set_channel_id(long _this_ptr, long _val);
        // uint64_t UpdateFulfillHTLC_get_htlc_id(const struct LDKUpdateFulfillHTLC *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_get_htlc_id")] public static extern long UpdateFulfillHTLC_get_htlc_id(long _this_ptr);
        // void UpdateFulfillHTLC_set_htlc_id(struct LDKUpdateFulfillHTLC *NONNULL_PTR this_ptr, uint64_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_set_htlc_id")] public static extern void UpdateFulfillHTLC_set_htlc_id(long _this_ptr, long _val);
        // const uint8_t (*UpdateFulfillHTLC_get_payment_preimage(const struct LDKUpdateFulfillHTLC *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_get_payment_preimage")] public static extern byte[] UpdateFulfillHTLC_get_payment_preimage(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_get_payment_preimage")] public static extern long UpdateFulfillHTLC_get_payment_preimage(long _this_ptr);
        // void UpdateFulfillHTLC_set_payment_preimage(struct LDKUpdateFulfillHTLC *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_set_payment_preimage")] public static extern void UpdateFulfillHTLC_set_payment_preimage(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_set_payment_preimage")] public static extern void UpdateFulfillHTLC_set_payment_preimage(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKUpdateFulfillHTLC UpdateFulfillHTLC_new(struct LDKThirtyTwoBytes channel_id_arg, uint64_t htlc_id_arg, struct LDKThirtyTwoBytes payment_preimage_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_new")] public static extern long UpdateFulfillHTLC_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, long _htlc_id_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_preimage_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_new")] public static extern long UpdateFulfillHTLC_new(long _channel_id_arg, long _htlc_id_arg, long _payment_preimage_arg);
        // uint64_t UpdateFulfillHTLC_clone_ptr(LDKUpdateFulfillHTLC *NONNULL_PTR arg);
        [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);
@@ -6573,9 +7575,9 @@ internal class bindings {
        // void UpdateFailHTLC_free(struct LDKUpdateFailHTLC this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailHTLC_free")] public static extern void UpdateFailHTLC_free(long _this_obj);
        // const uint8_t (*UpdateFailHTLC_get_channel_id(const struct LDKUpdateFailHTLC *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailHTLC_get_channel_id")] public static extern byte[] UpdateFailHTLC_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailHTLC_get_channel_id")] public static extern long UpdateFailHTLC_get_channel_id(long _this_ptr);
        // void UpdateFailHTLC_set_channel_id(struct LDKUpdateFailHTLC *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailHTLC_set_channel_id")] public static extern void UpdateFailHTLC_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailHTLC_set_channel_id")] public static extern void UpdateFailHTLC_set_channel_id(long _this_ptr, long _val);
        // uint64_t UpdateFailHTLC_get_htlc_id(const struct LDKUpdateFailHTLC *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailHTLC_get_htlc_id")] public static extern long UpdateFailHTLC_get_htlc_id(long _this_ptr);
        // void UpdateFailHTLC_set_htlc_id(struct LDKUpdateFailHTLC *NONNULL_PTR this_ptr, uint64_t val);
@@ -6589,9 +7591,9 @@ internal class bindings {
        // void UpdateFailMalformedHTLC_free(struct LDKUpdateFailMalformedHTLC this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailMalformedHTLC_free")] public static extern void UpdateFailMalformedHTLC_free(long _this_obj);
        // const uint8_t (*UpdateFailMalformedHTLC_get_channel_id(const struct LDKUpdateFailMalformedHTLC *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailMalformedHTLC_get_channel_id")] public static extern byte[] UpdateFailMalformedHTLC_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailMalformedHTLC_get_channel_id")] public static extern long UpdateFailMalformedHTLC_get_channel_id(long _this_ptr);
        // void UpdateFailMalformedHTLC_set_channel_id(struct LDKUpdateFailMalformedHTLC *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailMalformedHTLC_set_channel_id")] public static extern void UpdateFailMalformedHTLC_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailMalformedHTLC_set_channel_id")] public static extern void UpdateFailMalformedHTLC_set_channel_id(long _this_ptr, long _val);
        // uint64_t UpdateFailMalformedHTLC_get_htlc_id(const struct LDKUpdateFailMalformedHTLC *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailMalformedHTLC_get_htlc_id")] public static extern long UpdateFailMalformedHTLC_get_htlc_id(long _this_ptr);
        // void UpdateFailMalformedHTLC_set_htlc_id(struct LDKUpdateFailMalformedHTLC *NONNULL_PTR this_ptr, uint64_t val);
@@ -6609,19 +7611,19 @@ internal class bindings {
        // void CommitmentSigned_free(struct LDKCommitmentSigned this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_free")] public static extern void CommitmentSigned_free(long _this_obj);
        // const uint8_t (*CommitmentSigned_get_channel_id(const struct LDKCommitmentSigned *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_get_channel_id")] public static extern byte[] CommitmentSigned_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_get_channel_id")] public static extern long CommitmentSigned_get_channel_id(long _this_ptr);
        // void CommitmentSigned_set_channel_id(struct LDKCommitmentSigned *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_set_channel_id")] public static extern void CommitmentSigned_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // struct LDKSignature CommitmentSigned_get_signature(const struct LDKCommitmentSigned *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_get_signature")] public static extern byte[] CommitmentSigned_get_signature(long _this_ptr);
-       // void CommitmentSigned_set_signature(struct LDKCommitmentSigned *NONNULL_PTR this_ptr, struct LDKSignature val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_set_signature")] public static extern void CommitmentSigned_set_signature(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // struct LDKCVec_SignatureZ CommitmentSigned_get_htlc_signatures(const struct LDKCommitmentSigned *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_get_htlc_signatures")] public static extern byte[][] CommitmentSigned_get_htlc_signatures(long _this_ptr);
-       // void CommitmentSigned_set_htlc_signatures(struct LDKCommitmentSigned *NONNULL_PTR this_ptr, struct LDKCVec_SignatureZ val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_set_htlc_signatures")] public static extern void CommitmentSigned_set_htlc_signatures(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _val);
-       // MUST_USE_RES struct LDKCommitmentSigned CommitmentSigned_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKSignature signature_arg, struct LDKCVec_SignatureZ htlc_signatures_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_new")] public static extern long CommitmentSigned_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _signature_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _htlc_signatures_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_set_channel_id")] public static extern void CommitmentSigned_set_channel_id(long _this_ptr, long _val);
+       // struct LDKECDSASignature CommitmentSigned_get_signature(const struct LDKCommitmentSigned *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_get_signature")] public static extern long CommitmentSigned_get_signature(long _this_ptr);
+       // void CommitmentSigned_set_signature(struct LDKCommitmentSigned *NONNULL_PTR this_ptr, struct LDKECDSASignature val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_set_signature")] public static extern void CommitmentSigned_set_signature(long _this_ptr, long _val);
+       // struct LDKCVec_ECDSASignatureZ CommitmentSigned_get_htlc_signatures(const struct LDKCommitmentSigned *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_get_htlc_signatures")] public static extern long CommitmentSigned_get_htlc_signatures(long _this_ptr);
+       // void CommitmentSigned_set_htlc_signatures(struct LDKCommitmentSigned *NONNULL_PTR this_ptr, struct LDKCVec_ECDSASignatureZ val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_set_htlc_signatures")] public static extern void CommitmentSigned_set_htlc_signatures(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKCommitmentSigned CommitmentSigned_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKECDSASignature signature_arg, struct LDKCVec_ECDSASignatureZ htlc_signatures_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_new")] public static extern long CommitmentSigned_new(long _channel_id_arg, long _signature_arg, long _htlc_signatures_arg);
        // uint64_t CommitmentSigned_clone_ptr(LDKCommitmentSigned *NONNULL_PTR arg);
        [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);
@@ -6631,19 +7633,19 @@ internal class bindings {
        // void RevokeAndACK_free(struct LDKRevokeAndACK this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_free")] public static extern void RevokeAndACK_free(long _this_obj);
        // const uint8_t (*RevokeAndACK_get_channel_id(const struct LDKRevokeAndACK *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_get_channel_id")] public static extern byte[] RevokeAndACK_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_get_channel_id")] public static extern long RevokeAndACK_get_channel_id(long _this_ptr);
        // void RevokeAndACK_set_channel_id(struct LDKRevokeAndACK *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_set_channel_id")] public static extern void RevokeAndACK_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_set_channel_id")] public static extern void RevokeAndACK_set_channel_id(long _this_ptr, long _val);
        // const uint8_t (*RevokeAndACK_get_per_commitment_secret(const struct LDKRevokeAndACK *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_get_per_commitment_secret")] public static extern byte[] RevokeAndACK_get_per_commitment_secret(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_get_per_commitment_secret")] public static extern long RevokeAndACK_get_per_commitment_secret(long _this_ptr);
        // void RevokeAndACK_set_per_commitment_secret(struct LDKRevokeAndACK *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_set_per_commitment_secret")] public static extern void RevokeAndACK_set_per_commitment_secret(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_set_per_commitment_secret")] public static extern void RevokeAndACK_set_per_commitment_secret(long _this_ptr, long _val);
        // struct LDKPublicKey RevokeAndACK_get_next_per_commitment_point(const struct LDKRevokeAndACK *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_get_next_per_commitment_point")] public static extern byte[] RevokeAndACK_get_next_per_commitment_point(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_get_next_per_commitment_point")] public static extern long RevokeAndACK_get_next_per_commitment_point(long _this_ptr);
        // void RevokeAndACK_set_next_per_commitment_point(struct LDKRevokeAndACK *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_set_next_per_commitment_point")] public static extern void RevokeAndACK_set_next_per_commitment_point(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_set_next_per_commitment_point")] public static extern void RevokeAndACK_set_next_per_commitment_point(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKRevokeAndACK RevokeAndACK_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKThirtyTwoBytes per_commitment_secret_arg, struct LDKPublicKey next_per_commitment_point_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_new")] public static extern long RevokeAndACK_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _per_commitment_secret_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _next_per_commitment_point_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_new")] public static extern long RevokeAndACK_new(long _channel_id_arg, long _per_commitment_secret_arg, long _next_per_commitment_point_arg);
        // uint64_t RevokeAndACK_clone_ptr(LDKRevokeAndACK *NONNULL_PTR arg);
        [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);
@@ -6653,15 +7655,15 @@ internal class bindings {
        // void UpdateFee_free(struct LDKUpdateFee this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_free")] public static extern void UpdateFee_free(long _this_obj);
        // const uint8_t (*UpdateFee_get_channel_id(const struct LDKUpdateFee *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_get_channel_id")] public static extern byte[] UpdateFee_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_get_channel_id")] public static extern long UpdateFee_get_channel_id(long _this_ptr);
        // void UpdateFee_set_channel_id(struct LDKUpdateFee *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_set_channel_id")] public static extern void UpdateFee_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_set_channel_id")] public static extern void UpdateFee_set_channel_id(long _this_ptr, long _val);
        // uint32_t UpdateFee_get_feerate_per_kw(const struct LDKUpdateFee *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_get_feerate_per_kw")] public static extern int UpdateFee_get_feerate_per_kw(long _this_ptr);
        // void UpdateFee_set_feerate_per_kw(struct LDKUpdateFee *NONNULL_PTR this_ptr, uint32_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_set_feerate_per_kw")] public static extern void UpdateFee_set_feerate_per_kw(long _this_ptr, int _val);
        // MUST_USE_RES struct LDKUpdateFee UpdateFee_new(struct LDKThirtyTwoBytes channel_id_arg, uint32_t feerate_per_kw_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_new")] public static extern long UpdateFee_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, int _feerate_per_kw_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_new")] public static extern long UpdateFee_new(long _channel_id_arg, int _feerate_per_kw_arg);
        // uint64_t UpdateFee_clone_ptr(LDKUpdateFee *NONNULL_PTR arg);
        [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);
@@ -6671,9 +7673,9 @@ internal class bindings {
        // void ChannelReestablish_free(struct LDKChannelReestablish this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_free")] public static extern void ChannelReestablish_free(long _this_obj);
        // const uint8_t (*ChannelReestablish_get_channel_id(const struct LDKChannelReestablish *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_get_channel_id")] public static extern byte[] ChannelReestablish_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_get_channel_id")] public static extern long ChannelReestablish_get_channel_id(long _this_ptr);
        // void ChannelReestablish_set_channel_id(struct LDKChannelReestablish *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_set_channel_id")] public static extern void ChannelReestablish_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_set_channel_id")] public static extern void ChannelReestablish_set_channel_id(long _this_ptr, long _val);
        // uint64_t ChannelReestablish_get_next_local_commitment_number(const struct LDKChannelReestablish *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_get_next_local_commitment_number")] public static extern long ChannelReestablish_get_next_local_commitment_number(long _this_ptr);
        // void ChannelReestablish_set_next_local_commitment_number(struct LDKChannelReestablish *NONNULL_PTR this_ptr, uint64_t val);
@@ -6683,19 +7685,19 @@ internal class bindings {
        // void ChannelReestablish_set_next_remote_commitment_number(struct LDKChannelReestablish *NONNULL_PTR this_ptr, uint64_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_set_next_remote_commitment_number")] public static extern void ChannelReestablish_set_next_remote_commitment_number(long _this_ptr, long _val);
        // const uint8_t (*ChannelReestablish_get_your_last_per_commitment_secret(const struct LDKChannelReestablish *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_get_your_last_per_commitment_secret")] public static extern byte[] ChannelReestablish_get_your_last_per_commitment_secret(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_get_your_last_per_commitment_secret")] public static extern long ChannelReestablish_get_your_last_per_commitment_secret(long _this_ptr);
        // void ChannelReestablish_set_your_last_per_commitment_secret(struct LDKChannelReestablish *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_set_your_last_per_commitment_secret")] public static extern void ChannelReestablish_set_your_last_per_commitment_secret(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_set_your_last_per_commitment_secret")] public static extern void ChannelReestablish_set_your_last_per_commitment_secret(long _this_ptr, long _val);
        // struct LDKPublicKey ChannelReestablish_get_my_current_per_commitment_point(const struct LDKChannelReestablish *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_get_my_current_per_commitment_point")] public static extern byte[] ChannelReestablish_get_my_current_per_commitment_point(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_get_my_current_per_commitment_point")] public static extern long ChannelReestablish_get_my_current_per_commitment_point(long _this_ptr);
        // void ChannelReestablish_set_my_current_per_commitment_point(struct LDKChannelReestablish *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_set_my_current_per_commitment_point")] public static extern void ChannelReestablish_set_my_current_per_commitment_point(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // struct LDKCOption_TxidZ ChannelReestablish_get_next_funding_txid(const struct LDKChannelReestablish *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_set_my_current_per_commitment_point")] public static extern void ChannelReestablish_set_my_current_per_commitment_point(long _this_ptr, long _val);
+       // struct LDKCOption_ThirtyTwoBytesZ ChannelReestablish_get_next_funding_txid(const struct LDKChannelReestablish *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_get_next_funding_txid")] public static extern long ChannelReestablish_get_next_funding_txid(long _this_ptr);
-       // void ChannelReestablish_set_next_funding_txid(struct LDKChannelReestablish *NONNULL_PTR this_ptr, struct LDKCOption_TxidZ val);
+       // void ChannelReestablish_set_next_funding_txid(struct LDKChannelReestablish *NONNULL_PTR this_ptr, struct LDKCOption_ThirtyTwoBytesZ val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_set_next_funding_txid")] public static extern void ChannelReestablish_set_next_funding_txid(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKChannelReestablish ChannelReestablish_new(struct LDKThirtyTwoBytes channel_id_arg, uint64_t next_local_commitment_number_arg, uint64_t next_remote_commitment_number_arg, struct LDKThirtyTwoBytes your_last_per_commitment_secret_arg, struct LDKPublicKey my_current_per_commitment_point_arg, struct LDKCOption_TxidZ next_funding_txid_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_new")] public static extern long ChannelReestablish_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, long _next_local_commitment_number_arg, long _next_remote_commitment_number_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _your_last_per_commitment_secret_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _my_current_per_commitment_point_arg, long _next_funding_txid_arg);
+       // MUST_USE_RES struct LDKChannelReestablish ChannelReestablish_new(struct LDKThirtyTwoBytes channel_id_arg, uint64_t next_local_commitment_number_arg, uint64_t next_remote_commitment_number_arg, struct LDKThirtyTwoBytes your_last_per_commitment_secret_arg, struct LDKPublicKey my_current_per_commitment_point_arg, struct LDKCOption_ThirtyTwoBytesZ next_funding_txid_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_new")] public static extern long ChannelReestablish_new(long _channel_id_arg, long _next_local_commitment_number_arg, long _next_remote_commitment_number_arg, long _your_last_per_commitment_secret_arg, long _my_current_per_commitment_point_arg, long _next_funding_txid_arg);
        // uint64_t ChannelReestablish_clone_ptr(LDKChannelReestablish *NONNULL_PTR arg);
        [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);
@@ -6705,51 +7707,69 @@ internal class bindings {
        // void AnnouncementSignatures_free(struct LDKAnnouncementSignatures this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_free")] public static extern void AnnouncementSignatures_free(long _this_obj);
        // const uint8_t (*AnnouncementSignatures_get_channel_id(const struct LDKAnnouncementSignatures *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_get_channel_id")] public static extern byte[] AnnouncementSignatures_get_channel_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_get_channel_id")] public static extern long AnnouncementSignatures_get_channel_id(long _this_ptr);
        // void AnnouncementSignatures_set_channel_id(struct LDKAnnouncementSignatures *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_set_channel_id")] public static extern void AnnouncementSignatures_set_channel_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_set_channel_id")] public static extern void AnnouncementSignatures_set_channel_id(long _this_ptr, long _val);
        // uint64_t AnnouncementSignatures_get_short_channel_id(const struct LDKAnnouncementSignatures *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_get_short_channel_id")] public static extern long AnnouncementSignatures_get_short_channel_id(long _this_ptr);
        // void AnnouncementSignatures_set_short_channel_id(struct LDKAnnouncementSignatures *NONNULL_PTR this_ptr, uint64_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_set_short_channel_id")] public static extern void AnnouncementSignatures_set_short_channel_id(long _this_ptr, long _val);
-       // struct LDKSignature AnnouncementSignatures_get_node_signature(const struct LDKAnnouncementSignatures *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_get_node_signature")] public static extern byte[] AnnouncementSignatures_get_node_signature(long _this_ptr);
-       // void AnnouncementSignatures_set_node_signature(struct LDKAnnouncementSignatures *NONNULL_PTR this_ptr, struct LDKSignature val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_set_node_signature")] public static extern void AnnouncementSignatures_set_node_signature(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // struct LDKSignature AnnouncementSignatures_get_bitcoin_signature(const struct LDKAnnouncementSignatures *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_get_bitcoin_signature")] public static extern byte[] AnnouncementSignatures_get_bitcoin_signature(long _this_ptr);
-       // void AnnouncementSignatures_set_bitcoin_signature(struct LDKAnnouncementSignatures *NONNULL_PTR this_ptr, struct LDKSignature val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_set_bitcoin_signature")] public static extern void AnnouncementSignatures_set_bitcoin_signature(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // MUST_USE_RES struct LDKAnnouncementSignatures AnnouncementSignatures_new(struct LDKThirtyTwoBytes channel_id_arg, uint64_t short_channel_id_arg, struct LDKSignature node_signature_arg, struct LDKSignature bitcoin_signature_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_new")] public static extern long AnnouncementSignatures_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id_arg, long _short_channel_id_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_signature_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _bitcoin_signature_arg);
+       // struct LDKECDSASignature AnnouncementSignatures_get_node_signature(const struct LDKAnnouncementSignatures *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_get_node_signature")] public static extern long AnnouncementSignatures_get_node_signature(long _this_ptr);
+       // void AnnouncementSignatures_set_node_signature(struct LDKAnnouncementSignatures *NONNULL_PTR this_ptr, struct LDKECDSASignature val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_set_node_signature")] public static extern void AnnouncementSignatures_set_node_signature(long _this_ptr, long _val);
+       // struct LDKECDSASignature AnnouncementSignatures_get_bitcoin_signature(const struct LDKAnnouncementSignatures *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_get_bitcoin_signature")] public static extern long AnnouncementSignatures_get_bitcoin_signature(long _this_ptr);
+       // void AnnouncementSignatures_set_bitcoin_signature(struct LDKAnnouncementSignatures *NONNULL_PTR this_ptr, struct LDKECDSASignature val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_set_bitcoin_signature")] public static extern void AnnouncementSignatures_set_bitcoin_signature(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKAnnouncementSignatures AnnouncementSignatures_new(struct LDKThirtyTwoBytes channel_id_arg, uint64_t short_channel_id_arg, struct LDKECDSASignature node_signature_arg, struct LDKECDSASignature bitcoin_signature_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_new")] public static extern long AnnouncementSignatures_new(long _channel_id_arg, long _short_channel_id_arg, long _node_signature_arg, long _bitcoin_signature_arg);
        // uint64_t AnnouncementSignatures_clone_ptr(LDKAnnouncementSignatures *NONNULL_PTR arg);
        [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);
        // 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 NetAddress_free(struct LDKNetAddress this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetAddress_free")] public static extern void NetAddress_free(long _this_ptr);
-       // uint64_t NetAddress_clone_ptr(LDKNetAddress *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetAddress_clone_ptr")] public static extern long NetAddress_clone_ptr(long _arg);
-       // struct LDKNetAddress NetAddress_clone(const struct LDKNetAddress *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetAddress_clone")] public static extern long NetAddress_clone(long _orig);
-       // struct LDKNetAddress NetAddress_ipv4(struct LDKFourBytes addr, uint16_t port);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetAddress_ipv4")] public static extern long NetAddress_ipv4([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _addr, short _port);
-       // struct LDKNetAddress NetAddress_ipv6(struct LDKSixteenBytes addr, uint16_t port);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetAddress_ipv6")] public static extern long NetAddress_ipv6([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _addr, short _port);
-       // struct LDKNetAddress NetAddress_onion_v2(struct LDKTwelveBytes a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetAddress_onion_v2")] public static extern long NetAddress_onion_v2([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a);
-       // struct LDKNetAddress NetAddress_onion_v3(struct LDKThirtyTwoBytes ed25519_pubkey, uint16_t checksum, uint8_t version, uint16_t port);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetAddress_onion_v3")] public static extern long NetAddress_onion_v3([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ed25519_pubkey, short _checksum, byte _version, short _port);
-       // struct LDKNetAddress NetAddress_hostname(struct LDKHostname hostname, uint16_t port);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetAddress_hostname")] public static extern long NetAddress_hostname(long _hostname, short _port);
-       // bool NetAddress_eq(const struct LDKNetAddress *NONNULL_PTR a, const struct LDKNetAddress *NONNULL_PTR b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetAddress_eq")] public static extern bool NetAddress_eq(long _a, long _b);
-       // struct LDKCVec_u8Z NetAddress_write(const struct LDKNetAddress *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetAddress_write")] public static extern byte[] NetAddress_write(long _obj);
-       // struct LDKCResult_NetAddressDecodeErrorZ NetAddress_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetAddress_read")] public static extern long NetAddress_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       // void SocketAddress_free(struct LDKSocketAddress this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddress_free")] public static extern void SocketAddress_free(long _this_ptr);
+       // uint64_t SocketAddress_clone_ptr(LDKSocketAddress *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddress_clone_ptr")] public static extern long SocketAddress_clone_ptr(long _arg);
+       // struct LDKSocketAddress SocketAddress_clone(const struct LDKSocketAddress *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddress_clone")] public static extern long SocketAddress_clone(long _orig);
+       // struct LDKSocketAddress SocketAddress_tcp_ip_v4(struct LDKFourBytes addr, uint16_t port);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddress_tcp_ip_v4")] public static extern long SocketAddress_tcp_ip_v4(long _addr, short _port);
+       // struct LDKSocketAddress SocketAddress_tcp_ip_v6(struct LDKSixteenBytes addr, uint16_t port);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddress_tcp_ip_v6")] public static extern long SocketAddress_tcp_ip_v6(long _addr, short _port);
+       // struct LDKSocketAddress SocketAddress_onion_v2(struct LDKTwelveBytes a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddress_onion_v2")] public static extern long SocketAddress_onion_v2(long _a);
+       // struct LDKSocketAddress SocketAddress_onion_v3(struct LDKThirtyTwoBytes ed25519_pubkey, uint16_t checksum, uint8_t version, uint16_t port);
+       [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);
+       // 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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddress_write")] public static extern long SocketAddress_write(long _obj);
+       // struct LDKCResult_SocketAddressDecodeErrorZ SocketAddress_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddress_read")] public static extern long SocketAddress_read(long _ser);
+       // enum LDKSocketAddressParseError SocketAddressParseError_clone(const enum LDKSocketAddressParseError *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddressParseError_clone")] public static extern SocketAddressParseError SocketAddressParseError_clone(long _orig);
+       // enum LDKSocketAddressParseError SocketAddressParseError_socket_addr_parse(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddressParseError_socket_addr_parse")] public static extern SocketAddressParseError SocketAddressParseError_socket_addr_parse();
+       // enum LDKSocketAddressParseError SocketAddressParseError_invalid_input(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddressParseError_invalid_input")] public static extern SocketAddressParseError SocketAddressParseError_invalid_input();
+       // enum LDKSocketAddressParseError SocketAddressParseError_invalid_port(void);
+       [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();
+       // 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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_parse_onion_address")] public static extern long parse_onion_address(long _host, short _port);
+       // struct LDKStr SocketAddress_to_str(const struct LDKSocketAddress *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddress_to_str")] public static extern long SocketAddress_to_str(long _o);
+       // struct LDKCResult_SocketAddressSocketAddressParseErrorZ SocketAddress_from_str(struct LDKStr s);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddress_from_str")] public static extern long SocketAddress_from_str(long _s);
        // void UnsignedGossipMessage_free(struct LDKUnsignedGossipMessage this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedGossipMessage_free")] public static extern void UnsignedGossipMessage_free(long _this_ptr);
        // uint64_t UnsignedGossipMessage_clone_ptr(LDKUnsignedGossipMessage *NONNULL_PTR arg);
@@ -6763,7 +7783,7 @@ internal class bindings {
        // struct LDKUnsignedGossipMessage UnsignedGossipMessage_node_announcement(struct LDKUnsignedNodeAnnouncement a);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedGossipMessage_node_announcement")] public static extern long UnsignedGossipMessage_node_announcement(long _a);
        // struct LDKCVec_u8Z UnsignedGossipMessage_write(const struct LDKUnsignedGossipMessage *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedGossipMessage_write")] public static extern byte[] UnsignedGossipMessage_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedGossipMessage_write")] public static extern long UnsignedGossipMessage_write(long _obj);
        // void UnsignedNodeAnnouncement_free(struct LDKUnsignedNodeAnnouncement this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_free")] public static extern void UnsignedNodeAnnouncement_free(long _this_obj);
        // struct LDKNodeFeatures UnsignedNodeAnnouncement_get_features(const struct LDKUnsignedNodeAnnouncement *NONNULL_PTR this_ptr);
@@ -6779,17 +7799,17 @@ internal class bindings {
        // void UnsignedNodeAnnouncement_set_node_id(struct LDKUnsignedNodeAnnouncement *NONNULL_PTR this_ptr, struct LDKNodeId val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_set_node_id")] public static extern void UnsignedNodeAnnouncement_set_node_id(long _this_ptr, long _val);
        // const uint8_t (*UnsignedNodeAnnouncement_get_rgb(const struct LDKUnsignedNodeAnnouncement *NONNULL_PTR this_ptr))[3];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_get_rgb")] public static extern byte[] UnsignedNodeAnnouncement_get_rgb(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_get_rgb")] public static extern long UnsignedNodeAnnouncement_get_rgb(long _this_ptr);
        // void UnsignedNodeAnnouncement_set_rgb(struct LDKUnsignedNodeAnnouncement *NONNULL_PTR this_ptr, struct LDKThreeBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_set_rgb")] public static extern void UnsignedNodeAnnouncement_set_rgb(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_set_rgb")] public static extern void UnsignedNodeAnnouncement_set_rgb(long _this_ptr, long _val);
        // struct LDKNodeAlias UnsignedNodeAnnouncement_get_alias(const struct LDKUnsignedNodeAnnouncement *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_get_alias")] public static extern long UnsignedNodeAnnouncement_get_alias(long _this_ptr);
        // void UnsignedNodeAnnouncement_set_alias(struct LDKUnsignedNodeAnnouncement *NONNULL_PTR this_ptr, struct LDKNodeAlias val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_set_alias")] public static extern void UnsignedNodeAnnouncement_set_alias(long _this_ptr, long _val);
-       // struct LDKCVec_NetAddressZ UnsignedNodeAnnouncement_get_addresses(const struct LDKUnsignedNodeAnnouncement *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_get_addresses")] public static extern long[] UnsignedNodeAnnouncement_get_addresses(long _this_ptr);
-       // void UnsignedNodeAnnouncement_set_addresses(struct LDKUnsignedNodeAnnouncement *NONNULL_PTR this_ptr, struct LDKCVec_NetAddressZ val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_set_addresses")] public static extern void UnsignedNodeAnnouncement_set_addresses(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _val);
+       // struct LDKCVec_SocketAddressZ UnsignedNodeAnnouncement_get_addresses(const struct LDKUnsignedNodeAnnouncement *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_get_addresses")] public static extern long UnsignedNodeAnnouncement_get_addresses(long _this_ptr);
+       // void UnsignedNodeAnnouncement_set_addresses(struct LDKUnsignedNodeAnnouncement *NONNULL_PTR this_ptr, struct LDKCVec_SocketAddressZ val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_set_addresses")] public static extern void UnsignedNodeAnnouncement_set_addresses(long _this_ptr, long _val);
        // uint64_t UnsignedNodeAnnouncement_clone_ptr(LDKUnsignedNodeAnnouncement *NONNULL_PTR arg);
        [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);
@@ -6798,16 +7818,16 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_eq")] public static extern bool UnsignedNodeAnnouncement_eq(long _a, long _b);
        // void NodeAnnouncement_free(struct LDKNodeAnnouncement this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_free")] public static extern void NodeAnnouncement_free(long _this_obj);
-       // struct LDKSignature NodeAnnouncement_get_signature(const struct LDKNodeAnnouncement *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_get_signature")] public static extern byte[] NodeAnnouncement_get_signature(long _this_ptr);
-       // void NodeAnnouncement_set_signature(struct LDKNodeAnnouncement *NONNULL_PTR this_ptr, struct LDKSignature val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_set_signature")] public static extern void NodeAnnouncement_set_signature(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       // struct LDKECDSASignature NodeAnnouncement_get_signature(const struct LDKNodeAnnouncement *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_get_signature")] public static extern long NodeAnnouncement_get_signature(long _this_ptr);
+       // void NodeAnnouncement_set_signature(struct LDKNodeAnnouncement *NONNULL_PTR this_ptr, struct LDKECDSASignature val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_set_signature")] public static extern void NodeAnnouncement_set_signature(long _this_ptr, long _val);
        // struct LDKUnsignedNodeAnnouncement NodeAnnouncement_get_contents(const struct LDKNodeAnnouncement *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_get_contents")] public static extern long NodeAnnouncement_get_contents(long _this_ptr);
        // void NodeAnnouncement_set_contents(struct LDKNodeAnnouncement *NONNULL_PTR this_ptr, struct LDKUnsignedNodeAnnouncement val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_set_contents")] public static extern void NodeAnnouncement_set_contents(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKNodeAnnouncement NodeAnnouncement_new(struct LDKSignature signature_arg, struct LDKUnsignedNodeAnnouncement contents_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_new")] public static extern long NodeAnnouncement_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _signature_arg, long _contents_arg);
+       // MUST_USE_RES struct LDKNodeAnnouncement NodeAnnouncement_new(struct LDKECDSASignature signature_arg, struct LDKUnsignedNodeAnnouncement contents_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_new")] public static extern long NodeAnnouncement_new(long _signature_arg, long _contents_arg);
        // uint64_t NodeAnnouncement_clone_ptr(LDKNodeAnnouncement *NONNULL_PTR arg);
        [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);
@@ -6821,9 +7841,9 @@ internal class bindings {
        // void UnsignedChannelAnnouncement_set_features(struct LDKUnsignedChannelAnnouncement *NONNULL_PTR this_ptr, struct LDKChannelFeatures val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_set_features")] public static extern void UnsignedChannelAnnouncement_set_features(long _this_ptr, long _val);
        // const uint8_t (*UnsignedChannelAnnouncement_get_chain_hash(const struct LDKUnsignedChannelAnnouncement *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_get_chain_hash")] public static extern byte[] UnsignedChannelAnnouncement_get_chain_hash(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_get_chain_hash")] public static extern long UnsignedChannelAnnouncement_get_chain_hash(long _this_ptr);
        // void UnsignedChannelAnnouncement_set_chain_hash(struct LDKUnsignedChannelAnnouncement *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_set_chain_hash")] public static extern void UnsignedChannelAnnouncement_set_chain_hash(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_set_chain_hash")] public static extern void UnsignedChannelAnnouncement_set_chain_hash(long _this_ptr, long _val);
        // uint64_t UnsignedChannelAnnouncement_get_short_channel_id(const struct LDKUnsignedChannelAnnouncement *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_get_short_channel_id")] public static extern long UnsignedChannelAnnouncement_get_short_channel_id(long _this_ptr);
        // void UnsignedChannelAnnouncement_set_short_channel_id(struct LDKUnsignedChannelAnnouncement *NONNULL_PTR this_ptr, uint64_t val);
@@ -6844,6 +7864,12 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_get_bitcoin_key_2")] public static extern long UnsignedChannelAnnouncement_get_bitcoin_key_2(long _this_ptr);
        // void UnsignedChannelAnnouncement_set_bitcoin_key_2(struct LDKUnsignedChannelAnnouncement *NONNULL_PTR this_ptr, struct LDKNodeId val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_set_bitcoin_key_2")] public static extern void UnsignedChannelAnnouncement_set_bitcoin_key_2(long _this_ptr, long _val);
+       // struct LDKCVec_u8Z UnsignedChannelAnnouncement_get_excess_data(const struct LDKUnsignedChannelAnnouncement *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_get_excess_data")] public static extern long UnsignedChannelAnnouncement_get_excess_data(long _this_ptr);
+       // void UnsignedChannelAnnouncement_set_excess_data(struct LDKUnsignedChannelAnnouncement *NONNULL_PTR this_ptr, struct LDKCVec_u8Z val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_set_excess_data")] public static extern void UnsignedChannelAnnouncement_set_excess_data(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKUnsignedChannelAnnouncement UnsignedChannelAnnouncement_new(struct LDKChannelFeatures features_arg, struct LDKThirtyTwoBytes chain_hash_arg, uint64_t short_channel_id_arg, struct LDKNodeId node_id_1_arg, struct LDKNodeId node_id_2_arg, struct LDKNodeId bitcoin_key_1_arg, struct LDKNodeId bitcoin_key_2_arg, struct LDKCVec_u8Z excess_data_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_new")] public static extern long UnsignedChannelAnnouncement_new(long _features_arg, long _chain_hash_arg, long _short_channel_id_arg, long _node_id_1_arg, long _node_id_2_arg, long _bitcoin_key_1_arg, long _bitcoin_key_2_arg, long _excess_data_arg);
        // uint64_t UnsignedChannelAnnouncement_clone_ptr(LDKUnsignedChannelAnnouncement *NONNULL_PTR arg);
        [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);
@@ -6852,28 +7878,28 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_eq")] public static extern bool UnsignedChannelAnnouncement_eq(long _a, long _b);
        // void ChannelAnnouncement_free(struct LDKChannelAnnouncement this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_free")] public static extern void ChannelAnnouncement_free(long _this_obj);
-       // struct LDKSignature ChannelAnnouncement_get_node_signature_1(const struct LDKChannelAnnouncement *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_get_node_signature_1")] public static extern byte[] ChannelAnnouncement_get_node_signature_1(long _this_ptr);
-       // void ChannelAnnouncement_set_node_signature_1(struct LDKChannelAnnouncement *NONNULL_PTR this_ptr, struct LDKSignature val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_set_node_signature_1")] public static extern void ChannelAnnouncement_set_node_signature_1(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // struct LDKSignature ChannelAnnouncement_get_node_signature_2(const struct LDKChannelAnnouncement *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_get_node_signature_2")] public static extern byte[] ChannelAnnouncement_get_node_signature_2(long _this_ptr);
-       // void ChannelAnnouncement_set_node_signature_2(struct LDKChannelAnnouncement *NONNULL_PTR this_ptr, struct LDKSignature val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_set_node_signature_2")] public static extern void ChannelAnnouncement_set_node_signature_2(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // struct LDKSignature ChannelAnnouncement_get_bitcoin_signature_1(const struct LDKChannelAnnouncement *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_get_bitcoin_signature_1")] public static extern byte[] ChannelAnnouncement_get_bitcoin_signature_1(long _this_ptr);
-       // void ChannelAnnouncement_set_bitcoin_signature_1(struct LDKChannelAnnouncement *NONNULL_PTR this_ptr, struct LDKSignature val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_set_bitcoin_signature_1")] public static extern void ChannelAnnouncement_set_bitcoin_signature_1(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // struct LDKSignature ChannelAnnouncement_get_bitcoin_signature_2(const struct LDKChannelAnnouncement *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_get_bitcoin_signature_2")] public static extern byte[] ChannelAnnouncement_get_bitcoin_signature_2(long _this_ptr);
-       // void ChannelAnnouncement_set_bitcoin_signature_2(struct LDKChannelAnnouncement *NONNULL_PTR this_ptr, struct LDKSignature val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_set_bitcoin_signature_2")] public static extern void ChannelAnnouncement_set_bitcoin_signature_2(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       // struct LDKECDSASignature ChannelAnnouncement_get_node_signature_1(const struct LDKChannelAnnouncement *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_get_node_signature_1")] public static extern long ChannelAnnouncement_get_node_signature_1(long _this_ptr);
+       // void ChannelAnnouncement_set_node_signature_1(struct LDKChannelAnnouncement *NONNULL_PTR this_ptr, struct LDKECDSASignature val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_set_node_signature_1")] public static extern void ChannelAnnouncement_set_node_signature_1(long _this_ptr, long _val);
+       // struct LDKECDSASignature ChannelAnnouncement_get_node_signature_2(const struct LDKChannelAnnouncement *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_get_node_signature_2")] public static extern long ChannelAnnouncement_get_node_signature_2(long _this_ptr);
+       // void ChannelAnnouncement_set_node_signature_2(struct LDKChannelAnnouncement *NONNULL_PTR this_ptr, struct LDKECDSASignature val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_set_node_signature_2")] public static extern void ChannelAnnouncement_set_node_signature_2(long _this_ptr, long _val);
+       // struct LDKECDSASignature ChannelAnnouncement_get_bitcoin_signature_1(const struct LDKChannelAnnouncement *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_get_bitcoin_signature_1")] public static extern long ChannelAnnouncement_get_bitcoin_signature_1(long _this_ptr);
+       // void ChannelAnnouncement_set_bitcoin_signature_1(struct LDKChannelAnnouncement *NONNULL_PTR this_ptr, struct LDKECDSASignature val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_set_bitcoin_signature_1")] public static extern void ChannelAnnouncement_set_bitcoin_signature_1(long _this_ptr, long _val);
+       // struct LDKECDSASignature ChannelAnnouncement_get_bitcoin_signature_2(const struct LDKChannelAnnouncement *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_get_bitcoin_signature_2")] public static extern long ChannelAnnouncement_get_bitcoin_signature_2(long _this_ptr);
+       // void ChannelAnnouncement_set_bitcoin_signature_2(struct LDKChannelAnnouncement *NONNULL_PTR this_ptr, struct LDKECDSASignature val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_set_bitcoin_signature_2")] public static extern void ChannelAnnouncement_set_bitcoin_signature_2(long _this_ptr, long _val);
        // struct LDKUnsignedChannelAnnouncement ChannelAnnouncement_get_contents(const struct LDKChannelAnnouncement *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_get_contents")] public static extern long ChannelAnnouncement_get_contents(long _this_ptr);
        // void ChannelAnnouncement_set_contents(struct LDKChannelAnnouncement *NONNULL_PTR this_ptr, struct LDKUnsignedChannelAnnouncement val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_set_contents")] public static extern void ChannelAnnouncement_set_contents(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKChannelAnnouncement ChannelAnnouncement_new(struct LDKSignature node_signature_1_arg, struct LDKSignature node_signature_2_arg, struct LDKSignature bitcoin_signature_1_arg, struct LDKSignature bitcoin_signature_2_arg, struct LDKUnsignedChannelAnnouncement contents_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_new")] public static extern long ChannelAnnouncement_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_signature_1_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_signature_2_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _bitcoin_signature_1_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _bitcoin_signature_2_arg, long _contents_arg);
+       // MUST_USE_RES struct LDKChannelAnnouncement ChannelAnnouncement_new(struct LDKECDSASignature node_signature_1_arg, struct LDKECDSASignature node_signature_2_arg, struct LDKECDSASignature bitcoin_signature_1_arg, struct LDKECDSASignature bitcoin_signature_2_arg, struct LDKUnsignedChannelAnnouncement contents_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_new")] public static extern long ChannelAnnouncement_new(long _node_signature_1_arg, long _node_signature_2_arg, long _bitcoin_signature_1_arg, long _bitcoin_signature_2_arg, long _contents_arg);
        // uint64_t ChannelAnnouncement_clone_ptr(LDKChannelAnnouncement *NONNULL_PTR arg);
        [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);
@@ -6883,9 +7909,9 @@ internal class bindings {
        // void UnsignedChannelUpdate_free(struct LDKUnsignedChannelUpdate this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_free")] public static extern void UnsignedChannelUpdate_free(long _this_obj);
        // const uint8_t (*UnsignedChannelUpdate_get_chain_hash(const struct LDKUnsignedChannelUpdate *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_get_chain_hash")] public static extern byte[] UnsignedChannelUpdate_get_chain_hash(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_get_chain_hash")] public static extern long UnsignedChannelUpdate_get_chain_hash(long _this_ptr);
        // void UnsignedChannelUpdate_set_chain_hash(struct LDKUnsignedChannelUpdate *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_set_chain_hash")] public static extern void UnsignedChannelUpdate_set_chain_hash(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_set_chain_hash")] public static extern void UnsignedChannelUpdate_set_chain_hash(long _this_ptr, long _val);
        // uint64_t UnsignedChannelUpdate_get_short_channel_id(const struct LDKUnsignedChannelUpdate *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_get_short_channel_id")] public static extern long UnsignedChannelUpdate_get_short_channel_id(long _this_ptr);
        // void UnsignedChannelUpdate_set_short_channel_id(struct LDKUnsignedChannelUpdate *NONNULL_PTR this_ptr, uint64_t val);
@@ -6919,11 +7945,11 @@ internal class bindings {
        // void UnsignedChannelUpdate_set_fee_proportional_millionths(struct LDKUnsignedChannelUpdate *NONNULL_PTR this_ptr, uint32_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_set_fee_proportional_millionths")] public static extern void UnsignedChannelUpdate_set_fee_proportional_millionths(long _this_ptr, int _val);
        // struct LDKCVec_u8Z UnsignedChannelUpdate_get_excess_data(const struct LDKUnsignedChannelUpdate *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_get_excess_data")] public static extern byte[] UnsignedChannelUpdate_get_excess_data(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_get_excess_data")] public static extern long UnsignedChannelUpdate_get_excess_data(long _this_ptr);
        // void UnsignedChannelUpdate_set_excess_data(struct LDKUnsignedChannelUpdate *NONNULL_PTR this_ptr, struct LDKCVec_u8Z val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_set_excess_data")] public static extern void UnsignedChannelUpdate_set_excess_data(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_set_excess_data")] public static extern void UnsignedChannelUpdate_set_excess_data(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKUnsignedChannelUpdate UnsignedChannelUpdate_new(struct LDKThirtyTwoBytes chain_hash_arg, uint64_t short_channel_id_arg, uint32_t timestamp_arg, uint8_t flags_arg, uint16_t cltv_expiry_delta_arg, uint64_t htlc_minimum_msat_arg, uint64_t htlc_maximum_msat_arg, uint32_t fee_base_msat_arg, uint32_t fee_proportional_millionths_arg, struct LDKCVec_u8Z excess_data_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_new")] public static extern long UnsignedChannelUpdate_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _chain_hash_arg, long _short_channel_id_arg, int _timestamp_arg, byte _flags_arg, short _cltv_expiry_delta_arg, long _htlc_minimum_msat_arg, long _htlc_maximum_msat_arg, int _fee_base_msat_arg, int _fee_proportional_millionths_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _excess_data_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_new")] public static extern long UnsignedChannelUpdate_new(long _chain_hash_arg, long _short_channel_id_arg, int _timestamp_arg, byte _flags_arg, short _cltv_expiry_delta_arg, long _htlc_minimum_msat_arg, long _htlc_maximum_msat_arg, int _fee_base_msat_arg, int _fee_proportional_millionths_arg, long _excess_data_arg);
        // uint64_t UnsignedChannelUpdate_clone_ptr(LDKUnsignedChannelUpdate *NONNULL_PTR arg);
        [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);
@@ -6932,16 +7958,16 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_eq")] public static extern bool UnsignedChannelUpdate_eq(long _a, long _b);
        // void ChannelUpdate_free(struct LDKChannelUpdate this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_free")] public static extern void ChannelUpdate_free(long _this_obj);
-       // struct LDKSignature ChannelUpdate_get_signature(const struct LDKChannelUpdate *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_get_signature")] public static extern byte[] ChannelUpdate_get_signature(long _this_ptr);
-       // void ChannelUpdate_set_signature(struct LDKChannelUpdate *NONNULL_PTR this_ptr, struct LDKSignature val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_set_signature")] public static extern void ChannelUpdate_set_signature(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       // struct LDKECDSASignature ChannelUpdate_get_signature(const struct LDKChannelUpdate *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_get_signature")] public static extern long ChannelUpdate_get_signature(long _this_ptr);
+       // void ChannelUpdate_set_signature(struct LDKChannelUpdate *NONNULL_PTR this_ptr, struct LDKECDSASignature val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_set_signature")] public static extern void ChannelUpdate_set_signature(long _this_ptr, long _val);
        // struct LDKUnsignedChannelUpdate ChannelUpdate_get_contents(const struct LDKChannelUpdate *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_get_contents")] public static extern long ChannelUpdate_get_contents(long _this_ptr);
        // void ChannelUpdate_set_contents(struct LDKChannelUpdate *NONNULL_PTR this_ptr, struct LDKUnsignedChannelUpdate val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_set_contents")] public static extern void ChannelUpdate_set_contents(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKChannelUpdate ChannelUpdate_new(struct LDKSignature signature_arg, struct LDKUnsignedChannelUpdate contents_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_new")] public static extern long ChannelUpdate_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _signature_arg, long _contents_arg);
+       // MUST_USE_RES struct LDKChannelUpdate ChannelUpdate_new(struct LDKECDSASignature signature_arg, struct LDKUnsignedChannelUpdate contents_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_new")] public static extern long ChannelUpdate_new(long _signature_arg, long _contents_arg);
        // uint64_t ChannelUpdate_clone_ptr(LDKChannelUpdate *NONNULL_PTR arg);
        [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);
@@ -6951,9 +7977,9 @@ internal class bindings {
        // void QueryChannelRange_free(struct LDKQueryChannelRange this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_free")] public static extern void QueryChannelRange_free(long _this_obj);
        // const uint8_t (*QueryChannelRange_get_chain_hash(const struct LDKQueryChannelRange *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_get_chain_hash")] public static extern byte[] QueryChannelRange_get_chain_hash(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_get_chain_hash")] public static extern long QueryChannelRange_get_chain_hash(long _this_ptr);
        // void QueryChannelRange_set_chain_hash(struct LDKQueryChannelRange *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_set_chain_hash")] public static extern void QueryChannelRange_set_chain_hash(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_set_chain_hash")] public static extern void QueryChannelRange_set_chain_hash(long _this_ptr, long _val);
        // uint32_t QueryChannelRange_get_first_blocknum(const struct LDKQueryChannelRange *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_get_first_blocknum")] public static extern int QueryChannelRange_get_first_blocknum(long _this_ptr);
        // void QueryChannelRange_set_first_blocknum(struct LDKQueryChannelRange *NONNULL_PTR this_ptr, uint32_t val);
@@ -6963,7 +7989,7 @@ internal class bindings {
        // void QueryChannelRange_set_number_of_blocks(struct LDKQueryChannelRange *NONNULL_PTR this_ptr, uint32_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_set_number_of_blocks")] public static extern void QueryChannelRange_set_number_of_blocks(long _this_ptr, int _val);
        // MUST_USE_RES struct LDKQueryChannelRange QueryChannelRange_new(struct LDKThirtyTwoBytes chain_hash_arg, uint32_t first_blocknum_arg, uint32_t number_of_blocks_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_new")] public static extern long QueryChannelRange_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _chain_hash_arg, int _first_blocknum_arg, int _number_of_blocks_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_new")] public static extern long QueryChannelRange_new(long _chain_hash_arg, int _first_blocknum_arg, int _number_of_blocks_arg);
        // uint64_t QueryChannelRange_clone_ptr(LDKQueryChannelRange *NONNULL_PTR arg);
        [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);
@@ -6973,9 +7999,9 @@ internal class bindings {
        // void ReplyChannelRange_free(struct LDKReplyChannelRange this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_free")] public static extern void ReplyChannelRange_free(long _this_obj);
        // const uint8_t (*ReplyChannelRange_get_chain_hash(const struct LDKReplyChannelRange *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_get_chain_hash")] public static extern byte[] ReplyChannelRange_get_chain_hash(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_get_chain_hash")] public static extern long ReplyChannelRange_get_chain_hash(long _this_ptr);
        // void ReplyChannelRange_set_chain_hash(struct LDKReplyChannelRange *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_set_chain_hash")] public static extern void ReplyChannelRange_set_chain_hash(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_set_chain_hash")] public static extern void ReplyChannelRange_set_chain_hash(long _this_ptr, long _val);
        // uint32_t ReplyChannelRange_get_first_blocknum(const struct LDKReplyChannelRange *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_get_first_blocknum")] public static extern int ReplyChannelRange_get_first_blocknum(long _this_ptr);
        // void ReplyChannelRange_set_first_blocknum(struct LDKReplyChannelRange *NONNULL_PTR this_ptr, uint32_t val);
@@ -6989,11 +8015,11 @@ internal class bindings {
        // void ReplyChannelRange_set_sync_complete(struct LDKReplyChannelRange *NONNULL_PTR this_ptr, bool val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_set_sync_complete")] public static extern void ReplyChannelRange_set_sync_complete(long _this_ptr, bool _val);
        // struct LDKCVec_u64Z ReplyChannelRange_get_short_channel_ids(const struct LDKReplyChannelRange *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_get_short_channel_ids")] public static extern long[] ReplyChannelRange_get_short_channel_ids(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_get_short_channel_ids")] public static extern long ReplyChannelRange_get_short_channel_ids(long _this_ptr);
        // void ReplyChannelRange_set_short_channel_ids(struct LDKReplyChannelRange *NONNULL_PTR this_ptr, struct LDKCVec_u64Z val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_set_short_channel_ids")] public static extern void ReplyChannelRange_set_short_channel_ids(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_set_short_channel_ids")] public static extern void ReplyChannelRange_set_short_channel_ids(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKReplyChannelRange ReplyChannelRange_new(struct LDKThirtyTwoBytes chain_hash_arg, uint32_t first_blocknum_arg, uint32_t number_of_blocks_arg, bool sync_complete_arg, struct LDKCVec_u64Z short_channel_ids_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_new")] public static extern long ReplyChannelRange_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _chain_hash_arg, int _first_blocknum_arg, int _number_of_blocks_arg, bool _sync_complete_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _short_channel_ids_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_new")] public static extern long ReplyChannelRange_new(long _chain_hash_arg, int _first_blocknum_arg, int _number_of_blocks_arg, bool _sync_complete_arg, long _short_channel_ids_arg);
        // uint64_t ReplyChannelRange_clone_ptr(LDKReplyChannelRange *NONNULL_PTR arg);
        [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);
@@ -7003,15 +8029,15 @@ internal class bindings {
        // void QueryShortChannelIds_free(struct LDKQueryShortChannelIds this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_free")] public static extern void QueryShortChannelIds_free(long _this_obj);
        // const uint8_t (*QueryShortChannelIds_get_chain_hash(const struct LDKQueryShortChannelIds *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_get_chain_hash")] public static extern byte[] QueryShortChannelIds_get_chain_hash(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_get_chain_hash")] public static extern long QueryShortChannelIds_get_chain_hash(long _this_ptr);
        // void QueryShortChannelIds_set_chain_hash(struct LDKQueryShortChannelIds *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_set_chain_hash")] public static extern void QueryShortChannelIds_set_chain_hash(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_set_chain_hash")] public static extern void QueryShortChannelIds_set_chain_hash(long _this_ptr, long _val);
        // struct LDKCVec_u64Z QueryShortChannelIds_get_short_channel_ids(const struct LDKQueryShortChannelIds *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_get_short_channel_ids")] public static extern long[] QueryShortChannelIds_get_short_channel_ids(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_get_short_channel_ids")] public static extern long QueryShortChannelIds_get_short_channel_ids(long _this_ptr);
        // void QueryShortChannelIds_set_short_channel_ids(struct LDKQueryShortChannelIds *NONNULL_PTR this_ptr, struct LDKCVec_u64Z val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_set_short_channel_ids")] public static extern void QueryShortChannelIds_set_short_channel_ids(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_set_short_channel_ids")] public static extern void QueryShortChannelIds_set_short_channel_ids(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKQueryShortChannelIds QueryShortChannelIds_new(struct LDKThirtyTwoBytes chain_hash_arg, struct LDKCVec_u64Z short_channel_ids_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_new")] public static extern long QueryShortChannelIds_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _chain_hash_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _short_channel_ids_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_new")] public static extern long QueryShortChannelIds_new(long _chain_hash_arg, long _short_channel_ids_arg);
        // uint64_t QueryShortChannelIds_clone_ptr(LDKQueryShortChannelIds *NONNULL_PTR arg);
        [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);
@@ -7021,15 +8047,15 @@ internal class bindings {
        // void ReplyShortChannelIdsEnd_free(struct LDKReplyShortChannelIdsEnd this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_free")] public static extern void ReplyShortChannelIdsEnd_free(long _this_obj);
        // const uint8_t (*ReplyShortChannelIdsEnd_get_chain_hash(const struct LDKReplyShortChannelIdsEnd *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_get_chain_hash")] public static extern byte[] ReplyShortChannelIdsEnd_get_chain_hash(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_get_chain_hash")] public static extern long ReplyShortChannelIdsEnd_get_chain_hash(long _this_ptr);
        // void ReplyShortChannelIdsEnd_set_chain_hash(struct LDKReplyShortChannelIdsEnd *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_set_chain_hash")] public static extern void ReplyShortChannelIdsEnd_set_chain_hash(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_set_chain_hash")] public static extern void ReplyShortChannelIdsEnd_set_chain_hash(long _this_ptr, long _val);
        // bool ReplyShortChannelIdsEnd_get_full_information(const struct LDKReplyShortChannelIdsEnd *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_get_full_information")] public static extern bool ReplyShortChannelIdsEnd_get_full_information(long _this_ptr);
        // void ReplyShortChannelIdsEnd_set_full_information(struct LDKReplyShortChannelIdsEnd *NONNULL_PTR this_ptr, bool val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_set_full_information")] public static extern void ReplyShortChannelIdsEnd_set_full_information(long _this_ptr, bool _val);
        // MUST_USE_RES struct LDKReplyShortChannelIdsEnd ReplyShortChannelIdsEnd_new(struct LDKThirtyTwoBytes chain_hash_arg, bool full_information_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_new")] public static extern long ReplyShortChannelIdsEnd_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _chain_hash_arg, bool _full_information_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_new")] public static extern long ReplyShortChannelIdsEnd_new(long _chain_hash_arg, bool _full_information_arg);
        // uint64_t ReplyShortChannelIdsEnd_clone_ptr(LDKReplyShortChannelIdsEnd *NONNULL_PTR arg);
        [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);
@@ -7039,9 +8065,9 @@ internal class bindings {
        // void GossipTimestampFilter_free(struct LDKGossipTimestampFilter this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_free")] public static extern void GossipTimestampFilter_free(long _this_obj);
        // const uint8_t (*GossipTimestampFilter_get_chain_hash(const struct LDKGossipTimestampFilter *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_get_chain_hash")] public static extern byte[] GossipTimestampFilter_get_chain_hash(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_get_chain_hash")] public static extern long GossipTimestampFilter_get_chain_hash(long _this_ptr);
        // void GossipTimestampFilter_set_chain_hash(struct LDKGossipTimestampFilter *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_set_chain_hash")] public static extern void GossipTimestampFilter_set_chain_hash(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_set_chain_hash")] public static extern void GossipTimestampFilter_set_chain_hash(long _this_ptr, long _val);
        // uint32_t GossipTimestampFilter_get_first_timestamp(const struct LDKGossipTimestampFilter *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_get_first_timestamp")] public static extern int GossipTimestampFilter_get_first_timestamp(long _this_ptr);
        // void GossipTimestampFilter_set_first_timestamp(struct LDKGossipTimestampFilter *NONNULL_PTR this_ptr, uint32_t val);
@@ -7051,7 +8077,7 @@ internal class bindings {
        // void GossipTimestampFilter_set_timestamp_range(struct LDKGossipTimestampFilter *NONNULL_PTR this_ptr, uint32_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_set_timestamp_range")] public static extern void GossipTimestampFilter_set_timestamp_range(long _this_ptr, int _val);
        // MUST_USE_RES struct LDKGossipTimestampFilter GossipTimestampFilter_new(struct LDKThirtyTwoBytes chain_hash_arg, uint32_t first_timestamp_arg, uint32_t timestamp_range_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_new")] public static extern long GossipTimestampFilter_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _chain_hash_arg, int _first_timestamp_arg, int _timestamp_range_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_new")] public static extern long GossipTimestampFilter_new(long _chain_hash_arg, int _first_timestamp_arg, int _timestamp_range_arg);
        // uint64_t GossipTimestampFilter_clone_ptr(LDKGossipTimestampFilter *NONNULL_PTR arg);
        [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);
@@ -7081,15 +8107,15 @@ internal class bindings {
        // 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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LightningError_get_err")] public static extern string LightningError_get_err(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LightningError_get_err")] public static extern long LightningError_get_err(long _this_ptr);
        // void LightningError_set_err(struct LDKLightningError *NONNULL_PTR this_ptr, struct LDKStr val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LightningError_set_err")] public static extern void LightningError_set_err(long _this_ptr, string _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LightningError_set_err")] public static extern void LightningError_set_err(long _this_ptr, long _val);
        // struct LDKErrorAction LightningError_get_action(const struct LDKLightningError *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LightningError_get_action")] public static extern long LightningError_get_action(long _this_ptr);
        // void LightningError_set_action(struct LDKLightningError *NONNULL_PTR this_ptr, struct LDKErrorAction val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LightningError_set_action")] public static extern void LightningError_set_action(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKLightningError LightningError_new(struct LDKStr err_arg, struct LDKErrorAction action_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LightningError_new")] public static extern long LightningError_new(string _err_arg, long _action_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LightningError_new")] public static extern long LightningError_new(long _err_arg, long _action_arg);
        // uint64_t LightningError_clone_ptr(LDKLightningError *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LightningError_clone_ptr")] public static extern long LightningError_clone_ptr(long _arg);
        // struct LDKLightningError LightningError_clone(const struct LDKLightningError *NONNULL_PTR orig);
@@ -7097,21 +8123,21 @@ internal class bindings {
        // void CommitmentUpdate_free(struct LDKCommitmentUpdate this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_free")] public static extern void CommitmentUpdate_free(long _this_obj);
        // struct LDKCVec_UpdateAddHTLCZ CommitmentUpdate_get_update_add_htlcs(const struct LDKCommitmentUpdate *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_get_update_add_htlcs")] public static extern long[] CommitmentUpdate_get_update_add_htlcs(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_get_update_add_htlcs")] public static extern long CommitmentUpdate_get_update_add_htlcs(long _this_ptr);
        // void CommitmentUpdate_set_update_add_htlcs(struct LDKCommitmentUpdate *NONNULL_PTR this_ptr, struct LDKCVec_UpdateAddHTLCZ val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_set_update_add_htlcs")] public static extern void CommitmentUpdate_set_update_add_htlcs(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_set_update_add_htlcs")] public static extern void CommitmentUpdate_set_update_add_htlcs(long _this_ptr, long _val);
        // struct LDKCVec_UpdateFulfillHTLCZ CommitmentUpdate_get_update_fulfill_htlcs(const struct LDKCommitmentUpdate *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_get_update_fulfill_htlcs")] public static extern long[] CommitmentUpdate_get_update_fulfill_htlcs(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_get_update_fulfill_htlcs")] public static extern long CommitmentUpdate_get_update_fulfill_htlcs(long _this_ptr);
        // void CommitmentUpdate_set_update_fulfill_htlcs(struct LDKCommitmentUpdate *NONNULL_PTR this_ptr, struct LDKCVec_UpdateFulfillHTLCZ val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_set_update_fulfill_htlcs")] public static extern void CommitmentUpdate_set_update_fulfill_htlcs(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_set_update_fulfill_htlcs")] public static extern void CommitmentUpdate_set_update_fulfill_htlcs(long _this_ptr, long _val);
        // struct LDKCVec_UpdateFailHTLCZ CommitmentUpdate_get_update_fail_htlcs(const struct LDKCommitmentUpdate *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_get_update_fail_htlcs")] public static extern long[] CommitmentUpdate_get_update_fail_htlcs(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_get_update_fail_htlcs")] public static extern long CommitmentUpdate_get_update_fail_htlcs(long _this_ptr);
        // void CommitmentUpdate_set_update_fail_htlcs(struct LDKCommitmentUpdate *NONNULL_PTR this_ptr, struct LDKCVec_UpdateFailHTLCZ val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_set_update_fail_htlcs")] public static extern void CommitmentUpdate_set_update_fail_htlcs(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_set_update_fail_htlcs")] public static extern void CommitmentUpdate_set_update_fail_htlcs(long _this_ptr, long _val);
        // struct LDKCVec_UpdateFailMalformedHTLCZ CommitmentUpdate_get_update_fail_malformed_htlcs(const struct LDKCommitmentUpdate *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_get_update_fail_malformed_htlcs")] public static extern long[] CommitmentUpdate_get_update_fail_malformed_htlcs(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_get_update_fail_malformed_htlcs")] public static extern long CommitmentUpdate_get_update_fail_malformed_htlcs(long _this_ptr);
        // void CommitmentUpdate_set_update_fail_malformed_htlcs(struct LDKCommitmentUpdate *NONNULL_PTR this_ptr, struct LDKCVec_UpdateFailMalformedHTLCZ val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_set_update_fail_malformed_htlcs")] public static extern void CommitmentUpdate_set_update_fail_malformed_htlcs(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_set_update_fail_malformed_htlcs")] public static extern void CommitmentUpdate_set_update_fail_malformed_htlcs(long _this_ptr, long _val);
        // struct LDKUpdateFee CommitmentUpdate_get_update_fee(const struct LDKCommitmentUpdate *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_get_update_fee")] public static extern long CommitmentUpdate_get_update_fee(long _this_ptr);
        // void CommitmentUpdate_set_update_fee(struct LDKCommitmentUpdate *NONNULL_PTR this_ptr, struct LDKUpdateFee val);
@@ -7121,7 +8147,7 @@ internal class bindings {
        // void CommitmentUpdate_set_commitment_signed(struct LDKCommitmentUpdate *NONNULL_PTR this_ptr, struct LDKCommitmentSigned val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_set_commitment_signed")] public static extern void CommitmentUpdate_set_commitment_signed(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKCommitmentUpdate CommitmentUpdate_new(struct LDKCVec_UpdateAddHTLCZ update_add_htlcs_arg, struct LDKCVec_UpdateFulfillHTLCZ update_fulfill_htlcs_arg, struct LDKCVec_UpdateFailHTLCZ update_fail_htlcs_arg, struct LDKCVec_UpdateFailMalformedHTLCZ update_fail_malformed_htlcs_arg, struct LDKUpdateFee update_fee_arg, struct LDKCommitmentSigned commitment_signed_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_new")] public static extern long CommitmentUpdate_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _update_add_htlcs_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _update_fulfill_htlcs_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _update_fail_htlcs_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _update_fail_malformed_htlcs_arg, long _update_fee_arg, long _commitment_signed_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_new")] public static extern long CommitmentUpdate_new(long _update_add_htlcs_arg, long _update_fulfill_htlcs_arg, long _update_fail_htlcs_arg, long _update_fail_malformed_htlcs_arg, long _update_fee_arg, long _commitment_signed_arg);
        // uint64_t CommitmentUpdate_clone_ptr(LDKCommitmentUpdate *NONNULL_PTR arg);
        [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);
@@ -7135,187 +8161,187 @@ internal class bindings {
        // void OnionMessageHandler_free(struct LDKOnionMessageHandler this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageHandler_free")] public static extern void OnionMessageHandler_free(long _this_ptr);
        // struct LDKCVec_u8Z AcceptChannel_write(const struct LDKAcceptChannel *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_write")] public static extern byte[] AcceptChannel_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_write")] public static extern long AcceptChannel_write(long _obj);
        // struct LDKCResult_AcceptChannelDecodeErrorZ AcceptChannel_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_read")] public static extern long AcceptChannel_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_read")] public static extern long AcceptChannel_read(long _ser);
        // struct LDKCVec_u8Z AcceptChannelV2_write(const struct LDKAcceptChannelV2 *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_write")] public static extern byte[] AcceptChannelV2_write(long _obj);
+       [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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_read")] public static extern long AcceptChannelV2_read(long _ser);
        // struct LDKCVec_u8Z TxAddInput_write(const struct LDKTxAddInput *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_write")] public static extern byte[] TxAddInput_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_write")] public static extern long TxAddInput_write(long _obj);
        // struct LDKCResult_TxAddInputDecodeErrorZ TxAddInput_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_read")] public static extern long TxAddInput_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_read")] public static extern long TxAddInput_read(long _ser);
        // struct LDKCVec_u8Z TxAddOutput_write(const struct LDKTxAddOutput *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_write")] public static extern byte[] TxAddOutput_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_write")] public static extern long TxAddOutput_write(long _obj);
        // struct LDKCResult_TxAddOutputDecodeErrorZ TxAddOutput_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_read")] public static extern long TxAddOutput_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_read")] public static extern long TxAddOutput_read(long _ser);
        // struct LDKCVec_u8Z TxRemoveInput_write(const struct LDKTxRemoveInput *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_write")] public static extern byte[] TxRemoveInput_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_write")] public static extern long TxRemoveInput_write(long _obj);
        // struct LDKCResult_TxRemoveInputDecodeErrorZ TxRemoveInput_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_read")] public static extern long TxRemoveInput_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_read")] public static extern long TxRemoveInput_read(long _ser);
        // struct LDKCVec_u8Z TxRemoveOutput_write(const struct LDKTxRemoveOutput *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_write")] public static extern byte[] TxRemoveOutput_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_write")] public static extern long TxRemoveOutput_write(long _obj);
        // struct LDKCResult_TxRemoveOutputDecodeErrorZ TxRemoveOutput_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_read")] public static extern long TxRemoveOutput_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_read")] public static extern long TxRemoveOutput_read(long _ser);
        // struct LDKCVec_u8Z TxComplete_write(const struct LDKTxComplete *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxComplete_write")] public static extern byte[] TxComplete_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxComplete_write")] public static extern long TxComplete_write(long _obj);
        // struct LDKCResult_TxCompleteDecodeErrorZ TxComplete_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxComplete_read")] public static extern long TxComplete_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxComplete_read")] public static extern long TxComplete_read(long _ser);
        // struct LDKCVec_u8Z TxSignatures_write(const struct LDKTxSignatures *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_write")] public static extern byte[] TxSignatures_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_write")] public static extern long TxSignatures_write(long _obj);
        // struct LDKCResult_TxSignaturesDecodeErrorZ TxSignatures_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_read")] public static extern long TxSignatures_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_read")] public static extern long TxSignatures_read(long _ser);
        // struct LDKCVec_u8Z TxInitRbf_write(const struct LDKTxInitRbf *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_write")] public static extern byte[] TxInitRbf_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_write")] public static extern long TxInitRbf_write(long _obj);
        // struct LDKCResult_TxInitRbfDecodeErrorZ TxInitRbf_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_read")] public static extern long TxInitRbf_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_read")] public static extern long TxInitRbf_read(long _ser);
        // struct LDKCVec_u8Z TxAckRbf_write(const struct LDKTxAckRbf *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_write")] public static extern byte[] TxAckRbf_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_write")] public static extern long TxAckRbf_write(long _obj);
        // struct LDKCResult_TxAckRbfDecodeErrorZ TxAckRbf_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_read")] public static extern long TxAckRbf_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_read")] public static extern long TxAckRbf_read(long _ser);
        // struct LDKCVec_u8Z TxAbort_write(const struct LDKTxAbort *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_write")] public static extern byte[] TxAbort_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_write")] public static extern long TxAbort_write(long _obj);
        // struct LDKCResult_TxAbortDecodeErrorZ TxAbort_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_read")] public static extern long TxAbort_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_read")] public static extern long TxAbort_read(long _ser);
        // struct LDKCVec_u8Z AnnouncementSignatures_write(const struct LDKAnnouncementSignatures *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_write")] public static extern byte[] AnnouncementSignatures_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_write")] public static extern long AnnouncementSignatures_write(long _obj);
        // struct LDKCResult_AnnouncementSignaturesDecodeErrorZ AnnouncementSignatures_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_read")] public static extern long AnnouncementSignatures_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_read")] public static extern long AnnouncementSignatures_read(long _ser);
        // struct LDKCVec_u8Z ChannelReestablish_write(const struct LDKChannelReestablish *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_write")] public static extern byte[] ChannelReestablish_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_write")] public static extern long ChannelReestablish_write(long _obj);
        // struct LDKCResult_ChannelReestablishDecodeErrorZ ChannelReestablish_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_read")] public static extern long ChannelReestablish_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_read")] public static extern long ChannelReestablish_read(long _ser);
        // struct LDKCVec_u8Z ClosingSigned_write(const struct LDKClosingSigned *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_write")] public static extern byte[] ClosingSigned_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_write")] public static extern long ClosingSigned_write(long _obj);
        // struct LDKCResult_ClosingSignedDecodeErrorZ ClosingSigned_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_read")] public static extern long ClosingSigned_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_read")] public static extern long ClosingSigned_read(long _ser);
        // struct LDKCVec_u8Z ClosingSignedFeeRange_write(const struct LDKClosingSignedFeeRange *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSignedFeeRange_write")] public static extern byte[] ClosingSignedFeeRange_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSignedFeeRange_write")] public static extern long ClosingSignedFeeRange_write(long _obj);
        // struct LDKCResult_ClosingSignedFeeRangeDecodeErrorZ ClosingSignedFeeRange_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSignedFeeRange_read")] public static extern long ClosingSignedFeeRange_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSignedFeeRange_read")] public static extern long ClosingSignedFeeRange_read(long _ser);
        // struct LDKCVec_u8Z CommitmentSigned_write(const struct LDKCommitmentSigned *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_write")] public static extern byte[] CommitmentSigned_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_write")] public static extern long CommitmentSigned_write(long _obj);
        // struct LDKCResult_CommitmentSignedDecodeErrorZ CommitmentSigned_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_read")] public static extern long CommitmentSigned_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_read")] public static extern long CommitmentSigned_read(long _ser);
        // struct LDKCVec_u8Z FundingCreated_write(const struct LDKFundingCreated *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_write")] public static extern byte[] FundingCreated_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_write")] public static extern long FundingCreated_write(long _obj);
        // struct LDKCResult_FundingCreatedDecodeErrorZ FundingCreated_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_read")] public static extern long FundingCreated_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_read")] public static extern long FundingCreated_read(long _ser);
        // struct LDKCVec_u8Z FundingSigned_write(const struct LDKFundingSigned *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_write")] public static extern byte[] FundingSigned_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_write")] public static extern long FundingSigned_write(long _obj);
        // struct LDKCResult_FundingSignedDecodeErrorZ FundingSigned_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_read")] public static extern long FundingSigned_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_read")] public static extern long FundingSigned_read(long _ser);
        // struct LDKCVec_u8Z ChannelReady_write(const struct LDKChannelReady *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_write")] public static extern byte[] ChannelReady_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_write")] public static extern long ChannelReady_write(long _obj);
        // struct LDKCResult_ChannelReadyDecodeErrorZ ChannelReady_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_read")] public static extern long ChannelReady_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_read")] public static extern long ChannelReady_read(long _ser);
        // struct LDKCVec_u8Z Init_write(const struct LDKInit *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Init_write")] public static extern byte[] Init_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Init_write")] public static extern long Init_write(long _obj);
        // struct LDKCResult_InitDecodeErrorZ Init_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Init_read")] public static extern long Init_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Init_read")] public static extern long Init_read(long _ser);
        // struct LDKCVec_u8Z OpenChannel_write(const struct LDKOpenChannel *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_write")] public static extern byte[] OpenChannel_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_write")] public static extern long OpenChannel_write(long _obj);
        // struct LDKCResult_OpenChannelDecodeErrorZ OpenChannel_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_read")] public static extern long OpenChannel_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_read")] public static extern long OpenChannel_read(long _ser);
        // struct LDKCVec_u8Z OpenChannelV2_write(const struct LDKOpenChannelV2 *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_write")] public static extern byte[] OpenChannelV2_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_write")] public static extern long OpenChannelV2_write(long _obj);
        // struct LDKCResult_OpenChannelV2DecodeErrorZ OpenChannelV2_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_read")] public static extern long OpenChannelV2_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_read")] public static extern long OpenChannelV2_read(long _ser);
        // struct LDKCVec_u8Z RevokeAndACK_write(const struct LDKRevokeAndACK *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_write")] public static extern byte[] RevokeAndACK_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_write")] public static extern long RevokeAndACK_write(long _obj);
        // struct LDKCResult_RevokeAndACKDecodeErrorZ RevokeAndACK_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_read")] public static extern long RevokeAndACK_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_read")] public static extern long RevokeAndACK_read(long _ser);
        // struct LDKCVec_u8Z Shutdown_write(const struct LDKShutdown *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_write")] public static extern byte[] Shutdown_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_write")] public static extern long Shutdown_write(long _obj);
        // struct LDKCResult_ShutdownDecodeErrorZ Shutdown_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_read")] public static extern long Shutdown_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_read")] public static extern long Shutdown_read(long _ser);
        // struct LDKCVec_u8Z UpdateFailHTLC_write(const struct LDKUpdateFailHTLC *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailHTLC_write")] public static extern byte[] UpdateFailHTLC_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailHTLC_write")] public static extern long UpdateFailHTLC_write(long _obj);
        // struct LDKCResult_UpdateFailHTLCDecodeErrorZ UpdateFailHTLC_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailHTLC_read")] public static extern long UpdateFailHTLC_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailHTLC_read")] public static extern long UpdateFailHTLC_read(long _ser);
        // struct LDKCVec_u8Z UpdateFailMalformedHTLC_write(const struct LDKUpdateFailMalformedHTLC *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailMalformedHTLC_write")] public static extern byte[] UpdateFailMalformedHTLC_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailMalformedHTLC_write")] public static extern long UpdateFailMalformedHTLC_write(long _obj);
        // struct LDKCResult_UpdateFailMalformedHTLCDecodeErrorZ UpdateFailMalformedHTLC_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailMalformedHTLC_read")] public static extern long UpdateFailMalformedHTLC_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailMalformedHTLC_read")] public static extern long UpdateFailMalformedHTLC_read(long _ser);
        // struct LDKCVec_u8Z UpdateFee_write(const struct LDKUpdateFee *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_write")] public static extern byte[] UpdateFee_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_write")] public static extern long UpdateFee_write(long _obj);
        // struct LDKCResult_UpdateFeeDecodeErrorZ UpdateFee_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_read")] public static extern long UpdateFee_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_read")] public static extern long UpdateFee_read(long _ser);
        // struct LDKCVec_u8Z UpdateFulfillHTLC_write(const struct LDKUpdateFulfillHTLC *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_write")] public static extern byte[] UpdateFulfillHTLC_write(long _obj);
+       [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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_read")] public static extern long UpdateFulfillHTLC_read(long _ser);
        // struct LDKCVec_u8Z UpdateAddHTLC_write(const struct LDKUpdateAddHTLC *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_write")] public static extern byte[] UpdateAddHTLC_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_write")] public static extern long UpdateAddHTLC_write(long _obj);
        // struct LDKCResult_UpdateAddHTLCDecodeErrorZ UpdateAddHTLC_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_read")] public static extern long UpdateAddHTLC_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_read")] public static extern long UpdateAddHTLC_read(long _ser);
        // struct LDKCResult_OnionMessageDecodeErrorZ OnionMessage_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessage_read")] public static extern long OnionMessage_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [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 byte[] OnionMessage_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessage_write")] public static extern long OnionMessage_write(long _obj);
        // struct LDKCVec_u8Z Ping_write(const struct LDKPing *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Ping_write")] public static extern byte[] Ping_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Ping_write")] public static extern long Ping_write(long _obj);
        // struct LDKCResult_PingDecodeErrorZ Ping_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Ping_read")] public static extern long Ping_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Ping_read")] public static extern long Ping_read(long _ser);
        // struct LDKCVec_u8Z Pong_write(const struct LDKPong *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Pong_write")] public static extern byte[] Pong_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Pong_write")] public static extern long Pong_write(long _obj);
        // struct LDKCResult_PongDecodeErrorZ Pong_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Pong_read")] public static extern long Pong_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Pong_read")] public static extern long Pong_read(long _ser);
        // struct LDKCVec_u8Z UnsignedChannelAnnouncement_write(const struct LDKUnsignedChannelAnnouncement *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_write")] public static extern byte[] UnsignedChannelAnnouncement_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_write")] public static extern long UnsignedChannelAnnouncement_write(long _obj);
        // struct LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ UnsignedChannelAnnouncement_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_read")] public static extern long UnsignedChannelAnnouncement_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_read")] public static extern long UnsignedChannelAnnouncement_read(long _ser);
        // struct LDKCVec_u8Z ChannelAnnouncement_write(const struct LDKChannelAnnouncement *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_write")] public static extern byte[] ChannelAnnouncement_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_write")] public static extern long ChannelAnnouncement_write(long _obj);
        // struct LDKCResult_ChannelAnnouncementDecodeErrorZ ChannelAnnouncement_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_read")] public static extern long ChannelAnnouncement_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_read")] public static extern long ChannelAnnouncement_read(long _ser);
        // struct LDKCVec_u8Z UnsignedChannelUpdate_write(const struct LDKUnsignedChannelUpdate *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_write")] public static extern byte[] UnsignedChannelUpdate_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_write")] public static extern long UnsignedChannelUpdate_write(long _obj);
        // struct LDKCResult_UnsignedChannelUpdateDecodeErrorZ UnsignedChannelUpdate_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_read")] public static extern long UnsignedChannelUpdate_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_read")] public static extern long UnsignedChannelUpdate_read(long _ser);
        // struct LDKCVec_u8Z ChannelUpdate_write(const struct LDKChannelUpdate *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_write")] public static extern byte[] ChannelUpdate_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_write")] public static extern long ChannelUpdate_write(long _obj);
        // struct LDKCResult_ChannelUpdateDecodeErrorZ ChannelUpdate_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_read")] public static extern long ChannelUpdate_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_read")] public static extern long ChannelUpdate_read(long _ser);
        // struct LDKCVec_u8Z ErrorMessage_write(const struct LDKErrorMessage *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_write")] public static extern byte[] ErrorMessage_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_write")] public static extern long ErrorMessage_write(long _obj);
        // struct LDKCResult_ErrorMessageDecodeErrorZ ErrorMessage_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_read")] public static extern long ErrorMessage_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_read")] public static extern long ErrorMessage_read(long _ser);
        // struct LDKCVec_u8Z WarningMessage_write(const struct LDKWarningMessage *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_write")] public static extern byte[] WarningMessage_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_write")] public static extern long WarningMessage_write(long _obj);
        // struct LDKCResult_WarningMessageDecodeErrorZ WarningMessage_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_read")] public static extern long WarningMessage_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_read")] public static extern long WarningMessage_read(long _ser);
        // struct LDKCVec_u8Z UnsignedNodeAnnouncement_write(const struct LDKUnsignedNodeAnnouncement *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_write")] public static extern byte[] UnsignedNodeAnnouncement_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_write")] public static extern long UnsignedNodeAnnouncement_write(long _obj);
        // struct LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ UnsignedNodeAnnouncement_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_read")] public static extern long UnsignedNodeAnnouncement_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_read")] public static extern long UnsignedNodeAnnouncement_read(long _ser);
        // struct LDKCVec_u8Z NodeAnnouncement_write(const struct LDKNodeAnnouncement *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_write")] public static extern byte[] NodeAnnouncement_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_write")] public static extern long NodeAnnouncement_write(long _obj);
        // struct LDKCResult_NodeAnnouncementDecodeErrorZ NodeAnnouncement_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_read")] public static extern long NodeAnnouncement_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_read")] public static extern long NodeAnnouncement_read(long _ser);
        // struct LDKCResult_QueryShortChannelIdsDecodeErrorZ QueryShortChannelIds_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_read")] public static extern long QueryShortChannelIds_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_read")] public static extern long QueryShortChannelIds_read(long _ser);
        // struct LDKCVec_u8Z QueryShortChannelIds_write(const struct LDKQueryShortChannelIds *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_write")] public static extern byte[] QueryShortChannelIds_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_write")] public static extern long QueryShortChannelIds_write(long _obj);
        // struct LDKCVec_u8Z ReplyShortChannelIdsEnd_write(const struct LDKReplyShortChannelIdsEnd *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_write")] public static extern byte[] ReplyShortChannelIdsEnd_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_write")] public static extern long ReplyShortChannelIdsEnd_write(long _obj);
        // struct LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ ReplyShortChannelIdsEnd_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_read")] public static extern long ReplyShortChannelIdsEnd_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_read")] public static extern long ReplyShortChannelIdsEnd_read(long _ser);
        // MUST_USE_RES uint32_t QueryChannelRange_end_blocknum(const struct LDKQueryChannelRange *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_end_blocknum")] public static extern int QueryChannelRange_end_blocknum(long _this_arg);
        // struct LDKCVec_u8Z QueryChannelRange_write(const struct LDKQueryChannelRange *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_write")] public static extern byte[] QueryChannelRange_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_write")] public static extern long QueryChannelRange_write(long _obj);
        // struct LDKCResult_QueryChannelRangeDecodeErrorZ QueryChannelRange_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_read")] public static extern long QueryChannelRange_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_read")] public static extern long QueryChannelRange_read(long _ser);
        // struct LDKCResult_ReplyChannelRangeDecodeErrorZ ReplyChannelRange_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_read")] public static extern long ReplyChannelRange_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_read")] public static extern long ReplyChannelRange_read(long _ser);
        // struct LDKCVec_u8Z ReplyChannelRange_write(const struct LDKReplyChannelRange *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_write")] public static extern byte[] ReplyChannelRange_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_write")] public static extern long ReplyChannelRange_write(long _obj);
        // struct LDKCVec_u8Z GossipTimestampFilter_write(const struct LDKGossipTimestampFilter *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_write")] public static extern byte[] GossipTimestampFilter_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_write")] public static extern long GossipTimestampFilter_write(long _obj);
        // struct LDKCResult_GossipTimestampFilterDecodeErrorZ GossipTimestampFilter_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_read")] public static extern long GossipTimestampFilter_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_read")] public static extern long GossipTimestampFilter_read(long _ser);
        // void CustomMessageHandler_free(struct LDKCustomMessageHandler this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomMessageHandler_free")] public static extern void CustomMessageHandler_free(long _this_ptr);
        // void IgnoringMessageHandler_free(struct LDKIgnoringMessageHandler this_obj);
@@ -7326,8 +8352,6 @@ internal class bindings {
        [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);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_IgnoringMessageHandler_as_RoutingMessageHandler")] public static extern long IgnoringMessageHandler_as_RoutingMessageHandler(long _this_arg);
-       // struct LDKOnionMessageProvider IgnoringMessageHandler_as_OnionMessageProvider(const struct LDKIgnoringMessageHandler *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_IgnoringMessageHandler_as_OnionMessageProvider")] public static extern long IgnoringMessageHandler_as_OnionMessageProvider(long _this_arg);
        // struct LDKOnionMessageHandler IgnoringMessageHandler_as_OnionMessageHandler(const struct LDKIgnoringMessageHandler *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_IgnoringMessageHandler_as_OnionMessageHandler")] public static extern long IgnoringMessageHandler_as_OnionMessageHandler(long _this_arg);
        // struct LDKOffersMessageHandler IgnoringMessageHandler_as_OffersMessageHandler(const struct LDKIgnoringMessageHandler *NONNULL_PTR this_arg);
@@ -7383,29 +8407,29 @@ internal class bindings {
        // void PeerManager_free(struct LDKPeerManager this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_free")] public static extern void PeerManager_free(long _this_obj);
        // MUST_USE_RES struct LDKPeerManager PeerManager_new(struct LDKMessageHandler message_handler, uint32_t current_time, const uint8_t (*ephemeral_random_data)[32], struct LDKLogger logger, struct LDKNodeSigner node_signer);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_new")] public static extern long PeerManager_new(long _message_handler, int _current_time, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ephemeral_random_data, long _logger, long _node_signer);
-       // MUST_USE_RES struct LDKCVec_C2Tuple_PublicKeyCOption_NetAddressZZZ PeerManager_get_peer_node_ids(const struct LDKPeerManager *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_get_peer_node_ids")] public static extern long[] PeerManager_get_peer_node_ids(long _this_arg);
-       // MUST_USE_RES struct LDKCResult_CVec_u8ZPeerHandleErrorZ PeerManager_new_outbound_connection(const struct LDKPeerManager *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, struct LDKSocketDescriptor descriptor, struct LDKCOption_NetAddressZ remote_network_address);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_new_outbound_connection")] public static extern long PeerManager_new_outbound_connection(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _their_node_id, long _descriptor, long _remote_network_address);
-       // MUST_USE_RES struct LDKCResult_NonePeerHandleErrorZ PeerManager_new_inbound_connection(const struct LDKPeerManager *NONNULL_PTR this_arg, struct LDKSocketDescriptor descriptor, struct LDKCOption_NetAddressZ remote_network_address);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_new")] public static extern long PeerManager_new(long _message_handler, int _current_time, long _ephemeral_random_data, long _logger, long _node_signer);
+       // MUST_USE_RES struct LDKCVec_C2Tuple_PublicKeyCOption_SocketAddressZZZ PeerManager_get_peer_node_ids(const struct LDKPeerManager *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_get_peer_node_ids")] public static extern long PeerManager_get_peer_node_ids(long _this_arg);
+       // MUST_USE_RES struct LDKCResult_CVec_u8ZPeerHandleErrorZ PeerManager_new_outbound_connection(const struct LDKPeerManager *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, struct LDKSocketDescriptor descriptor, struct LDKCOption_SocketAddressZ remote_network_address);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_new_outbound_connection")] public static extern long PeerManager_new_outbound_connection(long _this_arg, long _their_node_id, long _descriptor, long _remote_network_address);
+       // MUST_USE_RES struct LDKCResult_NonePeerHandleErrorZ PeerManager_new_inbound_connection(const struct LDKPeerManager *NONNULL_PTR this_arg, struct LDKSocketDescriptor descriptor, struct LDKCOption_SocketAddressZ remote_network_address);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_new_inbound_connection")] public static extern long PeerManager_new_inbound_connection(long _this_arg, long _descriptor, long _remote_network_address);
        // MUST_USE_RES struct LDKCResult_NonePeerHandleErrorZ PeerManager_write_buffer_space_avail(const struct LDKPeerManager *NONNULL_PTR this_arg, struct LDKSocketDescriptor *NONNULL_PTR descriptor);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_write_buffer_space_avail")] public static extern long PeerManager_write_buffer_space_avail(long _this_arg, long _descriptor);
        // MUST_USE_RES struct LDKCResult_boolPeerHandleErrorZ PeerManager_read_event(const struct LDKPeerManager *NONNULL_PTR this_arg, struct LDKSocketDescriptor *NONNULL_PTR peer_descriptor, struct LDKu8slice data);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_read_event")] public static extern long PeerManager_read_event(long _this_arg, long _peer_descriptor, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _data);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_read_event")] public static extern long PeerManager_read_event(long _this_arg, long _peer_descriptor, long _data);
        // void PeerManager_process_events(const struct LDKPeerManager *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_process_events")] public static extern void PeerManager_process_events(long _this_arg);
        // void PeerManager_socket_disconnected(const struct LDKPeerManager *NONNULL_PTR this_arg, const struct LDKSocketDescriptor *NONNULL_PTR descriptor);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_socket_disconnected")] public static extern void PeerManager_socket_disconnected(long _this_arg, long _descriptor);
        // void PeerManager_disconnect_by_node_id(const struct LDKPeerManager *NONNULL_PTR this_arg, struct LDKPublicKey node_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_disconnect_by_node_id")] public static extern void PeerManager_disconnect_by_node_id(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_disconnect_by_node_id")] public static extern void PeerManager_disconnect_by_node_id(long _this_arg, long _node_id);
        // void PeerManager_disconnect_all_peers(const struct LDKPeerManager *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_disconnect_all_peers")] public static extern void PeerManager_disconnect_all_peers(long _this_arg);
        // void PeerManager_timer_tick_occurred(const struct LDKPeerManager *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_timer_tick_occurred")] public static extern void PeerManager_timer_tick_occurred(long _this_arg);
-       // void PeerManager_broadcast_node_announcement(const struct LDKPeerManager *NONNULL_PTR this_arg, struct LDKThreeBytes rgb, struct LDKThirtyTwoBytes alias, struct LDKCVec_NetAddressZ addresses);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_broadcast_node_announcement")] public static extern void PeerManager_broadcast_node_announcement(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _rgb, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _alias, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _addresses);
+       // void PeerManager_broadcast_node_announcement(const struct LDKPeerManager *NONNULL_PTR this_arg, struct LDKThreeBytes rgb, struct LDKThirtyTwoBytes alias, struct LDKCVec_SocketAddressZ addresses);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeerManager_broadcast_node_announcement")] public static extern void PeerManager_broadcast_node_announcement(long _this_arg, long _rgb, long _alias, long _addresses);
        // uint64_t htlc_success_tx_weight(const struct LDKChannelTypeFeatures *NONNULL_PTR channel_type_features);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_htlc_success_tx_weight")] public static extern long htlc_success_tx_weight(long _channel_type_features);
        // uint64_t htlc_timeout_tx_weight(const struct LDKChannelTypeFeatures *NONNULL_PTR channel_type_features);
@@ -7425,11 +8449,11 @@ internal class bindings {
        // bool HTLCClaim_eq(const enum LDKHTLCClaim *NONNULL_PTR a, const enum LDKHTLCClaim *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCClaim_eq")] public static extern bool HTLCClaim_eq(long _a, long _b);
        // MUST_USE_RES struct LDKCOption_HTLCClaimZ HTLCClaim_from_witness(struct LDKWitness witness);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCClaim_from_witness")] public static extern long HTLCClaim_from_witness([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _witness);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCClaim_from_witness")] public static extern long HTLCClaim_from_witness(long _witness);
        // struct LDKThirtyTwoBytes build_commitment_secret(const uint8_t (*commitment_seed)[32], uint64_t idx);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_build_commitment_secret")] public static extern byte[] build_commitment_secret([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _commitment_seed, long _idx);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_build_commitment_secret")] public static extern long build_commitment_secret(long _commitment_seed, long _idx);
        // struct LDKTransaction build_closing_transaction(uint64_t to_holder_value_sat, uint64_t to_counterparty_value_sat, struct LDKCVec_u8Z to_holder_script, struct LDKCVec_u8Z to_counterparty_script, struct LDKOutPoint funding_outpoint);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_build_closing_transaction")] public static extern byte[] build_closing_transaction(long _to_holder_value_sat, long _to_counterparty_value_sat, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _to_holder_script, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _to_counterparty_script, long _funding_outpoint);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_build_closing_transaction")] public static extern long build_closing_transaction(long _to_holder_value_sat, long _to_counterparty_value_sat, long _to_holder_script, long _to_counterparty_script, long _funding_outpoint);
        // void CounterpartyCommitmentSecrets_free(struct LDKCounterpartyCommitmentSecrets this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyCommitmentSecrets_free")] public static extern void CounterpartyCommitmentSecrets_free(long _this_obj);
        // uint64_t CounterpartyCommitmentSecrets_clone_ptr(LDKCounterpartyCommitmentSecrets *NONNULL_PTR arg);
@@ -7441,45 +8465,45 @@ internal class bindings {
        // MUST_USE_RES uint64_t CounterpartyCommitmentSecrets_get_min_seen_secret(const struct LDKCounterpartyCommitmentSecrets *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyCommitmentSecrets_get_min_seen_secret")] public static extern long CounterpartyCommitmentSecrets_get_min_seen_secret(long _this_arg);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ CounterpartyCommitmentSecrets_provide_secret(struct LDKCounterpartyCommitmentSecrets *NONNULL_PTR this_arg, uint64_t idx, struct LDKThirtyTwoBytes secret);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyCommitmentSecrets_provide_secret")] public static extern long CounterpartyCommitmentSecrets_provide_secret(long _this_arg, long _idx, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _secret);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyCommitmentSecrets_provide_secret")] public static extern long CounterpartyCommitmentSecrets_provide_secret(long _this_arg, long _idx, long _secret);
        // MUST_USE_RES struct LDKThirtyTwoBytes CounterpartyCommitmentSecrets_get_secret(const struct LDKCounterpartyCommitmentSecrets *NONNULL_PTR this_arg, uint64_t idx);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyCommitmentSecrets_get_secret")] public static extern byte[] CounterpartyCommitmentSecrets_get_secret(long _this_arg, long _idx);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyCommitmentSecrets_get_secret")] public static extern long CounterpartyCommitmentSecrets_get_secret(long _this_arg, long _idx);
        // struct LDKCVec_u8Z CounterpartyCommitmentSecrets_write(const struct LDKCounterpartyCommitmentSecrets *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyCommitmentSecrets_write")] public static extern byte[] CounterpartyCommitmentSecrets_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyCommitmentSecrets_write")] public static extern long CounterpartyCommitmentSecrets_write(long _obj);
        // struct LDKCResult_CounterpartyCommitmentSecretsDecodeErrorZ CounterpartyCommitmentSecrets_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyCommitmentSecrets_read")] public static extern long CounterpartyCommitmentSecrets_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [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 byte[] derive_private_key([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _per_commitment_point, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _base_secret);
+       [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 byte[] derive_public_key([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _per_commitment_point, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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 byte[] derive_private_revocation_key([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _per_commitment_secret, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _countersignatory_revocation_base_secret);
+       [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 byte[] derive_public_revocation_key([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _per_commitment_point, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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 byte[] TxCreationKeys_get_per_commitment_point(long _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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_get_revocation_key")] public static extern byte[] TxCreationKeys_get_revocation_key(long _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_set_revocation_key")] public static extern void TxCreationKeys_set_revocation_key(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_get_broadcaster_htlc_key")] public static extern byte[] TxCreationKeys_get_broadcaster_htlc_key(long _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_set_broadcaster_htlc_key")] public static extern void TxCreationKeys_set_broadcaster_htlc_key(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_get_countersignatory_htlc_key")] public static extern byte[] TxCreationKeys_get_countersignatory_htlc_key(long _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_set_countersignatory_htlc_key")] public static extern void TxCreationKeys_set_countersignatory_htlc_key(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_get_broadcaster_delayed_payment_key")] public static extern byte[] TxCreationKeys_get_broadcaster_delayed_payment_key(long _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_set_broadcaster_delayed_payment_key")] public static extern void TxCreationKeys_set_broadcaster_delayed_payment_key(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_new")] public static extern long TxCreationKeys_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _per_commitment_point_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _revocation_key_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _broadcaster_htlc_key_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _countersignatory_htlc_key_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
        // uint64_t TxCreationKeys_clone_ptr(LDKTxCreationKeys *NONNULL_PTR arg);
@@ -7487,49 +8511,53 @@ internal class bindings {
        // struct LDKTxCreationKeys TxCreationKeys_clone(const struct LDKTxCreationKeys *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_clone")] public static extern long TxCreationKeys_clone(long _orig);
        // struct LDKCVec_u8Z TxCreationKeys_write(const struct LDKTxCreationKeys *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_write")] public static extern byte[] TxCreationKeys_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_write")] public static extern long TxCreationKeys_write(long _obj);
        // struct LDKCResult_TxCreationKeysDecodeErrorZ TxCreationKeys_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_read")] public static extern long TxCreationKeys_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_read")] public static extern long TxCreationKeys_read(long _ser);
        // void ChannelPublicKeys_free(struct LDKChannelPublicKeys this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_free")] public static extern void ChannelPublicKeys_free(long _this_obj);
        // struct LDKPublicKey ChannelPublicKeys_get_funding_pubkey(const struct LDKChannelPublicKeys *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_get_funding_pubkey")] public static extern byte[] ChannelPublicKeys_get_funding_pubkey(long _this_ptr);
+       [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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_get_revocation_basepoint")] public static extern byte[] ChannelPublicKeys_get_revocation_basepoint(long _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_set_revocation_basepoint")] public static extern void ChannelPublicKeys_set_revocation_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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 byte[] ChannelPublicKeys_get_payment_point(long _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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_get_delayed_payment_basepoint")] public static extern byte[] ChannelPublicKeys_get_delayed_payment_basepoint(long _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_set_delayed_payment_basepoint")] public static extern void ChannelPublicKeys_set_delayed_payment_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_get_htlc_basepoint")] public static extern byte[] ChannelPublicKeys_get_htlc_basepoint(long _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_set_htlc_basepoint")] public static extern void ChannelPublicKeys_set_htlc_basepoint(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_new")] public static extern long ChannelPublicKeys_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_pubkey_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _revocation_basepoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_point_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _delayed_payment_basepoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
        // struct LDKChannelPublicKeys ChannelPublicKeys_clone(const struct LDKChannelPublicKeys *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_clone")] public static extern long ChannelPublicKeys_clone(long _orig);
+       // uint64_t ChannelPublicKeys_hash(const struct LDKChannelPublicKeys *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_hash")] public static extern long ChannelPublicKeys_hash(long _o);
        // bool ChannelPublicKeys_eq(const struct LDKChannelPublicKeys *NONNULL_PTR a, const struct LDKChannelPublicKeys *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_eq")] public static extern bool ChannelPublicKeys_eq(long _a, long _b);
        // struct LDKCVec_u8Z ChannelPublicKeys_write(const struct LDKChannelPublicKeys *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_write")] public static extern byte[] ChannelPublicKeys_write(long _obj);
+       [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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_derive_new")] public static extern long TxCreationKeys_derive_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _per_commitment_point, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _broadcaster_delayed_payment_base, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _broadcaster_htlc_base, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _countersignatory_revocation_base, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _per_commitment_point, long _broadcaster_keys, long _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_get_revokeable_redeemscript")] public static extern byte[] get_revokeable_redeemscript([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _revocation_key, short _contest_delay, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
        // void HTLCOutputInCommitment_free(struct LDKHTLCOutputInCommitment this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCOutputInCommitment_free")] public static extern void HTLCOutputInCommitment_free(long _this_obj);
        // bool HTLCOutputInCommitment_get_offered(const struct LDKHTLCOutputInCommitment *NONNULL_PTR this_ptr);
@@ -7545,15 +8573,15 @@ internal class bindings {
        // void HTLCOutputInCommitment_set_cltv_expiry(struct LDKHTLCOutputInCommitment *NONNULL_PTR this_ptr, uint32_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCOutputInCommitment_set_cltv_expiry")] public static extern void HTLCOutputInCommitment_set_cltv_expiry(long _this_ptr, int _val);
        // const uint8_t (*HTLCOutputInCommitment_get_payment_hash(const struct LDKHTLCOutputInCommitment *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCOutputInCommitment_get_payment_hash")] public static extern byte[] HTLCOutputInCommitment_get_payment_hash(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCOutputInCommitment_get_payment_hash")] public static extern long HTLCOutputInCommitment_get_payment_hash(long _this_ptr);
        // void HTLCOutputInCommitment_set_payment_hash(struct LDKHTLCOutputInCommitment *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCOutputInCommitment_set_payment_hash")] public static extern void HTLCOutputInCommitment_set_payment_hash(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCOutputInCommitment_set_payment_hash")] public static extern void HTLCOutputInCommitment_set_payment_hash(long _this_ptr, long _val);
        // struct LDKCOption_u32Z HTLCOutputInCommitment_get_transaction_output_index(const struct LDKHTLCOutputInCommitment *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCOutputInCommitment_get_transaction_output_index")] public static extern long HTLCOutputInCommitment_get_transaction_output_index(long _this_ptr);
        // void HTLCOutputInCommitment_set_transaction_output_index(struct LDKHTLCOutputInCommitment *NONNULL_PTR this_ptr, struct LDKCOption_u32Z val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCOutputInCommitment_set_transaction_output_index")] public static extern void HTLCOutputInCommitment_set_transaction_output_index(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKHTLCOutputInCommitment HTLCOutputInCommitment_new(bool offered_arg, uint64_t amount_msat_arg, uint32_t cltv_expiry_arg, struct LDKThirtyTwoBytes payment_hash_arg, struct LDKCOption_u32Z transaction_output_index_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCOutputInCommitment_new")] public static extern long HTLCOutputInCommitment_new(bool _offered_arg, long _amount_msat_arg, int _cltv_expiry_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash_arg, long _transaction_output_index_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCOutputInCommitment_new")] public static extern long HTLCOutputInCommitment_new(bool _offered_arg, long _amount_msat_arg, int _cltv_expiry_arg, long _payment_hash_arg, long _transaction_output_index_arg);
        // uint64_t HTLCOutputInCommitment_clone_ptr(LDKHTLCOutputInCommitment *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCOutputInCommitment_clone_ptr")] public static extern long HTLCOutputInCommitment_clone_ptr(long _arg);
        // struct LDKHTLCOutputInCommitment HTLCOutputInCommitment_clone(const struct LDKHTLCOutputInCommitment *NONNULL_PTR orig);
@@ -7561,23 +8589,23 @@ internal class bindings {
        // bool HTLCOutputInCommitment_eq(const struct LDKHTLCOutputInCommitment *NONNULL_PTR a, const struct LDKHTLCOutputInCommitment *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCOutputInCommitment_eq")] public static extern bool HTLCOutputInCommitment_eq(long _a, long _b);
        // struct LDKCVec_u8Z HTLCOutputInCommitment_write(const struct LDKHTLCOutputInCommitment *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCOutputInCommitment_write")] public static extern byte[] HTLCOutputInCommitment_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCOutputInCommitment_write")] public static extern long HTLCOutputInCommitment_write(long _obj);
        // struct LDKCResult_HTLCOutputInCommitmentDecodeErrorZ HTLCOutputInCommitment_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCOutputInCommitment_read")] public static extern long HTLCOutputInCommitment_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCOutputInCommitment_read")] public static extern long HTLCOutputInCommitment_read(long _ser);
        // struct LDKCVec_u8Z get_htlc_redeemscript(const struct LDKHTLCOutputInCommitment *NONNULL_PTR htlc, const struct LDKChannelTypeFeatures *NONNULL_PTR channel_type_features, const struct LDKTxCreationKeys *NONNULL_PTR keys);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_get_htlc_redeemscript")] public static extern byte[] get_htlc_redeemscript(long _htlc, long _channel_type_features, long _keys);
+       [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 byte[] make_funding_redeemscript([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _broadcaster, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_build_htlc_transaction")] public static extern byte[] build_htlc_transaction([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _commitment_txid, int _feerate_per_kw, short _contest_delay, long _htlc, long _channel_type_features, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _broadcaster_delayed_payment_key, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _revocation_key);
-       // struct LDKWitness build_htlc_input_witness(struct LDKSignature local_sig, struct LDKSignature remote_sig, struct LDKCOption_PaymentPreimageZ 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 byte[] build_htlc_input_witness([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _local_sig, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _remote_sig, long _preimage, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _redeem_script, long _channel_type_features);
+       [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);
        // struct LDKCVec_u8Z get_to_countersignatory_with_anchors_redeemscript(struct LDKPublicKey payment_point);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_get_to_countersignatory_with_anchors_redeemscript")] public static extern byte[] get_to_countersignatory_with_anchors_redeemscript([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_point);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_get_to_countersignatory_with_anchors_redeemscript")] public static extern long get_to_countersignatory_with_anchors_redeemscript(long _payment_point);
        // struct LDKCVec_u8Z get_anchor_redeemscript(struct LDKPublicKey funding_pubkey);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_get_anchor_redeemscript")] public static extern byte[] get_anchor_redeemscript([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_pubkey);
-       // struct LDKWitness build_anchor_input_witness(struct LDKPublicKey funding_key, struct LDKSignature funding_sig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_build_anchor_input_witness")] public static extern byte[] build_anchor_input_witness([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_key, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_sig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_get_anchor_redeemscript")] public static extern long get_anchor_redeemscript(long _funding_pubkey);
+       // struct LDKWitness build_anchor_input_witness(struct LDKPublicKey funding_key, struct LDKECDSASignature funding_sig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_build_anchor_input_witness")] public static extern long build_anchor_input_witness(long _funding_key, long _funding_sig);
        // void ChannelTransactionParameters_free(struct LDKChannelTransactionParameters this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTransactionParameters_free")] public static extern void ChannelTransactionParameters_free(long _this_obj);
        // struct LDKChannelPublicKeys ChannelTransactionParameters_get_holder_pubkeys(const struct LDKChannelTransactionParameters *NONNULL_PTR this_ptr);
@@ -7610,6 +8638,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTransactionParameters_clone_ptr")] public static extern long ChannelTransactionParameters_clone_ptr(long _arg);
        // struct LDKChannelTransactionParameters ChannelTransactionParameters_clone(const struct LDKChannelTransactionParameters *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTransactionParameters_clone")] public static extern long ChannelTransactionParameters_clone(long _orig);
+       // uint64_t ChannelTransactionParameters_hash(const struct LDKChannelTransactionParameters *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTransactionParameters_hash")] public static extern long ChannelTransactionParameters_hash(long _o);
        // bool ChannelTransactionParameters_eq(const struct LDKChannelTransactionParameters *NONNULL_PTR a, const struct LDKChannelTransactionParameters *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTransactionParameters_eq")] public static extern bool ChannelTransactionParameters_eq(long _a, long _b);
        // void CounterpartyChannelTransactionParameters_free(struct LDKCounterpartyChannelTransactionParameters this_obj);
@@ -7628,6 +8658,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyChannelTransactionParameters_clone_ptr")] public static extern long CounterpartyChannelTransactionParameters_clone_ptr(long _arg);
        // struct LDKCounterpartyChannelTransactionParameters CounterpartyChannelTransactionParameters_clone(const struct LDKCounterpartyChannelTransactionParameters *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyChannelTransactionParameters_clone")] public static extern long CounterpartyChannelTransactionParameters_clone(long _orig);
+       // uint64_t CounterpartyChannelTransactionParameters_hash(const struct LDKCounterpartyChannelTransactionParameters *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyChannelTransactionParameters_hash")] public static extern long CounterpartyChannelTransactionParameters_hash(long _o);
        // bool CounterpartyChannelTransactionParameters_eq(const struct LDKCounterpartyChannelTransactionParameters *NONNULL_PTR a, const struct LDKCounterpartyChannelTransactionParameters *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyChannelTransactionParameters_eq")] public static extern bool CounterpartyChannelTransactionParameters_eq(long _a, long _b);
        // MUST_USE_RES bool ChannelTransactionParameters_is_populated(const struct LDKChannelTransactionParameters *NONNULL_PTR this_arg);
@@ -7637,13 +8669,13 @@ internal class bindings {
        // MUST_USE_RES struct LDKDirectedChannelTransactionParameters ChannelTransactionParameters_as_counterparty_broadcastable(const struct LDKChannelTransactionParameters *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTransactionParameters_as_counterparty_broadcastable")] public static extern long ChannelTransactionParameters_as_counterparty_broadcastable(long _this_arg);
        // struct LDKCVec_u8Z CounterpartyChannelTransactionParameters_write(const struct LDKCounterpartyChannelTransactionParameters *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyChannelTransactionParameters_write")] public static extern byte[] CounterpartyChannelTransactionParameters_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyChannelTransactionParameters_write")] public static extern long CounterpartyChannelTransactionParameters_write(long _obj);
        // struct LDKCResult_CounterpartyChannelTransactionParametersDecodeErrorZ CounterpartyChannelTransactionParameters_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyChannelTransactionParameters_read")] public static extern long CounterpartyChannelTransactionParameters_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyChannelTransactionParameters_read")] public static extern long CounterpartyChannelTransactionParameters_read(long _ser);
        // struct LDKCVec_u8Z ChannelTransactionParameters_write(const struct LDKChannelTransactionParameters *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTransactionParameters_write")] public static extern byte[] ChannelTransactionParameters_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTransactionParameters_write")] public static extern long ChannelTransactionParameters_write(long _obj);
        // struct LDKCResult_ChannelTransactionParametersDecodeErrorZ ChannelTransactionParameters_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTransactionParameters_read")] public static extern long ChannelTransactionParameters_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTransactionParameters_read")] public static extern long ChannelTransactionParameters_read(long _ser);
        // void DirectedChannelTransactionParameters_free(struct LDKDirectedChannelTransactionParameters this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DirectedChannelTransactionParameters_free")] public static extern void DirectedChannelTransactionParameters_free(long _this_obj);
        // MUST_USE_RES struct LDKChannelPublicKeys DirectedChannelTransactionParameters_broadcaster_pubkeys(const struct LDKDirectedChannelTransactionParameters *NONNULL_PTR this_arg);
@@ -7660,50 +8692,50 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DirectedChannelTransactionParameters_channel_type_features")] public static extern long DirectedChannelTransactionParameters_channel_type_features(long _this_arg);
        // void HolderCommitmentTransaction_free(struct LDKHolderCommitmentTransaction this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_free")] public static extern void HolderCommitmentTransaction_free(long _this_obj);
-       // struct LDKSignature HolderCommitmentTransaction_get_counterparty_sig(const struct LDKHolderCommitmentTransaction *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_get_counterparty_sig")] public static extern byte[] HolderCommitmentTransaction_get_counterparty_sig(long _this_ptr);
-       // void HolderCommitmentTransaction_set_counterparty_sig(struct LDKHolderCommitmentTransaction *NONNULL_PTR this_ptr, struct LDKSignature val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_set_counterparty_sig")] public static extern void HolderCommitmentTransaction_set_counterparty_sig(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // struct LDKCVec_SignatureZ HolderCommitmentTransaction_get_counterparty_htlc_sigs(const struct LDKHolderCommitmentTransaction *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_get_counterparty_htlc_sigs")] public static extern byte[][] HolderCommitmentTransaction_get_counterparty_htlc_sigs(long _this_ptr);
-       // void HolderCommitmentTransaction_set_counterparty_htlc_sigs(struct LDKHolderCommitmentTransaction *NONNULL_PTR this_ptr, struct LDKCVec_SignatureZ val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_set_counterparty_htlc_sigs")] public static extern void HolderCommitmentTransaction_set_counterparty_htlc_sigs(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _val);
+       // struct LDKECDSASignature HolderCommitmentTransaction_get_counterparty_sig(const struct LDKHolderCommitmentTransaction *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_get_counterparty_sig")] public static extern long HolderCommitmentTransaction_get_counterparty_sig(long _this_ptr);
+       // void HolderCommitmentTransaction_set_counterparty_sig(struct LDKHolderCommitmentTransaction *NONNULL_PTR this_ptr, struct LDKECDSASignature val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_set_counterparty_sig")] public static extern void HolderCommitmentTransaction_set_counterparty_sig(long _this_ptr, long _val);
+       // struct LDKCVec_ECDSASignatureZ HolderCommitmentTransaction_get_counterparty_htlc_sigs(const struct LDKHolderCommitmentTransaction *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_get_counterparty_htlc_sigs")] public static extern long HolderCommitmentTransaction_get_counterparty_htlc_sigs(long _this_ptr);
+       // void HolderCommitmentTransaction_set_counterparty_htlc_sigs(struct LDKHolderCommitmentTransaction *NONNULL_PTR this_ptr, struct LDKCVec_ECDSASignatureZ val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_set_counterparty_htlc_sigs")] public static extern void HolderCommitmentTransaction_set_counterparty_htlc_sigs(long _this_ptr, long _val);
        // uint64_t HolderCommitmentTransaction_clone_ptr(LDKHolderCommitmentTransaction *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_clone_ptr")] public static extern long HolderCommitmentTransaction_clone_ptr(long _arg);
        // struct LDKHolderCommitmentTransaction HolderCommitmentTransaction_clone(const struct LDKHolderCommitmentTransaction *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_clone")] public static extern long HolderCommitmentTransaction_clone(long _orig);
        // struct LDKCVec_u8Z HolderCommitmentTransaction_write(const struct LDKHolderCommitmentTransaction *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_write")] public static extern byte[] HolderCommitmentTransaction_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_write")] public static extern long HolderCommitmentTransaction_write(long _obj);
        // struct LDKCResult_HolderCommitmentTransactionDecodeErrorZ HolderCommitmentTransaction_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_read")] public static extern long HolderCommitmentTransaction_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
-       // MUST_USE_RES struct LDKHolderCommitmentTransaction HolderCommitmentTransaction_new(struct LDKCommitmentTransaction commitment_tx, struct LDKSignature counterparty_sig, struct LDKCVec_SignatureZ counterparty_htlc_sigs, struct LDKPublicKey holder_funding_key, struct LDKPublicKey counterparty_funding_key);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_new")] public static extern long HolderCommitmentTransaction_new(long _commitment_tx, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _counterparty_sig, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _counterparty_htlc_sigs, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _holder_funding_key, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _counterparty_funding_key);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_read")] public static extern long HolderCommitmentTransaction_read(long _ser);
+       // MUST_USE_RES struct LDKHolderCommitmentTransaction HolderCommitmentTransaction_new(struct LDKCommitmentTransaction commitment_tx, struct LDKECDSASignature counterparty_sig, struct LDKCVec_ECDSASignatureZ counterparty_htlc_sigs, struct LDKPublicKey holder_funding_key, struct LDKPublicKey counterparty_funding_key);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HolderCommitmentTransaction_new")] public static extern long HolderCommitmentTransaction_new(long _commitment_tx, long _counterparty_sig, long _counterparty_htlc_sigs, long _holder_funding_key, long _counterparty_funding_key);
        // void BuiltCommitmentTransaction_free(struct LDKBuiltCommitmentTransaction this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_free")] public static extern void BuiltCommitmentTransaction_free(long _this_obj);
        // struct LDKTransaction BuiltCommitmentTransaction_get_transaction(const struct LDKBuiltCommitmentTransaction *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_get_transaction")] public static extern byte[] BuiltCommitmentTransaction_get_transaction(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_get_transaction")] public static extern long BuiltCommitmentTransaction_get_transaction(long _this_ptr);
        // void BuiltCommitmentTransaction_set_transaction(struct LDKBuiltCommitmentTransaction *NONNULL_PTR this_ptr, struct LDKTransaction val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_set_transaction")] public static extern void BuiltCommitmentTransaction_set_transaction(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_set_transaction")] public static extern void BuiltCommitmentTransaction_set_transaction(long _this_ptr, long _val);
        // const uint8_t (*BuiltCommitmentTransaction_get_txid(const struct LDKBuiltCommitmentTransaction *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_get_txid")] public static extern byte[] BuiltCommitmentTransaction_get_txid(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_get_txid")] public static extern long BuiltCommitmentTransaction_get_txid(long _this_ptr);
        // void BuiltCommitmentTransaction_set_txid(struct LDKBuiltCommitmentTransaction *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_set_txid")] public static extern void BuiltCommitmentTransaction_set_txid(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_set_txid")] public static extern void BuiltCommitmentTransaction_set_txid(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKBuiltCommitmentTransaction BuiltCommitmentTransaction_new(struct LDKTransaction transaction_arg, struct LDKThirtyTwoBytes txid_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_new")] public static extern long BuiltCommitmentTransaction_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _transaction_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _txid_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_new")] public static extern long BuiltCommitmentTransaction_new(long _transaction_arg, long _txid_arg);
        // uint64_t BuiltCommitmentTransaction_clone_ptr(LDKBuiltCommitmentTransaction *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_clone_ptr")] public static extern long BuiltCommitmentTransaction_clone_ptr(long _arg);
        // struct LDKBuiltCommitmentTransaction BuiltCommitmentTransaction_clone(const struct LDKBuiltCommitmentTransaction *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_clone")] public static extern long BuiltCommitmentTransaction_clone(long _orig);
        // struct LDKCVec_u8Z BuiltCommitmentTransaction_write(const struct LDKBuiltCommitmentTransaction *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_write")] public static extern byte[] BuiltCommitmentTransaction_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_write")] public static extern long BuiltCommitmentTransaction_write(long _obj);
        // struct LDKCResult_BuiltCommitmentTransactionDecodeErrorZ BuiltCommitmentTransaction_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_read")] public static extern long BuiltCommitmentTransaction_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_read")] public static extern long BuiltCommitmentTransaction_read(long _ser);
        // MUST_USE_RES struct LDKThirtyTwoBytes BuiltCommitmentTransaction_get_sighash_all(const struct LDKBuiltCommitmentTransaction *NONNULL_PTR this_arg, struct LDKu8slice funding_redeemscript, uint64_t channel_value_satoshis);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_get_sighash_all")] public static extern byte[] BuiltCommitmentTransaction_get_sighash_all(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_redeemscript, long _channel_value_satoshis);
-       // MUST_USE_RES struct LDKSignature BuiltCommitmentTransaction_sign_counterparty_commitment(const struct LDKBuiltCommitmentTransaction *NONNULL_PTR this_arg, const uint8_t (*funding_key)[32], struct LDKu8slice funding_redeemscript, uint64_t channel_value_satoshis);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_sign_counterparty_commitment")] public static extern byte[] BuiltCommitmentTransaction_sign_counterparty_commitment(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_key, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_redeemscript, long _channel_value_satoshis);
-       // MUST_USE_RES struct LDKSignature BuiltCommitmentTransaction_sign_holder_commitment(const struct LDKBuiltCommitmentTransaction *NONNULL_PTR this_arg, const uint8_t (*funding_key)[32], struct LDKu8slice funding_redeemscript, uint64_t channel_value_satoshis, const struct LDKEntropySource *NONNULL_PTR entropy_source);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_sign_holder_commitment")] public static extern byte[] BuiltCommitmentTransaction_sign_holder_commitment(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_key, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_redeemscript, long _channel_value_satoshis, long _entropy_source);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_get_sighash_all")] public static extern long BuiltCommitmentTransaction_get_sighash_all(long _this_arg, long _funding_redeemscript, long _channel_value_satoshis);
+       // MUST_USE_RES struct LDKECDSASignature BuiltCommitmentTransaction_sign_counterparty_commitment(const struct LDKBuiltCommitmentTransaction *NONNULL_PTR this_arg, const uint8_t (*funding_key)[32], struct LDKu8slice funding_redeemscript, uint64_t channel_value_satoshis);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_sign_counterparty_commitment")] public static extern long BuiltCommitmentTransaction_sign_counterparty_commitment(long _this_arg, long _funding_key, long _funding_redeemscript, long _channel_value_satoshis);
+       // MUST_USE_RES struct LDKECDSASignature BuiltCommitmentTransaction_sign_holder_commitment(const struct LDKBuiltCommitmentTransaction *NONNULL_PTR this_arg, const uint8_t (*funding_key)[32], struct LDKu8slice funding_redeemscript, uint64_t channel_value_satoshis, const struct LDKEntropySource *NONNULL_PTR entropy_source);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BuiltCommitmentTransaction_sign_holder_commitment")] public static extern long BuiltCommitmentTransaction_sign_holder_commitment(long _this_arg, long _funding_key, long _funding_redeemscript, long _channel_value_satoshis, long _entropy_source);
        // void ClosingTransaction_free(struct LDKClosingTransaction this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingTransaction_free")] public static extern void ClosingTransaction_free(long _this_obj);
        // uint64_t ClosingTransaction_clone_ptr(LDKClosingTransaction *NONNULL_PTR arg);
@@ -7715,7 +8747,7 @@ internal class bindings {
        // bool ClosingTransaction_eq(const struct LDKClosingTransaction *NONNULL_PTR a, const struct LDKClosingTransaction *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingTransaction_eq")] public static extern bool ClosingTransaction_eq(long _a, long _b);
        // MUST_USE_RES struct LDKClosingTransaction ClosingTransaction_new(uint64_t to_holder_value_sat, uint64_t to_counterparty_value_sat, struct LDKCVec_u8Z to_holder_script, struct LDKCVec_u8Z to_counterparty_script, struct LDKOutPoint funding_outpoint);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingTransaction_new")] public static extern long ClosingTransaction_new(long _to_holder_value_sat, long _to_counterparty_value_sat, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _to_holder_script, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _to_counterparty_script, long _funding_outpoint);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingTransaction_new")] public static extern long ClosingTransaction_new(long _to_holder_value_sat, long _to_counterparty_value_sat, long _to_holder_script, long _to_counterparty_script, long _funding_outpoint);
        // MUST_USE_RES struct LDKTrustedClosingTransaction ClosingTransaction_trust(const struct LDKClosingTransaction *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingTransaction_trust")] public static extern long ClosingTransaction_trust(long _this_arg);
        // MUST_USE_RES struct LDKCResult_TrustedClosingTransactionNoneZ ClosingTransaction_verify(const struct LDKClosingTransaction *NONNULL_PTR this_arg, struct LDKOutPoint funding_outpoint);
@@ -7725,17 +8757,17 @@ internal class bindings {
        // MUST_USE_RES uint64_t ClosingTransaction_to_counterparty_value_sat(const struct LDKClosingTransaction *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingTransaction_to_counterparty_value_sat")] public static extern long ClosingTransaction_to_counterparty_value_sat(long _this_arg);
        // MUST_USE_RES struct LDKu8slice ClosingTransaction_to_holder_script(const struct LDKClosingTransaction *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingTransaction_to_holder_script")] public static extern byte[] ClosingTransaction_to_holder_script(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingTransaction_to_holder_script")] public static extern long ClosingTransaction_to_holder_script(long _this_arg);
        // MUST_USE_RES struct LDKu8slice ClosingTransaction_to_counterparty_script(const struct LDKClosingTransaction *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingTransaction_to_counterparty_script")] public static extern byte[] ClosingTransaction_to_counterparty_script(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingTransaction_to_counterparty_script")] public static extern long ClosingTransaction_to_counterparty_script(long _this_arg);
        // void TrustedClosingTransaction_free(struct LDKTrustedClosingTransaction this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedClosingTransaction_free")] public static extern void TrustedClosingTransaction_free(long _this_obj);
        // MUST_USE_RES struct LDKTransaction TrustedClosingTransaction_built_transaction(const struct LDKTrustedClosingTransaction *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedClosingTransaction_built_transaction")] public static extern byte[] TrustedClosingTransaction_built_transaction(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedClosingTransaction_built_transaction")] public static extern long TrustedClosingTransaction_built_transaction(long _this_arg);
        // MUST_USE_RES struct LDKThirtyTwoBytes TrustedClosingTransaction_get_sighash_all(const struct LDKTrustedClosingTransaction *NONNULL_PTR this_arg, struct LDKu8slice funding_redeemscript, uint64_t channel_value_satoshis);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedClosingTransaction_get_sighash_all")] public static extern byte[] TrustedClosingTransaction_get_sighash_all(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_redeemscript, long _channel_value_satoshis);
-       // MUST_USE_RES struct LDKSignature TrustedClosingTransaction_sign(const struct LDKTrustedClosingTransaction *NONNULL_PTR this_arg, const uint8_t (*funding_key)[32], struct LDKu8slice funding_redeemscript, uint64_t channel_value_satoshis);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedClosingTransaction_sign")] public static extern byte[] TrustedClosingTransaction_sign(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_key, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_redeemscript, long _channel_value_satoshis);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedClosingTransaction_get_sighash_all")] public static extern long TrustedClosingTransaction_get_sighash_all(long _this_arg, long _funding_redeemscript, long _channel_value_satoshis);
+       // MUST_USE_RES struct LDKECDSASignature TrustedClosingTransaction_sign(const struct LDKTrustedClosingTransaction *NONNULL_PTR this_arg, const uint8_t (*funding_key)[32], struct LDKu8slice funding_redeemscript, uint64_t channel_value_satoshis);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedClosingTransaction_sign")] public static extern long TrustedClosingTransaction_sign(long _this_arg, long _funding_key, long _funding_redeemscript, long _channel_value_satoshis);
        // void CommitmentTransaction_free(struct LDKCommitmentTransaction this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentTransaction_free")] public static extern void CommitmentTransaction_free(long _this_obj);
        // uint64_t CommitmentTransaction_clone_ptr(LDKCommitmentTransaction *NONNULL_PTR arg);
@@ -7743,11 +8775,13 @@ internal class bindings {
        // struct LDKCommitmentTransaction CommitmentTransaction_clone(const struct LDKCommitmentTransaction *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentTransaction_clone")] public static extern long CommitmentTransaction_clone(long _orig);
        // struct LDKCVec_u8Z CommitmentTransaction_write(const struct LDKCommitmentTransaction *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentTransaction_write")] public static extern byte[] CommitmentTransaction_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentTransaction_write")] public static extern long CommitmentTransaction_write(long _obj);
        // struct LDKCResult_CommitmentTransactionDecodeErrorZ CommitmentTransaction_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentTransaction_read")] public static extern long CommitmentTransaction_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentTransaction_read")] public static extern long CommitmentTransaction_read(long _ser);
        // MUST_USE_RES uint64_t CommitmentTransaction_commitment_number(const struct LDKCommitmentTransaction *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentTransaction_commitment_number")] public static extern long CommitmentTransaction_commitment_number(long _this_arg);
+       // MUST_USE_RES struct LDKPublicKey CommitmentTransaction_per_commitment_point(const struct LDKCommitmentTransaction *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentTransaction_per_commitment_point")] public static extern long CommitmentTransaction_per_commitment_point(long _this_arg);
        // MUST_USE_RES uint64_t CommitmentTransaction_to_broadcaster_value_sat(const struct LDKCommitmentTransaction *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentTransaction_to_broadcaster_value_sat")] public static extern long CommitmentTransaction_to_broadcaster_value_sat(long _this_arg);
        // MUST_USE_RES uint64_t CommitmentTransaction_to_countersignatory_value_sat(const struct LDKCommitmentTransaction *NONNULL_PTR this_arg);
@@ -7761,17 +8795,21 @@ internal class bindings {
        // void TrustedCommitmentTransaction_free(struct LDKTrustedCommitmentTransaction this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedCommitmentTransaction_free")] public static extern void TrustedCommitmentTransaction_free(long _this_obj);
        // MUST_USE_RES struct LDKThirtyTwoBytes TrustedCommitmentTransaction_txid(const struct LDKTrustedCommitmentTransaction *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedCommitmentTransaction_txid")] public static extern byte[] TrustedCommitmentTransaction_txid(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedCommitmentTransaction_txid")] public static extern long TrustedCommitmentTransaction_txid(long _this_arg);
        // MUST_USE_RES struct LDKBuiltCommitmentTransaction TrustedCommitmentTransaction_built_transaction(const struct LDKTrustedCommitmentTransaction *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedCommitmentTransaction_built_transaction")] public static extern long TrustedCommitmentTransaction_built_transaction(long _this_arg);
        // MUST_USE_RES struct LDKTxCreationKeys TrustedCommitmentTransaction_keys(const struct LDKTrustedCommitmentTransaction *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedCommitmentTransaction_keys")] public static extern long TrustedCommitmentTransaction_keys(long _this_arg);
        // MUST_USE_RES struct LDKChannelTypeFeatures TrustedCommitmentTransaction_channel_type_features(const struct LDKTrustedCommitmentTransaction *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedCommitmentTransaction_channel_type_features")] public static extern long TrustedCommitmentTransaction_channel_type_features(long _this_arg);
-       // MUST_USE_RES struct LDKCResult_CVec_SignatureZNoneZ TrustedCommitmentTransaction_get_htlc_sigs(const struct LDKTrustedCommitmentTransaction *NONNULL_PTR this_arg, const uint8_t (*htlc_base_key)[32], const struct LDKDirectedChannelTransactionParameters *NONNULL_PTR channel_parameters, const struct LDKEntropySource *NONNULL_PTR entropy_source);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedCommitmentTransaction_get_htlc_sigs")] public static extern long TrustedCommitmentTransaction_get_htlc_sigs(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _htlc_base_key, long _channel_parameters, long _entropy_source);
+       // MUST_USE_RES struct LDKCResult_CVec_ECDSASignatureZNoneZ TrustedCommitmentTransaction_get_htlc_sigs(const struct LDKTrustedCommitmentTransaction *NONNULL_PTR this_arg, const uint8_t (*htlc_base_key)[32], const struct LDKDirectedChannelTransactionParameters *NONNULL_PTR channel_parameters, const struct LDKEntropySource *NONNULL_PTR entropy_source);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedCommitmentTransaction_get_htlc_sigs")] public static extern long TrustedCommitmentTransaction_get_htlc_sigs(long _this_arg, long _htlc_base_key, long _channel_parameters, long _entropy_source);
+       // MUST_USE_RES struct LDKCOption_usizeZ TrustedCommitmentTransaction_revokeable_output_index(const struct LDKTrustedCommitmentTransaction *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedCommitmentTransaction_revokeable_output_index")] public static extern long TrustedCommitmentTransaction_revokeable_output_index(long _this_arg);
+       // MUST_USE_RES struct LDKCResult_TransactionNoneZ TrustedCommitmentTransaction_build_to_local_justice_tx(const struct LDKTrustedCommitmentTransaction *NONNULL_PTR this_arg, uint64_t feerate_per_kw, struct LDKCVec_u8Z destination_script);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TrustedCommitmentTransaction_build_to_local_justice_tx")] public static extern long TrustedCommitmentTransaction_build_to_local_justice_tx(long _this_arg, long _feerate_per_kw, long _destination_script);
        // uint64_t get_commitment_transaction_number_obscure_factor(struct LDKPublicKey broadcaster_payment_basepoint, struct LDKPublicKey countersignatory_payment_basepoint, bool outbound_from_broadcaster);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_get_commitment_transaction_number_obscure_factor")] public static extern long get_commitment_transaction_number_obscure_factor([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _broadcaster_payment_basepoint, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _countersignatory_payment_basepoint, bool _outbound_from_broadcaster);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_get_commitment_transaction_number_obscure_factor")] public static extern long get_commitment_transaction_number_obscure_factor(long _broadcaster_payment_basepoint, long _countersignatory_payment_basepoint, bool _outbound_from_broadcaster);
        // bool InitFeatures_eq(const struct LDKInitFeatures *NONNULL_PTR a, const struct LDKInitFeatures *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_eq")] public static extern bool InitFeatures_eq(long _a, long _b);
        // bool NodeFeatures_eq(const struct LDKNodeFeatures *NONNULL_PTR a, const struct LDKNodeFeatures *NONNULL_PTR b);
@@ -7850,6 +8888,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_requires_unknown_bits_from")] public static extern bool InitFeatures_requires_unknown_bits_from(long _this_arg, long _other);
        // MUST_USE_RES bool InitFeatures_requires_unknown_bits(const struct LDKInitFeatures *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_requires_unknown_bits")] public static extern bool InitFeatures_requires_unknown_bits(long _this_arg);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ InitFeatures_set_required_feature_bit(struct LDKInitFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_set_required_feature_bit")] public static extern long InitFeatures_set_required_feature_bit(long _this_arg, long _bit);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ InitFeatures_set_optional_feature_bit(struct LDKInitFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_set_optional_feature_bit")] public static extern long InitFeatures_set_optional_feature_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ InitFeatures_set_required_custom_bit(struct LDKInitFeatures *NONNULL_PTR this_arg, uintptr_t bit);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_set_required_custom_bit")] public static extern long InitFeatures_set_required_custom_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ InitFeatures_set_optional_custom_bit(struct LDKInitFeatures *NONNULL_PTR this_arg, uintptr_t bit);
@@ -7860,6 +8902,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_requires_unknown_bits_from")] public static extern bool NodeFeatures_requires_unknown_bits_from(long _this_arg, long _other);
        // MUST_USE_RES bool NodeFeatures_requires_unknown_bits(const struct LDKNodeFeatures *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_requires_unknown_bits")] public static extern bool NodeFeatures_requires_unknown_bits(long _this_arg);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ NodeFeatures_set_required_feature_bit(struct LDKNodeFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_set_required_feature_bit")] public static extern long NodeFeatures_set_required_feature_bit(long _this_arg, long _bit);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ NodeFeatures_set_optional_feature_bit(struct LDKNodeFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_set_optional_feature_bit")] public static extern long NodeFeatures_set_optional_feature_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ NodeFeatures_set_required_custom_bit(struct LDKNodeFeatures *NONNULL_PTR this_arg, uintptr_t bit);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_set_required_custom_bit")] public static extern long NodeFeatures_set_required_custom_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ NodeFeatures_set_optional_custom_bit(struct LDKNodeFeatures *NONNULL_PTR this_arg, uintptr_t bit);
@@ -7870,6 +8916,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelFeatures_requires_unknown_bits_from")] public static extern bool ChannelFeatures_requires_unknown_bits_from(long _this_arg, long _other);
        // MUST_USE_RES bool ChannelFeatures_requires_unknown_bits(const struct LDKChannelFeatures *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelFeatures_requires_unknown_bits")] public static extern bool ChannelFeatures_requires_unknown_bits(long _this_arg);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ ChannelFeatures_set_required_feature_bit(struct LDKChannelFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelFeatures_set_required_feature_bit")] public static extern long ChannelFeatures_set_required_feature_bit(long _this_arg, long _bit);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ ChannelFeatures_set_optional_feature_bit(struct LDKChannelFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelFeatures_set_optional_feature_bit")] public static extern long ChannelFeatures_set_optional_feature_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ ChannelFeatures_set_required_custom_bit(struct LDKChannelFeatures *NONNULL_PTR this_arg, uintptr_t bit);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelFeatures_set_required_custom_bit")] public static extern long ChannelFeatures_set_required_custom_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ ChannelFeatures_set_optional_custom_bit(struct LDKChannelFeatures *NONNULL_PTR this_arg, uintptr_t bit);
@@ -7880,6 +8930,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11InvoiceFeatures_requires_unknown_bits_from")] public static extern bool Bolt11InvoiceFeatures_requires_unknown_bits_from(long _this_arg, long _other);
        // MUST_USE_RES bool Bolt11InvoiceFeatures_requires_unknown_bits(const struct LDKBolt11InvoiceFeatures *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11InvoiceFeatures_requires_unknown_bits")] public static extern bool Bolt11InvoiceFeatures_requires_unknown_bits(long _this_arg);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ Bolt11InvoiceFeatures_set_required_feature_bit(struct LDKBolt11InvoiceFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11InvoiceFeatures_set_required_feature_bit")] public static extern long Bolt11InvoiceFeatures_set_required_feature_bit(long _this_arg, long _bit);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ Bolt11InvoiceFeatures_set_optional_feature_bit(struct LDKBolt11InvoiceFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11InvoiceFeatures_set_optional_feature_bit")] public static extern long Bolt11InvoiceFeatures_set_optional_feature_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ Bolt11InvoiceFeatures_set_required_custom_bit(struct LDKBolt11InvoiceFeatures *NONNULL_PTR this_arg, uintptr_t bit);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11InvoiceFeatures_set_required_custom_bit")] public static extern long Bolt11InvoiceFeatures_set_required_custom_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ Bolt11InvoiceFeatures_set_optional_custom_bit(struct LDKBolt11InvoiceFeatures *NONNULL_PTR this_arg, uintptr_t bit);
@@ -7890,6 +8944,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OfferFeatures_requires_unknown_bits_from")] public static extern bool OfferFeatures_requires_unknown_bits_from(long _this_arg, long _other);
        // MUST_USE_RES bool OfferFeatures_requires_unknown_bits(const struct LDKOfferFeatures *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OfferFeatures_requires_unknown_bits")] public static extern bool OfferFeatures_requires_unknown_bits(long _this_arg);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ OfferFeatures_set_required_feature_bit(struct LDKOfferFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OfferFeatures_set_required_feature_bit")] public static extern long OfferFeatures_set_required_feature_bit(long _this_arg, long _bit);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ OfferFeatures_set_optional_feature_bit(struct LDKOfferFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OfferFeatures_set_optional_feature_bit")] public static extern long OfferFeatures_set_optional_feature_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ OfferFeatures_set_required_custom_bit(struct LDKOfferFeatures *NONNULL_PTR this_arg, uintptr_t bit);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OfferFeatures_set_required_custom_bit")] public static extern long OfferFeatures_set_required_custom_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ OfferFeatures_set_optional_custom_bit(struct LDKOfferFeatures *NONNULL_PTR this_arg, uintptr_t bit);
@@ -7900,6 +8958,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequestFeatures_requires_unknown_bits_from")] public static extern bool InvoiceRequestFeatures_requires_unknown_bits_from(long _this_arg, long _other);
        // MUST_USE_RES bool InvoiceRequestFeatures_requires_unknown_bits(const struct LDKInvoiceRequestFeatures *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequestFeatures_requires_unknown_bits")] public static extern bool InvoiceRequestFeatures_requires_unknown_bits(long _this_arg);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ InvoiceRequestFeatures_set_required_feature_bit(struct LDKInvoiceRequestFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequestFeatures_set_required_feature_bit")] public static extern long InvoiceRequestFeatures_set_required_feature_bit(long _this_arg, long _bit);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ InvoiceRequestFeatures_set_optional_feature_bit(struct LDKInvoiceRequestFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequestFeatures_set_optional_feature_bit")] public static extern long InvoiceRequestFeatures_set_optional_feature_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ InvoiceRequestFeatures_set_required_custom_bit(struct LDKInvoiceRequestFeatures *NONNULL_PTR this_arg, uintptr_t bit);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequestFeatures_set_required_custom_bit")] public static extern long InvoiceRequestFeatures_set_required_custom_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ InvoiceRequestFeatures_set_optional_custom_bit(struct LDKInvoiceRequestFeatures *NONNULL_PTR this_arg, uintptr_t bit);
@@ -7910,6 +8972,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12InvoiceFeatures_requires_unknown_bits_from")] public static extern bool Bolt12InvoiceFeatures_requires_unknown_bits_from(long _this_arg, long _other);
        // MUST_USE_RES bool Bolt12InvoiceFeatures_requires_unknown_bits(const struct LDKBolt12InvoiceFeatures *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12InvoiceFeatures_requires_unknown_bits")] public static extern bool Bolt12InvoiceFeatures_requires_unknown_bits(long _this_arg);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ Bolt12InvoiceFeatures_set_required_feature_bit(struct LDKBolt12InvoiceFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12InvoiceFeatures_set_required_feature_bit")] public static extern long Bolt12InvoiceFeatures_set_required_feature_bit(long _this_arg, long _bit);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ Bolt12InvoiceFeatures_set_optional_feature_bit(struct LDKBolt12InvoiceFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12InvoiceFeatures_set_optional_feature_bit")] public static extern long Bolt12InvoiceFeatures_set_optional_feature_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ Bolt12InvoiceFeatures_set_required_custom_bit(struct LDKBolt12InvoiceFeatures *NONNULL_PTR this_arg, uintptr_t bit);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12InvoiceFeatures_set_required_custom_bit")] public static extern long Bolt12InvoiceFeatures_set_required_custom_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ Bolt12InvoiceFeatures_set_optional_custom_bit(struct LDKBolt12InvoiceFeatures *NONNULL_PTR this_arg, uintptr_t bit);
@@ -7920,6 +8986,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHopFeatures_requires_unknown_bits_from")] public static extern bool BlindedHopFeatures_requires_unknown_bits_from(long _this_arg, long _other);
        // MUST_USE_RES bool BlindedHopFeatures_requires_unknown_bits(const struct LDKBlindedHopFeatures *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHopFeatures_requires_unknown_bits")] public static extern bool BlindedHopFeatures_requires_unknown_bits(long _this_arg);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ BlindedHopFeatures_set_required_feature_bit(struct LDKBlindedHopFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHopFeatures_set_required_feature_bit")] public static extern long BlindedHopFeatures_set_required_feature_bit(long _this_arg, long _bit);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ BlindedHopFeatures_set_optional_feature_bit(struct LDKBlindedHopFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHopFeatures_set_optional_feature_bit")] public static extern long BlindedHopFeatures_set_optional_feature_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ BlindedHopFeatures_set_required_custom_bit(struct LDKBlindedHopFeatures *NONNULL_PTR this_arg, uintptr_t bit);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHopFeatures_set_required_custom_bit")] public static extern long BlindedHopFeatures_set_required_custom_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ BlindedHopFeatures_set_optional_custom_bit(struct LDKBlindedHopFeatures *NONNULL_PTR this_arg, uintptr_t bit);
@@ -7930,38 +9000,42 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_requires_unknown_bits_from")] public static extern bool ChannelTypeFeatures_requires_unknown_bits_from(long _this_arg, long _other);
        // MUST_USE_RES bool ChannelTypeFeatures_requires_unknown_bits(const struct LDKChannelTypeFeatures *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_requires_unknown_bits")] public static extern bool ChannelTypeFeatures_requires_unknown_bits(long _this_arg);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ ChannelTypeFeatures_set_required_feature_bit(struct LDKChannelTypeFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_set_required_feature_bit")] public static extern long ChannelTypeFeatures_set_required_feature_bit(long _this_arg, long _bit);
+       // MUST_USE_RES struct LDKCResult_NoneNoneZ ChannelTypeFeatures_set_optional_feature_bit(struct LDKChannelTypeFeatures *NONNULL_PTR this_arg, uintptr_t bit);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_set_optional_feature_bit")] public static extern long ChannelTypeFeatures_set_optional_feature_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ ChannelTypeFeatures_set_required_custom_bit(struct LDKChannelTypeFeatures *NONNULL_PTR this_arg, uintptr_t bit);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_set_required_custom_bit")] public static extern long ChannelTypeFeatures_set_required_custom_bit(long _this_arg, long _bit);
        // MUST_USE_RES struct LDKCResult_NoneNoneZ ChannelTypeFeatures_set_optional_custom_bit(struct LDKChannelTypeFeatures *NONNULL_PTR this_arg, uintptr_t bit);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_set_optional_custom_bit")] public static extern long ChannelTypeFeatures_set_optional_custom_bit(long _this_arg, long _bit);
        // struct LDKCVec_u8Z InitFeatures_write(const struct LDKInitFeatures *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_write")] public static extern byte[] InitFeatures_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_write")] public static extern long InitFeatures_write(long _obj);
        // struct LDKCResult_InitFeaturesDecodeErrorZ InitFeatures_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_read")] public static extern long InitFeatures_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_read")] public static extern long InitFeatures_read(long _ser);
        // struct LDKCVec_u8Z ChannelFeatures_write(const struct LDKChannelFeatures *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelFeatures_write")] public static extern byte[] ChannelFeatures_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelFeatures_write")] public static extern long ChannelFeatures_write(long _obj);
        // struct LDKCResult_ChannelFeaturesDecodeErrorZ ChannelFeatures_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelFeatures_read")] public static extern long ChannelFeatures_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelFeatures_read")] public static extern long ChannelFeatures_read(long _ser);
        // struct LDKCVec_u8Z NodeFeatures_write(const struct LDKNodeFeatures *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_write")] public static extern byte[] NodeFeatures_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_write")] public static extern long NodeFeatures_write(long _obj);
        // struct LDKCResult_NodeFeaturesDecodeErrorZ NodeFeatures_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_read")] public static extern long NodeFeatures_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_read")] public static extern long NodeFeatures_read(long _ser);
        // struct LDKCVec_u8Z Bolt11InvoiceFeatures_write(const struct LDKBolt11InvoiceFeatures *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11InvoiceFeatures_write")] public static extern byte[] Bolt11InvoiceFeatures_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11InvoiceFeatures_write")] public static extern long Bolt11InvoiceFeatures_write(long _obj);
        // struct LDKCResult_Bolt11InvoiceFeaturesDecodeErrorZ Bolt11InvoiceFeatures_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11InvoiceFeatures_read")] public static extern long Bolt11InvoiceFeatures_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11InvoiceFeatures_read")] public static extern long Bolt11InvoiceFeatures_read(long _ser);
        // struct LDKCVec_u8Z Bolt12InvoiceFeatures_write(const struct LDKBolt12InvoiceFeatures *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12InvoiceFeatures_write")] public static extern byte[] Bolt12InvoiceFeatures_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12InvoiceFeatures_write")] public static extern long Bolt12InvoiceFeatures_write(long _obj);
        // struct LDKCResult_Bolt12InvoiceFeaturesDecodeErrorZ Bolt12InvoiceFeatures_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12InvoiceFeatures_read")] public static extern long Bolt12InvoiceFeatures_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12InvoiceFeatures_read")] public static extern long Bolt12InvoiceFeatures_read(long _ser);
        // struct LDKCVec_u8Z BlindedHopFeatures_write(const struct LDKBlindedHopFeatures *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHopFeatures_write")] public static extern byte[] BlindedHopFeatures_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHopFeatures_write")] public static extern long BlindedHopFeatures_write(long _obj);
        // struct LDKCResult_BlindedHopFeaturesDecodeErrorZ BlindedHopFeatures_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHopFeatures_read")] public static extern long BlindedHopFeatures_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHopFeatures_read")] public static extern long BlindedHopFeatures_read(long _ser);
        // struct LDKCVec_u8Z ChannelTypeFeatures_write(const struct LDKChannelTypeFeatures *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_write")] public static extern byte[] ChannelTypeFeatures_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_write")] public static extern long ChannelTypeFeatures_write(long _obj);
        // struct LDKCResult_ChannelTypeFeaturesDecodeErrorZ ChannelTypeFeatures_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_read")] public static extern long ChannelTypeFeatures_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_read")] public static extern long ChannelTypeFeatures_read(long _ser);
        // void InitFeatures_set_data_loss_protect_optional(struct LDKInitFeatures *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_set_data_loss_protect_optional")] public static extern void InitFeatures_set_data_loss_protect_optional(long _this_arg);
        // void InitFeatures_set_data_loss_protect_required(struct LDKInitFeatures *NONNULL_PTR this_arg);
@@ -8200,6 +9274,30 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_requires_shutdown_anysegwit")] public static extern bool InitFeatures_requires_shutdown_anysegwit(long _this_arg);
        // MUST_USE_RES bool NodeFeatures_requires_shutdown_anysegwit(const struct LDKNodeFeatures *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_requires_shutdown_anysegwit")] public static extern bool NodeFeatures_requires_shutdown_anysegwit(long _this_arg);
+       // void InitFeatures_set_taproot_optional(struct LDKInitFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_set_taproot_optional")] public static extern void InitFeatures_set_taproot_optional(long _this_arg);
+       // void InitFeatures_set_taproot_required(struct LDKInitFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_set_taproot_required")] public static extern void InitFeatures_set_taproot_required(long _this_arg);
+       // MUST_USE_RES bool InitFeatures_supports_taproot(const struct LDKInitFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_supports_taproot")] public static extern bool InitFeatures_supports_taproot(long _this_arg);
+       // void NodeFeatures_set_taproot_optional(struct LDKNodeFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_set_taproot_optional")] public static extern void NodeFeatures_set_taproot_optional(long _this_arg);
+       // void NodeFeatures_set_taproot_required(struct LDKNodeFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_set_taproot_required")] public static extern void NodeFeatures_set_taproot_required(long _this_arg);
+       // MUST_USE_RES bool NodeFeatures_supports_taproot(const struct LDKNodeFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_supports_taproot")] public static extern bool NodeFeatures_supports_taproot(long _this_arg);
+       // void ChannelTypeFeatures_set_taproot_optional(struct LDKChannelTypeFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_set_taproot_optional")] public static extern void ChannelTypeFeatures_set_taproot_optional(long _this_arg);
+       // void ChannelTypeFeatures_set_taproot_required(struct LDKChannelTypeFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_set_taproot_required")] public static extern void ChannelTypeFeatures_set_taproot_required(long _this_arg);
+       // MUST_USE_RES bool ChannelTypeFeatures_supports_taproot(const struct LDKChannelTypeFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_supports_taproot")] public static extern bool ChannelTypeFeatures_supports_taproot(long _this_arg);
+       // MUST_USE_RES bool InitFeatures_requires_taproot(const struct LDKInitFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_requires_taproot")] public static extern bool InitFeatures_requires_taproot(long _this_arg);
+       // MUST_USE_RES bool NodeFeatures_requires_taproot(const struct LDKNodeFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_requires_taproot")] public static extern bool NodeFeatures_requires_taproot(long _this_arg);
+       // MUST_USE_RES bool ChannelTypeFeatures_requires_taproot(const struct LDKChannelTypeFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_requires_taproot")] public static extern bool ChannelTypeFeatures_requires_taproot(long _this_arg);
        // void InitFeatures_set_onion_messages_optional(struct LDKInitFeatures *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_set_onion_messages_optional")] public static extern void InitFeatures_set_onion_messages_optional(long _this_arg);
        // void InitFeatures_set_onion_messages_required(struct LDKInitFeatures *NONNULL_PTR this_arg);
@@ -8307,29 +9405,29 @@ internal class bindings {
        // 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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvalidShutdownScript_get_script")] public static extern byte[] InvalidShutdownScript_get_script(long _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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvalidShutdownScript_set_script")] public static extern void InvalidShutdownScript_set_script(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKInvalidShutdownScript InvalidShutdownScript_new(struct LDKCVec_u8Z script_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvalidShutdownScript_new")] public static extern long InvalidShutdownScript_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _script_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvalidShutdownScript_new")] public static extern long InvalidShutdownScript_new(long _script_arg);
        // uint64_t InvalidShutdownScript_clone_ptr(LDKInvalidShutdownScript *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvalidShutdownScript_clone_ptr")] public static extern long InvalidShutdownScript_clone_ptr(long _arg);
        // struct LDKInvalidShutdownScript InvalidShutdownScript_clone(const struct LDKInvalidShutdownScript *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvalidShutdownScript_clone")] public static extern long InvalidShutdownScript_clone(long _orig);
        // struct LDKCVec_u8Z ShutdownScript_write(const struct LDKShutdownScript *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ShutdownScript_write")] public static extern byte[] ShutdownScript_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ShutdownScript_write")] public static extern long ShutdownScript_write(long _obj);
        // struct LDKCResult_ShutdownScriptDecodeErrorZ ShutdownScript_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ShutdownScript_read")] public static extern long ShutdownScript_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ShutdownScript_read")] public static extern long ShutdownScript_read(long _ser);
        // MUST_USE_RES struct LDKShutdownScript ShutdownScript_new_p2wpkh(const uint8_t (*pubkey_hash)[20]);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ShutdownScript_new_p2wpkh")] public static extern long ShutdownScript_new_p2wpkh([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _pubkey_hash);
+       [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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _script_hash);
+       [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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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 LDKCVec_u8Z ShutdownScript_into_inner(struct LDKShutdownScript this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ShutdownScript_into_inner")] public static extern byte[] ShutdownScript_into_inner(long _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ShutdownScript_as_legacy_pubkey")] public static extern byte[] ShutdownScript_as_legacy_pubkey(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ShutdownScript_as_legacy_pubkey")] public static extern long ShutdownScript_as_legacy_pubkey(long _this_arg);
        // MUST_USE_RES bool ShutdownScript_is_compatible(const struct LDKShutdownScript *NONNULL_PTR this_arg, const struct LDKInitFeatures *NONNULL_PTR features);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ShutdownScript_is_compatible")] public static extern bool ShutdownScript_is_compatible(long _this_arg, long _features);
        // void Retry_free(struct LDKRetry this_ptr);
@@ -8338,14 +9436,18 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Retry_clone_ptr")] public static extern long Retry_clone_ptr(long _arg);
        // struct LDKRetry Retry_clone(const struct LDKRetry *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Retry_clone")] public static extern long Retry_clone(long _orig);
-       // struct LDKRetry Retry_attempts(uintptr_t a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Retry_attempts")] public static extern long Retry_attempts(long _a);
+       // struct LDKRetry Retry_attempts(uint32_t a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Retry_attempts")] public static extern long Retry_attempts(int _a);
        // struct LDKRetry Retry_timeout(uint64_t a);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Retry_timeout")] public static extern long Retry_timeout(long _a);
        // bool Retry_eq(const struct LDKRetry *NONNULL_PTR a, const struct LDKRetry *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Retry_eq")] public static extern bool Retry_eq(long _a, long _b);
        // uint64_t Retry_hash(const struct LDKRetry *NONNULL_PTR o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Retry_hash")] public static extern long Retry_hash(long _o);
+       // struct LDKCVec_u8Z Retry_write(const struct LDKRetry *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Retry_write")] public static extern long Retry_write(long _obj);
+       // struct LDKCResult_RetryDecodeErrorZ Retry_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Retry_read")] public static extern long Retry_read(long _ser);
        // enum LDKRetryableSendFailure RetryableSendFailure_clone(const enum LDKRetryableSendFailure *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RetryableSendFailure_clone")] public static extern RetryableSendFailure RetryableSendFailure_clone(long _orig);
        // enum LDKRetryableSendFailure RetryableSendFailure_payment_expired(void);
@@ -8365,25 +9467,37 @@ internal class bindings {
        // struct LDKPaymentSendFailure PaymentSendFailure_parameter_error(struct LDKAPIError a);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentSendFailure_parameter_error")] public static extern long PaymentSendFailure_parameter_error(long _a);
        // struct LDKPaymentSendFailure PaymentSendFailure_path_parameter_error(struct LDKCVec_CResult_NoneAPIErrorZZ a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentSendFailure_path_parameter_error")] public static extern long PaymentSendFailure_path_parameter_error([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentSendFailure_path_parameter_error")] public static extern long PaymentSendFailure_path_parameter_error(long _a);
        // struct LDKPaymentSendFailure PaymentSendFailure_all_failed_resend_safe(struct LDKCVec_APIErrorZ a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentSendFailure_all_failed_resend_safe")] public static extern long PaymentSendFailure_all_failed_resend_safe([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentSendFailure_all_failed_resend_safe")] public static extern long PaymentSendFailure_all_failed_resend_safe(long _a);
        // struct LDKPaymentSendFailure PaymentSendFailure_duplicate_payment(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentSendFailure_duplicate_payment")] public static extern long PaymentSendFailure_duplicate_payment();
        // struct LDKPaymentSendFailure PaymentSendFailure_partial_failure(struct LDKCVec_CResult_NoneAPIErrorZZ results, struct LDKRouteParameters failed_paths_retry, struct LDKThirtyTwoBytes payment_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentSendFailure_partial_failure")] public static extern long PaymentSendFailure_partial_failure([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _results, long _failed_paths_retry, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentSendFailure_partial_failure")] public static extern long PaymentSendFailure_partial_failure(long _results, long _failed_paths_retry, long _payment_id);
+       // bool PaymentSendFailure_eq(const struct LDKPaymentSendFailure *NONNULL_PTR a, const struct LDKPaymentSendFailure *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentSendFailure_eq")] public static extern bool PaymentSendFailure_eq(long _a, long _b);
+       // void ProbeSendFailure_free(struct LDKProbeSendFailure this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbeSendFailure_free")] public static extern void ProbeSendFailure_free(long _this_ptr);
+       // uint64_t ProbeSendFailure_clone_ptr(LDKProbeSendFailure *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbeSendFailure_clone_ptr")] public static extern long ProbeSendFailure_clone_ptr(long _arg);
+       // struct LDKProbeSendFailure ProbeSendFailure_clone(const struct LDKProbeSendFailure *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbeSendFailure_clone")] public static extern long ProbeSendFailure_clone(long _orig);
+       // struct LDKProbeSendFailure ProbeSendFailure_route_not_found(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbeSendFailure_route_not_found")] public static extern long ProbeSendFailure_route_not_found();
+       // struct LDKProbeSendFailure ProbeSendFailure_sending_failed(struct LDKPaymentSendFailure a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbeSendFailure_sending_failed")] public static extern long ProbeSendFailure_sending_failed(long _a);
+       // bool ProbeSendFailure_eq(const struct LDKProbeSendFailure *NONNULL_PTR a, const struct LDKProbeSendFailure *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbeSendFailure_eq")] public static extern bool ProbeSendFailure_eq(long _a, long _b);
        // void RecipientOnionFields_free(struct LDKRecipientOnionFields this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_free")] public static extern void RecipientOnionFields_free(long _this_obj);
-       // struct LDKCOption_PaymentSecretZ RecipientOnionFields_get_payment_secret(const struct LDKRecipientOnionFields *NONNULL_PTR this_ptr);
+       // struct LDKCOption_ThirtyTwoBytesZ RecipientOnionFields_get_payment_secret(const struct LDKRecipientOnionFields *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_get_payment_secret")] public static extern long RecipientOnionFields_get_payment_secret(long _this_ptr);
-       // void RecipientOnionFields_set_payment_secret(struct LDKRecipientOnionFields *NONNULL_PTR this_ptr, struct LDKCOption_PaymentSecretZ val);
+       // void RecipientOnionFields_set_payment_secret(struct LDKRecipientOnionFields *NONNULL_PTR this_ptr, struct LDKCOption_ThirtyTwoBytesZ val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_set_payment_secret")] public static extern void RecipientOnionFields_set_payment_secret(long _this_ptr, long _val);
        // struct LDKCOption_CVec_u8ZZ RecipientOnionFields_get_payment_metadata(const struct LDKRecipientOnionFields *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_get_payment_metadata")] public static extern long RecipientOnionFields_get_payment_metadata(long _this_ptr);
        // void RecipientOnionFields_set_payment_metadata(struct LDKRecipientOnionFields *NONNULL_PTR this_ptr, struct LDKCOption_CVec_u8ZZ val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_set_payment_metadata")] public static extern void RecipientOnionFields_set_payment_metadata(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKRecipientOnionFields RecipientOnionFields_new(struct LDKCOption_PaymentSecretZ payment_secret_arg, struct LDKCOption_CVec_u8ZZ payment_metadata_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_new")] public static extern long RecipientOnionFields_new(long _payment_secret_arg, long _payment_metadata_arg);
        // uint64_t RecipientOnionFields_clone_ptr(LDKRecipientOnionFields *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_clone_ptr")] public static extern long RecipientOnionFields_clone_ptr(long _arg);
        // struct LDKRecipientOnionFields RecipientOnionFields_clone(const struct LDKRecipientOnionFields *NONNULL_PTR orig);
@@ -8391,13 +9505,17 @@ internal class bindings {
        // bool RecipientOnionFields_eq(const struct LDKRecipientOnionFields *NONNULL_PTR a, const struct LDKRecipientOnionFields *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_eq")] public static extern bool RecipientOnionFields_eq(long _a, long _b);
        // struct LDKCVec_u8Z RecipientOnionFields_write(const struct LDKRecipientOnionFields *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_write")] public static extern byte[] RecipientOnionFields_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_write")] public static extern long RecipientOnionFields_write(long _obj);
        // struct LDKCResult_RecipientOnionFieldsDecodeErrorZ RecipientOnionFields_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_read")] public static extern long RecipientOnionFields_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_read")] public static extern long RecipientOnionFields_read(long _ser);
        // MUST_USE_RES struct LDKRecipientOnionFields RecipientOnionFields_secret_only(struct LDKThirtyTwoBytes payment_secret);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_secret_only")] public static extern long RecipientOnionFields_secret_only([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_secret);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_secret_only")] public static extern long RecipientOnionFields_secret_only(long _payment_secret);
        // MUST_USE_RES struct LDKRecipientOnionFields RecipientOnionFields_spontaneous_empty(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_spontaneous_empty")] public static extern long RecipientOnionFields_spontaneous_empty();
+       // MUST_USE_RES struct LDKCResult_RecipientOnionFieldsNoneZ RecipientOnionFields_with_custom_tlvs(struct LDKRecipientOnionFields this_arg, struct LDKCVec_C2Tuple_u64CVec_u8ZZZ custom_tlvs);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_with_custom_tlvs")] public static extern long RecipientOnionFields_with_custom_tlvs(long _this_arg, long _custom_tlvs);
+       // MUST_USE_RES struct LDKCVec_C2Tuple_u64CVec_u8ZZZ RecipientOnionFields_custom_tlvs(const struct LDKRecipientOnionFields *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RecipientOnionFields_custom_tlvs")] public static extern long RecipientOnionFields_custom_tlvs(long _this_arg);
        // void CustomMessageReader_free(struct LDKCustomMessageReader this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomMessageReader_free")] public static extern void CustomMessageReader_free(long _this_ptr);
        // uint64_t Type_clone_ptr(LDKType *NONNULL_PTR arg);
@@ -8406,18 +9524,140 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Type_clone")] public static extern long Type_clone(long _orig);
        // void Type_free(struct LDKType this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Type_free")] public static extern void Type_free(long _this_ptr);
-       // void UnsignedBolt12Invoice_free(struct LDKUnsignedBolt12Invoice this_obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_free")] public static extern void UnsignedBolt12Invoice_free(long _this_obj);
-       // MUST_USE_RES struct LDKPublicKey UnsignedBolt12Invoice_signing_pubkey(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_signing_pubkey")] public static extern byte[] UnsignedBolt12Invoice_signing_pubkey(long _this_arg);
-       // void Bolt12Invoice_free(struct LDKBolt12Invoice this_obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_free")] public static extern void Bolt12Invoice_free(long _this_obj);
-       // uint64_t Bolt12Invoice_clone_ptr(LDKBolt12Invoice *NONNULL_PTR arg);
+       // void Offer_free(struct LDKOffer this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_free")] public static extern void Offer_free(long _this_obj);
+       // uint64_t Offer_clone_ptr(LDKOffer *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_clone_ptr")] public static extern long Offer_clone_ptr(long _arg);
+       // struct LDKOffer Offer_clone(const struct LDKOffer *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_clone")] public static extern long Offer_clone(long _orig);
+       // MUST_USE_RES struct LDKCVec_ThirtyTwoBytesZ Offer_chains(const struct LDKOffer *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_chains")] public static extern long Offer_chains(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_CVec_u8ZZ Offer_metadata(const struct LDKOffer *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_metadata")] public static extern long Offer_metadata(long _this_arg);
+       // MUST_USE_RES struct LDKAmount Offer_amount(const struct LDKOffer *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_amount")] public static extern long Offer_amount(long _this_arg);
+       // MUST_USE_RES struct LDKPrintableString Offer_description(const struct LDKOffer *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_description")] public static extern long Offer_description(long _this_arg);
+       // MUST_USE_RES struct LDKOfferFeatures Offer_offer_features(const struct LDKOffer *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_offer_features")] public static extern long Offer_offer_features(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_u64Z Offer_absolute_expiry(const struct LDKOffer *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_absolute_expiry")] public static extern long Offer_absolute_expiry(long _this_arg);
+       // MUST_USE_RES struct LDKPrintableString Offer_issuer(const struct LDKOffer *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_issuer")] public static extern long Offer_issuer(long _this_arg);
+       // MUST_USE_RES struct LDKCVec_BlindedPathZ Offer_paths(const struct LDKOffer *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_paths")] public static extern long Offer_paths(long _this_arg);
+       // MUST_USE_RES struct LDKQuantity Offer_supported_quantity(const struct LDKOffer *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_supported_quantity")] public static extern long Offer_supported_quantity(long _this_arg);
+       // MUST_USE_RES struct LDKPublicKey Offer_signing_pubkey(const struct LDKOffer *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_signing_pubkey")] public static extern long Offer_signing_pubkey(long _this_arg);
+       // MUST_USE_RES bool Offer_supports_chain(const struct LDKOffer *NONNULL_PTR this_arg, struct LDKThirtyTwoBytes chain);
+       [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_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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_expects_quantity")] public static extern bool Offer_expects_quantity(long _this_arg);
+       // struct LDKCVec_u8Z Offer_write(const struct LDKOffer *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_write")] public static extern long Offer_write(long _obj);
+       // void Amount_free(struct LDKAmount this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Amount_free")] public static extern void Amount_free(long _this_obj);
+       // uint64_t Amount_clone_ptr(LDKAmount *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Amount_clone_ptr")] public static extern long Amount_clone_ptr(long _arg);
+       // struct LDKAmount Amount_clone(const struct LDKAmount *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Amount_clone")] public static extern long Amount_clone(long _orig);
+       // void Quantity_free(struct LDKQuantity this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Quantity_free")] public static extern void Quantity_free(long _this_obj);
+       // uint64_t Quantity_clone_ptr(LDKQuantity *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Quantity_clone_ptr")] public static extern long Quantity_clone_ptr(long _arg);
+       // struct LDKQuantity Quantity_clone(const struct LDKQuantity *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Quantity_clone")] public static extern long Quantity_clone(long _orig);
+       // struct LDKCResult_OfferBolt12ParseErrorZ Offer_from_str(struct LDKStr s);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_from_str")] public static extern long Offer_from_str(long _s);
+       // void UnsignedBolt12Invoice_free(struct LDKUnsignedBolt12Invoice this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_free")] public static extern void UnsignedBolt12Invoice_free(long _this_obj);
+       // MUST_USE_RES struct LDKTaggedHash UnsignedBolt12Invoice_tagged_hash(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_tagged_hash")] public static extern long UnsignedBolt12Invoice_tagged_hash(long _this_arg);
+       // void Bolt12Invoice_free(struct LDKBolt12Invoice this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_free")] public static extern void Bolt12Invoice_free(long _this_obj);
+       // uint64_t Bolt12Invoice_clone_ptr(LDKBolt12Invoice *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_clone_ptr")] public static extern long Bolt12Invoice_clone_ptr(long _arg);
        // struct LDKBolt12Invoice Bolt12Invoice_clone(const struct LDKBolt12Invoice *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_clone")] public static extern long Bolt12Invoice_clone(long _orig);
+       // MUST_USE_RES struct LDKCOption_CVec_ThirtyTwoBytesZZ UnsignedBolt12Invoice_offer_chains(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_offer_chains")] public static extern long UnsignedBolt12Invoice_offer_chains(long _this_arg);
+       // MUST_USE_RES struct LDKThirtyTwoBytes UnsignedBolt12Invoice_chain(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_chain")] public static extern long UnsignedBolt12Invoice_chain(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_CVec_u8ZZ UnsignedBolt12Invoice_metadata(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_metadata")] public static extern long UnsignedBolt12Invoice_metadata(long _this_arg);
+       // MUST_USE_RES struct LDKAmount UnsignedBolt12Invoice_amount(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_amount")] public static extern long UnsignedBolt12Invoice_amount(long _this_arg);
+       // MUST_USE_RES struct LDKOfferFeatures UnsignedBolt12Invoice_offer_features(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_offer_features")] public static extern long UnsignedBolt12Invoice_offer_features(long _this_arg);
+       // MUST_USE_RES struct LDKPrintableString UnsignedBolt12Invoice_description(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_description")] public static extern long UnsignedBolt12Invoice_description(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_u64Z UnsignedBolt12Invoice_absolute_expiry(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_absolute_expiry")] public static extern long UnsignedBolt12Invoice_absolute_expiry(long _this_arg);
+       // MUST_USE_RES struct LDKPrintableString UnsignedBolt12Invoice_issuer(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_issuer")] public static extern long UnsignedBolt12Invoice_issuer(long _this_arg);
+       // MUST_USE_RES struct LDKCVec_BlindedPathZ UnsignedBolt12Invoice_message_paths(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_message_paths")] public static extern long UnsignedBolt12Invoice_message_paths(long _this_arg);
+       // MUST_USE_RES struct LDKQuantity UnsignedBolt12Invoice_supported_quantity(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_supported_quantity")] public static extern long UnsignedBolt12Invoice_supported_quantity(long _this_arg);
+       // MUST_USE_RES struct LDKu8slice UnsignedBolt12Invoice_payer_metadata(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_payer_metadata")] public static extern long UnsignedBolt12Invoice_payer_metadata(long _this_arg);
+       // MUST_USE_RES struct LDKInvoiceRequestFeatures UnsignedBolt12Invoice_invoice_request_features(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_invoice_request_features")] public static extern long UnsignedBolt12Invoice_invoice_request_features(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_u64Z UnsignedBolt12Invoice_quantity(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_quantity")] public static extern long UnsignedBolt12Invoice_quantity(long _this_arg);
+       // MUST_USE_RES struct LDKPublicKey UnsignedBolt12Invoice_payer_id(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_payer_id")] public static extern long UnsignedBolt12Invoice_payer_id(long _this_arg);
+       // MUST_USE_RES struct LDKPrintableString UnsignedBolt12Invoice_payer_note(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_payer_note")] public static extern long UnsignedBolt12Invoice_payer_note(long _this_arg);
+       // MUST_USE_RES uint64_t UnsignedBolt12Invoice_created_at(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_created_at")] public static extern long UnsignedBolt12Invoice_created_at(long _this_arg);
+       // MUST_USE_RES uint64_t UnsignedBolt12Invoice_relative_expiry(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_relative_expiry")] public static extern long UnsignedBolt12Invoice_relative_expiry(long _this_arg);
+       // MUST_USE_RES bool UnsignedBolt12Invoice_is_expired(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_is_expired")] public static extern bool UnsignedBolt12Invoice_is_expired(long _this_arg);
+       // MUST_USE_RES struct LDKThirtyTwoBytes UnsignedBolt12Invoice_payment_hash(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_payment_hash")] public static extern long UnsignedBolt12Invoice_payment_hash(long _this_arg);
+       // MUST_USE_RES uint64_t UnsignedBolt12Invoice_amount_msats(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_amount_msats")] public static extern long UnsignedBolt12Invoice_amount_msats(long _this_arg);
+       // MUST_USE_RES struct LDKBolt12InvoiceFeatures UnsignedBolt12Invoice_invoice_features(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_invoice_features")] public static extern long UnsignedBolt12Invoice_invoice_features(long _this_arg);
+       // MUST_USE_RES struct LDKPublicKey UnsignedBolt12Invoice_signing_pubkey(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_signing_pubkey")] public static extern long UnsignedBolt12Invoice_signing_pubkey(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_CVec_ThirtyTwoBytesZZ Bolt12Invoice_offer_chains(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_offer_chains")] public static extern long Bolt12Invoice_offer_chains(long _this_arg);
+       // MUST_USE_RES struct LDKThirtyTwoBytes Bolt12Invoice_chain(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_chain")] public static extern long Bolt12Invoice_chain(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_CVec_u8ZZ Bolt12Invoice_metadata(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_metadata")] public static extern long Bolt12Invoice_metadata(long _this_arg);
+       // MUST_USE_RES struct LDKAmount Bolt12Invoice_amount(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_amount")] public static extern long Bolt12Invoice_amount(long _this_arg);
+       // MUST_USE_RES struct LDKOfferFeatures Bolt12Invoice_offer_features(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_offer_features")] public static extern long Bolt12Invoice_offer_features(long _this_arg);
        // MUST_USE_RES struct LDKPrintableString Bolt12Invoice_description(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_description")] public static extern long Bolt12Invoice_description(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_u64Z Bolt12Invoice_absolute_expiry(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_absolute_expiry")] public static extern long Bolt12Invoice_absolute_expiry(long _this_arg);
+       // MUST_USE_RES struct LDKPrintableString Bolt12Invoice_issuer(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_issuer")] public static extern long Bolt12Invoice_issuer(long _this_arg);
+       // MUST_USE_RES struct LDKCVec_BlindedPathZ Bolt12Invoice_message_paths(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_message_paths")] public static extern long Bolt12Invoice_message_paths(long _this_arg);
+       // MUST_USE_RES struct LDKQuantity Bolt12Invoice_supported_quantity(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_supported_quantity")] public static extern long Bolt12Invoice_supported_quantity(long _this_arg);
+       // MUST_USE_RES struct LDKu8slice Bolt12Invoice_payer_metadata(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_payer_metadata")] public static extern long Bolt12Invoice_payer_metadata(long _this_arg);
+       // MUST_USE_RES struct LDKInvoiceRequestFeatures Bolt12Invoice_invoice_request_features(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_invoice_request_features")] public static extern long Bolt12Invoice_invoice_request_features(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_u64Z Bolt12Invoice_quantity(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_quantity")] public static extern long Bolt12Invoice_quantity(long _this_arg);
+       // MUST_USE_RES struct LDKPublicKey Bolt12Invoice_payer_id(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_payer_id")] public static extern long Bolt12Invoice_payer_id(long _this_arg);
+       // MUST_USE_RES struct LDKPrintableString Bolt12Invoice_payer_note(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_payer_note")] public static extern long Bolt12Invoice_payer_note(long _this_arg);
        // MUST_USE_RES uint64_t Bolt12Invoice_created_at(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_created_at")] public static extern long Bolt12Invoice_created_at(long _this_arg);
        // MUST_USE_RES uint64_t Bolt12Invoice_relative_expiry(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
@@ -8425,19 +9665,23 @@ internal class bindings {
        // MUST_USE_RES bool Bolt12Invoice_is_expired(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_is_expired")] public static extern bool Bolt12Invoice_is_expired(long _this_arg);
        // MUST_USE_RES struct LDKThirtyTwoBytes Bolt12Invoice_payment_hash(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_payment_hash")] public static extern byte[] Bolt12Invoice_payment_hash(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_payment_hash")] public static extern long Bolt12Invoice_payment_hash(long _this_arg);
        // MUST_USE_RES uint64_t Bolt12Invoice_amount_msats(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_amount_msats")] public static extern long Bolt12Invoice_amount_msats(long _this_arg);
-       // MUST_USE_RES struct LDKBolt12InvoiceFeatures Bolt12Invoice_features(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_features")] public static extern long Bolt12Invoice_features(long _this_arg);
+       // MUST_USE_RES struct LDKBolt12InvoiceFeatures Bolt12Invoice_invoice_features(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_invoice_features")] public static extern long Bolt12Invoice_invoice_features(long _this_arg);
        // MUST_USE_RES struct LDKPublicKey Bolt12Invoice_signing_pubkey(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_signing_pubkey")] public static extern byte[] Bolt12Invoice_signing_pubkey(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_signing_pubkey")] public static extern long Bolt12Invoice_signing_pubkey(long _this_arg);
+       // MUST_USE_RES struct LDKSchnorrSignature Bolt12Invoice_signature(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_signature")] public static extern long Bolt12Invoice_signature(long _this_arg);
        // MUST_USE_RES struct LDKThirtyTwoBytes Bolt12Invoice_signable_hash(const struct LDKBolt12Invoice *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_signable_hash")] public static extern byte[] Bolt12Invoice_signable_hash(long _this_arg);
-       // MUST_USE_RES bool Bolt12Invoice_verify(const struct LDKBolt12Invoice *NONNULL_PTR this_arg, const struct LDKExpandedKey *NONNULL_PTR key);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_verify")] public static extern bool Bolt12Invoice_verify(long _this_arg, long _key);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_signable_hash")] public static extern long Bolt12Invoice_signable_hash(long _this_arg);
+       // MUST_USE_RES struct LDKCResult_ThirtyTwoBytesNoneZ Bolt12Invoice_verify(const struct LDKBolt12Invoice *NONNULL_PTR this_arg, const struct LDKExpandedKey *NONNULL_PTR key);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_verify")] public static extern long Bolt12Invoice_verify(long _this_arg, long _key);
+       // struct LDKCVec_u8Z UnsignedBolt12Invoice_write(const struct LDKUnsignedBolt12Invoice *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedBolt12Invoice_write")] public static extern long UnsignedBolt12Invoice_write(long _obj);
        // struct LDKCVec_u8Z Bolt12Invoice_write(const struct LDKBolt12Invoice *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_write")] public static extern byte[] Bolt12Invoice_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12Invoice_write")] public static extern long Bolt12Invoice_write(long _obj);
        // void BlindedPayInfo_free(struct LDKBlindedPayInfo this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPayInfo_free")] public static extern void BlindedPayInfo_free(long _this_obj);
        // uint32_t BlindedPayInfo_get_fee_base_msat(const struct LDKBlindedPayInfo *NONNULL_PTR this_ptr);
@@ -8475,9 +9719,9 @@ internal class bindings {
        // bool BlindedPayInfo_eq(const struct LDKBlindedPayInfo *NONNULL_PTR a, const struct LDKBlindedPayInfo *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPayInfo_eq")] public static extern bool BlindedPayInfo_eq(long _a, long _b);
        // struct LDKCVec_u8Z BlindedPayInfo_write(const struct LDKBlindedPayInfo *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPayInfo_write")] public static extern byte[] BlindedPayInfo_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPayInfo_write")] public static extern long BlindedPayInfo_write(long _obj);
        // struct LDKCResult_BlindedPayInfoDecodeErrorZ BlindedPayInfo_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPayInfo_read")] public static extern long BlindedPayInfo_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPayInfo_read")] public static extern long BlindedPayInfo_read(long _ser);
        // void InvoiceError_free(struct LDKInvoiceError this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceError_free")] public static extern void InvoiceError_free(long _this_obj);
        // struct LDKErroneousField InvoiceError_get_erroneous_field(const struct LDKInvoiceError *NONNULL_PTR this_ptr);
@@ -8510,86 +9754,144 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErroneousField_clone_ptr")] public static extern long ErroneousField_clone_ptr(long _arg);
        // struct LDKErroneousField ErroneousField_clone(const struct LDKErroneousField *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErroneousField_clone")] public static extern long ErroneousField_clone(long _orig);
+       // MUST_USE_RES struct LDKInvoiceError InvoiceError_from_string(struct LDKStr s);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceError_from_string")] public static extern long InvoiceError_from_string(long _s);
        // struct LDKCVec_u8Z InvoiceError_write(const struct LDKInvoiceError *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceError_write")] public static extern byte[] InvoiceError_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceError_write")] public static extern long InvoiceError_write(long _obj);
        // struct LDKCResult_InvoiceErrorDecodeErrorZ InvoiceError_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceError_read")] public static extern long InvoiceError_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceError_read")] public static extern long InvoiceError_read(long _ser);
        // void UnsignedInvoiceRequest_free(struct LDKUnsignedInvoiceRequest this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_free")] public static extern void UnsignedInvoiceRequest_free(long _this_obj);
+       // MUST_USE_RES struct LDKTaggedHash UnsignedInvoiceRequest_tagged_hash(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_tagged_hash")] public static extern long UnsignedInvoiceRequest_tagged_hash(long _this_arg);
        // void InvoiceRequest_free(struct LDKInvoiceRequest this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_free")] public static extern void InvoiceRequest_free(long _this_obj);
        // uint64_t InvoiceRequest_clone_ptr(LDKInvoiceRequest *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_clone_ptr")] public static extern long InvoiceRequest_clone_ptr(long _arg);
        // struct LDKInvoiceRequest InvoiceRequest_clone(const struct LDKInvoiceRequest *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_clone")] public static extern long InvoiceRequest_clone(long _orig);
-       // MUST_USE_RES struct LDKu8slice InvoiceRequest_metadata(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_metadata")] public static extern byte[] InvoiceRequest_metadata(long _this_arg);
+       // void VerifiedInvoiceRequest_free(struct LDKVerifiedInvoiceRequest this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_free")] public static extern void VerifiedInvoiceRequest_free(long _this_obj);
+       // struct LDKCOption_SecretKeyZ VerifiedInvoiceRequest_get_keys(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_get_keys")] public static extern long VerifiedInvoiceRequest_get_keys(long _this_ptr);
+       // void VerifiedInvoiceRequest_set_keys(struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_ptr, struct LDKCOption_SecretKeyZ val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_set_keys")] public static extern void VerifiedInvoiceRequest_set_keys(long _this_ptr, long _val);
+       // uint64_t VerifiedInvoiceRequest_clone_ptr(LDKVerifiedInvoiceRequest *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_clone_ptr")] public static extern long VerifiedInvoiceRequest_clone_ptr(long _arg);
+       // struct LDKVerifiedInvoiceRequest VerifiedInvoiceRequest_clone(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_clone")] public static extern long VerifiedInvoiceRequest_clone(long _orig);
+       // MUST_USE_RES struct LDKCVec_ThirtyTwoBytesZ UnsignedInvoiceRequest_chains(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_chains")] public static extern long UnsignedInvoiceRequest_chains(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_CVec_u8ZZ UnsignedInvoiceRequest_metadata(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_metadata")] public static extern long UnsignedInvoiceRequest_metadata(long _this_arg);
+       // MUST_USE_RES struct LDKAmount UnsignedInvoiceRequest_amount(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_amount")] public static extern long UnsignedInvoiceRequest_amount(long _this_arg);
+       // MUST_USE_RES struct LDKPrintableString UnsignedInvoiceRequest_description(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_description")] public static extern long UnsignedInvoiceRequest_description(long _this_arg);
+       // MUST_USE_RES struct LDKOfferFeatures UnsignedInvoiceRequest_offer_features(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_offer_features")] public static extern long UnsignedInvoiceRequest_offer_features(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_u64Z UnsignedInvoiceRequest_absolute_expiry(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_absolute_expiry")] public static extern long UnsignedInvoiceRequest_absolute_expiry(long _this_arg);
+       // MUST_USE_RES struct LDKPrintableString UnsignedInvoiceRequest_issuer(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_issuer")] public static extern long UnsignedInvoiceRequest_issuer(long _this_arg);
+       // MUST_USE_RES struct LDKCVec_BlindedPathZ UnsignedInvoiceRequest_paths(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_paths")] public static extern long UnsignedInvoiceRequest_paths(long _this_arg);
+       // MUST_USE_RES struct LDKQuantity UnsignedInvoiceRequest_supported_quantity(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_supported_quantity")] public static extern long UnsignedInvoiceRequest_supported_quantity(long _this_arg);
+       // MUST_USE_RES struct LDKPublicKey UnsignedInvoiceRequest_signing_pubkey(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_signing_pubkey")] public static extern long UnsignedInvoiceRequest_signing_pubkey(long _this_arg);
+       // MUST_USE_RES struct LDKu8slice UnsignedInvoiceRequest_payer_metadata(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_payer_metadata")] public static extern long UnsignedInvoiceRequest_payer_metadata(long _this_arg);
+       // MUST_USE_RES struct LDKThirtyTwoBytes UnsignedInvoiceRequest_chain(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_chain")] public static extern long UnsignedInvoiceRequest_chain(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_u64Z UnsignedInvoiceRequest_amount_msats(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_amount_msats")] public static extern long UnsignedInvoiceRequest_amount_msats(long _this_arg);
+       // MUST_USE_RES struct LDKInvoiceRequestFeatures UnsignedInvoiceRequest_invoice_request_features(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_invoice_request_features")] public static extern long UnsignedInvoiceRequest_invoice_request_features(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_u64Z UnsignedInvoiceRequest_quantity(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_quantity")] public static extern long UnsignedInvoiceRequest_quantity(long _this_arg);
+       // MUST_USE_RES struct LDKPublicKey UnsignedInvoiceRequest_payer_id(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_payer_id")] public static extern long UnsignedInvoiceRequest_payer_id(long _this_arg);
+       // MUST_USE_RES struct LDKPrintableString UnsignedInvoiceRequest_payer_note(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_payer_note")] public static extern long UnsignedInvoiceRequest_payer_note(long _this_arg);
+       // MUST_USE_RES struct LDKCVec_ThirtyTwoBytesZ InvoiceRequest_chains(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_chains")] public static extern long InvoiceRequest_chains(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_CVec_u8ZZ InvoiceRequest_metadata(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_metadata")] public static extern long InvoiceRequest_metadata(long _this_arg);
+       // MUST_USE_RES struct LDKAmount InvoiceRequest_amount(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_amount")] public static extern long InvoiceRequest_amount(long _this_arg);
+       // MUST_USE_RES struct LDKPrintableString InvoiceRequest_description(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_description")] public static extern long InvoiceRequest_description(long _this_arg);
+       // MUST_USE_RES struct LDKOfferFeatures InvoiceRequest_offer_features(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_offer_features")] public static extern long InvoiceRequest_offer_features(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_u64Z InvoiceRequest_absolute_expiry(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_absolute_expiry")] public static extern long InvoiceRequest_absolute_expiry(long _this_arg);
+       // MUST_USE_RES struct LDKPrintableString InvoiceRequest_issuer(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_issuer")] public static extern long InvoiceRequest_issuer(long _this_arg);
+       // MUST_USE_RES struct LDKCVec_BlindedPathZ InvoiceRequest_paths(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_paths")] public static extern long InvoiceRequest_paths(long _this_arg);
+       // MUST_USE_RES struct LDKQuantity InvoiceRequest_supported_quantity(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_supported_quantity")] public static extern long InvoiceRequest_supported_quantity(long _this_arg);
+       // MUST_USE_RES struct LDKPublicKey InvoiceRequest_signing_pubkey(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_signing_pubkey")] public static extern long InvoiceRequest_signing_pubkey(long _this_arg);
+       // MUST_USE_RES struct LDKu8slice InvoiceRequest_payer_metadata(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_payer_metadata")] public static extern long InvoiceRequest_payer_metadata(long _this_arg);
        // MUST_USE_RES struct LDKThirtyTwoBytes InvoiceRequest_chain(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_chain")] public static extern byte[] InvoiceRequest_chain(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_chain")] public static extern long InvoiceRequest_chain(long _this_arg);
        // MUST_USE_RES struct LDKCOption_u64Z InvoiceRequest_amount_msats(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_amount_msats")] public static extern long InvoiceRequest_amount_msats(long _this_arg);
-       // MUST_USE_RES struct LDKInvoiceRequestFeatures InvoiceRequest_features(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_features")] public static extern long InvoiceRequest_features(long _this_arg);
+       // MUST_USE_RES struct LDKInvoiceRequestFeatures InvoiceRequest_invoice_request_features(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_invoice_request_features")] public static extern long InvoiceRequest_invoice_request_features(long _this_arg);
        // MUST_USE_RES struct LDKCOption_u64Z InvoiceRequest_quantity(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_quantity")] public static extern long InvoiceRequest_quantity(long _this_arg);
        // MUST_USE_RES struct LDKPublicKey InvoiceRequest_payer_id(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_payer_id")] public static extern byte[] InvoiceRequest_payer_id(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_payer_id")] public static extern long InvoiceRequest_payer_id(long _this_arg);
        // MUST_USE_RES struct LDKPrintableString InvoiceRequest_payer_note(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_payer_note")] public static extern long InvoiceRequest_payer_note(long _this_arg);
-       // MUST_USE_RES struct LDKCResult_COption_KeyPairZNoneZ InvoiceRequest_verify(const struct LDKInvoiceRequest *NONNULL_PTR this_arg, const struct LDKExpandedKey *NONNULL_PTR key);
+       // MUST_USE_RES struct LDKSchnorrSignature InvoiceRequest_signature(const struct LDKInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_signature")] public static extern long InvoiceRequest_signature(long _this_arg);
+       // MUST_USE_RES struct LDKCResult_VerifiedInvoiceRequestNoneZ InvoiceRequest_verify(struct LDKInvoiceRequest this_arg, const struct LDKExpandedKey *NONNULL_PTR key);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_verify")] public static extern long InvoiceRequest_verify(long _this_arg, long _key);
+       // MUST_USE_RES struct LDKCVec_ThirtyTwoBytesZ VerifiedInvoiceRequest_chains(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_chains")] public static extern long VerifiedInvoiceRequest_chains(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_CVec_u8ZZ VerifiedInvoiceRequest_metadata(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_metadata")] public static extern long VerifiedInvoiceRequest_metadata(long _this_arg);
+       // MUST_USE_RES struct LDKAmount VerifiedInvoiceRequest_amount(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_amount")] public static extern long VerifiedInvoiceRequest_amount(long _this_arg);
+       // MUST_USE_RES struct LDKPrintableString VerifiedInvoiceRequest_description(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_description")] public static extern long VerifiedInvoiceRequest_description(long _this_arg);
+       // MUST_USE_RES struct LDKOfferFeatures VerifiedInvoiceRequest_offer_features(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_offer_features")] public static extern long VerifiedInvoiceRequest_offer_features(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_u64Z VerifiedInvoiceRequest_absolute_expiry(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_absolute_expiry")] public static extern long VerifiedInvoiceRequest_absolute_expiry(long _this_arg);
+       // MUST_USE_RES struct LDKPrintableString VerifiedInvoiceRequest_issuer(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_issuer")] public static extern long VerifiedInvoiceRequest_issuer(long _this_arg);
+       // MUST_USE_RES struct LDKCVec_BlindedPathZ VerifiedInvoiceRequest_paths(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_paths")] public static extern long VerifiedInvoiceRequest_paths(long _this_arg);
+       // MUST_USE_RES struct LDKQuantity VerifiedInvoiceRequest_supported_quantity(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_supported_quantity")] public static extern long VerifiedInvoiceRequest_supported_quantity(long _this_arg);
+       // MUST_USE_RES struct LDKPublicKey VerifiedInvoiceRequest_signing_pubkey(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_signing_pubkey")] public static extern long VerifiedInvoiceRequest_signing_pubkey(long _this_arg);
+       // MUST_USE_RES struct LDKu8slice VerifiedInvoiceRequest_payer_metadata(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_payer_metadata")] public static extern long VerifiedInvoiceRequest_payer_metadata(long _this_arg);
+       // MUST_USE_RES struct LDKThirtyTwoBytes VerifiedInvoiceRequest_chain(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_chain")] public static extern long VerifiedInvoiceRequest_chain(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_u64Z VerifiedInvoiceRequest_amount_msats(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_amount_msats")] public static extern long VerifiedInvoiceRequest_amount_msats(long _this_arg);
+       // MUST_USE_RES struct LDKInvoiceRequestFeatures VerifiedInvoiceRequest_invoice_request_features(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_invoice_request_features")] public static extern long VerifiedInvoiceRequest_invoice_request_features(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_u64Z VerifiedInvoiceRequest_quantity(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_quantity")] public static extern long VerifiedInvoiceRequest_quantity(long _this_arg);
+       // MUST_USE_RES struct LDKPublicKey VerifiedInvoiceRequest_payer_id(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_payer_id")] public static extern long VerifiedInvoiceRequest_payer_id(long _this_arg);
+       // MUST_USE_RES struct LDKPrintableString VerifiedInvoiceRequest_payer_note(const struct LDKVerifiedInvoiceRequest *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_VerifiedInvoiceRequest_payer_note")] public static extern long VerifiedInvoiceRequest_payer_note(long _this_arg);
+       // struct LDKCVec_u8Z UnsignedInvoiceRequest_write(const struct LDKUnsignedInvoiceRequest *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedInvoiceRequest_write")] public static extern long UnsignedInvoiceRequest_write(long _obj);
        // struct LDKCVec_u8Z InvoiceRequest_write(const struct LDKInvoiceRequest *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_write")] public static extern byte[] InvoiceRequest_write(long _obj);
-       // void Offer_free(struct LDKOffer this_obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_free")] public static extern void Offer_free(long _this_obj);
-       // uint64_t Offer_clone_ptr(LDKOffer *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_clone_ptr")] public static extern long Offer_clone_ptr(long _arg);
-       // struct LDKOffer Offer_clone(const struct LDKOffer *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_clone")] public static extern long Offer_clone(long _orig);
-       // MUST_USE_RES struct LDKCVec_ChainHashZ Offer_chains(const struct LDKOffer *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_chains")] public static extern byte[][] Offer_chains(long _this_arg);
-       // MUST_USE_RES bool Offer_supports_chain(const struct LDKOffer *NONNULL_PTR this_arg, struct LDKThirtyTwoBytes chain);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_supports_chain")] public static extern bool Offer_supports_chain(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _chain);
-       // MUST_USE_RES struct LDKCOption_CVec_u8ZZ Offer_metadata(const struct LDKOffer *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_metadata")] public static extern long Offer_metadata(long _this_arg);
-       // MUST_USE_RES struct LDKAmount Offer_amount(const struct LDKOffer *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_amount")] public static extern long Offer_amount(long _this_arg);
-       // MUST_USE_RES struct LDKPrintableString Offer_description(const struct LDKOffer *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_description")] public static extern long Offer_description(long _this_arg);
-       // MUST_USE_RES struct LDKOfferFeatures Offer_features(const struct LDKOffer *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_features")] public static extern long Offer_features(long _this_arg);
-       // MUST_USE_RES struct LDKCOption_DurationZ Offer_absolute_expiry(const struct LDKOffer *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_absolute_expiry")] public static extern long Offer_absolute_expiry(long _this_arg);
-       // 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 struct LDKPrintableString Offer_issuer(const struct LDKOffer *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_issuer")] public static extern long Offer_issuer(long _this_arg);
-       // MUST_USE_RES struct LDKCVec_BlindedPathZ Offer_paths(const struct LDKOffer *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_paths")] public static extern long[] Offer_paths(long _this_arg);
-       // MUST_USE_RES struct LDKQuantity Offer_supported_quantity(const struct LDKOffer *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_supported_quantity")] public static extern long Offer_supported_quantity(long _this_arg);
-       // 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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_expects_quantity")] public static extern bool Offer_expects_quantity(long _this_arg);
-       // MUST_USE_RES struct LDKPublicKey Offer_signing_pubkey(const struct LDKOffer *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_signing_pubkey")] public static extern byte[] Offer_signing_pubkey(long _this_arg);
-       // struct LDKCVec_u8Z Offer_write(const struct LDKOffer *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_write")] public static extern byte[] Offer_write(long _obj);
-       // void Amount_free(struct LDKAmount this_obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Amount_free")] public static extern void Amount_free(long _this_obj);
-       // uint64_t Amount_clone_ptr(LDKAmount *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Amount_clone_ptr")] public static extern long Amount_clone_ptr(long _arg);
-       // struct LDKAmount Amount_clone(const struct LDKAmount *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Amount_clone")] public static extern long Amount_clone(long _orig);
-       // void Quantity_free(struct LDKQuantity this_obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Quantity_free")] public static extern void Quantity_free(long _this_obj);
-       // uint64_t Quantity_clone_ptr(LDKQuantity *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Quantity_clone_ptr")] public static extern long Quantity_clone_ptr(long _arg);
-       // struct LDKQuantity Quantity_clone(const struct LDKQuantity *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Quantity_clone")] public static extern long Quantity_clone(long _orig);
-       // struct LDKCResult_OfferBolt12ParseErrorZ Offer_from_str(struct LDKStr s);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_from_str")] public static extern long Offer_from_str(string _s);
+       [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);
        // 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);
@@ -8640,6 +9942,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12SemanticError_missing_payer_metadata")] public static extern Bolt12SemanticError Bolt12SemanticError_missing_payer_metadata();
        // enum LDKBolt12SemanticError Bolt12SemanticError_missing_payer_id(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12SemanticError_missing_payer_id")] public static extern Bolt12SemanticError Bolt12SemanticError_missing_payer_id();
+       // enum LDKBolt12SemanticError Bolt12SemanticError_duplicate_payment_id(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12SemanticError_duplicate_payment_id")] public static extern Bolt12SemanticError Bolt12SemanticError_duplicate_payment_id();
        // enum LDKBolt12SemanticError Bolt12SemanticError_missing_paths(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12SemanticError_missing_paths")] public static extern Bolt12SemanticError Bolt12SemanticError_missing_paths();
        // enum LDKBolt12SemanticError Bolt12SemanticError_invalid_pay_info(void);
@@ -8658,18 +9962,18 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_clone")] public static extern long Refund_clone(long _orig);
        // MUST_USE_RES struct LDKPrintableString Refund_description(const struct LDKRefund *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_description")] public static extern long Refund_description(long _this_arg);
-       // MUST_USE_RES struct LDKCOption_DurationZ Refund_absolute_expiry(const struct LDKRefund *NONNULL_PTR this_arg);
+       // MUST_USE_RES struct LDKCOption_u64Z Refund_absolute_expiry(const struct LDKRefund *NONNULL_PTR this_arg);
        [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 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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_paths")] public static extern long[] Refund_paths(long _this_arg);
-       // MUST_USE_RES struct LDKu8slice Refund_metadata(const struct LDKRefund *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_metadata")] public static extern byte[] Refund_metadata(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_paths")] public static extern long Refund_paths(long _this_arg);
+       // MUST_USE_RES struct LDKu8slice Refund_payer_metadata(const struct LDKRefund *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_payer_metadata")] public static extern long Refund_payer_metadata(long _this_arg);
        // MUST_USE_RES struct LDKThirtyTwoBytes Refund_chain(const struct LDKRefund *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_chain")] public static extern byte[] Refund_chain(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_chain")] public static extern long Refund_chain(long _this_arg);
        // MUST_USE_RES uint64_t Refund_amount_msats(const struct LDKRefund *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_amount_msats")] public static extern long Refund_amount_msats(long _this_arg);
        // MUST_USE_RES struct LDKInvoiceRequestFeatures Refund_features(const struct LDKRefund *NONNULL_PTR this_arg);
@@ -8677,13 +9981,13 @@ internal class bindings {
        // MUST_USE_RES struct LDKCOption_u64Z Refund_quantity(const struct LDKRefund *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_quantity")] public static extern long Refund_quantity(long _this_arg);
        // MUST_USE_RES struct LDKPublicKey Refund_payer_id(const struct LDKRefund *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_payer_id")] public static extern byte[] Refund_payer_id(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_payer_id")] public static extern long Refund_payer_id(long _this_arg);
        // MUST_USE_RES struct LDKPrintableString Refund_payer_note(const struct LDKRefund *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_payer_note")] public static extern long Refund_payer_note(long _this_arg);
        // struct LDKCVec_u8Z Refund_write(const struct LDKRefund *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_write")] public static extern byte[] Refund_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_write")] public static extern long Refund_write(long _obj);
        // struct LDKCResult_RefundBolt12ParseErrorZ Refund_from_str(struct LDKStr s);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_from_str")] public static extern long Refund_from_str(string _s);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_from_str")] public static extern long Refund_from_str(long _s);
        // enum LDKUtxoLookupError UtxoLookupError_clone(const enum LDKUtxoLookupError *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UtxoLookupError_clone")] public static extern UtxoLookupError UtxoLookupError_clone(long _orig);
        // enum LDKUtxoLookupError UtxoLookupError_unknown_chain(void);
@@ -8721,17 +10025,17 @@ internal class bindings {
        // struct LDKNodeId NodeId_clone(const struct LDKNodeId *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeId_clone")] public static extern long NodeId_clone(long _orig);
        // MUST_USE_RES struct LDKNodeId NodeId_from_pubkey(struct LDKPublicKey pubkey);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeId_from_pubkey")] public static extern long NodeId_from_pubkey([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _pubkey);
+       [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 byte[] NodeId_as_slice(long _this_arg);
-       // MUST_USE_RES struct LDKCResult_PublicKeyErrorZ NodeId_as_pubkey(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 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);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeId_hash")] public static extern long NodeId_hash(long _o);
        // struct LDKCVec_u8Z NodeId_write(const struct LDKNodeId *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeId_write")] public static extern byte[] NodeId_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeId_write")] public static extern long NodeId_write(long _obj);
        // struct LDKCResult_NodeIdDecodeErrorZ NodeId_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeId_read")] public static extern long NodeId_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeId_read")] public static extern long NodeId_read(long _ser);
        // void NetworkGraph_free(struct LDKNetworkGraph this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_free")] public static extern void NetworkGraph_free(long _this_obj);
        // void ReadOnlyNetworkGraph_free(struct LDKReadOnlyNetworkGraph this_obj);
@@ -8747,23 +10051,23 @@ internal class bindings {
        // struct LDKNetworkUpdate NetworkUpdate_channel_failure(uint64_t short_channel_id, bool is_permanent);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkUpdate_channel_failure")] public static extern long NetworkUpdate_channel_failure(long _short_channel_id, bool _is_permanent);
        // struct LDKNetworkUpdate NetworkUpdate_node_failure(struct LDKPublicKey node_id, bool is_permanent);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkUpdate_node_failure")] public static extern long NetworkUpdate_node_failure([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, bool _is_permanent);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkUpdate_node_failure")] public static extern long NetworkUpdate_node_failure(long _node_id, bool _is_permanent);
        // bool NetworkUpdate_eq(const struct LDKNetworkUpdate *NONNULL_PTR a, const struct LDKNetworkUpdate *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkUpdate_eq")] public static extern bool NetworkUpdate_eq(long _a, long _b);
        // struct LDKCVec_u8Z NetworkUpdate_write(const struct LDKNetworkUpdate *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkUpdate_write")] public static extern byte[] NetworkUpdate_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkUpdate_write")] public static extern long NetworkUpdate_write(long _obj);
        // struct LDKCResult_COption_NetworkUpdateZDecodeErrorZ NetworkUpdate_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkUpdate_read")] public static extern long NetworkUpdate_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkUpdate_read")] public static extern long NetworkUpdate_read(long _ser);
        // void P2PGossipSync_free(struct LDKP2PGossipSync this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_P2PGossipSync_free")] public static extern void P2PGossipSync_free(long _this_obj);
        // MUST_USE_RES struct LDKP2PGossipSync P2PGossipSync_new(const struct LDKNetworkGraph *NONNULL_PTR network_graph, struct LDKCOption_UtxoLookupZ utxo_lookup, struct LDKLogger logger);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_P2PGossipSync_new")] public static extern long P2PGossipSync_new(long _network_graph, long _utxo_lookup, long _logger);
-       // void P2PGossipSync_add_utxo_lookup(struct LDKP2PGossipSync *NONNULL_PTR this_arg, struct LDKCOption_UtxoLookupZ utxo_lookup);
+       // void P2PGossipSync_add_utxo_lookup(const struct LDKP2PGossipSync *NONNULL_PTR this_arg, struct LDKCOption_UtxoLookupZ utxo_lookup);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_P2PGossipSync_add_utxo_lookup")] public static extern void P2PGossipSync_add_utxo_lookup(long _this_arg, long _utxo_lookup);
        // void NetworkGraph_handle_network_update(const struct LDKNetworkGraph *NONNULL_PTR this_arg, const struct LDKNetworkUpdate *NONNULL_PTR network_update);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_handle_network_update")] public static extern void NetworkGraph_handle_network_update(long _this_arg, long _network_update);
-       // MUST_USE_RES struct LDKThirtyTwoBytes NetworkGraph_get_genesis_hash(const struct LDKNetworkGraph *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_get_genesis_hash")] public static extern byte[] NetworkGraph_get_genesis_hash(long _this_arg);
+       // MUST_USE_RES struct LDKThirtyTwoBytes NetworkGraph_get_chain_hash(const struct LDKNetworkGraph *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_get_chain_hash")] public static extern long NetworkGraph_get_chain_hash(long _this_arg);
        // struct LDKCResult_NoneLightningErrorZ verify_node_announcement(const struct LDKNodeAnnouncement *NONNULL_PTR msg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_verify_node_announcement")] public static extern long verify_node_announcement(long _msg);
        // struct LDKCResult_NoneLightningErrorZ verify_channel_announcement(const struct LDKChannelAnnouncement *NONNULL_PTR msg);
@@ -8811,9 +10115,9 @@ internal class bindings {
        // bool ChannelUpdateInfo_eq(const struct LDKChannelUpdateInfo *NONNULL_PTR a, const struct LDKChannelUpdateInfo *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdateInfo_eq")] public static extern bool ChannelUpdateInfo_eq(long _a, long _b);
        // struct LDKCVec_u8Z ChannelUpdateInfo_write(const struct LDKChannelUpdateInfo *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdateInfo_write")] public static extern byte[] ChannelUpdateInfo_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdateInfo_write")] public static extern long ChannelUpdateInfo_write(long _obj);
        // struct LDKCResult_ChannelUpdateInfoDecodeErrorZ ChannelUpdateInfo_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdateInfo_read")] public static extern long ChannelUpdateInfo_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdateInfo_read")] public static extern long ChannelUpdateInfo_read(long _ser);
        // void ChannelInfo_free(struct LDKChannelInfo this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelInfo_free")] public static extern void ChannelInfo_free(long _this_obj);
        // struct LDKChannelFeatures ChannelInfo_get_features(const struct LDKChannelInfo *NONNULL_PTR this_ptr);
@@ -8853,9 +10157,9 @@ internal class bindings {
        // MUST_USE_RES struct LDKChannelUpdateInfo ChannelInfo_get_directional_info(const struct LDKChannelInfo *NONNULL_PTR this_arg, uint8_t channel_flags);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelInfo_get_directional_info")] public static extern long ChannelInfo_get_directional_info(long _this_arg, byte _channel_flags);
        // struct LDKCVec_u8Z ChannelInfo_write(const struct LDKChannelInfo *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelInfo_write")] public static extern byte[] ChannelInfo_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelInfo_write")] public static extern long ChannelInfo_write(long _obj);
        // struct LDKCResult_ChannelInfoDecodeErrorZ ChannelInfo_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelInfo_read")] public static extern long ChannelInfo_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelInfo_read")] public static extern long ChannelInfo_read(long _ser);
        // void DirectedChannelInfo_free(struct LDKDirectedChannelInfo this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DirectedChannelInfo_free")] public static extern void DirectedChannelInfo_free(long _this_obj);
        // uint64_t DirectedChannelInfo_clone_ptr(LDKDirectedChannelInfo *NONNULL_PTR arg);
@@ -8909,9 +10213,9 @@ internal class bindings {
        // uint64_t RoutingFees_hash(const struct LDKRoutingFees *NONNULL_PTR o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingFees_hash")] public static extern long RoutingFees_hash(long _o);
        // struct LDKCVec_u8Z RoutingFees_write(const struct LDKRoutingFees *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingFees_write")] public static extern byte[] RoutingFees_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingFees_write")] public static extern long RoutingFees_write(long _obj);
        // struct LDKCResult_RoutingFeesDecodeErrorZ RoutingFees_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingFees_read")] public static extern long RoutingFees_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingFees_read")] public static extern long RoutingFees_read(long _ser);
        // void NodeAnnouncementInfo_free(struct LDKNodeAnnouncementInfo this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_free")] public static extern void NodeAnnouncementInfo_free(long _this_obj);
        // struct LDKNodeFeatures NodeAnnouncementInfo_get_features(const struct LDKNodeAnnouncementInfo *NONNULL_PTR this_ptr);
@@ -8923,9 +10227,9 @@ internal class bindings {
        // void NodeAnnouncementInfo_set_last_update(struct LDKNodeAnnouncementInfo *NONNULL_PTR this_ptr, uint32_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_set_last_update")] public static extern void NodeAnnouncementInfo_set_last_update(long _this_ptr, int _val);
        // const uint8_t (*NodeAnnouncementInfo_get_rgb(const struct LDKNodeAnnouncementInfo *NONNULL_PTR this_ptr))[3];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_get_rgb")] public static extern byte[] NodeAnnouncementInfo_get_rgb(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_get_rgb")] public static extern long NodeAnnouncementInfo_get_rgb(long _this_ptr);
        // void NodeAnnouncementInfo_set_rgb(struct LDKNodeAnnouncementInfo *NONNULL_PTR this_ptr, struct LDKThreeBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_set_rgb")] public static extern void NodeAnnouncementInfo_set_rgb(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_set_rgb")] public static extern void NodeAnnouncementInfo_set_rgb(long _this_ptr, long _val);
        // struct LDKNodeAlias NodeAnnouncementInfo_get_alias(const struct LDKNodeAnnouncementInfo *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_get_alias")] public static extern long NodeAnnouncementInfo_get_alias(long _this_ptr);
        // void NodeAnnouncementInfo_set_alias(struct LDKNodeAnnouncementInfo *NONNULL_PTR this_ptr, struct LDKNodeAlias val);
@@ -8935,27 +10239,27 @@ internal class bindings {
        // void NodeAnnouncementInfo_set_announcement_message(struct LDKNodeAnnouncementInfo *NONNULL_PTR this_ptr, struct LDKNodeAnnouncement val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_set_announcement_message")] public static extern void NodeAnnouncementInfo_set_announcement_message(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKNodeAnnouncementInfo NodeAnnouncementInfo_new(struct LDKNodeFeatures features_arg, uint32_t last_update_arg, struct LDKThreeBytes rgb_arg, struct LDKNodeAlias alias_arg, struct LDKNodeAnnouncement announcement_message_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_new")] public static extern long NodeAnnouncementInfo_new(long _features_arg, int _last_update_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _rgb_arg, long _alias_arg, long _announcement_message_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_new")] public static extern long NodeAnnouncementInfo_new(long _features_arg, int _last_update_arg, long _rgb_arg, long _alias_arg, long _announcement_message_arg);
        // uint64_t NodeAnnouncementInfo_clone_ptr(LDKNodeAnnouncementInfo *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_clone_ptr")] public static extern long NodeAnnouncementInfo_clone_ptr(long _arg);
        // struct LDKNodeAnnouncementInfo NodeAnnouncementInfo_clone(const struct LDKNodeAnnouncementInfo *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_clone")] public static extern long NodeAnnouncementInfo_clone(long _orig);
        // bool NodeAnnouncementInfo_eq(const struct LDKNodeAnnouncementInfo *NONNULL_PTR a, const struct LDKNodeAnnouncementInfo *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_eq")] public static extern bool NodeAnnouncementInfo_eq(long _a, long _b);
-       // MUST_USE_RES struct LDKCVec_NetAddressZ NodeAnnouncementInfo_addresses(const struct LDKNodeAnnouncementInfo *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_addresses")] public static extern long[] NodeAnnouncementInfo_addresses(long _this_arg);
+       // MUST_USE_RES struct LDKCVec_SocketAddressZ NodeAnnouncementInfo_addresses(const struct LDKNodeAnnouncementInfo *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_addresses")] public static extern long NodeAnnouncementInfo_addresses(long _this_arg);
        // struct LDKCVec_u8Z NodeAnnouncementInfo_write(const struct LDKNodeAnnouncementInfo *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_write")] public static extern byte[] NodeAnnouncementInfo_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_write")] public static extern long NodeAnnouncementInfo_write(long _obj);
        // struct LDKCResult_NodeAnnouncementInfoDecodeErrorZ NodeAnnouncementInfo_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_read")] public static extern long NodeAnnouncementInfo_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncementInfo_read")] public static extern long NodeAnnouncementInfo_read(long _ser);
        // void NodeAlias_free(struct LDKNodeAlias this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAlias_free")] public static extern void NodeAlias_free(long _this_obj);
        // const uint8_t (*NodeAlias_get_a(const struct LDKNodeAlias *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAlias_get_a")] public static extern byte[] NodeAlias_get_a(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAlias_get_a")] public static extern long NodeAlias_get_a(long _this_ptr);
        // void NodeAlias_set_a(struct LDKNodeAlias *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAlias_set_a")] public static extern void NodeAlias_set_a(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAlias_set_a")] public static extern void NodeAlias_set_a(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKNodeAlias NodeAlias_new(struct LDKThirtyTwoBytes a_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAlias_new")] public static extern long NodeAlias_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAlias_new")] public static extern long NodeAlias_new(long _a_arg);
        // uint64_t NodeAlias_clone_ptr(LDKNodeAlias *NONNULL_PTR arg);
        [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);
@@ -8963,21 +10267,21 @@ internal class bindings {
        // 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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAlias_write")] public static extern byte[] NodeAlias_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAlias_write")] public static extern long NodeAlias_write(long _obj);
        // struct LDKCResult_NodeAliasDecodeErrorZ NodeAlias_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAlias_read")] public static extern long NodeAlias_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAlias_read")] public static extern long NodeAlias_read(long _ser);
        // void NodeInfo_free(struct LDKNodeInfo this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeInfo_free")] public static extern void NodeInfo_free(long _this_obj);
        // struct LDKCVec_u64Z NodeInfo_get_channels(const struct LDKNodeInfo *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeInfo_get_channels")] public static extern long[] NodeInfo_get_channels(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeInfo_get_channels")] public static extern long NodeInfo_get_channels(long _this_ptr);
        // void NodeInfo_set_channels(struct LDKNodeInfo *NONNULL_PTR this_ptr, struct LDKCVec_u64Z val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeInfo_set_channels")] public static extern void NodeInfo_set_channels(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeInfo_set_channels")] public static extern void NodeInfo_set_channels(long _this_ptr, long _val);
        // struct LDKNodeAnnouncementInfo NodeInfo_get_announcement_info(const struct LDKNodeInfo *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeInfo_get_announcement_info")] public static extern long NodeInfo_get_announcement_info(long _this_ptr);
        // void NodeInfo_set_announcement_info(struct LDKNodeInfo *NONNULL_PTR this_ptr, struct LDKNodeAnnouncementInfo val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeInfo_set_announcement_info")] public static extern void NodeInfo_set_announcement_info(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKNodeInfo NodeInfo_new(struct LDKCVec_u64Z channels_arg, struct LDKNodeAnnouncementInfo announcement_info_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeInfo_new")] public static extern long NodeInfo_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _channels_arg, long _announcement_info_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeInfo_new")] public static extern long NodeInfo_new(long _channels_arg, long _announcement_info_arg);
        // uint64_t NodeInfo_clone_ptr(LDKNodeInfo *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeInfo_clone_ptr")] public static extern long NodeInfo_clone_ptr(long _arg);
        // struct LDKNodeInfo NodeInfo_clone(const struct LDKNodeInfo *NONNULL_PTR orig);
@@ -8985,13 +10289,13 @@ internal class bindings {
        // bool NodeInfo_eq(const struct LDKNodeInfo *NONNULL_PTR a, const struct LDKNodeInfo *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeInfo_eq")] public static extern bool NodeInfo_eq(long _a, long _b);
        // struct LDKCVec_u8Z NodeInfo_write(const struct LDKNodeInfo *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeInfo_write")] public static extern byte[] NodeInfo_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeInfo_write")] public static extern long NodeInfo_write(long _obj);
        // struct LDKCResult_NodeInfoDecodeErrorZ NodeInfo_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeInfo_read")] public static extern long NodeInfo_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeInfo_read")] public static extern long NodeInfo_read(long _ser);
        // struct LDKCVec_u8Z NetworkGraph_write(const struct LDKNetworkGraph *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_write")] public static extern byte[] NetworkGraph_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_write")] public static extern long NetworkGraph_write(long _obj);
        // struct LDKCResult_NetworkGraphDecodeErrorZ NetworkGraph_read(struct LDKu8slice ser, struct LDKLogger arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_read")] public static extern long NetworkGraph_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser, long _arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_read")] public static extern long NetworkGraph_read(long _ser, long _arg);
        // MUST_USE_RES struct LDKNetworkGraph NetworkGraph_new(enum LDKNetwork network, struct LDKLogger logger);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_new")] public static extern long NetworkGraph_new(Network _network, long _logger);
        // MUST_USE_RES struct LDKReadOnlyNetworkGraph NetworkGraph_read_only(const struct LDKNetworkGraph *NONNULL_PTR this_arg);
@@ -9011,11 +10315,11 @@ internal class bindings {
        // MUST_USE_RES struct LDKCResult_NoneLightningErrorZ NetworkGraph_update_channel_from_unsigned_announcement(const struct LDKNetworkGraph *NONNULL_PTR this_arg, const struct LDKUnsignedChannelAnnouncement *NONNULL_PTR msg, struct LDKCOption_UtxoLookupZ utxo_lookup);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_update_channel_from_unsigned_announcement")] public static extern long NetworkGraph_update_channel_from_unsigned_announcement(long _this_arg, long _msg, long _utxo_lookup);
        // MUST_USE_RES struct LDKCResult_NoneLightningErrorZ NetworkGraph_add_channel_from_partial_announcement(const struct LDKNetworkGraph *NONNULL_PTR this_arg, uint64_t short_channel_id, uint64_t timestamp, struct LDKChannelFeatures features, struct LDKPublicKey node_id_1, struct LDKPublicKey node_id_2);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_add_channel_from_partial_announcement")] public static extern long NetworkGraph_add_channel_from_partial_announcement(long _this_arg, long _short_channel_id, long _timestamp, long _features, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id_1, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id_2);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_add_channel_from_partial_announcement")] public static extern long NetworkGraph_add_channel_from_partial_announcement(long _this_arg, long _short_channel_id, long _timestamp, long _features, long _node_id_1, long _node_id_2);
        // void NetworkGraph_channel_failed_permanent(const struct LDKNetworkGraph *NONNULL_PTR this_arg, uint64_t short_channel_id);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_channel_failed_permanent")] public static extern void NetworkGraph_channel_failed_permanent(long _this_arg, long _short_channel_id);
        // void NetworkGraph_node_failed_permanent(const struct LDKNetworkGraph *NONNULL_PTR this_arg, struct LDKPublicKey node_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_node_failed_permanent")] public static extern void NetworkGraph_node_failed_permanent(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_node_failed_permanent")] public static extern void NetworkGraph_node_failed_permanent(long _this_arg, long _node_id);
        // void NetworkGraph_remove_stale_channels_and_tracking(const struct LDKNetworkGraph *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_remove_stale_channels_and_tracking")] public static extern void NetworkGraph_remove_stale_channels_and_tracking(long _this_arg);
        // void NetworkGraph_remove_stale_channels_and_tracking_with_time(const struct LDKNetworkGraph *NONNULL_PTR this_arg, uint64_t current_time_unix);
@@ -9024,32 +10328,32 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_update_channel")] public static extern long NetworkGraph_update_channel(long _this_arg, long _msg);
        // MUST_USE_RES struct LDKCResult_NoneLightningErrorZ NetworkGraph_update_channel_unsigned(const struct LDKNetworkGraph *NONNULL_PTR this_arg, const struct LDKUnsignedChannelUpdate *NONNULL_PTR msg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_update_channel_unsigned")] public static extern long NetworkGraph_update_channel_unsigned(long _this_arg, long _msg);
+       // MUST_USE_RES struct LDKCResult_NoneLightningErrorZ NetworkGraph_verify_channel_update(const struct LDKNetworkGraph *NONNULL_PTR this_arg, const struct LDKChannelUpdate *NONNULL_PTR msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NetworkGraph_verify_channel_update")] public static extern long NetworkGraph_verify_channel_update(long _this_arg, long _msg);
        // MUST_USE_RES struct LDKChannelInfo ReadOnlyNetworkGraph_channel(const struct LDKReadOnlyNetworkGraph *NONNULL_PTR this_arg, uint64_t short_channel_id);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReadOnlyNetworkGraph_channel")] public static extern long ReadOnlyNetworkGraph_channel(long _this_arg, long _short_channel_id);
        // MUST_USE_RES struct LDKCVec_u64Z ReadOnlyNetworkGraph_list_channels(const struct LDKReadOnlyNetworkGraph *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReadOnlyNetworkGraph_list_channels")] public static extern long[] ReadOnlyNetworkGraph_list_channels(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReadOnlyNetworkGraph_list_channels")] public static extern long ReadOnlyNetworkGraph_list_channels(long _this_arg);
        // MUST_USE_RES struct LDKNodeInfo ReadOnlyNetworkGraph_node(const struct LDKReadOnlyNetworkGraph *NONNULL_PTR this_arg, const struct LDKNodeId *NONNULL_PTR node_id);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReadOnlyNetworkGraph_node")] public static extern long ReadOnlyNetworkGraph_node(long _this_arg, long _node_id);
        // MUST_USE_RES struct LDKCVec_NodeIdZ ReadOnlyNetworkGraph_list_nodes(const struct LDKReadOnlyNetworkGraph *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReadOnlyNetworkGraph_list_nodes")] public static extern long[] ReadOnlyNetworkGraph_list_nodes(long _this_arg);
-       // MUST_USE_RES struct LDKCOption_CVec_NetAddressZZ ReadOnlyNetworkGraph_get_addresses(const struct LDKReadOnlyNetworkGraph *NONNULL_PTR this_arg, struct LDKPublicKey pubkey);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReadOnlyNetworkGraph_get_addresses")] public static extern long ReadOnlyNetworkGraph_get_addresses(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _pubkey);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReadOnlyNetworkGraph_list_nodes")] public static extern long ReadOnlyNetworkGraph_list_nodes(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_CVec_SocketAddressZZ ReadOnlyNetworkGraph_get_addresses(const struct LDKReadOnlyNetworkGraph *NONNULL_PTR this_arg, struct LDKPublicKey pubkey);
+       [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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _random_seed_bytes, long _scorer, long _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);
        // 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);
        // 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);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScorerAccountingForInFlightHtlcs_free")] public static extern void ScorerAccountingForInFlightHtlcs_free(long _this_obj);
-       // MUST_USE_RES struct LDKScorerAccountingForInFlightHtlcs ScorerAccountingForInFlightHtlcs_new(struct LDKScore scorer, const struct LDKInFlightHtlcs *NONNULL_PTR inflight_htlcs);
+       // MUST_USE_RES struct LDKScorerAccountingForInFlightHtlcs ScorerAccountingForInFlightHtlcs_new(struct LDKScoreLookUp scorer, const struct LDKInFlightHtlcs *NONNULL_PTR inflight_htlcs);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScorerAccountingForInFlightHtlcs_new")] public static extern long ScorerAccountingForInFlightHtlcs_new(long _scorer, long _inflight_htlcs);
-       // struct LDKCVec_u8Z ScorerAccountingForInFlightHtlcs_write(const struct LDKScorerAccountingForInFlightHtlcs *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScorerAccountingForInFlightHtlcs_write")] public static extern byte[] ScorerAccountingForInFlightHtlcs_write(long _obj);
-       // struct LDKScore ScorerAccountingForInFlightHtlcs_as_Score(const struct LDKScorerAccountingForInFlightHtlcs *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScorerAccountingForInFlightHtlcs_as_Score")] public static extern long ScorerAccountingForInFlightHtlcs_as_Score(long _this_arg);
+       // struct LDKScoreLookUp ScorerAccountingForInFlightHtlcs_as_ScoreLookUp(const struct LDKScorerAccountingForInFlightHtlcs *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScorerAccountingForInFlightHtlcs_as_ScoreLookUp")] public static extern long ScorerAccountingForInFlightHtlcs_as_ScoreLookUp(long _this_arg);
        // void InFlightHtlcs_free(struct LDKInFlightHtlcs this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InFlightHtlcs_free")] public static extern void InFlightHtlcs_free(long _this_obj);
        // uint64_t InFlightHtlcs_clone_ptr(LDKInFlightHtlcs *NONNULL_PTR arg);
@@ -9059,21 +10363,21 @@ internal class bindings {
        // MUST_USE_RES struct LDKInFlightHtlcs InFlightHtlcs_new(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InFlightHtlcs_new")] public static extern long InFlightHtlcs_new();
        // void InFlightHtlcs_process_path(struct LDKInFlightHtlcs *NONNULL_PTR this_arg, const struct LDKPath *NONNULL_PTR path, struct LDKPublicKey payer_node_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InFlightHtlcs_process_path")] public static extern void InFlightHtlcs_process_path(long _this_arg, long _path, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payer_node_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InFlightHtlcs_process_path")] public static extern void InFlightHtlcs_process_path(long _this_arg, long _path, long _payer_node_id);
        // void InFlightHtlcs_add_inflight_htlc(struct LDKInFlightHtlcs *NONNULL_PTR this_arg, const struct LDKNodeId *NONNULL_PTR source, const struct LDKNodeId *NONNULL_PTR target, uint64_t channel_scid, uint64_t used_msat);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InFlightHtlcs_add_inflight_htlc")] public static extern void InFlightHtlcs_add_inflight_htlc(long _this_arg, long _source, long _target, long _channel_scid, long _used_msat);
        // MUST_USE_RES struct LDKCOption_u64Z InFlightHtlcs_used_liquidity_msat(const struct LDKInFlightHtlcs *NONNULL_PTR this_arg, const struct LDKNodeId *NONNULL_PTR source, const struct LDKNodeId *NONNULL_PTR target, uint64_t channel_scid);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InFlightHtlcs_used_liquidity_msat")] public static extern long InFlightHtlcs_used_liquidity_msat(long _this_arg, long _source, long _target, long _channel_scid);
        // struct LDKCVec_u8Z InFlightHtlcs_write(const struct LDKInFlightHtlcs *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InFlightHtlcs_write")] public static extern byte[] InFlightHtlcs_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InFlightHtlcs_write")] public static extern long InFlightHtlcs_write(long _obj);
        // struct LDKCResult_InFlightHtlcsDecodeErrorZ InFlightHtlcs_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InFlightHtlcs_read")] public static extern long InFlightHtlcs_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InFlightHtlcs_read")] public static extern long InFlightHtlcs_read(long _ser);
        // void RouteHop_free(struct LDKRouteHop this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_free")] public static extern void RouteHop_free(long _this_obj);
        // struct LDKPublicKey RouteHop_get_pubkey(const struct LDKRouteHop *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_get_pubkey")] public static extern byte[] RouteHop_get_pubkey(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_get_pubkey")] public static extern long RouteHop_get_pubkey(long _this_ptr);
        // void RouteHop_set_pubkey(struct LDKRouteHop *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_set_pubkey")] public static extern void RouteHop_set_pubkey(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_set_pubkey")] public static extern void RouteHop_set_pubkey(long _this_ptr, long _val);
        // struct LDKNodeFeatures RouteHop_get_node_features(const struct LDKRouteHop *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_get_node_features")] public static extern long RouteHop_get_node_features(long _this_ptr);
        // void RouteHop_set_node_features(struct LDKRouteHop *NONNULL_PTR this_ptr, struct LDKNodeFeatures val);
@@ -9094,8 +10398,12 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_get_cltv_expiry_delta")] public static extern int RouteHop_get_cltv_expiry_delta(long _this_ptr);
        // void RouteHop_set_cltv_expiry_delta(struct LDKRouteHop *NONNULL_PTR this_ptr, uint32_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_set_cltv_expiry_delta")] public static extern void RouteHop_set_cltv_expiry_delta(long _this_ptr, int _val);
-       // MUST_USE_RES struct LDKRouteHop RouteHop_new(struct LDKPublicKey pubkey_arg, struct LDKNodeFeatures node_features_arg, uint64_t short_channel_id_arg, struct LDKChannelFeatures channel_features_arg, uint64_t fee_msat_arg, uint32_t cltv_expiry_delta_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_new")] public static extern long RouteHop_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _pubkey_arg, long _node_features_arg, long _short_channel_id_arg, long _channel_features_arg, long _fee_msat_arg, int _cltv_expiry_delta_arg);
+       // bool RouteHop_get_maybe_announced_channel(const struct LDKRouteHop *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_get_maybe_announced_channel")] public static extern bool RouteHop_get_maybe_announced_channel(long _this_ptr);
+       // void RouteHop_set_maybe_announced_channel(struct LDKRouteHop *NONNULL_PTR this_ptr, bool val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_set_maybe_announced_channel")] public static extern void RouteHop_set_maybe_announced_channel(long _this_ptr, bool _val);
+       // MUST_USE_RES struct LDKRouteHop RouteHop_new(struct LDKPublicKey pubkey_arg, struct LDKNodeFeatures node_features_arg, uint64_t short_channel_id_arg, struct LDKChannelFeatures channel_features_arg, uint64_t fee_msat_arg, uint32_t cltv_expiry_delta_arg, bool maybe_announced_channel_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_new")] public static extern long RouteHop_new(long _pubkey_arg, long _node_features_arg, long _short_channel_id_arg, long _channel_features_arg, long _fee_msat_arg, int _cltv_expiry_delta_arg, bool _maybe_announced_channel_arg);
        // uint64_t RouteHop_clone_ptr(LDKRouteHop *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_clone_ptr")] public static extern long RouteHop_clone_ptr(long _arg);
        // struct LDKRouteHop RouteHop_clone(const struct LDKRouteHop *NONNULL_PTR orig);
@@ -9105,19 +10413,19 @@ internal class bindings {
        // bool RouteHop_eq(const struct LDKRouteHop *NONNULL_PTR a, const struct LDKRouteHop *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_eq")] public static extern bool RouteHop_eq(long _a, long _b);
        // struct LDKCVec_u8Z RouteHop_write(const struct LDKRouteHop *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_write")] public static extern byte[] RouteHop_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_write")] public static extern long RouteHop_write(long _obj);
        // struct LDKCResult_RouteHopDecodeErrorZ RouteHop_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_read")] public static extern long RouteHop_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHop_read")] public static extern long RouteHop_read(long _ser);
        // void BlindedTail_free(struct LDKBlindedTail this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_free")] public static extern void BlindedTail_free(long _this_obj);
        // struct LDKCVec_BlindedHopZ BlindedTail_get_hops(const struct LDKBlindedTail *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_get_hops")] public static extern long[] BlindedTail_get_hops(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_get_hops")] public static extern long BlindedTail_get_hops(long _this_ptr);
        // void BlindedTail_set_hops(struct LDKBlindedTail *NONNULL_PTR this_ptr, struct LDKCVec_BlindedHopZ val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_set_hops")] public static extern void BlindedTail_set_hops(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_set_hops")] public static extern void BlindedTail_set_hops(long _this_ptr, long _val);
        // struct LDKPublicKey BlindedTail_get_blinding_point(const struct LDKBlindedTail *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_get_blinding_point")] public static extern byte[] BlindedTail_get_blinding_point(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_get_blinding_point")] public static extern long BlindedTail_get_blinding_point(long _this_ptr);
        // void BlindedTail_set_blinding_point(struct LDKBlindedTail *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_set_blinding_point")] public static extern void BlindedTail_set_blinding_point(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_set_blinding_point")] public static extern void BlindedTail_set_blinding_point(long _this_ptr, long _val);
        // uint32_t BlindedTail_get_excess_final_cltv_expiry_delta(const struct LDKBlindedTail *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_get_excess_final_cltv_expiry_delta")] public static extern int BlindedTail_get_excess_final_cltv_expiry_delta(long _this_ptr);
        // void BlindedTail_set_excess_final_cltv_expiry_delta(struct LDKBlindedTail *NONNULL_PTR this_ptr, uint32_t val);
@@ -9127,7 +10435,7 @@ internal class bindings {
        // void BlindedTail_set_final_value_msat(struct LDKBlindedTail *NONNULL_PTR this_ptr, uint64_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_set_final_value_msat")] public static extern void BlindedTail_set_final_value_msat(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKBlindedTail BlindedTail_new(struct LDKCVec_BlindedHopZ hops_arg, struct LDKPublicKey blinding_point_arg, uint32_t excess_final_cltv_expiry_delta_arg, uint64_t final_value_msat_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_new")] public static extern long BlindedTail_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _hops_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _blinding_point_arg, int _excess_final_cltv_expiry_delta_arg, long _final_value_msat_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_new")] public static extern long BlindedTail_new(long _hops_arg, long _blinding_point_arg, int _excess_final_cltv_expiry_delta_arg, long _final_value_msat_arg);
        // uint64_t BlindedTail_clone_ptr(LDKBlindedTail *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_clone_ptr")] public static extern long BlindedTail_clone_ptr(long _arg);
        // struct LDKBlindedTail BlindedTail_clone(const struct LDKBlindedTail *NONNULL_PTR orig);
@@ -9137,21 +10445,21 @@ internal class bindings {
        // bool BlindedTail_eq(const struct LDKBlindedTail *NONNULL_PTR a, const struct LDKBlindedTail *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_eq")] public static extern bool BlindedTail_eq(long _a, long _b);
        // struct LDKCVec_u8Z BlindedTail_write(const struct LDKBlindedTail *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_write")] public static extern byte[] BlindedTail_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_write")] public static extern long BlindedTail_write(long _obj);
        // struct LDKCResult_BlindedTailDecodeErrorZ BlindedTail_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_read")] public static extern long BlindedTail_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedTail_read")] public static extern long BlindedTail_read(long _ser);
        // void Path_free(struct LDKPath this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Path_free")] public static extern void Path_free(long _this_obj);
        // struct LDKCVec_RouteHopZ Path_get_hops(const struct LDKPath *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Path_get_hops")] public static extern long[] Path_get_hops(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Path_get_hops")] public static extern long Path_get_hops(long _this_ptr);
        // void Path_set_hops(struct LDKPath *NONNULL_PTR this_ptr, struct LDKCVec_RouteHopZ val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Path_set_hops")] public static extern void Path_set_hops(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Path_set_hops")] public static extern void Path_set_hops(long _this_ptr, long _val);
        // struct LDKBlindedTail Path_get_blinded_tail(const struct LDKPath *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Path_get_blinded_tail")] public static extern long Path_get_blinded_tail(long _this_ptr);
        // void Path_set_blinded_tail(struct LDKPath *NONNULL_PTR this_ptr, struct LDKBlindedTail val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Path_set_blinded_tail")] public static extern void Path_set_blinded_tail(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKPath Path_new(struct LDKCVec_RouteHopZ hops_arg, struct LDKBlindedTail blinded_tail_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Path_new")] public static extern long Path_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _hops_arg, long _blinded_tail_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Path_new")] public static extern long Path_new(long _hops_arg, long _blinded_tail_arg);
        // uint64_t Path_clone_ptr(LDKPath *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Path_clone_ptr")] public static extern long Path_clone_ptr(long _arg);
        // struct LDKPath Path_clone(const struct LDKPath *NONNULL_PTR orig);
@@ -9169,15 +10477,15 @@ internal class bindings {
        // void Route_free(struct LDKRoute this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_free")] public static extern void Route_free(long _this_obj);
        // struct LDKCVec_PathZ Route_get_paths(const struct LDKRoute *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_get_paths")] public static extern long[] Route_get_paths(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_get_paths")] public static extern long Route_get_paths(long _this_ptr);
        // void Route_set_paths(struct LDKRoute *NONNULL_PTR this_ptr, struct LDKCVec_PathZ val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_set_paths")] public static extern void Route_set_paths(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _val);
-       // struct LDKPaymentParameters Route_get_payment_params(const struct LDKRoute *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_get_payment_params")] public static extern long Route_get_payment_params(long _this_ptr);
-       // void Route_set_payment_params(struct LDKRoute *NONNULL_PTR this_ptr, struct LDKPaymentParameters val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_set_payment_params")] public static extern void Route_set_payment_params(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKRoute Route_new(struct LDKCVec_PathZ paths_arg, struct LDKPaymentParameters payment_params_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_new")] public static extern long Route_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _paths_arg, long _payment_params_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_set_paths")] public static extern void Route_set_paths(long _this_ptr, long _val);
+       // struct LDKRouteParameters Route_get_route_params(const struct LDKRoute *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_get_route_params")] public static extern long Route_get_route_params(long _this_ptr);
+       // void Route_set_route_params(struct LDKRoute *NONNULL_PTR this_ptr, struct LDKRouteParameters val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_set_route_params")] public static extern void Route_set_route_params(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKRoute Route_new(struct LDKCVec_PathZ paths_arg, struct LDKRouteParameters route_params_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_new")] public static extern long Route_new(long _paths_arg, long _route_params_arg);
        // uint64_t Route_clone_ptr(LDKRoute *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_clone_ptr")] public static extern long Route_clone_ptr(long _arg);
        // struct LDKRoute Route_clone(const struct LDKRoute *NONNULL_PTR orig);
@@ -9191,9 +10499,9 @@ internal class bindings {
        // MUST_USE_RES uint64_t Route_get_total_amount(const struct LDKRoute *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_get_total_amount")] public static extern long Route_get_total_amount(long _this_arg);
        // struct LDKCVec_u8Z Route_write(const struct LDKRoute *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_write")] public static extern byte[] Route_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_write")] public static extern long Route_write(long _obj);
        // struct LDKCResult_RouteDecodeErrorZ Route_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_read")] public static extern long Route_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Route_read")] public static extern long Route_read(long _ser);
        // void RouteParameters_free(struct LDKRouteParameters this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteParameters_free")] public static extern void RouteParameters_free(long _this_obj);
        // struct LDKPaymentParameters RouteParameters_get_payment_params(const struct LDKRouteParameters *NONNULL_PTR this_ptr);
@@ -9204,18 +10512,26 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteParameters_get_final_value_msat")] public static extern long RouteParameters_get_final_value_msat(long _this_ptr);
        // void RouteParameters_set_final_value_msat(struct LDKRouteParameters *NONNULL_PTR this_ptr, uint64_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteParameters_set_final_value_msat")] public static extern void RouteParameters_set_final_value_msat(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKRouteParameters RouteParameters_new(struct LDKPaymentParameters payment_params_arg, uint64_t final_value_msat_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteParameters_new")] public static extern long RouteParameters_new(long _payment_params_arg, long _final_value_msat_arg);
+       // struct LDKCOption_u64Z RouteParameters_get_max_total_routing_fee_msat(const struct LDKRouteParameters *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteParameters_get_max_total_routing_fee_msat")] public static extern long RouteParameters_get_max_total_routing_fee_msat(long _this_ptr);
+       // void RouteParameters_set_max_total_routing_fee_msat(struct LDKRouteParameters *NONNULL_PTR this_ptr, struct LDKCOption_u64Z val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteParameters_set_max_total_routing_fee_msat")] public static extern void RouteParameters_set_max_total_routing_fee_msat(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKRouteParameters RouteParameters_new(struct LDKPaymentParameters payment_params_arg, uint64_t final_value_msat_arg, struct LDKCOption_u64Z max_total_routing_fee_msat_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteParameters_new")] public static extern long RouteParameters_new(long _payment_params_arg, long _final_value_msat_arg, long _max_total_routing_fee_msat_arg);
        // uint64_t RouteParameters_clone_ptr(LDKRouteParameters *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteParameters_clone_ptr")] public static extern long RouteParameters_clone_ptr(long _arg);
        // struct LDKRouteParameters RouteParameters_clone(const struct LDKRouteParameters *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteParameters_clone")] public static extern long RouteParameters_clone(long _orig);
+       // uint64_t RouteParameters_hash(const struct LDKRouteParameters *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteParameters_hash")] public static extern long RouteParameters_hash(long _o);
        // bool RouteParameters_eq(const struct LDKRouteParameters *NONNULL_PTR a, const struct LDKRouteParameters *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteParameters_eq")] public static extern bool RouteParameters_eq(long _a, long _b);
+       // MUST_USE_RES struct LDKRouteParameters RouteParameters_from_payment_params_and_value(struct LDKPaymentParameters payment_params, uint64_t final_value_msat);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteParameters_from_payment_params_and_value")] public static extern long RouteParameters_from_payment_params_and_value(long _payment_params, long _final_value_msat);
        // struct LDKCVec_u8Z RouteParameters_write(const struct LDKRouteParameters *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteParameters_write")] public static extern byte[] RouteParameters_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteParameters_write")] public static extern long RouteParameters_write(long _obj);
        // struct LDKCResult_RouteParametersDecodeErrorZ RouteParameters_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteParameters_read")] public static extern long RouteParameters_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteParameters_read")] public static extern long RouteParameters_read(long _ser);
        // void PaymentParameters_free(struct LDKPaymentParameters this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_free")] public static extern void PaymentParameters_free(long _this_obj);
        // struct LDKPayee PaymentParameters_get_payee(const struct LDKPaymentParameters *NONNULL_PTR this_ptr);
@@ -9239,11 +10555,11 @@ internal class bindings {
        // void PaymentParameters_set_max_channel_saturation_power_of_half(struct LDKPaymentParameters *NONNULL_PTR this_ptr, uint8_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_set_max_channel_saturation_power_of_half")] public static extern void PaymentParameters_set_max_channel_saturation_power_of_half(long _this_ptr, byte _val);
        // struct LDKCVec_u64Z PaymentParameters_get_previously_failed_channels(const struct LDKPaymentParameters *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_get_previously_failed_channels")] public static extern long[] PaymentParameters_get_previously_failed_channels(long _this_ptr);
+       [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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _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);
        // 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);
@@ -9253,15 +10569,17 @@ internal class bindings {
        // bool PaymentParameters_eq(const struct LDKPaymentParameters *NONNULL_PTR a, const struct LDKPaymentParameters *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_eq")] public static extern bool PaymentParameters_eq(long _a, long _b);
        // struct LDKCVec_u8Z PaymentParameters_write(const struct LDKPaymentParameters *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_write")] public static extern byte[] PaymentParameters_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_write")] public static extern long PaymentParameters_write(long _obj);
        // struct LDKCResult_PaymentParametersDecodeErrorZ PaymentParameters_read(struct LDKu8slice ser, uint32_t arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_read")] public static extern long PaymentParameters_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser, int _arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_read")] public static extern long PaymentParameters_read(long _ser, int _arg);
        // MUST_USE_RES struct LDKPaymentParameters PaymentParameters_from_node_id(struct LDKPublicKey payee_pubkey, uint32_t final_cltv_expiry_delta);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_from_node_id")] public static extern long PaymentParameters_from_node_id([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payee_pubkey, int _final_cltv_expiry_delta);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_from_node_id")] public static extern long PaymentParameters_from_node_id(long _payee_pubkey, int _final_cltv_expiry_delta);
        // MUST_USE_RES struct LDKPaymentParameters PaymentParameters_for_keysend(struct LDKPublicKey payee_pubkey, uint32_t final_cltv_expiry_delta, bool allow_mpp);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_for_keysend")] public static extern long PaymentParameters_for_keysend([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payee_pubkey, int _final_cltv_expiry_delta, bool _allow_mpp);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_for_keysend")] public static extern long PaymentParameters_for_keysend(long _payee_pubkey, int _final_cltv_expiry_delta, bool _allow_mpp);
        // MUST_USE_RES struct LDKPaymentParameters PaymentParameters_from_bolt12_invoice(const struct LDKBolt12Invoice *NONNULL_PTR invoice);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_from_bolt12_invoice")] public static extern long PaymentParameters_from_bolt12_invoice(long _invoice);
+       // MUST_USE_RES struct LDKPaymentParameters PaymentParameters_blinded(struct LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ blinded_route_hints);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_blinded")] public static extern long PaymentParameters_blinded(long _blinded_route_hints);
        // void Payee_free(struct LDKPayee this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Payee_free")] public static extern void Payee_free(long _this_ptr);
        // uint64_t Payee_clone_ptr(LDKPayee *NONNULL_PTR arg);
@@ -9269,9 +10587,9 @@ internal class bindings {
        // struct LDKPayee Payee_clone(const struct LDKPayee *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Payee_clone")] public static extern long Payee_clone(long _orig);
        // struct LDKPayee Payee_blinded(struct LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ route_hints, struct LDKBolt12InvoiceFeatures features);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Payee_blinded")] public static extern long Payee_blinded([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _route_hints, long _features);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Payee_blinded")] public static extern long Payee_blinded(long _route_hints, long _features);
        // struct LDKPayee Payee_clear(struct LDKPublicKey node_id, struct LDKCVec_RouteHintZ route_hints, struct LDKBolt11InvoiceFeatures features, uint32_t final_cltv_expiry_delta);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Payee_clear")] public static extern long Payee_clear([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _route_hints, long _features, int _final_cltv_expiry_delta);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Payee_clear")] public static extern long Payee_clear(long _node_id, long _route_hints, long _features, int _final_cltv_expiry_delta);
        // uint64_t Payee_hash(const struct LDKPayee *NONNULL_PTR o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Payee_hash")] public static extern long Payee_hash(long _o);
        // bool Payee_eq(const struct LDKPayee *NONNULL_PTR a, const struct LDKPayee *NONNULL_PTR b);
@@ -9279,11 +10597,11 @@ internal class bindings {
        // void RouteHint_free(struct LDKRouteHint this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHint_free")] public static extern void RouteHint_free(long _this_obj);
        // struct LDKCVec_RouteHintHopZ RouteHint_get_a(const struct LDKRouteHint *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHint_get_a")] public static extern long[] RouteHint_get_a(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHint_get_a")] public static extern long RouteHint_get_a(long _this_ptr);
        // void RouteHint_set_a(struct LDKRouteHint *NONNULL_PTR this_ptr, struct LDKCVec_RouteHintHopZ val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHint_set_a")] public static extern void RouteHint_set_a(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHint_set_a")] public static extern void RouteHint_set_a(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKRouteHint RouteHint_new(struct LDKCVec_RouteHintHopZ a_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHint_new")] public static extern long RouteHint_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _a_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHint_new")] public static extern long RouteHint_new(long _a_arg);
        // uint64_t RouteHint_clone_ptr(LDKRouteHint *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHint_clone_ptr")] public static extern long RouteHint_clone_ptr(long _arg);
        // struct LDKRouteHint RouteHint_clone(const struct LDKRouteHint *NONNULL_PTR orig);
@@ -9293,15 +10611,15 @@ internal class bindings {
        // bool RouteHint_eq(const struct LDKRouteHint *NONNULL_PTR a, const struct LDKRouteHint *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHint_eq")] public static extern bool RouteHint_eq(long _a, long _b);
        // struct LDKCVec_u8Z RouteHint_write(const struct LDKRouteHint *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHint_write")] public static extern byte[] RouteHint_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHint_write")] public static extern long RouteHint_write(long _obj);
        // struct LDKCResult_RouteHintDecodeErrorZ RouteHint_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHint_read")] public static extern long RouteHint_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHint_read")] public static extern long RouteHint_read(long _ser);
        // void RouteHintHop_free(struct LDKRouteHintHop this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHintHop_free")] public static extern void RouteHintHop_free(long _this_obj);
        // struct LDKPublicKey RouteHintHop_get_src_node_id(const struct LDKRouteHintHop *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHintHop_get_src_node_id")] public static extern byte[] RouteHintHop_get_src_node_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHintHop_get_src_node_id")] public static extern long RouteHintHop_get_src_node_id(long _this_ptr);
        // void RouteHintHop_set_src_node_id(struct LDKRouteHintHop *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHintHop_set_src_node_id")] public static extern void RouteHintHop_set_src_node_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHintHop_set_src_node_id")] public static extern void RouteHintHop_set_src_node_id(long _this_ptr, long _val);
        // uint64_t RouteHintHop_get_short_channel_id(const struct LDKRouteHintHop *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHintHop_get_short_channel_id")] public static extern long RouteHintHop_get_short_channel_id(long _this_ptr);
        // void RouteHintHop_set_short_channel_id(struct LDKRouteHintHop *NONNULL_PTR this_ptr, uint64_t val);
@@ -9323,7 +10641,7 @@ internal class bindings {
        // void RouteHintHop_set_htlc_maximum_msat(struct LDKRouteHintHop *NONNULL_PTR this_ptr, struct LDKCOption_u64Z val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHintHop_set_htlc_maximum_msat")] public static extern void RouteHintHop_set_htlc_maximum_msat(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKRouteHintHop RouteHintHop_new(struct LDKPublicKey src_node_id_arg, uint64_t short_channel_id_arg, struct LDKRoutingFees fees_arg, uint16_t cltv_expiry_delta_arg, struct LDKCOption_u64Z htlc_minimum_msat_arg, struct LDKCOption_u64Z htlc_maximum_msat_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHintHop_new")] public static extern long RouteHintHop_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _src_node_id_arg, long _short_channel_id_arg, long _fees_arg, short _cltv_expiry_delta_arg, long _htlc_minimum_msat_arg, long _htlc_maximum_msat_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHintHop_new")] public static extern long RouteHintHop_new(long _src_node_id_arg, long _short_channel_id_arg, long _fees_arg, short _cltv_expiry_delta_arg, long _htlc_minimum_msat_arg, long _htlc_maximum_msat_arg);
        // uint64_t RouteHintHop_clone_ptr(LDKRouteHintHop *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHintHop_clone_ptr")] public static extern long RouteHintHop_clone_ptr(long _arg);
        // struct LDKRouteHintHop RouteHintHop_clone(const struct LDKRouteHintHop *NONNULL_PTR orig);
@@ -9333,13 +10651,17 @@ internal class bindings {
        // bool RouteHintHop_eq(const struct LDKRouteHintHop *NONNULL_PTR a, const struct LDKRouteHintHop *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHintHop_eq")] public static extern bool RouteHintHop_eq(long _a, long _b);
        // struct LDKCVec_u8Z RouteHintHop_write(const struct LDKRouteHintHop *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHintHop_write")] public static extern byte[] RouteHintHop_write(long _obj);
+       [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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
-       // 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 LDKScore *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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _our_node_pubkey, long _route_params, long _network_graph, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _first_hops, long _logger, long _scorer, long _score_params, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _random_seed_bytes);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHintHop_read")] public static extern long RouteHintHop_read(long _ser);
+       // 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]);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_build_route_from_hops")] public static extern long build_route_from_hops([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _our_node_pubkey, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _hops, long _route_params, long _network_graph, long _logger, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _random_seed_bytes);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_build_route_from_hops")] public static extern long build_route_from_hops(long _our_node_pubkey, long _hops, long _route_params, long _network_graph, long _logger, long _random_seed_bytes);
+       // void ScoreLookUp_free(struct LDKScoreLookUp this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScoreLookUp_free")] public static extern void ScoreLookUp_free(long _this_ptr);
+       // void ScoreUpdate_free(struct LDKScoreUpdate this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScoreUpdate_free")] public static extern void ScoreUpdate_free(long _this_ptr);
        // void Score_free(struct LDKScore this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Score_free")] public static extern void Score_free(long _this_ptr);
        // void LockableScore_free(struct LDKLockableScore this_ptr);
@@ -9351,17 +10673,21 @@ internal class bindings {
        // struct LDKLockableScore MultiThreadedLockableScore_as_LockableScore(const struct LDKMultiThreadedLockableScore *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MultiThreadedLockableScore_as_LockableScore")] public static extern long MultiThreadedLockableScore_as_LockableScore(long _this_arg);
        // struct LDKCVec_u8Z MultiThreadedLockableScore_write(const struct LDKMultiThreadedLockableScore *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MultiThreadedLockableScore_write")] public static extern byte[] MultiThreadedLockableScore_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MultiThreadedLockableScore_write")] public static extern long MultiThreadedLockableScore_write(long _obj);
        // struct LDKWriteableScore MultiThreadedLockableScore_as_WriteableScore(const struct LDKMultiThreadedLockableScore *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MultiThreadedLockableScore_as_WriteableScore")] public static extern long MultiThreadedLockableScore_as_WriteableScore(long _this_arg);
        // MUST_USE_RES struct LDKMultiThreadedLockableScore MultiThreadedLockableScore_new(struct LDKScore score);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MultiThreadedLockableScore_new")] public static extern long MultiThreadedLockableScore_new(long _score);
-       // void MultiThreadedScoreLock_free(struct LDKMultiThreadedScoreLock this_obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MultiThreadedScoreLock_free")] public static extern void MultiThreadedScoreLock_free(long _this_obj);
-       // struct LDKCVec_u8Z MultiThreadedScoreLock_write(const struct LDKMultiThreadedScoreLock *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MultiThreadedScoreLock_write")] public static extern byte[] MultiThreadedScoreLock_write(long _obj);
-       // struct LDKScore MultiThreadedScoreLock_as_Score(const struct LDKMultiThreadedScoreLock *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MultiThreadedScoreLock_as_Score")] public static extern long MultiThreadedScoreLock_as_Score(long _this_arg);
+       // void MultiThreadedScoreLockRead_free(struct LDKMultiThreadedScoreLockRead this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MultiThreadedScoreLockRead_free")] public static extern void MultiThreadedScoreLockRead_free(long _this_obj);
+       // void MultiThreadedScoreLockWrite_free(struct LDKMultiThreadedScoreLockWrite this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MultiThreadedScoreLockWrite_free")] public static extern void MultiThreadedScoreLockWrite_free(long _this_obj);
+       // struct LDKScoreLookUp MultiThreadedScoreLockRead_as_ScoreLookUp(const struct LDKMultiThreadedScoreLockRead *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MultiThreadedScoreLockRead_as_ScoreLookUp")] public static extern long MultiThreadedScoreLockRead_as_ScoreLookUp(long _this_arg);
+       // struct LDKCVec_u8Z MultiThreadedScoreLockWrite_write(const struct LDKMultiThreadedScoreLockWrite *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MultiThreadedScoreLockWrite_write")] public static extern long MultiThreadedScoreLockWrite_write(long _obj);
+       // struct LDKScoreUpdate MultiThreadedScoreLockWrite_as_ScoreUpdate(const struct LDKMultiThreadedScoreLockWrite *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MultiThreadedScoreLockWrite_as_ScoreUpdate")] public static extern long MultiThreadedScoreLockWrite_as_ScoreUpdate(long _this_arg);
        // void ChannelUsage_free(struct LDKChannelUsage this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUsage_free")] public static extern void ChannelUsage_free(long _this_obj);
        // uint64_t ChannelUsage_get_amount_msat(const struct LDKChannelUsage *NONNULL_PTR this_ptr);
@@ -9390,12 +10716,14 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FixedPenaltyScorer_clone")] public static extern long FixedPenaltyScorer_clone(long _orig);
        // MUST_USE_RES struct LDKFixedPenaltyScorer FixedPenaltyScorer_with_penalty(uint64_t penalty_msat);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FixedPenaltyScorer_with_penalty")] public static extern long FixedPenaltyScorer_with_penalty(long _penalty_msat);
-       // struct LDKScore FixedPenaltyScorer_as_Score(const struct LDKFixedPenaltyScorer *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FixedPenaltyScorer_as_Score")] public static extern long FixedPenaltyScorer_as_Score(long _this_arg);
+       // struct LDKScoreLookUp FixedPenaltyScorer_as_ScoreLookUp(const struct LDKFixedPenaltyScorer *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FixedPenaltyScorer_as_ScoreLookUp")] public static extern long FixedPenaltyScorer_as_ScoreLookUp(long _this_arg);
+       // struct LDKScoreUpdate FixedPenaltyScorer_as_ScoreUpdate(const struct LDKFixedPenaltyScorer *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FixedPenaltyScorer_as_ScoreUpdate")] public static extern long FixedPenaltyScorer_as_ScoreUpdate(long _this_arg);
        // struct LDKCVec_u8Z FixedPenaltyScorer_write(const struct LDKFixedPenaltyScorer *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FixedPenaltyScorer_write")] public static extern byte[] FixedPenaltyScorer_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FixedPenaltyScorer_write")] public static extern long FixedPenaltyScorer_write(long _obj);
        // struct LDKCResult_FixedPenaltyScorerDecodeErrorZ FixedPenaltyScorer_read(struct LDKu8slice ser, uint64_t arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FixedPenaltyScorer_read")] public static extern long FixedPenaltyScorer_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser, long _arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FixedPenaltyScorer_read")] public static extern long FixedPenaltyScorer_read(long _ser, long _arg);
        // void ProbabilisticScorer_free(struct LDKProbabilisticScorer this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScorer_free")] public static extern void ProbabilisticScorer_free(long _this_obj);
        // void ProbabilisticScoringFeeParameters_free(struct LDKProbabilisticScoringFeeParameters this_obj);
@@ -9432,6 +10760,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScoringFeeParameters_get_considered_impossible_penalty_msat")] public static extern long ProbabilisticScoringFeeParameters_get_considered_impossible_penalty_msat(long _this_ptr);
        // void ProbabilisticScoringFeeParameters_set_considered_impossible_penalty_msat(struct LDKProbabilisticScoringFeeParameters *NONNULL_PTR this_ptr, uint64_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScoringFeeParameters_set_considered_impossible_penalty_msat")] public static extern void ProbabilisticScoringFeeParameters_set_considered_impossible_penalty_msat(long _this_ptr, long _val);
+       // bool ProbabilisticScoringFeeParameters_get_linear_success_probability(const struct LDKProbabilisticScoringFeeParameters *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScoringFeeParameters_get_linear_success_probability")] public static extern bool ProbabilisticScoringFeeParameters_get_linear_success_probability(long _this_ptr);
+       // void ProbabilisticScoringFeeParameters_set_linear_success_probability(struct LDKProbabilisticScoringFeeParameters *NONNULL_PTR this_ptr, bool val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScoringFeeParameters_set_linear_success_probability")] public static extern void ProbabilisticScoringFeeParameters_set_linear_success_probability(long _this_ptr, bool _val);
        // uint64_t ProbabilisticScoringFeeParameters_clone_ptr(LDKProbabilisticScoringFeeParameters *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScoringFeeParameters_clone_ptr")] public static extern long ProbabilisticScoringFeeParameters_clone_ptr(long _arg);
        // struct LDKProbabilisticScoringFeeParameters ProbabilisticScoringFeeParameters_clone(const struct LDKProbabilisticScoringFeeParameters *NONNULL_PTR orig);
@@ -9441,7 +10773,7 @@ internal class bindings {
        // void ProbabilisticScoringFeeParameters_add_banned(struct LDKProbabilisticScoringFeeParameters *NONNULL_PTR this_arg, const struct LDKNodeId *NONNULL_PTR node_id);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScoringFeeParameters_add_banned")] public static extern void ProbabilisticScoringFeeParameters_add_banned(long _this_arg, long _node_id);
        // void ProbabilisticScoringFeeParameters_add_banned_from_list(struct LDKProbabilisticScoringFeeParameters *NONNULL_PTR this_arg, struct LDKCVec_NodeIdZ node_ids);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScoringFeeParameters_add_banned_from_list")] public static extern void ProbabilisticScoringFeeParameters_add_banned_from_list(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _node_ids);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScoringFeeParameters_add_banned_from_list")] public static extern void ProbabilisticScoringFeeParameters_add_banned_from_list(long _this_arg, long _node_ids);
        // void ProbabilisticScoringFeeParameters_remove_banned(struct LDKProbabilisticScoringFeeParameters *NONNULL_PTR this_arg, const struct LDKNodeId *NONNULL_PTR node_id);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScoringFeeParameters_remove_banned")] public static extern void ProbabilisticScoringFeeParameters_remove_banned(long _this_arg, long _node_id);
        // void ProbabilisticScoringFeeParameters_set_manual_penalty(struct LDKProbabilisticScoringFeeParameters *NONNULL_PTR this_arg, const struct LDKNodeId *NONNULL_PTR node_id, uint64_t penalty);
@@ -9474,14 +10806,20 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScorer_debug_log_liquidity_stats")] public static extern void ProbabilisticScorer_debug_log_liquidity_stats(long _this_arg);
        // MUST_USE_RES struct LDKCOption_C2Tuple_u64u64ZZ ProbabilisticScorer_estimated_channel_liquidity_range(const struct LDKProbabilisticScorer *NONNULL_PTR this_arg, uint64_t scid, const struct LDKNodeId *NONNULL_PTR target);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScorer_estimated_channel_liquidity_range")] public static extern long ProbabilisticScorer_estimated_channel_liquidity_range(long _this_arg, long _scid, long _target);
-       // MUST_USE_RES struct LDKCOption_C2Tuple_EightU16sEightU16sZZ ProbabilisticScorer_historical_estimated_channel_liquidity_probabilities(const struct LDKProbabilisticScorer *NONNULL_PTR this_arg, uint64_t scid, const struct LDKNodeId *NONNULL_PTR target);
+       // MUST_USE_RES struct LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ ProbabilisticScorer_historical_estimated_channel_liquidity_probabilities(const struct LDKProbabilisticScorer *NONNULL_PTR this_arg, uint64_t scid, const struct LDKNodeId *NONNULL_PTR target);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScorer_historical_estimated_channel_liquidity_probabilities")] public static extern long ProbabilisticScorer_historical_estimated_channel_liquidity_probabilities(long _this_arg, long _scid, long _target);
+       // MUST_USE_RES struct LDKCOption_f64Z ProbabilisticScorer_historical_estimated_payment_success_probability(const struct LDKProbabilisticScorer *NONNULL_PTR this_arg, uint64_t scid, const struct LDKNodeId *NONNULL_PTR target, uint64_t amount_msat, const struct LDKProbabilisticScoringFeeParameters *NONNULL_PTR params);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScorer_historical_estimated_payment_success_probability")] public static extern long ProbabilisticScorer_historical_estimated_payment_success_probability(long _this_arg, long _scid, long _target, long _amount_msat, long _params);
+       // struct LDKScoreLookUp ProbabilisticScorer_as_ScoreLookUp(const struct LDKProbabilisticScorer *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScorer_as_ScoreLookUp")] public static extern long ProbabilisticScorer_as_ScoreLookUp(long _this_arg);
+       // struct LDKScoreUpdate ProbabilisticScorer_as_ScoreUpdate(const struct LDKProbabilisticScorer *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScorer_as_ScoreUpdate")] public static extern long ProbabilisticScorer_as_ScoreUpdate(long _this_arg);
        // struct LDKScore ProbabilisticScorer_as_Score(const struct LDKProbabilisticScorer *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScorer_as_Score")] public static extern long ProbabilisticScorer_as_Score(long _this_arg);
        // struct LDKCVec_u8Z ProbabilisticScorer_write(const struct LDKProbabilisticScorer *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScorer_write")] public static extern byte[] ProbabilisticScorer_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScorer_write")] public static extern long ProbabilisticScorer_write(long _obj);
        // struct LDKCResult_ProbabilisticScorerDecodeErrorZ ProbabilisticScorer_read(struct LDKu8slice ser, struct LDKProbabilisticScoringDecayParameters arg_a, const struct LDKNetworkGraph *NONNULL_PTR arg_b, struct LDKLogger arg_c);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScorer_read")] public static extern long ProbabilisticScorer_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser, long _arg_a, long _arg_b, long _arg_c);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbabilisticScorer_read")] public static extern long ProbabilisticScorer_read(long _ser, long _arg_a, long _arg_b, long _arg_c);
        // void DelayedPaymentOutputDescriptor_free(struct LDKDelayedPaymentOutputDescriptor this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_free")] public static extern void DelayedPaymentOutputDescriptor_free(long _this_obj);
        // struct LDKOutPoint DelayedPaymentOutputDescriptor_get_outpoint(const struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR this_ptr);
@@ -9489,9 +10827,9 @@ internal class bindings {
        // void DelayedPaymentOutputDescriptor_set_outpoint(struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR this_ptr, struct LDKOutPoint val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_set_outpoint")] public static extern void DelayedPaymentOutputDescriptor_set_outpoint(long _this_ptr, long _val);
        // struct LDKPublicKey DelayedPaymentOutputDescriptor_get_per_commitment_point(const struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_get_per_commitment_point")] public static extern byte[] DelayedPaymentOutputDescriptor_get_per_commitment_point(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_get_per_commitment_point")] public static extern long DelayedPaymentOutputDescriptor_get_per_commitment_point(long _this_ptr);
        // void DelayedPaymentOutputDescriptor_set_per_commitment_point(struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_set_per_commitment_point")] public static extern void DelayedPaymentOutputDescriptor_set_per_commitment_point(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_set_per_commitment_point")] public static extern void DelayedPaymentOutputDescriptor_set_per_commitment_point(long _this_ptr, long _val);
        // uint16_t DelayedPaymentOutputDescriptor_get_to_self_delay(const struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_get_to_self_delay")] public static extern short DelayedPaymentOutputDescriptor_get_to_self_delay(long _this_ptr);
        // void DelayedPaymentOutputDescriptor_set_to_self_delay(struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR this_ptr, uint16_t val);
@@ -9501,29 +10839,31 @@ internal class bindings {
        // 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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_get_revocation_pubkey")] public static extern byte[] DelayedPaymentOutputDescriptor_get_revocation_pubkey(long _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_set_revocation_pubkey")] public static extern void DelayedPaymentOutputDescriptor_set_revocation_pubkey(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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 byte[] DelayedPaymentOutputDescriptor_get_channel_keys_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_get_channel_keys_id")] public static extern long DelayedPaymentOutputDescriptor_get_channel_keys_id(long _this_ptr);
        // void DelayedPaymentOutputDescriptor_set_channel_keys_id(struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_set_channel_keys_id")] public static extern void DelayedPaymentOutputDescriptor_set_channel_keys_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_set_channel_keys_id")] public static extern void DelayedPaymentOutputDescriptor_set_channel_keys_id(long _this_ptr, long _val);
        // uint64_t DelayedPaymentOutputDescriptor_get_channel_value_satoshis(const struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR this_ptr);
        [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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_new")] public static extern long DelayedPaymentOutputDescriptor_new(long _outpoint_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _per_commitment_point_arg, short _to_self_delay_arg, long _output_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _revocation_pubkey_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_keys_id_arg, long _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);
        // struct LDKDelayedPaymentOutputDescriptor DelayedPaymentOutputDescriptor_clone(const struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_clone")] public static extern long DelayedPaymentOutputDescriptor_clone(long _orig);
+       // uint64_t DelayedPaymentOutputDescriptor_hash(const struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_hash")] public static extern long DelayedPaymentOutputDescriptor_hash(long _o);
        // bool DelayedPaymentOutputDescriptor_eq(const struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR a, const struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_eq")] public static extern bool DelayedPaymentOutputDescriptor_eq(long _a, long _b);
        // struct LDKCVec_u8Z DelayedPaymentOutputDescriptor_write(const struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_write")] public static extern byte[] DelayedPaymentOutputDescriptor_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_write")] public static extern long DelayedPaymentOutputDescriptor_write(long _obj);
        // struct LDKCResult_DelayedPaymentOutputDescriptorDecodeErrorZ DelayedPaymentOutputDescriptor_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_read")] public static extern long DelayedPaymentOutputDescriptor_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_read")] public static extern long DelayedPaymentOutputDescriptor_read(long _ser);
        // void StaticPaymentOutputDescriptor_free(struct LDKStaticPaymentOutputDescriptor this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_free")] public static extern void StaticPaymentOutputDescriptor_free(long _this_obj);
        // struct LDKOutPoint StaticPaymentOutputDescriptor_get_outpoint(const struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR this_ptr);
@@ -9535,25 +10875,35 @@ internal class bindings {
        // void StaticPaymentOutputDescriptor_set_output(struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR this_ptr, struct LDKTxOut val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_set_output")] public static extern void StaticPaymentOutputDescriptor_set_output(long _this_ptr, long _val);
        // const uint8_t (*StaticPaymentOutputDescriptor_get_channel_keys_id(const struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_get_channel_keys_id")] public static extern byte[] StaticPaymentOutputDescriptor_get_channel_keys_id(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_get_channel_keys_id")] public static extern long StaticPaymentOutputDescriptor_get_channel_keys_id(long _this_ptr);
        // void StaticPaymentOutputDescriptor_set_channel_keys_id(struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_set_channel_keys_id")] public static extern void StaticPaymentOutputDescriptor_set_channel_keys_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_set_channel_keys_id")] public static extern void StaticPaymentOutputDescriptor_set_channel_keys_id(long _this_ptr, long _val);
        // uint64_t StaticPaymentOutputDescriptor_get_channel_value_satoshis(const struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_get_channel_value_satoshis")] public static extern long StaticPaymentOutputDescriptor_get_channel_value_satoshis(long _this_ptr);
        // void StaticPaymentOutputDescriptor_set_channel_value_satoshis(struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR this_ptr, uint64_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_set_channel_value_satoshis")] public static extern void StaticPaymentOutputDescriptor_set_channel_value_satoshis(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKStaticPaymentOutputDescriptor StaticPaymentOutputDescriptor_new(struct LDKOutPoint outpoint_arg, struct LDKTxOut output_arg, struct LDKThirtyTwoBytes channel_keys_id_arg, uint64_t channel_value_satoshis_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_new")] public static extern long StaticPaymentOutputDescriptor_new(long _outpoint_arg, long _output_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_keys_id_arg, long _channel_value_satoshis_arg);
+       // struct LDKChannelTransactionParameters StaticPaymentOutputDescriptor_get_channel_transaction_parameters(const struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_get_channel_transaction_parameters")] public static extern long StaticPaymentOutputDescriptor_get_channel_transaction_parameters(long _this_ptr);
+       // void StaticPaymentOutputDescriptor_set_channel_transaction_parameters(struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR this_ptr, struct LDKChannelTransactionParameters val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_set_channel_transaction_parameters")] public static extern void StaticPaymentOutputDescriptor_set_channel_transaction_parameters(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKStaticPaymentOutputDescriptor StaticPaymentOutputDescriptor_new(struct LDKOutPoint outpoint_arg, struct LDKTxOut output_arg, struct LDKThirtyTwoBytes channel_keys_id_arg, uint64_t channel_value_satoshis_arg, struct LDKChannelTransactionParameters channel_transaction_parameters_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_new")] public static extern long StaticPaymentOutputDescriptor_new(long _outpoint_arg, long _output_arg, long _channel_keys_id_arg, long _channel_value_satoshis_arg, long _channel_transaction_parameters_arg);
        // uint64_t StaticPaymentOutputDescriptor_clone_ptr(LDKStaticPaymentOutputDescriptor *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_clone_ptr")] public static extern long StaticPaymentOutputDescriptor_clone_ptr(long _arg);
        // struct LDKStaticPaymentOutputDescriptor StaticPaymentOutputDescriptor_clone(const struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_clone")] public static extern long StaticPaymentOutputDescriptor_clone(long _orig);
+       // uint64_t StaticPaymentOutputDescriptor_hash(const struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_hash")] public static extern long StaticPaymentOutputDescriptor_hash(long _o);
        // bool StaticPaymentOutputDescriptor_eq(const struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR a, const struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR b);
        [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);
+       [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 byte[] StaticPaymentOutputDescriptor_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_write")] public static extern long StaticPaymentOutputDescriptor_write(long _obj);
        // struct LDKCResult_StaticPaymentOutputDescriptorDecodeErrorZ StaticPaymentOutputDescriptor_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_read")] public static extern long StaticPaymentOutputDescriptor_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_read")] public static extern long StaticPaymentOutputDescriptor_read(long _ser);
        // void SpendableOutputDescriptor_free(struct LDKSpendableOutputDescriptor this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpendableOutputDescriptor_free")] public static extern void SpendableOutputDescriptor_free(long _this_ptr);
        // uint64_t SpendableOutputDescriptor_clone_ptr(LDKSpendableOutputDescriptor *NONNULL_PTR arg);
@@ -9566,14 +10916,96 @@ internal class bindings {
        [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);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpendableOutputDescriptor_static_payment_output")] public static extern long SpendableOutputDescriptor_static_payment_output(long _a);
+       // uint64_t SpendableOutputDescriptor_hash(const struct LDKSpendableOutputDescriptor *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpendableOutputDescriptor_hash")] public static extern long SpendableOutputDescriptor_hash(long _o);
        // bool SpendableOutputDescriptor_eq(const struct LDKSpendableOutputDescriptor *NONNULL_PTR a, const struct LDKSpendableOutputDescriptor *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpendableOutputDescriptor_eq")] public static extern bool SpendableOutputDescriptor_eq(long _a, long _b);
        // struct LDKCVec_u8Z SpendableOutputDescriptor_write(const struct LDKSpendableOutputDescriptor *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpendableOutputDescriptor_write")] public static extern byte[] SpendableOutputDescriptor_write(long _obj);
+       [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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
-       // MUST_USE_RES struct LDKCResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ 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_PackedLockTimeZ locktime);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpendableOutputDescriptor_create_spendable_outputs_psbt")] public static extern long SpendableOutputDescriptor_create_spendable_outputs_psbt([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _descriptors, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _outputs, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _change_destination_script, int _feerate_sat_per_1000_weight, long _locktime);
+       [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);
+       [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);
+       // uint64_t ChannelDerivationParameters_get_value_satoshis(const struct LDKChannelDerivationParameters *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_get_value_satoshis")] public static extern long ChannelDerivationParameters_get_value_satoshis(long _this_ptr);
+       // void ChannelDerivationParameters_set_value_satoshis(struct LDKChannelDerivationParameters *NONNULL_PTR this_ptr, uint64_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_set_value_satoshis")] public static extern void ChannelDerivationParameters_set_value_satoshis(long _this_ptr, long _val);
+       // const uint8_t (*ChannelDerivationParameters_get_keys_id(const struct LDKChannelDerivationParameters *NONNULL_PTR this_ptr))[32];
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_get_keys_id")] public static extern long ChannelDerivationParameters_get_keys_id(long _this_ptr);
+       // void ChannelDerivationParameters_set_keys_id(struct LDKChannelDerivationParameters *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_set_keys_id")] public static extern void ChannelDerivationParameters_set_keys_id(long _this_ptr, long _val);
+       // struct LDKChannelTransactionParameters ChannelDerivationParameters_get_transaction_parameters(const struct LDKChannelDerivationParameters *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_get_transaction_parameters")] public static extern long ChannelDerivationParameters_get_transaction_parameters(long _this_ptr);
+       // void ChannelDerivationParameters_set_transaction_parameters(struct LDKChannelDerivationParameters *NONNULL_PTR this_ptr, struct LDKChannelTransactionParameters val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_set_transaction_parameters")] public static extern void ChannelDerivationParameters_set_transaction_parameters(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKChannelDerivationParameters ChannelDerivationParameters_new(uint64_t value_satoshis_arg, struct LDKThirtyTwoBytes keys_id_arg, struct LDKChannelTransactionParameters transaction_parameters_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_new")] public static extern long ChannelDerivationParameters_new(long _value_satoshis_arg, long _keys_id_arg, long _transaction_parameters_arg);
+       // uint64_t ChannelDerivationParameters_clone_ptr(LDKChannelDerivationParameters *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_clone_ptr")] public static extern long ChannelDerivationParameters_clone_ptr(long _arg);
+       // struct LDKChannelDerivationParameters ChannelDerivationParameters_clone(const struct LDKChannelDerivationParameters *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_clone")] public static extern long ChannelDerivationParameters_clone(long _orig);
+       // bool ChannelDerivationParameters_eq(const struct LDKChannelDerivationParameters *NONNULL_PTR a, const struct LDKChannelDerivationParameters *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_eq")] public static extern bool ChannelDerivationParameters_eq(long _a, long _b);
+       // struct LDKCVec_u8Z ChannelDerivationParameters_write(const struct LDKChannelDerivationParameters *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_write")] public static extern long ChannelDerivationParameters_write(long _obj);
+       // struct LDKCResult_ChannelDerivationParametersDecodeErrorZ ChannelDerivationParameters_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_read")] public static extern long ChannelDerivationParameters_read(long _ser);
+       // void HTLCDescriptor_free(struct LDKHTLCDescriptor this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_free")] public static extern void HTLCDescriptor_free(long _this_obj);
+       // struct LDKChannelDerivationParameters HTLCDescriptor_get_channel_derivation_parameters(const struct LDKHTLCDescriptor *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_get_channel_derivation_parameters")] public static extern long HTLCDescriptor_get_channel_derivation_parameters(long _this_ptr);
+       // void HTLCDescriptor_set_channel_derivation_parameters(struct LDKHTLCDescriptor *NONNULL_PTR this_ptr, struct LDKChannelDerivationParameters val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_set_channel_derivation_parameters")] public static extern void HTLCDescriptor_set_channel_derivation_parameters(long _this_ptr, long _val);
+       // uint64_t HTLCDescriptor_get_per_commitment_number(const struct LDKHTLCDescriptor *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_get_per_commitment_number")] public static extern long HTLCDescriptor_get_per_commitment_number(long _this_ptr);
+       // void HTLCDescriptor_set_per_commitment_number(struct LDKHTLCDescriptor *NONNULL_PTR this_ptr, uint64_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_set_per_commitment_number")] public static extern void HTLCDescriptor_set_per_commitment_number(long _this_ptr, long _val);
+       // struct LDKPublicKey HTLCDescriptor_get_per_commitment_point(const struct LDKHTLCDescriptor *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_get_per_commitment_point")] public static extern long HTLCDescriptor_get_per_commitment_point(long _this_ptr);
+       // void HTLCDescriptor_set_per_commitment_point(struct LDKHTLCDescriptor *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_set_per_commitment_point")] public static extern void HTLCDescriptor_set_per_commitment_point(long _this_ptr, long _val);
+       // uint32_t HTLCDescriptor_get_feerate_per_kw(const struct LDKHTLCDescriptor *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_get_feerate_per_kw")] public static extern int HTLCDescriptor_get_feerate_per_kw(long _this_ptr);
+       // void HTLCDescriptor_set_feerate_per_kw(struct LDKHTLCDescriptor *NONNULL_PTR this_ptr, uint32_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_set_feerate_per_kw")] public static extern void HTLCDescriptor_set_feerate_per_kw(long _this_ptr, int _val);
+       // struct LDKHTLCOutputInCommitment HTLCDescriptor_get_htlc(const struct LDKHTLCDescriptor *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_get_htlc")] public static extern long HTLCDescriptor_get_htlc(long _this_ptr);
+       // void HTLCDescriptor_set_htlc(struct LDKHTLCDescriptor *NONNULL_PTR this_ptr, struct LDKHTLCOutputInCommitment val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_set_htlc")] public static extern void HTLCDescriptor_set_htlc(long _this_ptr, long _val);
+       // struct LDKCOption_ThirtyTwoBytesZ HTLCDescriptor_get_preimage(const struct LDKHTLCDescriptor *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_get_preimage")] public static extern long HTLCDescriptor_get_preimage(long _this_ptr);
+       // void HTLCDescriptor_set_preimage(struct LDKHTLCDescriptor *NONNULL_PTR this_ptr, struct LDKCOption_ThirtyTwoBytesZ val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_set_preimage")] public static extern void HTLCDescriptor_set_preimage(long _this_ptr, long _val);
+       // struct LDKECDSASignature HTLCDescriptor_get_counterparty_sig(const struct LDKHTLCDescriptor *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_get_counterparty_sig")] public static extern long HTLCDescriptor_get_counterparty_sig(long _this_ptr);
+       // void HTLCDescriptor_set_counterparty_sig(struct LDKHTLCDescriptor *NONNULL_PTR this_ptr, struct LDKECDSASignature val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_set_counterparty_sig")] public static extern void HTLCDescriptor_set_counterparty_sig(long _this_ptr, long _val);
+       // uint64_t HTLCDescriptor_clone_ptr(LDKHTLCDescriptor *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_clone_ptr")] public static extern long HTLCDescriptor_clone_ptr(long _arg);
+       // struct LDKHTLCDescriptor HTLCDescriptor_clone(const struct LDKHTLCDescriptor *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_clone")] public static extern long HTLCDescriptor_clone(long _orig);
+       // bool HTLCDescriptor_eq(const struct LDKHTLCDescriptor *NONNULL_PTR a, const struct LDKHTLCDescriptor *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_eq")] public static extern bool HTLCDescriptor_eq(long _a, long _b);
+       // struct LDKCVec_u8Z HTLCDescriptor_write(const struct LDKHTLCDescriptor *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_write")] public static extern long HTLCDescriptor_write(long _obj);
+       // struct LDKCResult_HTLCDescriptorDecodeErrorZ HTLCDescriptor_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_read")] public static extern long HTLCDescriptor_read(long _ser);
+       // MUST_USE_RES struct LDKOutPoint HTLCDescriptor_outpoint(const struct LDKHTLCDescriptor *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_outpoint")] public static extern long HTLCDescriptor_outpoint(long _this_arg);
+       // MUST_USE_RES struct LDKTxOut HTLCDescriptor_previous_utxo(const struct LDKHTLCDescriptor *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_previous_utxo")] public static extern long HTLCDescriptor_previous_utxo(long _this_arg);
+       // MUST_USE_RES struct LDKTxIn HTLCDescriptor_unsigned_tx_input(const struct LDKHTLCDescriptor *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_unsigned_tx_input")] public static extern long HTLCDescriptor_unsigned_tx_input(long _this_arg);
+       // MUST_USE_RES struct LDKTxOut HTLCDescriptor_tx_output(const struct LDKHTLCDescriptor *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_tx_output")] public static extern long HTLCDescriptor_tx_output(long _this_arg);
+       // MUST_USE_RES struct LDKCVec_u8Z HTLCDescriptor_witness_script(const struct LDKHTLCDescriptor *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_witness_script")] public static extern long HTLCDescriptor_witness_script(long _this_arg);
+       // MUST_USE_RES struct LDKWitness HTLCDescriptor_tx_input_witness(const struct LDKHTLCDescriptor *NONNULL_PTR this_arg, struct LDKECDSASignature signature, struct LDKu8slice witness_script);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_tx_input_witness")] public static extern long HTLCDescriptor_tx_input_witness(long _this_arg, long _signature, long _witness_script);
+       // MUST_USE_RES struct LDKWriteableEcdsaChannelSigner HTLCDescriptor_derive_channel_signer(const struct LDKHTLCDescriptor *NONNULL_PTR this_arg, const struct LDKSignerProvider *NONNULL_PTR signer_provider);
+       [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);
@@ -9599,43 +11031,43 @@ internal class bindings {
        // void InMemorySigner_free(struct LDKInMemorySigner this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_free")] public static extern void InMemorySigner_free(long _this_obj);
        // const uint8_t (*InMemorySigner_get_funding_key(const struct LDKInMemorySigner *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_get_funding_key")] public static extern byte[] InMemorySigner_get_funding_key(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_get_funding_key")] public static extern long InMemorySigner_get_funding_key(long _this_ptr);
        // void InMemorySigner_set_funding_key(struct LDKInMemorySigner *NONNULL_PTR this_ptr, struct LDKSecretKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_set_funding_key")] public static extern void InMemorySigner_set_funding_key(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_set_funding_key")] public static extern void InMemorySigner_set_funding_key(long _this_ptr, long _val);
        // const uint8_t (*InMemorySigner_get_revocation_base_key(const struct LDKInMemorySigner *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_get_revocation_base_key")] public static extern byte[] InMemorySigner_get_revocation_base_key(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_get_revocation_base_key")] public static extern long InMemorySigner_get_revocation_base_key(long _this_ptr);
        // void InMemorySigner_set_revocation_base_key(struct LDKInMemorySigner *NONNULL_PTR this_ptr, struct LDKSecretKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_set_revocation_base_key")] public static extern void InMemorySigner_set_revocation_base_key(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_set_revocation_base_key")] public static extern void InMemorySigner_set_revocation_base_key(long _this_ptr, long _val);
        // const uint8_t (*InMemorySigner_get_payment_key(const struct LDKInMemorySigner *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_get_payment_key")] public static extern byte[] InMemorySigner_get_payment_key(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_get_payment_key")] public static extern long InMemorySigner_get_payment_key(long _this_ptr);
        // void InMemorySigner_set_payment_key(struct LDKInMemorySigner *NONNULL_PTR this_ptr, struct LDKSecretKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_set_payment_key")] public static extern void InMemorySigner_set_payment_key(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_set_payment_key")] public static extern void InMemorySigner_set_payment_key(long _this_ptr, long _val);
        // const uint8_t (*InMemorySigner_get_delayed_payment_base_key(const struct LDKInMemorySigner *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_get_delayed_payment_base_key")] public static extern byte[] InMemorySigner_get_delayed_payment_base_key(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_get_delayed_payment_base_key")] public static extern long InMemorySigner_get_delayed_payment_base_key(long _this_ptr);
        // void InMemorySigner_set_delayed_payment_base_key(struct LDKInMemorySigner *NONNULL_PTR this_ptr, struct LDKSecretKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_set_delayed_payment_base_key")] public static extern void InMemorySigner_set_delayed_payment_base_key(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_set_delayed_payment_base_key")] public static extern void InMemorySigner_set_delayed_payment_base_key(long _this_ptr, long _val);
        // const uint8_t (*InMemorySigner_get_htlc_base_key(const struct LDKInMemorySigner *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_get_htlc_base_key")] public static extern byte[] InMemorySigner_get_htlc_base_key(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_get_htlc_base_key")] public static extern long InMemorySigner_get_htlc_base_key(long _this_ptr);
        // void InMemorySigner_set_htlc_base_key(struct LDKInMemorySigner *NONNULL_PTR this_ptr, struct LDKSecretKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_set_htlc_base_key")] public static extern void InMemorySigner_set_htlc_base_key(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_set_htlc_base_key")] public static extern void InMemorySigner_set_htlc_base_key(long _this_ptr, long _val);
        // const uint8_t (*InMemorySigner_get_commitment_seed(const struct LDKInMemorySigner *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_get_commitment_seed")] public static extern byte[] InMemorySigner_get_commitment_seed(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_get_commitment_seed")] public static extern long InMemorySigner_get_commitment_seed(long _this_ptr);
        // void InMemorySigner_set_commitment_seed(struct LDKInMemorySigner *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_set_commitment_seed")] public static extern void InMemorySigner_set_commitment_seed(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_set_commitment_seed")] public static extern void InMemorySigner_set_commitment_seed(long _this_ptr, long _val);
        // uint64_t InMemorySigner_clone_ptr(LDKInMemorySigner *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_clone_ptr")] public static extern long InMemorySigner_clone_ptr(long _arg);
        // struct LDKInMemorySigner InMemorySigner_clone(const struct LDKInMemorySigner *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_clone")] public static extern long InMemorySigner_clone(long _orig);
        // MUST_USE_RES struct LDKInMemorySigner InMemorySigner_new(struct LDKSecretKey funding_key, struct LDKSecretKey revocation_base_key, struct LDKSecretKey payment_key, struct LDKSecretKey delayed_payment_base_key, struct LDKSecretKey htlc_base_key, struct LDKThirtyTwoBytes commitment_seed, uint64_t channel_value_satoshis, struct LDKThirtyTwoBytes channel_keys_id, struct LDKThirtyTwoBytes rand_bytes_unique_start);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_new")] public static extern long InMemorySigner_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _funding_key, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _revocation_base_key, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_key, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _delayed_payment_base_key, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _htlc_base_key, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _commitment_seed, long _channel_value_satoshis, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_keys_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _rand_bytes_unique_start);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_new")] public static extern long InMemorySigner_new(long _funding_key, long _revocation_base_key, long _payment_key, long _delayed_payment_base_key, long _htlc_base_key, long _commitment_seed, long _channel_value_satoshis, long _channel_keys_id, long _rand_bytes_unique_start);
        // MUST_USE_RES struct LDKChannelPublicKeys InMemorySigner_counterparty_pubkeys(const struct LDKInMemorySigner *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_counterparty_pubkeys")] public static extern long InMemorySigner_counterparty_pubkeys(long _this_arg);
-       // MUST_USE_RES uint16_t InMemorySigner_counterparty_selected_contest_delay(const struct LDKInMemorySigner *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_counterparty_selected_contest_delay")] public static extern short InMemorySigner_counterparty_selected_contest_delay(long _this_arg);
-       // MUST_USE_RES uint16_t InMemorySigner_holder_selected_contest_delay(const struct LDKInMemorySigner *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_holder_selected_contest_delay")] public static extern short InMemorySigner_holder_selected_contest_delay(long _this_arg);
-       // MUST_USE_RES bool InMemorySigner_is_outbound(const struct LDKInMemorySigner *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_is_outbound")] public static extern bool InMemorySigner_is_outbound(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_u16Z InMemorySigner_counterparty_selected_contest_delay(const struct LDKInMemorySigner *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_counterparty_selected_contest_delay")] public static extern long InMemorySigner_counterparty_selected_contest_delay(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_u16Z InMemorySigner_holder_selected_contest_delay(const struct LDKInMemorySigner *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_holder_selected_contest_delay")] public static extern long InMemorySigner_holder_selected_contest_delay(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_boolZ InMemorySigner_is_outbound(const struct LDKInMemorySigner *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_is_outbound")] public static extern long InMemorySigner_is_outbound(long _this_arg);
        // MUST_USE_RES struct LDKOutPoint InMemorySigner_funding_outpoint(const struct LDKInMemorySigner *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_funding_outpoint")] public static extern long InMemorySigner_funding_outpoint(long _this_arg);
        // MUST_USE_RES struct LDKChannelTransactionParameters InMemorySigner_get_channel_parameters(const struct LDKInMemorySigner *NONNULL_PTR this_arg);
@@ -9643,9 +11075,9 @@ internal class bindings {
        // 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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_sign_counterparty_payment_input")] public static extern long InMemorySigner_sign_counterparty_payment_input(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _spend_tx, long _input_idx, long _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_sign_dynamic_p2wsh_input")] public static extern long InMemorySigner_sign_dynamic_p2wsh_input(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _spend_tx, long _input_idx, long _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);
        // struct LDKChannelSigner InMemorySigner_as_ChannelSigner(const struct LDKInMemorySigner *NONNULL_PTR this_arg);
@@ -9655,21 +11087,21 @@ internal class bindings {
        // struct LDKWriteableEcdsaChannelSigner InMemorySigner_as_WriteableEcdsaChannelSigner(const struct LDKInMemorySigner *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_as_WriteableEcdsaChannelSigner")] public static extern long InMemorySigner_as_WriteableEcdsaChannelSigner(long _this_arg);
        // struct LDKCVec_u8Z InMemorySigner_write(const struct LDKInMemorySigner *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_write")] public static extern byte[] InMemorySigner_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_write")] public static extern long InMemorySigner_write(long _obj);
        // struct LDKCResult_InMemorySignerDecodeErrorZ InMemorySigner_read(struct LDKu8slice ser, struct LDKEntropySource arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_read")] public static extern long InMemorySigner_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser, long _arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_read")] public static extern long InMemorySigner_read(long _ser, long _arg);
        // void KeysManager_free(struct LDKKeysManager this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_KeysManager_free")] public static extern void KeysManager_free(long _this_obj);
        // MUST_USE_RES struct LDKKeysManager KeysManager_new(const uint8_t (*seed)[32], uint64_t starting_time_secs, uint32_t starting_time_nanos);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_KeysManager_new")] public static extern long KeysManager_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _seed, long _starting_time_secs, int _starting_time_nanos);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_KeysManager_new")] public static extern long KeysManager_new(long _seed, long _starting_time_secs, int _starting_time_nanos);
        // MUST_USE_RES struct LDKSecretKey KeysManager_get_node_secret_key(const struct LDKKeysManager *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_KeysManager_get_node_secret_key")] public static extern byte[] KeysManager_get_node_secret_key(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_KeysManager_get_node_secret_key")] public static extern long KeysManager_get_node_secret_key(long _this_arg);
        // MUST_USE_RES struct LDKInMemorySigner KeysManager_derive_channel_keys(const struct LDKKeysManager *NONNULL_PTR this_arg, uint64_t channel_value_satoshis, const uint8_t (*params)[32]);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_KeysManager_derive_channel_keys")] public static extern long KeysManager_derive_channel_keys(long _this_arg, long _channel_value_satoshis, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _params);
-       // MUST_USE_RES struct LDKCResult_PartiallySignedTransactionNoneZ KeysManager_sign_spendable_outputs_psbt(const struct LDKKeysManager *NONNULL_PTR this_arg, struct LDKCVec_SpendableOutputDescriptorZ descriptors, struct LDKCVec_u8Z psbt);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_KeysManager_sign_spendable_outputs_psbt")] public static extern long KeysManager_sign_spendable_outputs_psbt(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _descriptors, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _psbt);
-       // MUST_USE_RES struct LDKCResult_TransactionNoneZ KeysManager_spend_spendable_outputs(const struct LDKKeysManager *NONNULL_PTR this_arg, struct LDKCVec_SpendableOutputDescriptorZ descriptors, struct LDKCVec_TxOutZ outputs, struct LDKCVec_u8Z change_destination_script, uint32_t feerate_sat_per_1000_weight, struct LDKCOption_PackedLockTimeZ locktime);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_KeysManager_spend_spendable_outputs")] public static extern long KeysManager_spend_spendable_outputs(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _descriptors, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _outputs, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _change_destination_script, int _feerate_sat_per_1000_weight, long _locktime);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_KeysManager_derive_channel_keys")] public static extern long KeysManager_derive_channel_keys(long _this_arg, long _channel_value_satoshis, long _params);
+       // MUST_USE_RES struct LDKCResult_CVec_u8ZNoneZ KeysManager_sign_spendable_outputs_psbt(const struct LDKKeysManager *NONNULL_PTR this_arg, struct LDKCVec_SpendableOutputDescriptorZ descriptors, struct LDKCVec_u8Z psbt);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_KeysManager_sign_spendable_outputs_psbt")] public static extern long KeysManager_sign_spendable_outputs_psbt(long _this_arg, long _descriptors, long _psbt);
+       // MUST_USE_RES struct LDKCResult_TransactionNoneZ KeysManager_spend_spendable_outputs(const struct LDKKeysManager *NONNULL_PTR this_arg, 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_KeysManager_spend_spendable_outputs")] public static extern long KeysManager_spend_spendable_outputs(long _this_arg, long _descriptors, long _outputs, long _change_destination_script, int _feerate_sat_per_1000_weight, long _locktime);
        // struct LDKEntropySource KeysManager_as_EntropySource(const struct LDKKeysManager *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_KeysManager_as_EntropySource")] public static extern long KeysManager_as_EntropySource(long _this_arg);
        // struct LDKNodeSigner KeysManager_as_NodeSigner(const struct LDKKeysManager *NONNULL_PTR this_arg);
@@ -9685,15 +11117,15 @@ internal class bindings {
        // struct LDKSignerProvider PhantomKeysManager_as_SignerProvider(const struct LDKPhantomKeysManager *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomKeysManager_as_SignerProvider")] public static extern long PhantomKeysManager_as_SignerProvider(long _this_arg);
        // MUST_USE_RES struct LDKPhantomKeysManager PhantomKeysManager_new(const uint8_t (*seed)[32], uint64_t starting_time_secs, uint32_t starting_time_nanos, const uint8_t (*cross_node_seed)[32]);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomKeysManager_new")] public static extern long PhantomKeysManager_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _seed, long _starting_time_secs, int _starting_time_nanos, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _cross_node_seed);
-       // MUST_USE_RES struct LDKCResult_TransactionNoneZ PhantomKeysManager_spend_spendable_outputs(const struct LDKPhantomKeysManager *NONNULL_PTR this_arg, struct LDKCVec_SpendableOutputDescriptorZ descriptors, struct LDKCVec_TxOutZ outputs, struct LDKCVec_u8Z change_destination_script, uint32_t feerate_sat_per_1000_weight, struct LDKCOption_PackedLockTimeZ locktime);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomKeysManager_spend_spendable_outputs")] public static extern long PhantomKeysManager_spend_spendable_outputs(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _descriptors, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _outputs, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _change_destination_script, int _feerate_sat_per_1000_weight, long _locktime);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomKeysManager_new")] public static extern long PhantomKeysManager_new(long _seed, long _starting_time_secs, int _starting_time_nanos, long _cross_node_seed);
+       // MUST_USE_RES struct LDKCResult_TransactionNoneZ PhantomKeysManager_spend_spendable_outputs(const struct LDKPhantomKeysManager *NONNULL_PTR this_arg, 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_PhantomKeysManager_spend_spendable_outputs")] public static extern long PhantomKeysManager_spend_spendable_outputs(long _this_arg, long _descriptors, long _outputs, long _change_destination_script, int _feerate_sat_per_1000_weight, long _locktime);
        // MUST_USE_RES struct LDKInMemorySigner PhantomKeysManager_derive_channel_keys(const struct LDKPhantomKeysManager *NONNULL_PTR this_arg, uint64_t channel_value_satoshis, const uint8_t (*params)[32]);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomKeysManager_derive_channel_keys")] public static extern long PhantomKeysManager_derive_channel_keys(long _this_arg, long _channel_value_satoshis, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _params);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomKeysManager_derive_channel_keys")] public static extern long PhantomKeysManager_derive_channel_keys(long _this_arg, long _channel_value_satoshis, long _params);
        // MUST_USE_RES struct LDKSecretKey PhantomKeysManager_get_node_secret_key(const struct LDKPhantomKeysManager *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomKeysManager_get_node_secret_key")] public static extern byte[] PhantomKeysManager_get_node_secret_key(long _this_arg);
+       [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 byte[] PhantomKeysManager_get_phantom_node_secret_key(long _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 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);
@@ -9707,15 +11139,15 @@ internal class bindings {
        // void OnionMessagePath_free(struct LDKOnionMessagePath this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessagePath_free")] public static extern void OnionMessagePath_free(long _this_obj);
        // struct LDKCVec_PublicKeyZ OnionMessagePath_get_intermediate_nodes(const struct LDKOnionMessagePath *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessagePath_get_intermediate_nodes")] public static extern byte[][] OnionMessagePath_get_intermediate_nodes(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessagePath_get_intermediate_nodes")] public static extern long OnionMessagePath_get_intermediate_nodes(long _this_ptr);
        // void OnionMessagePath_set_intermediate_nodes(struct LDKOnionMessagePath *NONNULL_PTR this_ptr, struct LDKCVec_PublicKeyZ val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessagePath_set_intermediate_nodes")] public static extern void OnionMessagePath_set_intermediate_nodes(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessagePath_set_intermediate_nodes")] public static extern void OnionMessagePath_set_intermediate_nodes(long _this_ptr, long _val);
        // struct LDKDestination OnionMessagePath_get_destination(const struct LDKOnionMessagePath *NONNULL_PTR this_ptr);
        [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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _intermediate_nodes_arg, long _destination_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessagePath_new")] public static extern long OnionMessagePath_new(long _intermediate_nodes_arg, long _destination_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);
@@ -9727,7 +11159,7 @@ internal class bindings {
        // struct LDKDestination Destination_clone(const struct LDKDestination *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Destination_clone")] public static extern long Destination_clone(long _orig);
        // struct LDKDestination Destination_node(struct LDKPublicKey a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Destination_node")] public static extern long Destination_node([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a);
+       [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 SendError_free(struct LDKSendError this_ptr);
@@ -9756,14 +11188,26 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SendError_eq")] public static extern bool SendError_eq(long _a, long _b);
        // void CustomOnionMessageHandler_free(struct LDKCustomOnionMessageHandler this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomOnionMessageHandler_free")] public static extern void CustomOnionMessageHandler_free(long _this_ptr);
+       // void PeeledOnion_free(struct LDKPeeledOnion this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeeledOnion_free")] public static extern void PeeledOnion_free(long _this_ptr);
+       // uint64_t PeeledOnion_clone_ptr(LDKPeeledOnion *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeeledOnion_clone_ptr")] public static extern long PeeledOnion_clone_ptr(long _arg);
+       // struct LDKPeeledOnion PeeledOnion_clone(const struct LDKPeeledOnion *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeeledOnion_clone")] public static extern long PeeledOnion_clone(long _orig);
+       // struct LDKPeeledOnion PeeledOnion_forward(struct LDKPublicKey a, struct LDKOnionMessage b);
+       [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);
+       [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 message, 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 _message, long _reply_path);
+       // 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);
        // 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);
-       // struct LDKOnionMessageProvider OnionMessenger_as_OnionMessageProvider(const struct LDKOnionMessenger *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessenger_as_OnionMessageProvider")] public static extern long OnionMessenger_as_OnionMessageProvider(long _this_arg);
        // void OffersMessageHandler_free(struct LDKOffersMessageHandler this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OffersMessageHandler_free")] public static extern void OffersMessageHandler_free(long _this_ptr);
        // void OffersMessage_free(struct LDKOffersMessage this_ptr);
@@ -9780,30 +11224,74 @@ 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);
-       // MUST_USE_RES uint64_t OffersMessage_tlv_type(const struct LDKOffersMessage *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OffersMessage_tlv_type")] public static extern long OffersMessage_tlv_type(long _this_arg);
        // struct LDKCVec_u8Z OffersMessage_write(const struct LDKOffersMessage *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OffersMessage_write")] public static extern byte[] OffersMessage_write(long _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OffersMessage_read")] public static extern long OffersMessage_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser, long _arg_a, long _arg_b);
-       // void OnionMessageContents_free(struct LDKOnionMessageContents this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageContents_free")] public static extern void OnionMessageContents_free(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OffersMessage_read")] public static extern long OffersMessage_read(long _ser, long _arg_a, long _arg_b);
+       // void Packet_free(struct LDKPacket this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Packet_free")] public static extern void Packet_free(long _this_obj);
+       // uint8_t Packet_get_version(const struct LDKPacket *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Packet_get_version")] public static extern byte Packet_get_version(long _this_ptr);
+       // void Packet_set_version(struct LDKPacket *NONNULL_PTR this_ptr, uint8_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Packet_set_version")] public static extern void Packet_set_version(long _this_ptr, byte _val);
+       // struct LDKPublicKey Packet_get_public_key(const struct LDKPacket *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Packet_get_public_key")] public static extern long Packet_get_public_key(long _this_ptr);
+       // void Packet_set_public_key(struct LDKPacket *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Packet_set_public_key")] public static extern void Packet_set_public_key(long _this_ptr, long _val);
+       // struct LDKCVec_u8Z Packet_get_hop_data(const struct LDKPacket *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Packet_get_hop_data")] public static extern long Packet_get_hop_data(long _this_ptr);
+       // void Packet_set_hop_data(struct LDKPacket *NONNULL_PTR this_ptr, struct LDKCVec_u8Z val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Packet_set_hop_data")] public static extern void Packet_set_hop_data(long _this_ptr, long _val);
+       // const uint8_t (*Packet_get_hmac(const struct LDKPacket *NONNULL_PTR this_ptr))[32];
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Packet_get_hmac")] public static extern long Packet_get_hmac(long _this_ptr);
+       // void Packet_set_hmac(struct LDKPacket *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Packet_set_hmac")] public static extern void Packet_set_hmac(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKPacket Packet_new(uint8_t version_arg, struct LDKPublicKey public_key_arg, struct LDKCVec_u8Z hop_data_arg, struct LDKThirtyTwoBytes hmac_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Packet_new")] public static extern long Packet_new(byte _version_arg, long _public_key_arg, long _hop_data_arg, long _hmac_arg);
+       // uint64_t Packet_clone_ptr(LDKPacket *NONNULL_PTR arg);
+       [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);
+       // 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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Packet_write")] public static extern long Packet_write(long _obj);
+       // void ParsedOnionMessageContents_free(struct LDKParsedOnionMessageContents this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ParsedOnionMessageContents_free")] public static extern void ParsedOnionMessageContents_free(long _this_ptr);
+       // uint64_t ParsedOnionMessageContents_clone_ptr(LDKParsedOnionMessageContents *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ParsedOnionMessageContents_clone_ptr")] public static extern long ParsedOnionMessageContents_clone_ptr(long _arg);
+       // struct LDKParsedOnionMessageContents ParsedOnionMessageContents_clone(const struct LDKParsedOnionMessageContents *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ParsedOnionMessageContents_clone")] public static extern long ParsedOnionMessageContents_clone(long _orig);
+       // struct LDKParsedOnionMessageContents ParsedOnionMessageContents_offers(struct LDKOffersMessage a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ParsedOnionMessageContents_offers")] public static extern long ParsedOnionMessageContents_offers(long _a);
+       // struct LDKParsedOnionMessageContents ParsedOnionMessageContents_custom(struct LDKOnionMessageContents a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ParsedOnionMessageContents_custom")] public static extern long ParsedOnionMessageContents_custom(long _a);
+       // struct LDKOnionMessageContents ParsedOnionMessageContents_as_OnionMessageContents(const struct LDKParsedOnionMessageContents *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ParsedOnionMessageContents_as_OnionMessageContents")] public static extern long ParsedOnionMessageContents_as_OnionMessageContents(long _this_arg);
+       // struct LDKCVec_u8Z ParsedOnionMessageContents_write(const struct LDKParsedOnionMessageContents *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ParsedOnionMessageContents_write")] public static extern long ParsedOnionMessageContents_write(long _obj);
        // uint64_t OnionMessageContents_clone_ptr(LDKOnionMessageContents *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageContents_clone_ptr")] public static extern long OnionMessageContents_clone_ptr(long _arg);
        // struct LDKOnionMessageContents OnionMessageContents_clone(const struct LDKOnionMessageContents *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageContents_clone")] public static extern long OnionMessageContents_clone(long _orig);
-       // struct LDKOnionMessageContents OnionMessageContents_offers(struct LDKOffersMessage a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageContents_offers")] public static extern long OnionMessageContents_offers(long _a);
-       // struct LDKOnionMessageContents OnionMessageContents_custom(struct LDKCustomOnionMessageContents a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageContents_custom")] public static extern long OnionMessageContents_custom(long _a);
-       // uint64_t CustomOnionMessageContents_clone_ptr(LDKCustomOnionMessageContents *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomOnionMessageContents_clone_ptr")] public static extern long CustomOnionMessageContents_clone_ptr(long _arg);
-       // struct LDKCustomOnionMessageContents CustomOnionMessageContents_clone(const struct LDKCustomOnionMessageContents *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomOnionMessageContents_clone")] public static extern long CustomOnionMessageContents_clone(long _orig);
-       // void CustomOnionMessageContents_free(struct LDKCustomOnionMessageContents this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CustomOnionMessageContents_free")] public static extern void CustomOnionMessageContents_free(long _this_ptr);
+       // void OnionMessageContents_free(struct LDKOnionMessageContents this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageContents_free")] public static extern void OnionMessageContents_free(long _this_ptr);
        // void BlindedPath_free(struct LDKBlindedPath this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_free")] public static extern void BlindedPath_free(long _this_obj);
+       // struct LDKPublicKey BlindedPath_get_introduction_node_id(const struct LDKBlindedPath *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_get_introduction_node_id")] public static extern long BlindedPath_get_introduction_node_id(long _this_ptr);
+       // void BlindedPath_set_introduction_node_id(struct LDKBlindedPath *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_set_introduction_node_id")] public static extern void BlindedPath_set_introduction_node_id(long _this_ptr, long _val);
+       // struct LDKPublicKey BlindedPath_get_blinding_point(const struct LDKBlindedPath *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_get_blinding_point")] public static extern long BlindedPath_get_blinding_point(long _this_ptr);
+       // void BlindedPath_set_blinding_point(struct LDKBlindedPath *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_set_blinding_point")] public static extern void BlindedPath_set_blinding_point(long _this_ptr, long _val);
+       // struct LDKCVec_BlindedHopZ BlindedPath_get_blinded_hops(const struct LDKBlindedPath *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_get_blinded_hops")] public static extern long BlindedPath_get_blinded_hops(long _this_ptr);
+       // void BlindedPath_set_blinded_hops(struct LDKBlindedPath *NONNULL_PTR this_ptr, struct LDKCVec_BlindedHopZ val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_set_blinded_hops")] public static extern void BlindedPath_set_blinded_hops(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKBlindedPath BlindedPath_new(struct LDKPublicKey introduction_node_id_arg, struct LDKPublicKey blinding_point_arg, struct LDKCVec_BlindedHopZ blinded_hops_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_new")] public static extern long BlindedPath_new(long _introduction_node_id_arg, long _blinding_point_arg, long _blinded_hops_arg);
        // uint64_t BlindedPath_clone_ptr(LDKBlindedPath *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_clone_ptr")] public static extern long BlindedPath_clone_ptr(long _arg);
        // struct LDKBlindedPath BlindedPath_clone(const struct LDKBlindedPath *NONNULL_PTR orig);
@@ -9814,6 +11302,16 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_eq")] public static extern bool BlindedPath_eq(long _a, long _b);
        // void BlindedHop_free(struct LDKBlindedHop this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHop_free")] public static extern void BlindedHop_free(long _this_obj);
+       // struct LDKPublicKey BlindedHop_get_blinded_node_id(const struct LDKBlindedHop *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHop_get_blinded_node_id")] public static extern long BlindedHop_get_blinded_node_id(long _this_ptr);
+       // void BlindedHop_set_blinded_node_id(struct LDKBlindedHop *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHop_set_blinded_node_id")] public static extern void BlindedHop_set_blinded_node_id(long _this_ptr, long _val);
+       // struct LDKCVec_u8Z BlindedHop_get_encrypted_payload(const struct LDKBlindedHop *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHop_get_encrypted_payload")] public static extern long BlindedHop_get_encrypted_payload(long _this_ptr);
+       // void BlindedHop_set_encrypted_payload(struct LDKBlindedHop *NONNULL_PTR this_ptr, struct LDKCVec_u8Z val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHop_set_encrypted_payload")] public static extern void BlindedHop_set_encrypted_payload(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKBlindedHop BlindedHop_new(struct LDKPublicKey blinded_node_id_arg, struct LDKCVec_u8Z encrypted_payload_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHop_new")] public static extern long BlindedHop_new(long _blinded_node_id_arg, long _encrypted_payload_arg);
        // uint64_t BlindedHop_clone_ptr(LDKBlindedHop *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHop_clone_ptr")] public static extern long BlindedHop_clone_ptr(long _arg);
        // struct LDKBlindedHop BlindedHop_clone(const struct LDKBlindedHop *NONNULL_PTR orig);
@@ -9822,32 +11320,176 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHop_hash")] public static extern long BlindedHop_hash(long _o);
        // bool BlindedHop_eq(const struct LDKBlindedHop *NONNULL_PTR a, const struct LDKBlindedHop *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHop_eq")] public static extern bool BlindedHop_eq(long _a, long _b);
+       // MUST_USE_RES struct LDKCResult_BlindedPathNoneZ BlindedPath_one_hop_for_message(struct LDKPublicKey recipient_node_id, const struct LDKEntropySource *NONNULL_PTR entropy_source);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_one_hop_for_message")] public static extern long BlindedPath_one_hop_for_message(long _recipient_node_id, long _entropy_source);
        // MUST_USE_RES struct LDKCResult_BlindedPathNoneZ BlindedPath_new_for_message(struct LDKCVec_PublicKeyZ node_pks, const struct LDKEntropySource *NONNULL_PTR entropy_source);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_new_for_message")] public static extern long BlindedPath_new_for_message([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[][] _node_pks, long _entropy_source);
+       [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);
        // struct LDKCVec_u8Z BlindedPath_write(const struct LDKBlindedPath *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_write")] public static extern byte[] BlindedPath_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_write")] public static extern long BlindedPath_write(long _obj);
        // struct LDKCResult_BlindedPathDecodeErrorZ BlindedPath_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_read")] public static extern long BlindedPath_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_read")] public static extern long BlindedPath_read(long _ser);
        // struct LDKCVec_u8Z BlindedHop_write(const struct LDKBlindedHop *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHop_write")] public static extern byte[] BlindedHop_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHop_write")] public static extern long BlindedHop_write(long _obj);
        // struct LDKCResult_BlindedHopDecodeErrorZ BlindedHop_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHop_read")] public static extern long BlindedHop_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHop_read")] public static extern long BlindedHop_read(long _ser);
+       // void ForwardNode_free(struct LDKForwardNode this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardNode_free")] public static extern void ForwardNode_free(long _this_obj);
+       // struct LDKForwardTlvs ForwardNode_get_tlvs(const struct LDKForwardNode *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardNode_get_tlvs")] public static extern long ForwardNode_get_tlvs(long _this_ptr);
+       // void ForwardNode_set_tlvs(struct LDKForwardNode *NONNULL_PTR this_ptr, struct LDKForwardTlvs val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardNode_set_tlvs")] public static extern void ForwardNode_set_tlvs(long _this_ptr, long _val);
+       // struct LDKPublicKey ForwardNode_get_node_id(const struct LDKForwardNode *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardNode_get_node_id")] public static extern long ForwardNode_get_node_id(long _this_ptr);
+       // void ForwardNode_set_node_id(struct LDKForwardNode *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardNode_set_node_id")] public static extern void ForwardNode_set_node_id(long _this_ptr, long _val);
+       // uint64_t ForwardNode_get_htlc_maximum_msat(const struct LDKForwardNode *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardNode_get_htlc_maximum_msat")] public static extern long ForwardNode_get_htlc_maximum_msat(long _this_ptr);
+       // void ForwardNode_set_htlc_maximum_msat(struct LDKForwardNode *NONNULL_PTR this_ptr, uint64_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardNode_set_htlc_maximum_msat")] public static extern void ForwardNode_set_htlc_maximum_msat(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKForwardNode ForwardNode_new(struct LDKForwardTlvs tlvs_arg, struct LDKPublicKey node_id_arg, uint64_t htlc_maximum_msat_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardNode_new")] public static extern long ForwardNode_new(long _tlvs_arg, long _node_id_arg, long _htlc_maximum_msat_arg);
+       // uint64_t ForwardNode_clone_ptr(LDKForwardNode *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardNode_clone_ptr")] public static extern long ForwardNode_clone_ptr(long _arg);
+       // struct LDKForwardNode ForwardNode_clone(const struct LDKForwardNode *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardNode_clone")] public static extern long ForwardNode_clone(long _orig);
+       // void ForwardTlvs_free(struct LDKForwardTlvs this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardTlvs_free")] public static extern void ForwardTlvs_free(long _this_obj);
+       // uint64_t ForwardTlvs_get_short_channel_id(const struct LDKForwardTlvs *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardTlvs_get_short_channel_id")] public static extern long ForwardTlvs_get_short_channel_id(long _this_ptr);
+       // void ForwardTlvs_set_short_channel_id(struct LDKForwardTlvs *NONNULL_PTR this_ptr, uint64_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardTlvs_set_short_channel_id")] public static extern void ForwardTlvs_set_short_channel_id(long _this_ptr, long _val);
+       // struct LDKPaymentRelay ForwardTlvs_get_payment_relay(const struct LDKForwardTlvs *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardTlvs_get_payment_relay")] public static extern long ForwardTlvs_get_payment_relay(long _this_ptr);
+       // void ForwardTlvs_set_payment_relay(struct LDKForwardTlvs *NONNULL_PTR this_ptr, struct LDKPaymentRelay val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardTlvs_set_payment_relay")] public static extern void ForwardTlvs_set_payment_relay(long _this_ptr, long _val);
+       // struct LDKPaymentConstraints ForwardTlvs_get_payment_constraints(const struct LDKForwardTlvs *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardTlvs_get_payment_constraints")] public static extern long ForwardTlvs_get_payment_constraints(long _this_ptr);
+       // void ForwardTlvs_set_payment_constraints(struct LDKForwardTlvs *NONNULL_PTR this_ptr, struct LDKPaymentConstraints val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardTlvs_set_payment_constraints")] public static extern void ForwardTlvs_set_payment_constraints(long _this_ptr, long _val);
+       // struct LDKBlindedHopFeatures ForwardTlvs_get_features(const struct LDKForwardTlvs *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardTlvs_get_features")] public static extern long ForwardTlvs_get_features(long _this_ptr);
+       // void ForwardTlvs_set_features(struct LDKForwardTlvs *NONNULL_PTR this_ptr, struct LDKBlindedHopFeatures val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardTlvs_set_features")] public static extern void ForwardTlvs_set_features(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKForwardTlvs ForwardTlvs_new(uint64_t short_channel_id_arg, struct LDKPaymentRelay payment_relay_arg, struct LDKPaymentConstraints payment_constraints_arg, struct LDKBlindedHopFeatures features_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardTlvs_new")] public static extern long ForwardTlvs_new(long _short_channel_id_arg, long _payment_relay_arg, long _payment_constraints_arg, long _features_arg);
+       // uint64_t ForwardTlvs_clone_ptr(LDKForwardTlvs *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardTlvs_clone_ptr")] public static extern long ForwardTlvs_clone_ptr(long _arg);
+       // struct LDKForwardTlvs ForwardTlvs_clone(const struct LDKForwardTlvs *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardTlvs_clone")] public static extern long ForwardTlvs_clone(long _orig);
+       // void ReceiveTlvs_free(struct LDKReceiveTlvs this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReceiveTlvs_free")] public static extern void ReceiveTlvs_free(long _this_obj);
+       // const uint8_t (*ReceiveTlvs_get_payment_secret(const struct LDKReceiveTlvs *NONNULL_PTR this_ptr))[32];
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReceiveTlvs_get_payment_secret")] public static extern long ReceiveTlvs_get_payment_secret(long _this_ptr);
+       // void ReceiveTlvs_set_payment_secret(struct LDKReceiveTlvs *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReceiveTlvs_set_payment_secret")] public static extern void ReceiveTlvs_set_payment_secret(long _this_ptr, long _val);
+       // struct LDKPaymentConstraints ReceiveTlvs_get_payment_constraints(const struct LDKReceiveTlvs *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReceiveTlvs_get_payment_constraints")] public static extern long ReceiveTlvs_get_payment_constraints(long _this_ptr);
+       // void ReceiveTlvs_set_payment_constraints(struct LDKReceiveTlvs *NONNULL_PTR this_ptr, struct LDKPaymentConstraints val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReceiveTlvs_set_payment_constraints")] public static extern void ReceiveTlvs_set_payment_constraints(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKReceiveTlvs ReceiveTlvs_new(struct LDKThirtyTwoBytes payment_secret_arg, struct LDKPaymentConstraints payment_constraints_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReceiveTlvs_new")] public static extern long ReceiveTlvs_new(long _payment_secret_arg, long _payment_constraints_arg);
+       // uint64_t ReceiveTlvs_clone_ptr(LDKReceiveTlvs *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReceiveTlvs_clone_ptr")] public static extern long ReceiveTlvs_clone_ptr(long _arg);
+       // struct LDKReceiveTlvs ReceiveTlvs_clone(const struct LDKReceiveTlvs *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReceiveTlvs_clone")] public static extern long ReceiveTlvs_clone(long _orig);
+       // void PaymentRelay_free(struct LDKPaymentRelay this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentRelay_free")] public static extern void PaymentRelay_free(long _this_obj);
+       // uint16_t PaymentRelay_get_cltv_expiry_delta(const struct LDKPaymentRelay *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentRelay_get_cltv_expiry_delta")] public static extern short PaymentRelay_get_cltv_expiry_delta(long _this_ptr);
+       // void PaymentRelay_set_cltv_expiry_delta(struct LDKPaymentRelay *NONNULL_PTR this_ptr, uint16_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentRelay_set_cltv_expiry_delta")] public static extern void PaymentRelay_set_cltv_expiry_delta(long _this_ptr, short _val);
+       // uint32_t PaymentRelay_get_fee_proportional_millionths(const struct LDKPaymentRelay *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentRelay_get_fee_proportional_millionths")] public static extern int PaymentRelay_get_fee_proportional_millionths(long _this_ptr);
+       // void PaymentRelay_set_fee_proportional_millionths(struct LDKPaymentRelay *NONNULL_PTR this_ptr, uint32_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentRelay_set_fee_proportional_millionths")] public static extern void PaymentRelay_set_fee_proportional_millionths(long _this_ptr, int _val);
+       // uint32_t PaymentRelay_get_fee_base_msat(const struct LDKPaymentRelay *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentRelay_get_fee_base_msat")] public static extern int PaymentRelay_get_fee_base_msat(long _this_ptr);
+       // void PaymentRelay_set_fee_base_msat(struct LDKPaymentRelay *NONNULL_PTR this_ptr, uint32_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentRelay_set_fee_base_msat")] public static extern void PaymentRelay_set_fee_base_msat(long _this_ptr, int _val);
+       // MUST_USE_RES struct LDKPaymentRelay PaymentRelay_new(uint16_t cltv_expiry_delta_arg, uint32_t fee_proportional_millionths_arg, uint32_t fee_base_msat_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentRelay_new")] public static extern long PaymentRelay_new(short _cltv_expiry_delta_arg, int _fee_proportional_millionths_arg, int _fee_base_msat_arg);
+       // uint64_t PaymentRelay_clone_ptr(LDKPaymentRelay *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentRelay_clone_ptr")] public static extern long PaymentRelay_clone_ptr(long _arg);
+       // struct LDKPaymentRelay PaymentRelay_clone(const struct LDKPaymentRelay *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentRelay_clone")] public static extern long PaymentRelay_clone(long _orig);
+       // void PaymentConstraints_free(struct LDKPaymentConstraints this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentConstraints_free")] public static extern void PaymentConstraints_free(long _this_obj);
+       // uint32_t PaymentConstraints_get_max_cltv_expiry(const struct LDKPaymentConstraints *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentConstraints_get_max_cltv_expiry")] public static extern int PaymentConstraints_get_max_cltv_expiry(long _this_ptr);
+       // void PaymentConstraints_set_max_cltv_expiry(struct LDKPaymentConstraints *NONNULL_PTR this_ptr, uint32_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentConstraints_set_max_cltv_expiry")] public static extern void PaymentConstraints_set_max_cltv_expiry(long _this_ptr, int _val);
+       // uint64_t PaymentConstraints_get_htlc_minimum_msat(const struct LDKPaymentConstraints *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentConstraints_get_htlc_minimum_msat")] public static extern long PaymentConstraints_get_htlc_minimum_msat(long _this_ptr);
+       // void PaymentConstraints_set_htlc_minimum_msat(struct LDKPaymentConstraints *NONNULL_PTR this_ptr, uint64_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentConstraints_set_htlc_minimum_msat")] public static extern void PaymentConstraints_set_htlc_minimum_msat(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKPaymentConstraints PaymentConstraints_new(uint32_t max_cltv_expiry_arg, uint64_t htlc_minimum_msat_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentConstraints_new")] public static extern long PaymentConstraints_new(int _max_cltv_expiry_arg, long _htlc_minimum_msat_arg);
+       // uint64_t PaymentConstraints_clone_ptr(LDKPaymentConstraints *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentConstraints_clone_ptr")] public static extern long PaymentConstraints_clone_ptr(long _arg);
+       // struct LDKPaymentConstraints PaymentConstraints_clone(const struct LDKPaymentConstraints *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentConstraints_clone")] public static extern long PaymentConstraints_clone(long _orig);
+       // struct LDKCVec_u8Z ForwardTlvs_write(const struct LDKForwardTlvs *NONNULL_PTR obj);
+       [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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentRelay_read")] public static extern long PaymentRelay_read(long _ser);
+       // struct LDKCVec_u8Z PaymentConstraints_write(const struct LDKPaymentConstraints *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentConstraints_write")] public static extern long PaymentConstraints_write(long _obj);
+       // struct LDKCResult_PaymentConstraintsDecodeErrorZ PaymentConstraints_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentConstraints_read")] public static extern long PaymentConstraints_read(long _ser);
        // void PaymentPurpose_free(struct LDKPaymentPurpose this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentPurpose_free")] public static extern void PaymentPurpose_free(long _this_ptr);
        // uint64_t PaymentPurpose_clone_ptr(LDKPaymentPurpose *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentPurpose_clone_ptr")] public static extern long PaymentPurpose_clone_ptr(long _arg);
        // struct LDKPaymentPurpose PaymentPurpose_clone(const struct LDKPaymentPurpose *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentPurpose_clone")] public static extern long PaymentPurpose_clone(long _orig);
-       // struct LDKPaymentPurpose PaymentPurpose_invoice_payment(struct LDKCOption_PaymentPreimageZ payment_preimage, struct LDKThirtyTwoBytes payment_secret);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentPurpose_invoice_payment")] public static extern long PaymentPurpose_invoice_payment(long _payment_preimage, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_secret);
+       // struct LDKPaymentPurpose PaymentPurpose_invoice_payment(struct LDKCOption_ThirtyTwoBytesZ payment_preimage, struct LDKThirtyTwoBytes payment_secret);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentPurpose_invoice_payment")] public static extern long PaymentPurpose_invoice_payment(long _payment_preimage, long _payment_secret);
        // struct LDKPaymentPurpose PaymentPurpose_spontaneous_payment(struct LDKThirtyTwoBytes a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentPurpose_spontaneous_payment")] public static extern long PaymentPurpose_spontaneous_payment([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a);
+       [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);
        // struct LDKCVec_u8Z PaymentPurpose_write(const struct LDKPaymentPurpose *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentPurpose_write")] public static extern byte[] PaymentPurpose_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentPurpose_write")] public static extern long PaymentPurpose_write(long _obj);
        // struct LDKCResult_PaymentPurposeDecodeErrorZ PaymentPurpose_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentPurpose_read")] public static extern long PaymentPurpose_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentPurpose_read")] public static extern long PaymentPurpose_read(long _ser);
+       // void ClaimedHTLC_free(struct LDKClaimedHTLC this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_free")] public static extern void ClaimedHTLC_free(long _this_obj);
+       // const uint8_t (*ClaimedHTLC_get_channel_id(const struct LDKClaimedHTLC *NONNULL_PTR this_ptr))[32];
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_get_channel_id")] public static extern long ClaimedHTLC_get_channel_id(long _this_ptr);
+       // void ClaimedHTLC_set_channel_id(struct LDKClaimedHTLC *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_set_channel_id")] public static extern void ClaimedHTLC_set_channel_id(long _this_ptr, long _val);
+       // struct LDKU128 ClaimedHTLC_get_user_channel_id(const struct LDKClaimedHTLC *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_get_user_channel_id")] public static extern long ClaimedHTLC_get_user_channel_id(long _this_ptr);
+       // void ClaimedHTLC_set_user_channel_id(struct LDKClaimedHTLC *NONNULL_PTR this_ptr, struct LDKU128 val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_set_user_channel_id")] public static extern void ClaimedHTLC_set_user_channel_id(long _this_ptr, long _val);
+       // uint32_t ClaimedHTLC_get_cltv_expiry(const struct LDKClaimedHTLC *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_get_cltv_expiry")] public static extern int ClaimedHTLC_get_cltv_expiry(long _this_ptr);
+       // void ClaimedHTLC_set_cltv_expiry(struct LDKClaimedHTLC *NONNULL_PTR this_ptr, uint32_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_set_cltv_expiry")] public static extern void ClaimedHTLC_set_cltv_expiry(long _this_ptr, int _val);
+       // uint64_t ClaimedHTLC_get_value_msat(const struct LDKClaimedHTLC *NONNULL_PTR this_ptr);
+       [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_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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_clone")] public static extern long ClaimedHTLC_clone(long _orig);
+       // bool ClaimedHTLC_eq(const struct LDKClaimedHTLC *NONNULL_PTR a, const struct LDKClaimedHTLC *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_eq")] public static extern bool ClaimedHTLC_eq(long _a, long _b);
+       // struct LDKCVec_u8Z ClaimedHTLC_write(const struct LDKClaimedHTLC *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_write")] public static extern long ClaimedHTLC_write(long _obj);
+       // struct LDKCResult_ClaimedHTLCDecodeErrorZ ClaimedHTLC_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_read")] public static extern long ClaimedHTLC_read(long _ser);
        // void PathFailure_free(struct LDKPathFailure this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PathFailure_free")] public static extern void PathFailure_free(long _this_ptr);
        // uint64_t PathFailure_clone_ptr(LDKPathFailure *NONNULL_PTR arg);
@@ -9861,9 +11503,9 @@ internal class bindings {
        // bool PathFailure_eq(const struct LDKPathFailure *NONNULL_PTR a, const struct LDKPathFailure *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PathFailure_eq")] public static extern bool PathFailure_eq(long _a, long _b);
        // struct LDKCVec_u8Z PathFailure_write(const struct LDKPathFailure *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PathFailure_write")] public static extern byte[] PathFailure_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PathFailure_write")] public static extern long PathFailure_write(long _obj);
        // struct LDKCResult_COption_PathFailureZDecodeErrorZ PathFailure_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PathFailure_read")] public static extern long PathFailure_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PathFailure_read")] public static extern long PathFailure_read(long _ser);
        // void ClosureReason_free(struct LDKClosureReason this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosureReason_free")] public static extern void ClosureReason_free(long _this_ptr);
        // uint64_t ClosureReason_clone_ptr(LDKClosureReason *NONNULL_PTR arg);
@@ -9881,19 +11523,21 @@ internal class bindings {
        // struct LDKClosureReason ClosureReason_funding_timed_out(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosureReason_funding_timed_out")] public static extern long ClosureReason_funding_timed_out();
        // struct LDKClosureReason ClosureReason_processing_error(struct LDKStr err);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosureReason_processing_error")] public static extern long ClosureReason_processing_error(string _err);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosureReason_processing_error")] public static extern long ClosureReason_processing_error(long _err);
        // struct LDKClosureReason ClosureReason_disconnected_peer(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosureReason_disconnected_peer")] public static extern long ClosureReason_disconnected_peer();
        // struct LDKClosureReason ClosureReason_outdated_channel_manager(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosureReason_outdated_channel_manager")] public static extern long ClosureReason_outdated_channel_manager();
        // struct LDKClosureReason ClosureReason_counterparty_coop_closed_unfunded_channel(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosureReason_counterparty_coop_closed_unfunded_channel")] public static extern long ClosureReason_counterparty_coop_closed_unfunded_channel();
+       // struct LDKClosureReason ClosureReason_funding_batch_closure(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosureReason_funding_batch_closure")] public static extern long ClosureReason_funding_batch_closure();
        // bool ClosureReason_eq(const struct LDKClosureReason *NONNULL_PTR a, const struct LDKClosureReason *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosureReason_eq")] public static extern bool ClosureReason_eq(long _a, long _b);
        // struct LDKCVec_u8Z ClosureReason_write(const struct LDKClosureReason *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosureReason_write")] public static extern byte[] ClosureReason_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosureReason_write")] public static extern long ClosureReason_write(long _obj);
        // struct LDKCResult_COption_ClosureReasonZDecodeErrorZ ClosureReason_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosureReason_read")] public static extern long ClosureReason_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosureReason_read")] public static extern long ClosureReason_read(long _ser);
        // void HTLCDestination_free(struct LDKHTLCDestination this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDestination_free")] public static extern void HTLCDestination_free(long _this_ptr);
        // uint64_t HTLCDestination_clone_ptr(LDKHTLCDestination *NONNULL_PTR arg);
@@ -9901,19 +11545,19 @@ internal class bindings {
        // struct LDKHTLCDestination HTLCDestination_clone(const struct LDKHTLCDestination *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDestination_clone")] public static extern long HTLCDestination_clone(long _orig);
        // struct LDKHTLCDestination HTLCDestination_next_hop_channel(struct LDKPublicKey node_id, struct LDKThirtyTwoBytes channel_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDestination_next_hop_channel")] public static extern long HTLCDestination_next_hop_channel([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDestination_next_hop_channel")] public static extern long HTLCDestination_next_hop_channel(long _node_id, long _channel_id);
        // struct LDKHTLCDestination HTLCDestination_unknown_next_hop(uint64_t requested_forward_scid);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDestination_unknown_next_hop")] public static extern long HTLCDestination_unknown_next_hop(long _requested_forward_scid);
        // struct LDKHTLCDestination HTLCDestination_invalid_forward(uint64_t requested_forward_scid);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDestination_invalid_forward")] public static extern long HTLCDestination_invalid_forward(long _requested_forward_scid);
        // struct LDKHTLCDestination HTLCDestination_failed_payment(struct LDKThirtyTwoBytes payment_hash);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDestination_failed_payment")] public static extern long HTLCDestination_failed_payment([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDestination_failed_payment")] public static extern long HTLCDestination_failed_payment(long _payment_hash);
        // bool HTLCDestination_eq(const struct LDKHTLCDestination *NONNULL_PTR a, const struct LDKHTLCDestination *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDestination_eq")] public static extern bool HTLCDestination_eq(long _a, long _b);
        // struct LDKCVec_u8Z HTLCDestination_write(const struct LDKHTLCDestination *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDestination_write")] public static extern byte[] HTLCDestination_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDestination_write")] public static extern long HTLCDestination_write(long _obj);
        // struct LDKCResult_COption_HTLCDestinationZDecodeErrorZ HTLCDestination_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDestination_read")] public static extern long HTLCDestination_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDestination_read")] public static extern long HTLCDestination_read(long _ser);
        // enum LDKPaymentFailureReason PaymentFailureReason_clone(const enum LDKPaymentFailureReason *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentFailureReason_clone")] public static extern PaymentFailureReason PaymentFailureReason_clone(long _orig);
        // enum LDKPaymentFailureReason PaymentFailureReason_recipient_rejected(void);
@@ -9931,9 +11575,9 @@ internal class bindings {
        // bool PaymentFailureReason_eq(const enum LDKPaymentFailureReason *NONNULL_PTR a, const enum LDKPaymentFailureReason *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentFailureReason_eq")] public static extern bool PaymentFailureReason_eq(long _a, long _b);
        // struct LDKCVec_u8Z PaymentFailureReason_write(const enum LDKPaymentFailureReason *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentFailureReason_write")] public static extern byte[] PaymentFailureReason_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentFailureReason_write")] public static extern long PaymentFailureReason_write(long _obj);
        // struct LDKCResult_PaymentFailureReasonDecodeErrorZ PaymentFailureReason_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentFailureReason_read")] public static extern long PaymentFailureReason_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentFailureReason_read")] public static extern long PaymentFailureReason_read(long _ser);
        // void Event_free(struct LDKEvent this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_free")] public static extern void Event_free(long _this_ptr);
        // uint64_t Event_clone_ptr(LDKEvent *NONNULL_PTR arg);
@@ -9941,51 +11585,53 @@ internal class bindings {
        // struct LDKEvent Event_clone(const struct LDKEvent *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_clone")] public static extern long Event_clone(long _orig);
        // struct LDKEvent Event_funding_generation_ready(struct LDKThirtyTwoBytes temporary_channel_id, struct LDKPublicKey counterparty_node_id, uint64_t channel_value_satoshis, struct LDKCVec_u8Z output_script, struct LDKU128 user_channel_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_funding_generation_ready")] public static extern long Event_funding_generation_ready([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _temporary_channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _counterparty_node_id, long _channel_value_satoshis, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _output_script, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _user_channel_id);
-       // struct LDKEvent Event_payment_claimable(struct LDKPublicKey receiver_node_id, struct LDKThirtyTwoBytes payment_hash, struct LDKRecipientOnionFields onion_fields, uint64_t amount_msat, uint64_t counterparty_skimmed_fee_msat, struct LDKPaymentPurpose purpose, struct LDKThirtyTwoBytes via_channel_id, struct LDKCOption_u128Z via_user_channel_id, struct LDKCOption_u32Z claim_deadline);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_payment_claimable")] public static extern long Event_payment_claimable([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _receiver_node_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, long _onion_fields, long _amount_msat, long _counterparty_skimmed_fee_msat, long _purpose, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_payment_claimed")] public static extern long Event_payment_claimed([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _receiver_node_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, long _amount_msat, long _purpose);
-       // struct LDKEvent Event_payment_sent(struct LDKCOption_PaymentIdZ payment_id, struct LDKThirtyTwoBytes payment_preimage, struct LDKThirtyTwoBytes payment_hash, struct LDKCOption_u64Z fee_paid_msat);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_payment_sent")] public static extern long Event_payment_sent(long _payment_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_preimage, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, long _fee_paid_msat);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_funding_generation_ready")] public static extern long Event_funding_generation_ready(long _temporary_channel_id, long _counterparty_node_id, long _channel_value_satoshis, long _output_script, long _user_channel_id);
+       // struct LDKEvent Event_payment_claimable(struct LDKPublicKey receiver_node_id, struct LDKThirtyTwoBytes payment_hash, struct LDKRecipientOnionFields onion_fields, uint64_t amount_msat, uint64_t counterparty_skimmed_fee_msat, struct LDKPaymentPurpose purpose, struct LDKCOption_ThirtyTwoBytesZ via_channel_id, struct LDKCOption_U128Z via_user_channel_id, struct LDKCOption_u32Z claim_deadline);
+       [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_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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_payment_sent")] public static extern long Event_payment_sent(long _payment_id, long _payment_preimage, long _payment_hash, long _fee_paid_msat);
        // struct LDKEvent Event_payment_failed(struct LDKThirtyTwoBytes payment_id, struct LDKThirtyTwoBytes payment_hash, struct LDKCOption_PaymentFailureReasonZ reason);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_payment_failed")] public static extern long Event_payment_failed([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, long _reason);
-       // struct LDKEvent Event_payment_path_successful(struct LDKThirtyTwoBytes payment_id, struct LDKCOption_PaymentHashZ payment_hash, struct LDKPath path);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_payment_path_successful")] public static extern long Event_payment_path_successful([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_id, long _payment_hash, long _path);
-       // struct LDKEvent Event_payment_path_failed(struct LDKCOption_PaymentIdZ payment_id, struct LDKThirtyTwoBytes payment_hash, bool payment_failed_permanently, struct LDKPathFailure failure, struct LDKPath path, struct LDKCOption_u64Z short_channel_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_payment_path_failed")] public static extern long Event_payment_path_failed(long _payment_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, bool _payment_failed_permanently, long _failure, long _path, long _short_channel_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_payment_failed")] public static extern long Event_payment_failed(long _payment_id, long _payment_hash, long _reason);
+       // struct LDKEvent Event_payment_path_successful(struct LDKThirtyTwoBytes payment_id, struct LDKCOption_ThirtyTwoBytesZ payment_hash, struct LDKPath path);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_payment_path_successful")] public static extern long Event_payment_path_successful(long _payment_id, long _payment_hash, long _path);
+       // struct LDKEvent Event_payment_path_failed(struct LDKCOption_ThirtyTwoBytesZ payment_id, struct LDKThirtyTwoBytes payment_hash, bool payment_failed_permanently, struct LDKPathFailure failure, struct LDKPath path, struct LDKCOption_u64Z short_channel_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_payment_path_failed")] public static extern long Event_payment_path_failed(long _payment_id, long _payment_hash, bool _payment_failed_permanently, long _failure, long _path, long _short_channel_id);
        // struct LDKEvent Event_probe_successful(struct LDKThirtyTwoBytes payment_id, struct LDKThirtyTwoBytes payment_hash, struct LDKPath path);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_probe_successful")] public static extern long Event_probe_successful([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, long _path);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_probe_successful")] public static extern long Event_probe_successful(long _payment_id, long _payment_hash, long _path);
        // struct LDKEvent Event_probe_failed(struct LDKThirtyTwoBytes payment_id, struct LDKThirtyTwoBytes payment_hash, struct LDKPath path, struct LDKCOption_u64Z short_channel_id);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_probe_failed")] public static extern long Event_probe_failed([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, long _path, long _short_channel_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_probe_failed")] public static extern long Event_probe_failed(long _payment_id, long _payment_hash, long _path, long _short_channel_id);
        // struct LDKEvent Event_pending_htlcs_forwardable(uint64_t time_forwardable);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_pending_htlcs_forwardable")] public static extern long Event_pending_htlcs_forwardable(long _time_forwardable);
        // struct LDKEvent Event_htlcintercepted(struct LDKThirtyTwoBytes intercept_id, uint64_t requested_next_hop_scid, struct LDKThirtyTwoBytes payment_hash, uint64_t inbound_amount_msat, uint64_t expected_outbound_amount_msat);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_htlcintercepted")] public static extern long Event_htlcintercepted([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _intercept_id, long _requested_next_hop_scid, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, long _inbound_amount_msat, long _expected_outbound_amount_msat);
-       // struct LDKEvent Event_spendable_outputs(struct LDKCVec_SpendableOutputDescriptorZ outputs);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_spendable_outputs")] public static extern long Event_spendable_outputs([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _outputs);
-       // struct LDKEvent Event_payment_forwarded(struct LDKThirtyTwoBytes prev_channel_id, struct LDKThirtyTwoBytes next_channel_id, struct LDKCOption_u64Z fee_earned_msat, bool claim_from_onchain_tx, struct LDKCOption_u64Z outbound_amount_forwarded_msat);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_payment_forwarded")] public static extern long Event_payment_forwarded([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _prev_channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _next_channel_id, long _fee_earned_msat, bool _claim_from_onchain_tx, long _outbound_amount_forwarded_msat);
-       // struct LDKEvent Event_channel_pending(struct LDKThirtyTwoBytes channel_id, struct LDKU128 user_channel_id, struct LDKThirtyTwoBytes former_temporary_channel_id, struct LDKPublicKey counterparty_node_id, struct LDKOutPoint funding_txo);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_channel_pending")] public static extern long Event_channel_pending([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _user_channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _former_temporary_channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _counterparty_node_id, long _funding_txo);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_htlcintercepted")] public static extern long Event_htlcintercepted(long _intercept_id, long _requested_next_hop_scid, long _payment_hash, long _inbound_amount_msat, long _expected_outbound_amount_msat);
+       // struct LDKEvent Event_spendable_outputs(struct LDKCVec_SpendableOutputDescriptorZ outputs, struct LDKCOption_ThirtyTwoBytesZ channel_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_spendable_outputs")] public static extern long Event_spendable_outputs(long _outputs, long _channel_id);
+       // struct LDKEvent Event_payment_forwarded(struct LDKCOption_ThirtyTwoBytesZ prev_channel_id, struct LDKCOption_ThirtyTwoBytesZ next_channel_id, struct LDKCOption_u64Z fee_earned_msat, bool claim_from_onchain_tx, struct LDKCOption_u64Z outbound_amount_forwarded_msat);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_payment_forwarded")] public static extern long Event_payment_forwarded(long _prev_channel_id, long _next_channel_id, long _fee_earned_msat, bool _claim_from_onchain_tx, long _outbound_amount_forwarded_msat);
+       // struct LDKEvent Event_channel_pending(struct LDKThirtyTwoBytes channel_id, struct LDKU128 user_channel_id, struct LDKCOption_ThirtyTwoBytesZ former_temporary_channel_id, struct LDKPublicKey counterparty_node_id, struct LDKOutPoint funding_txo);
+       [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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _user_channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _counterparty_node_id, long _channel_type);
-       // struct LDKEvent Event_channel_closed(struct LDKThirtyTwoBytes channel_id, struct LDKU128 user_channel_id, struct LDKClosureReason reason);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_channel_closed")] public static extern long Event_channel_closed([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _user_channel_id, long _reason);
+       [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_discard_funding(struct LDKThirtyTwoBytes channel_id, struct LDKTransaction transaction);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_discard_funding")] public static extern long Event_discard_funding([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_open_channel_request")] public static extern long Event_open_channel_request([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _temporary_channel_id, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _counterparty_node_id, long _funding_satoshis, long _push_msat, long _channel_type);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_open_channel_request")] public static extern long Event_open_channel_request(long _temporary_channel_id, long _counterparty_node_id, long _funding_satoshis, long _push_msat, long _channel_type);
        // struct LDKEvent Event_htlchandling_failed(struct LDKThirtyTwoBytes prev_channel_id, struct LDKHTLCDestination failed_next_destination);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_htlchandling_failed")] public static extern long Event_htlchandling_failed([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _prev_channel_id, long _failed_next_destination);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_htlchandling_failed")] public static extern long Event_htlchandling_failed(long _prev_channel_id, long _failed_next_destination);
        // struct LDKEvent Event_bump_transaction(struct LDKBumpTransactionEvent a);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_bump_transaction")] public static extern long Event_bump_transaction(long _a);
        // bool Event_eq(const struct LDKEvent *NONNULL_PTR a, const struct LDKEvent *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_eq")] public static extern bool Event_eq(long _a, long _b);
        // struct LDKCVec_u8Z Event_write(const struct LDKEvent *NONNULL_PTR obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_write")] public static extern byte[] Event_write(long _obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_write")] public static extern long Event_write(long _obj);
        // struct LDKCResult_COption_EventZDecodeErrorZ Event_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_read")] public static extern long Event_read([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_read")] public static extern long Event_read(long _ser);
        // void MessageSendEvent_free(struct LDKMessageSendEvent this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_free")] public static extern void MessageSendEvent_free(long _this_ptr);
        // uint64_t MessageSendEvent_clone_ptr(LDKMessageSendEvent *NONNULL_PTR arg);
@@ -9993,51 +11639,51 @@ internal class bindings {
        // struct LDKMessageSendEvent MessageSendEvent_clone(const struct LDKMessageSendEvent *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_clone")] public static extern long MessageSendEvent_clone(long _orig);
        // struct LDKMessageSendEvent MessageSendEvent_send_accept_channel(struct LDKPublicKey node_id, struct LDKAcceptChannel msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_accept_channel")] public static extern long MessageSendEvent_send_accept_channel([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_accept_channel")] public static extern long MessageSendEvent_send_accept_channel(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_accept_channel_v2(struct LDKPublicKey node_id, struct LDKAcceptChannelV2 msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_accept_channel_v2")] public static extern long MessageSendEvent_send_accept_channel_v2([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_accept_channel_v2")] public static extern long MessageSendEvent_send_accept_channel_v2(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_open_channel(struct LDKPublicKey node_id, struct LDKOpenChannel msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_open_channel")] public static extern long MessageSendEvent_send_open_channel([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_open_channel")] public static extern long MessageSendEvent_send_open_channel(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_open_channel_v2(struct LDKPublicKey node_id, struct LDKOpenChannelV2 msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_open_channel_v2")] public static extern long MessageSendEvent_send_open_channel_v2([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_open_channel_v2")] public static extern long MessageSendEvent_send_open_channel_v2(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_funding_created(struct LDKPublicKey node_id, struct LDKFundingCreated msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_funding_created")] public static extern long MessageSendEvent_send_funding_created([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _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_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([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_add_output")] public static extern long MessageSendEvent_send_tx_add_output([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_add_output")] public static extern long MessageSendEvent_send_tx_add_output(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_tx_remove_input(struct LDKPublicKey node_id, struct LDKTxRemoveInput msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_remove_input")] public static extern long MessageSendEvent_send_tx_remove_input([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_remove_input")] public static extern long MessageSendEvent_send_tx_remove_input(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_tx_remove_output(struct LDKPublicKey node_id, struct LDKTxRemoveOutput msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_remove_output")] public static extern long MessageSendEvent_send_tx_remove_output([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_remove_output")] public static extern long MessageSendEvent_send_tx_remove_output(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_tx_complete(struct LDKPublicKey node_id, struct LDKTxComplete msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_complete")] public static extern long MessageSendEvent_send_tx_complete([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_complete")] public static extern long MessageSendEvent_send_tx_complete(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_tx_signatures(struct LDKPublicKey node_id, struct LDKTxSignatures msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_signatures")] public static extern long MessageSendEvent_send_tx_signatures([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_signatures")] public static extern long MessageSendEvent_send_tx_signatures(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_tx_init_rbf(struct LDKPublicKey node_id, struct LDKTxInitRbf msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_init_rbf")] public static extern long MessageSendEvent_send_tx_init_rbf([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_init_rbf")] public static extern long MessageSendEvent_send_tx_init_rbf(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_tx_ack_rbf(struct LDKPublicKey node_id, struct LDKTxAckRbf msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_ack_rbf")] public static extern long MessageSendEvent_send_tx_ack_rbf([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
-       // struct LDKMessageSendEvent MessageSendEvent_send_tx_abort(struct LDKPublicKey node_id, struct LDKTxAddInput msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_abort")] public static extern long MessageSendEvent_send_tx_abort([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_ack_rbf")] public static extern long MessageSendEvent_send_tx_ack_rbf(long _node_id, long _msg);
+       // struct LDKMessageSendEvent MessageSendEvent_send_tx_abort(struct LDKPublicKey node_id, struct LDKTxAbort msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_abort")] public static extern long MessageSendEvent_send_tx_abort(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_channel_ready(struct LDKPublicKey node_id, struct LDKChannelReady msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_channel_ready")] public static extern long MessageSendEvent_send_channel_ready([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_channel_ready")] public static extern long MessageSendEvent_send_channel_ready(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_announcement_signatures(struct LDKPublicKey node_id, struct LDKAnnouncementSignatures msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_announcement_signatures")] public static extern long MessageSendEvent_send_announcement_signatures([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_announcement_signatures")] public static extern long MessageSendEvent_send_announcement_signatures(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_update_htlcs(struct LDKPublicKey node_id, struct LDKCommitmentUpdate updates);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_update_htlcs")] public static extern long MessageSendEvent_update_htlcs([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _updates);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_update_htlcs")] public static extern long MessageSendEvent_update_htlcs(long _node_id, long _updates);
        // struct LDKMessageSendEvent MessageSendEvent_send_revoke_and_ack(struct LDKPublicKey node_id, struct LDKRevokeAndACK msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_revoke_and_ack")] public static extern long MessageSendEvent_send_revoke_and_ack([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_revoke_and_ack")] public static extern long MessageSendEvent_send_revoke_and_ack(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_closing_signed(struct LDKPublicKey node_id, struct LDKClosingSigned msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_closing_signed")] public static extern long MessageSendEvent_send_closing_signed([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_closing_signed")] public static extern long MessageSendEvent_send_closing_signed(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_shutdown(struct LDKPublicKey node_id, struct LDKShutdown msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_shutdown")] public static extern long MessageSendEvent_send_shutdown([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_shutdown")] public static extern long MessageSendEvent_send_shutdown(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_channel_reestablish(struct LDKPublicKey node_id, struct LDKChannelReestablish msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_channel_reestablish")] public static extern long MessageSendEvent_send_channel_reestablish([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_channel_reestablish")] public static extern long MessageSendEvent_send_channel_reestablish(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_channel_announcement(struct LDKPublicKey node_id, struct LDKChannelAnnouncement msg, struct LDKChannelUpdate update_msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_channel_announcement")] public static extern long MessageSendEvent_send_channel_announcement([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg, long _update_msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_channel_announcement")] public static extern long MessageSendEvent_send_channel_announcement(long _node_id, long _msg, long _update_msg);
        // struct LDKMessageSendEvent MessageSendEvent_broadcast_channel_announcement(struct LDKChannelAnnouncement msg, struct LDKChannelUpdate update_msg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_broadcast_channel_announcement")] public static extern long MessageSendEvent_broadcast_channel_announcement(long _msg, long _update_msg);
        // struct LDKMessageSendEvent MessageSendEvent_broadcast_channel_update(struct LDKChannelUpdate msg);
@@ -10045,47 +11691,23 @@ internal class bindings {
        // struct LDKMessageSendEvent MessageSendEvent_broadcast_node_announcement(struct LDKNodeAnnouncement msg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_broadcast_node_announcement")] public static extern long MessageSendEvent_broadcast_node_announcement(long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_channel_update(struct LDKPublicKey node_id, struct LDKChannelUpdate msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_channel_update")] public static extern long MessageSendEvent_send_channel_update([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_channel_update")] public static extern long MessageSendEvent_send_channel_update(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_handle_error(struct LDKPublicKey node_id, struct LDKErrorAction action);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_handle_error")] public static extern long MessageSendEvent_handle_error([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _action);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_handle_error")] public static extern long MessageSendEvent_handle_error(long _node_id, long _action);
        // struct LDKMessageSendEvent MessageSendEvent_send_channel_range_query(struct LDKPublicKey node_id, struct LDKQueryChannelRange msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_channel_range_query")] public static extern long MessageSendEvent_send_channel_range_query([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_channel_range_query")] public static extern long MessageSendEvent_send_channel_range_query(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_short_ids_query(struct LDKPublicKey node_id, struct LDKQueryShortChannelIds msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_short_ids_query")] public static extern long MessageSendEvent_send_short_ids_query([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_short_ids_query")] public static extern long MessageSendEvent_send_short_ids_query(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_reply_channel_range(struct LDKPublicKey node_id, struct LDKReplyChannelRange msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_reply_channel_range")] public static extern long MessageSendEvent_send_reply_channel_range([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_reply_channel_range")] public static extern long MessageSendEvent_send_reply_channel_range(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_gossip_timestamp_filter(struct LDKPublicKey node_id, struct LDKGossipTimestampFilter msg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_gossip_timestamp_filter")] public static extern long MessageSendEvent_send_gossip_timestamp_filter([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _node_id, long _msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_gossip_timestamp_filter")] public static extern long MessageSendEvent_send_gossip_timestamp_filter(long _node_id, long _msg);
        // void MessageSendEventsProvider_free(struct LDKMessageSendEventsProvider this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEventsProvider_free")] public static extern void MessageSendEventsProvider_free(long _this_ptr);
-       // void OnionMessageProvider_free(struct LDKOnionMessageProvider this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageProvider_free")] public static extern void OnionMessageProvider_free(long _this_ptr);
        // void EventsProvider_free(struct LDKEventsProvider this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EventsProvider_free")] public static extern void EventsProvider_free(long _this_ptr);
        // void EventHandler_free(struct LDKEventHandler this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EventHandler_free")] public static extern void EventHandler_free(long _this_ptr);
-       // void ChannelDerivationParameters_free(struct LDKChannelDerivationParameters this_obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_free")] public static extern void ChannelDerivationParameters_free(long _this_obj);
-       // uint64_t ChannelDerivationParameters_get_value_satoshis(const struct LDKChannelDerivationParameters *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_get_value_satoshis")] public static extern long ChannelDerivationParameters_get_value_satoshis(long _this_ptr);
-       // void ChannelDerivationParameters_set_value_satoshis(struct LDKChannelDerivationParameters *NONNULL_PTR this_ptr, uint64_t val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_set_value_satoshis")] public static extern void ChannelDerivationParameters_set_value_satoshis(long _this_ptr, long _val);
-       // const uint8_t (*ChannelDerivationParameters_get_keys_id(const struct LDKChannelDerivationParameters *NONNULL_PTR this_ptr))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_get_keys_id")] public static extern byte[] ChannelDerivationParameters_get_keys_id(long _this_ptr);
-       // void ChannelDerivationParameters_set_keys_id(struct LDKChannelDerivationParameters *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_set_keys_id")] public static extern void ChannelDerivationParameters_set_keys_id(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // struct LDKChannelTransactionParameters ChannelDerivationParameters_get_transaction_parameters(const struct LDKChannelDerivationParameters *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_get_transaction_parameters")] public static extern long ChannelDerivationParameters_get_transaction_parameters(long _this_ptr);
-       // void ChannelDerivationParameters_set_transaction_parameters(struct LDKChannelDerivationParameters *NONNULL_PTR this_ptr, struct LDKChannelTransactionParameters val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_set_transaction_parameters")] public static extern void ChannelDerivationParameters_set_transaction_parameters(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKChannelDerivationParameters ChannelDerivationParameters_new(uint64_t value_satoshis_arg, struct LDKThirtyTwoBytes keys_id_arg, struct LDKChannelTransactionParameters transaction_parameters_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_new")] public static extern long ChannelDerivationParameters_new(long _value_satoshis_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _keys_id_arg, long _transaction_parameters_arg);
-       // uint64_t ChannelDerivationParameters_clone_ptr(LDKChannelDerivationParameters *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_clone_ptr")] public static extern long ChannelDerivationParameters_clone_ptr(long _arg);
-       // struct LDKChannelDerivationParameters ChannelDerivationParameters_clone(const struct LDKChannelDerivationParameters *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_clone")] public static extern long ChannelDerivationParameters_clone(long _orig);
-       // bool ChannelDerivationParameters_eq(const struct LDKChannelDerivationParameters *NONNULL_PTR a, const struct LDKChannelDerivationParameters *NONNULL_PTR b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_eq")] public static extern bool ChannelDerivationParameters_eq(long _a, long _b);
        // void AnchorDescriptor_free(struct LDKAnchorDescriptor this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnchorDescriptor_free")] public static extern void AnchorDescriptor_free(long _this_obj);
        // struct LDKChannelDerivationParameters AnchorDescriptor_get_channel_derivation_parameters(const struct LDKAnchorDescriptor *NONNULL_PTR this_ptr);
@@ -10109,57 +11731,11 @@ internal class bindings {
        // MUST_USE_RES struct LDKTxIn AnchorDescriptor_unsigned_tx_input(const struct LDKAnchorDescriptor *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnchorDescriptor_unsigned_tx_input")] public static extern long AnchorDescriptor_unsigned_tx_input(long _this_arg);
        // MUST_USE_RES struct LDKCVec_u8Z AnchorDescriptor_witness_script(const struct LDKAnchorDescriptor *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnchorDescriptor_witness_script")] public static extern byte[] AnchorDescriptor_witness_script(long _this_arg);
-       // MUST_USE_RES struct LDKWitness AnchorDescriptor_tx_input_witness(const struct LDKAnchorDescriptor *NONNULL_PTR this_arg, struct LDKSignature signature);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnchorDescriptor_tx_input_witness")] public static extern byte[] AnchorDescriptor_tx_input_witness(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _signature);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnchorDescriptor_witness_script")] public static extern long AnchorDescriptor_witness_script(long _this_arg);
+       // MUST_USE_RES struct LDKWitness AnchorDescriptor_tx_input_witness(const struct LDKAnchorDescriptor *NONNULL_PTR this_arg, struct LDKECDSASignature signature);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnchorDescriptor_tx_input_witness")] public static extern long AnchorDescriptor_tx_input_witness(long _this_arg, long _signature);
        // MUST_USE_RES struct LDKWriteableEcdsaChannelSigner AnchorDescriptor_derive_channel_signer(const struct LDKAnchorDescriptor *NONNULL_PTR this_arg, const struct LDKSignerProvider *NONNULL_PTR signer_provider);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnchorDescriptor_derive_channel_signer")] public static extern long AnchorDescriptor_derive_channel_signer(long _this_arg, long _signer_provider);
-       // void HTLCDescriptor_free(struct LDKHTLCDescriptor this_obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_free")] public static extern void HTLCDescriptor_free(long _this_obj);
-       // struct LDKChannelDerivationParameters HTLCDescriptor_get_channel_derivation_parameters(const struct LDKHTLCDescriptor *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_get_channel_derivation_parameters")] public static extern long HTLCDescriptor_get_channel_derivation_parameters(long _this_ptr);
-       // void HTLCDescriptor_set_channel_derivation_parameters(struct LDKHTLCDescriptor *NONNULL_PTR this_ptr, struct LDKChannelDerivationParameters val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_set_channel_derivation_parameters")] public static extern void HTLCDescriptor_set_channel_derivation_parameters(long _this_ptr, long _val);
-       // uint64_t HTLCDescriptor_get_per_commitment_number(const struct LDKHTLCDescriptor *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_get_per_commitment_number")] public static extern long HTLCDescriptor_get_per_commitment_number(long _this_ptr);
-       // void HTLCDescriptor_set_per_commitment_number(struct LDKHTLCDescriptor *NONNULL_PTR this_ptr, uint64_t val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_set_per_commitment_number")] public static extern void HTLCDescriptor_set_per_commitment_number(long _this_ptr, long _val);
-       // struct LDKPublicKey HTLCDescriptor_get_per_commitment_point(const struct LDKHTLCDescriptor *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_get_per_commitment_point")] public static extern byte[] HTLCDescriptor_get_per_commitment_point(long _this_ptr);
-       // void HTLCDescriptor_set_per_commitment_point(struct LDKHTLCDescriptor *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_set_per_commitment_point")] public static extern void HTLCDescriptor_set_per_commitment_point(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // struct LDKHTLCOutputInCommitment HTLCDescriptor_get_htlc(const struct LDKHTLCDescriptor *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_get_htlc")] public static extern long HTLCDescriptor_get_htlc(long _this_ptr);
-       // void HTLCDescriptor_set_htlc(struct LDKHTLCDescriptor *NONNULL_PTR this_ptr, struct LDKHTLCOutputInCommitment val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_set_htlc")] public static extern void HTLCDescriptor_set_htlc(long _this_ptr, long _val);
-       // struct LDKCOption_PaymentPreimageZ HTLCDescriptor_get_preimage(const struct LDKHTLCDescriptor *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_get_preimage")] public static extern long HTLCDescriptor_get_preimage(long _this_ptr);
-       // void HTLCDescriptor_set_preimage(struct LDKHTLCDescriptor *NONNULL_PTR this_ptr, struct LDKCOption_PaymentPreimageZ val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_set_preimage")] public static extern void HTLCDescriptor_set_preimage(long _this_ptr, long _val);
-       // struct LDKSignature HTLCDescriptor_get_counterparty_sig(const struct LDKHTLCDescriptor *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_get_counterparty_sig")] public static extern byte[] HTLCDescriptor_get_counterparty_sig(long _this_ptr);
-       // void HTLCDescriptor_set_counterparty_sig(struct LDKHTLCDescriptor *NONNULL_PTR this_ptr, struct LDKSignature val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_set_counterparty_sig")] public static extern void HTLCDescriptor_set_counterparty_sig(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
-       // uint64_t HTLCDescriptor_clone_ptr(LDKHTLCDescriptor *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_clone_ptr")] public static extern long HTLCDescriptor_clone_ptr(long _arg);
-       // struct LDKHTLCDescriptor HTLCDescriptor_clone(const struct LDKHTLCDescriptor *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_clone")] public static extern long HTLCDescriptor_clone(long _orig);
-       // bool HTLCDescriptor_eq(const struct LDKHTLCDescriptor *NONNULL_PTR a, const struct LDKHTLCDescriptor *NONNULL_PTR b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_eq")] public static extern bool HTLCDescriptor_eq(long _a, long _b);
-       // MUST_USE_RES struct LDKOutPoint HTLCDescriptor_outpoint(const struct LDKHTLCDescriptor *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_outpoint")] public static extern long HTLCDescriptor_outpoint(long _this_arg);
-       // MUST_USE_RES struct LDKTxOut HTLCDescriptor_previous_utxo(const struct LDKHTLCDescriptor *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_previous_utxo")] public static extern long HTLCDescriptor_previous_utxo(long _this_arg);
-       // MUST_USE_RES struct LDKTxIn HTLCDescriptor_unsigned_tx_input(const struct LDKHTLCDescriptor *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_unsigned_tx_input")] public static extern long HTLCDescriptor_unsigned_tx_input(long _this_arg);
-       // MUST_USE_RES struct LDKTxOut HTLCDescriptor_tx_output(const struct LDKHTLCDescriptor *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_tx_output")] public static extern long HTLCDescriptor_tx_output(long _this_arg);
-       // MUST_USE_RES struct LDKCVec_u8Z HTLCDescriptor_witness_script(const struct LDKHTLCDescriptor *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_witness_script")] public static extern byte[] HTLCDescriptor_witness_script(long _this_arg);
-       // MUST_USE_RES struct LDKWitness HTLCDescriptor_tx_input_witness(const struct LDKHTLCDescriptor *NONNULL_PTR this_arg, struct LDKSignature signature, struct LDKu8slice witness_script);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_tx_input_witness")] public static extern byte[] HTLCDescriptor_tx_input_witness(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _signature, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _witness_script);
-       // MUST_USE_RES struct LDKWriteableEcdsaChannelSigner HTLCDescriptor_derive_channel_signer(const struct LDKHTLCDescriptor *NONNULL_PTR this_arg, const struct LDKSignerProvider *NONNULL_PTR signer_provider);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_derive_channel_signer")] public static extern long HTLCDescriptor_derive_channel_signer(long _this_arg, long _signer_provider);
        // void BumpTransactionEvent_free(struct LDKBumpTransactionEvent this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BumpTransactionEvent_free")] public static extern void BumpTransactionEvent_free(long _this_ptr);
        // uint64_t BumpTransactionEvent_clone_ptr(LDKBumpTransactionEvent *NONNULL_PTR arg);
@@ -10167,9 +11743,9 @@ internal class bindings {
        // struct LDKBumpTransactionEvent BumpTransactionEvent_clone(const struct LDKBumpTransactionEvent *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BumpTransactionEvent_clone")] public static extern long BumpTransactionEvent_clone(long _orig);
        // struct LDKBumpTransactionEvent BumpTransactionEvent_channel_close(struct LDKThirtyTwoBytes claim_id, uint32_t package_target_feerate_sat_per_1000_weight, struct LDKTransaction commitment_tx, uint64_t commitment_tx_fee_satoshis, struct LDKAnchorDescriptor anchor_descriptor, struct LDKCVec_HTLCOutputInCommitmentZ pending_htlcs);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BumpTransactionEvent_channel_close")] public static extern long BumpTransactionEvent_channel_close([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _claim_id, int _package_target_feerate_sat_per_1000_weight, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _commitment_tx, long _commitment_tx_fee_satoshis, long _anchor_descriptor, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _pending_htlcs);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BumpTransactionEvent_channel_close")] public static extern long BumpTransactionEvent_channel_close(long _claim_id, int _package_target_feerate_sat_per_1000_weight, long _commitment_tx, long _commitment_tx_fee_satoshis, long _anchor_descriptor, long _pending_htlcs);
        // struct LDKBumpTransactionEvent BumpTransactionEvent_htlcresolution(struct LDKThirtyTwoBytes claim_id, uint32_t target_feerate_sat_per_1000_weight, struct LDKCVec_HTLCDescriptorZ htlc_descriptors, uint32_t tx_lock_time);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BumpTransactionEvent_htlcresolution")] public static extern long BumpTransactionEvent_htlcresolution([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _claim_id, int _target_feerate_sat_per_1000_weight, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _htlc_descriptors, int _tx_lock_time);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BumpTransactionEvent_htlcresolution")] public static extern long BumpTransactionEvent_htlcresolution(long _claim_id, int _target_feerate_sat_per_1000_weight, long _htlc_descriptors, int _tx_lock_time);
        // bool BumpTransactionEvent_eq(const struct LDKBumpTransactionEvent *NONNULL_PTR a, const struct LDKBumpTransactionEvent *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BumpTransactionEvent_eq")] public static extern bool BumpTransactionEvent_eq(long _a, long _b);
        // void Input_free(struct LDKInput this_obj);
@@ -10221,19 +11797,19 @@ internal class bindings {
        // bool Utxo_eq(const struct LDKUtxo *NONNULL_PTR a, const struct LDKUtxo *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Utxo_eq")] public static extern bool Utxo_eq(long _a, long _b);
        // MUST_USE_RES struct LDKUtxo Utxo_new_p2pkh(struct LDKOutPoint outpoint, uint64_t value, const uint8_t (*pubkey_hash)[20]);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Utxo_new_p2pkh")] public static extern long Utxo_new_p2pkh(long _outpoint, long _value, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _pubkey_hash);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Utxo_new_p2pkh")] public static extern long Utxo_new_p2pkh(long _outpoint, long _value, long _pubkey_hash);
        // void CoinSelection_free(struct LDKCoinSelection this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CoinSelection_free")] public static extern void CoinSelection_free(long _this_obj);
        // struct LDKCVec_UtxoZ CoinSelection_get_confirmed_utxos(const struct LDKCoinSelection *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CoinSelection_get_confirmed_utxos")] public static extern long[] CoinSelection_get_confirmed_utxos(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CoinSelection_get_confirmed_utxos")] public static extern long CoinSelection_get_confirmed_utxos(long _this_ptr);
        // void CoinSelection_set_confirmed_utxos(struct LDKCoinSelection *NONNULL_PTR this_ptr, struct LDKCVec_UtxoZ val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CoinSelection_set_confirmed_utxos")] public static extern void CoinSelection_set_confirmed_utxos(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CoinSelection_set_confirmed_utxos")] public static extern void CoinSelection_set_confirmed_utxos(long _this_ptr, long _val);
        // struct LDKCOption_TxOutZ CoinSelection_get_change_output(const struct LDKCoinSelection *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CoinSelection_get_change_output")] public static extern long CoinSelection_get_change_output(long _this_ptr);
        // void CoinSelection_set_change_output(struct LDKCoinSelection *NONNULL_PTR this_ptr, struct LDKCOption_TxOutZ val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CoinSelection_set_change_output")] public static extern void CoinSelection_set_change_output(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKCoinSelection CoinSelection_new(struct LDKCVec_UtxoZ confirmed_utxos_arg, struct LDKCOption_TxOutZ change_output_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CoinSelection_new")] public static extern long CoinSelection_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _confirmed_utxos_arg, long _change_output_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CoinSelection_new")] public static extern long CoinSelection_new(long _confirmed_utxos_arg, long _change_output_arg);
        // uint64_t CoinSelection_clone_ptr(LDKCoinSelection *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CoinSelection_clone_ptr")] public static extern long CoinSelection_clone_ptr(long _arg);
        // struct LDKCoinSelection CoinSelection_clone(const struct LDKCoinSelection *NONNULL_PTR orig);
@@ -10254,14 +11830,14 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BumpTransactionEventHandler_new")] public static extern long BumpTransactionEventHandler_new(long _broadcaster, long _utxo_source, long _signer_provider, long _logger);
        // void BumpTransactionEventHandler_handle_event(const struct LDKBumpTransactionEventHandler *NONNULL_PTR this_arg, const struct LDKBumpTransactionEvent *NONNULL_PTR event);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BumpTransactionEventHandler_handle_event")] public static extern void BumpTransactionEventHandler_handle_event(long _this_arg, long _event);
-       // void FilesystemPersister_free(struct LDKFilesystemPersister this_obj);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FilesystemPersister_free")] public static extern void FilesystemPersister_free(long _this_obj);
-       // MUST_USE_RES struct LDKFilesystemPersister FilesystemPersister_new(struct LDKStr path_to_channel_data);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FilesystemPersister_new")] public static extern long FilesystemPersister_new(string _path_to_channel_data);
-       // MUST_USE_RES struct LDKStr FilesystemPersister_get_data_dir(const struct LDKFilesystemPersister *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FilesystemPersister_get_data_dir")] public static extern string FilesystemPersister_get_data_dir(long _this_arg);
-       // MUST_USE_RES struct LDKCResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ FilesystemPersister_read_channelmonitors(const struct LDKFilesystemPersister *NONNULL_PTR this_arg, struct LDKEntropySource entropy_source, const struct LDKSignerProvider *NONNULL_PTR signer_provider);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FilesystemPersister_read_channelmonitors")] public static extern long FilesystemPersister_read_channelmonitors(long _this_arg, long _entropy_source, long _signer_provider);
+       // void FilesystemStore_free(struct LDKFilesystemStore this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FilesystemStore_free")] public static extern void FilesystemStore_free(long _this_obj);
+       // MUST_USE_RES struct LDKFilesystemStore FilesystemStore_new(struct LDKStr data_dir);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FilesystemStore_new")] public static extern long FilesystemStore_new(long _data_dir);
+       // MUST_USE_RES struct LDKStr FilesystemStore_get_data_dir(const struct LDKFilesystemStore *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FilesystemStore_get_data_dir")] public static extern long FilesystemStore_get_data_dir(long _this_arg);
+       // struct LDKKVStore FilesystemStore_as_KVStore(const struct LDKFilesystemStore *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FilesystemStore_as_KVStore")] public static extern long FilesystemStore_as_KVStore(long _this_arg);
        // void BackgroundProcessor_free(struct LDKBackgroundProcessor this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BackgroundProcessor_free")] public static extern void BackgroundProcessor_free(long _this_obj);
        // void GossipSync_free(struct LDKGossipSync this_ptr);
@@ -10274,9 +11850,9 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipSync_none")] public static extern long GossipSync_none();
        // MUST_USE_RES struct LDKBackgroundProcessor BackgroundProcessor_start(struct LDKPersister persister, struct LDKEventHandler event_handler, const struct LDKChainMonitor *NONNULL_PTR chain_monitor, const struct LDKChannelManager *NONNULL_PTR channel_manager, struct LDKGossipSync gossip_sync, const struct LDKPeerManager *NONNULL_PTR peer_manager, struct LDKLogger logger, struct LDKCOption_WriteableScoreZ scorer);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BackgroundProcessor_start")] public static extern long BackgroundProcessor_start(long _persister, long _event_handler, long _chain_monitor, long _channel_manager, long _gossip_sync, long _peer_manager, long _logger, long _scorer);
-       // MUST_USE_RES struct LDKCResult_NoneErrorZ BackgroundProcessor_join(struct LDKBackgroundProcessor this_arg);
+       // MUST_USE_RES struct LDKCResult_NoneIOErrorZ BackgroundProcessor_join(struct LDKBackgroundProcessor this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BackgroundProcessor_join")] public static extern long BackgroundProcessor_join(long _this_arg);
-       // MUST_USE_RES struct LDKCResult_NoneErrorZ BackgroundProcessor_stop(struct LDKBackgroundProcessor this_arg);
+       // MUST_USE_RES struct LDKCResult_NoneIOErrorZ BackgroundProcessor_stop(struct LDKBackgroundProcessor this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BackgroundProcessor_stop")] public static extern long BackgroundProcessor_stop(long _this_arg);
        // void Bolt11ParseError_free(struct LDKBolt11ParseError this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11ParseError_free")] public static extern void Bolt11ParseError_free(long _this_ptr);
@@ -10317,7 +11893,7 @@ internal class bindings {
        // struct LDKBolt11ParseError Bolt11ParseError_invalid_recovery_id(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11ParseError_invalid_recovery_id")] public static extern long Bolt11ParseError_invalid_recovery_id();
        // struct LDKBolt11ParseError Bolt11ParseError_invalid_slice_length(struct LDKStr a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11ParseError_invalid_slice_length")] public static extern long Bolt11ParseError_invalid_slice_length(string _a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11ParseError_invalid_slice_length")] public static extern long Bolt11ParseError_invalid_slice_length(long _a);
        // struct LDKBolt11ParseError Bolt11ParseError_skip(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11ParseError_skip")] public static extern long Bolt11ParseError_skip();
        // bool Bolt11ParseError_eq(const struct LDKBolt11ParseError *NONNULL_PTR a, const struct LDKBolt11ParseError *NONNULL_PTR b);
@@ -10435,7 +12011,7 @@ internal class bindings {
        // bool Sha256_eq(const struct LDKSha256 *NONNULL_PTR a, const struct LDKSha256 *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Sha256_eq")] public static extern bool Sha256_eq(long _a, long _b);
        // MUST_USE_RES struct LDKSha256 Sha256_from_bytes(const uint8_t (*bytes)[32]);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Sha256_from_bytes")] public static extern long Sha256_from_bytes([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _bytes);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Sha256_from_bytes")] public static extern long Sha256_from_bytes(long _bytes);
        // void Description_free(struct LDKDescription this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Description_free")] public static extern void Description_free(long _this_obj);
        // uint64_t Description_clone_ptr(LDKDescription *NONNULL_PTR arg);
@@ -10449,11 +12025,11 @@ internal class bindings {
        // void PayeePubKey_free(struct LDKPayeePubKey this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PayeePubKey_free")] public static extern void PayeePubKey_free(long _this_obj);
        // struct LDKPublicKey PayeePubKey_get_a(const struct LDKPayeePubKey *NONNULL_PTR this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PayeePubKey_get_a")] public static extern byte[] PayeePubKey_get_a(long _this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PayeePubKey_get_a")] public static extern long PayeePubKey_get_a(long _this_ptr);
        // void PayeePubKey_set_a(struct LDKPayeePubKey *NONNULL_PTR this_ptr, struct LDKPublicKey val);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PayeePubKey_set_a")] public static extern void PayeePubKey_set_a(long _this_ptr, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PayeePubKey_set_a")] public static extern void PayeePubKey_set_a(long _this_ptr, long _val);
        // MUST_USE_RES struct LDKPayeePubKey PayeePubKey_new(struct LDKPublicKey a_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PayeePubKey_new")] public static extern long PayeePubKey_new([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PayeePubKey_new")] public static extern long PayeePubKey_new(long _a_arg);
        // uint64_t PayeePubKey_clone_ptr(LDKPayeePubKey *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PayeePubKey_clone_ptr")] public static extern long PayeePubKey_clone_ptr(long _arg);
        // struct LDKPayeePubKey PayeePubKey_clone(const struct LDKPayeePubKey *NONNULL_PTR orig);
@@ -10495,11 +12071,11 @@ internal class bindings {
        // struct LDKFallback Fallback_clone(const struct LDKFallback *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Fallback_clone")] public static extern long Fallback_clone(long _orig);
        // struct LDKFallback Fallback_seg_wit_program(struct LDKWitnessVersion version, struct LDKCVec_u8Z program);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Fallback_seg_wit_program")] public static extern long Fallback_seg_wit_program(byte _version, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _program);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Fallback_seg_wit_program")] public static extern long Fallback_seg_wit_program(byte _version, long _program);
        // struct LDKFallback Fallback_pub_key_hash(struct LDKTwentyBytes a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Fallback_pub_key_hash")] public static extern long Fallback_pub_key_hash([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Fallback_pub_key_hash")] public static extern long Fallback_pub_key_hash(long _a);
        // struct LDKFallback Fallback_script_hash(struct LDKTwentyBytes a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Fallback_script_hash")] public static extern long Fallback_script_hash([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Fallback_script_hash")] public static extern long Fallback_script_hash(long _a);
        // uint64_t Fallback_hash(const struct LDKFallback *NONNULL_PTR o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Fallback_hash")] public static extern long Fallback_hash(long _o);
        // bool Fallback_eq(const struct LDKFallback *NONNULL_PTR a, const struct LDKFallback *NONNULL_PTR b);
@@ -10529,15 +12105,15 @@ internal class bindings {
        // MUST_USE_RES struct LDKRawBolt11Invoice SignedRawBolt11Invoice_raw_invoice(const struct LDKSignedRawBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignedRawBolt11Invoice_raw_invoice")] public static extern long SignedRawBolt11Invoice_raw_invoice(long _this_arg);
        // MUST_USE_RES const uint8_t (*SignedRawBolt11Invoice_signable_hash(const struct LDKSignedRawBolt11Invoice *NONNULL_PTR this_arg))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignedRawBolt11Invoice_signable_hash")] public static extern byte[] SignedRawBolt11Invoice_signable_hash(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignedRawBolt11Invoice_signable_hash")] public static extern long SignedRawBolt11Invoice_signable_hash(long _this_arg);
        // MUST_USE_RES struct LDKBolt11InvoiceSignature SignedRawBolt11Invoice_signature(const struct LDKSignedRawBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignedRawBolt11Invoice_signature")] public static extern long SignedRawBolt11Invoice_signature(long _this_arg);
-       // MUST_USE_RES struct LDKCResult_PayeePubKeyErrorZ SignedRawBolt11Invoice_recover_payee_pub_key(const struct LDKSignedRawBolt11Invoice *NONNULL_PTR this_arg);
+       // MUST_USE_RES struct LDKCResult_PayeePubKeySecp256k1ErrorZ SignedRawBolt11Invoice_recover_payee_pub_key(const struct LDKSignedRawBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignedRawBolt11Invoice_recover_payee_pub_key")] public static extern long SignedRawBolt11Invoice_recover_payee_pub_key(long _this_arg);
        // MUST_USE_RES bool SignedRawBolt11Invoice_check_signature(const struct LDKSignedRawBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignedRawBolt11Invoice_check_signature")] public static extern bool SignedRawBolt11Invoice_check_signature(long _this_arg);
        // MUST_USE_RES struct LDKThirtyTwoBytes RawBolt11Invoice_signable_hash(const struct LDKRawBolt11Invoice *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RawBolt11Invoice_signable_hash")] public static extern byte[] RawBolt11Invoice_signable_hash(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RawBolt11Invoice_signable_hash")] public static extern long RawBolt11Invoice_signable_hash(long _this_arg);
        // MUST_USE_RES struct LDKSha256 RawBolt11Invoice_payment_hash(const struct LDKRawBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RawBolt11Invoice_payment_hash")] public static extern long RawBolt11Invoice_payment_hash(long _this_arg);
        // MUST_USE_RES struct LDKDescription RawBolt11Invoice_description(const struct LDKRawBolt11Invoice *NONNULL_PTR this_arg);
@@ -10550,14 +12126,14 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RawBolt11Invoice_expiry_time")] public static extern long RawBolt11Invoice_expiry_time(long _this_arg);
        // MUST_USE_RES struct LDKMinFinalCltvExpiryDelta RawBolt11Invoice_min_final_cltv_expiry_delta(const struct LDKRawBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RawBolt11Invoice_min_final_cltv_expiry_delta")] public static extern long RawBolt11Invoice_min_final_cltv_expiry_delta(long _this_arg);
-       // MUST_USE_RES struct LDKCOption_PaymentSecretZ RawBolt11Invoice_payment_secret(const struct LDKRawBolt11Invoice *NONNULL_PTR this_arg);
+       // MUST_USE_RES struct LDKCOption_ThirtyTwoBytesZ RawBolt11Invoice_payment_secret(const struct LDKRawBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RawBolt11Invoice_payment_secret")] public static extern long RawBolt11Invoice_payment_secret(long _this_arg);
        // MUST_USE_RES struct LDKCOption_CVec_u8ZZ RawBolt11Invoice_payment_metadata(const struct LDKRawBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RawBolt11Invoice_payment_metadata")] public static extern long RawBolt11Invoice_payment_metadata(long _this_arg);
        // MUST_USE_RES struct LDKBolt11InvoiceFeatures RawBolt11Invoice_features(const struct LDKRawBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RawBolt11Invoice_features")] public static extern long RawBolt11Invoice_features(long _this_arg);
        // MUST_USE_RES struct LDKCVec_PrivateRouteZ RawBolt11Invoice_private_routes(const struct LDKRawBolt11Invoice *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RawBolt11Invoice_private_routes")] public static extern long[] RawBolt11Invoice_private_routes(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RawBolt11Invoice_private_routes")] public static extern long RawBolt11Invoice_private_routes(long _this_arg);
        // MUST_USE_RES struct LDKCOption_u64Z RawBolt11Invoice_amount_pico_btc(const struct LDKRawBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RawBolt11Invoice_amount_pico_btc")] public static extern long RawBolt11Invoice_amount_pico_btc(long _this_arg);
        // MUST_USE_RES enum LDKCurrency RawBolt11Invoice_currency(const struct LDKRawBolt11Invoice *NONNULL_PTR this_arg);
@@ -10575,7 +12151,7 @@ internal class bindings {
        // MUST_USE_RES uint64_t PositiveTimestamp_as_time(const struct LDKPositiveTimestamp *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PositiveTimestamp_as_time")] public static extern long PositiveTimestamp_as_time(long _this_arg);
        // MUST_USE_RES struct LDKThirtyTwoBytes Bolt11Invoice_signable_hash(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_signable_hash")] public static extern byte[] Bolt11Invoice_signable_hash(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_signable_hash")] public static extern long Bolt11Invoice_signable_hash(long _this_arg);
        // MUST_USE_RES struct LDKSignedRawBolt11Invoice Bolt11Invoice_into_signed_raw(struct LDKBolt11Invoice this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_into_signed_raw")] public static extern long Bolt11Invoice_into_signed_raw(long _this_arg);
        // MUST_USE_RES struct LDKCResult_NoneBolt11SemanticErrorZ Bolt11Invoice_check_signature(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
@@ -10587,18 +12163,18 @@ internal class bindings {
        // MUST_USE_RES uint64_t Bolt11Invoice_duration_since_epoch(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_duration_since_epoch")] public static extern long Bolt11Invoice_duration_since_epoch(long _this_arg);
        // MUST_USE_RES const uint8_t (*Bolt11Invoice_payment_hash(const struct LDKBolt11Invoice *NONNULL_PTR this_arg))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_payment_hash")] public static extern byte[] Bolt11Invoice_payment_hash(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_payment_hash")] public static extern long Bolt11Invoice_payment_hash(long _this_arg);
        // MUST_USE_RES struct LDKPublicKey Bolt11Invoice_payee_pub_key(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_payee_pub_key")] public static extern byte[] Bolt11Invoice_payee_pub_key(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_payee_pub_key")] public static extern long Bolt11Invoice_payee_pub_key(long _this_arg);
        // MUST_USE_RES const uint8_t (*Bolt11Invoice_payment_secret(const struct LDKBolt11Invoice *NONNULL_PTR this_arg))[32];
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_payment_secret")] public static extern byte[] Bolt11Invoice_payment_secret(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_payment_secret")] public static extern long Bolt11Invoice_payment_secret(long _this_arg);
        // MUST_USE_RES struct LDKCOption_CVec_u8ZZ Bolt11Invoice_payment_metadata(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_payment_metadata")] public static extern long Bolt11Invoice_payment_metadata(long _this_arg);
        // MUST_USE_RES struct LDKBolt11InvoiceFeatures Bolt11Invoice_features(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_features")] public static extern long Bolt11Invoice_features(long _this_arg);
        // MUST_USE_RES struct LDKPublicKey Bolt11Invoice_recover_payee_pub_key(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_recover_payee_pub_key")] public static extern byte[] Bolt11Invoice_recover_payee_pub_key(long _this_arg);
-       // MUST_USE_RES struct LDKCOption_DurationZ Bolt11Invoice_expires_at(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_recover_payee_pub_key")] public static extern long Bolt11Invoice_recover_payee_pub_key(long _this_arg);
+       // MUST_USE_RES struct LDKCOption_u64Z Bolt11Invoice_expires_at(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_expires_at")] public static extern long Bolt11Invoice_expires_at(long _this_arg);
        // MUST_USE_RES uint64_t Bolt11Invoice_expiry_time(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_expiry_time")] public static extern long Bolt11Invoice_expiry_time(long _this_arg);
@@ -10612,20 +12188,20 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_would_expire")] public static extern bool Bolt11Invoice_would_expire(long _this_arg, long _at_time);
        // MUST_USE_RES uint64_t Bolt11Invoice_min_final_cltv_expiry_delta(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_min_final_cltv_expiry_delta")] public static extern long Bolt11Invoice_min_final_cltv_expiry_delta(long _this_arg);
-       // MUST_USE_RES struct LDKCVec_AddressZ Bolt11Invoice_fallback_addresses(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_fallback_addresses")] public static extern string[] Bolt11Invoice_fallback_addresses(long _this_arg);
+       // MUST_USE_RES struct LDKCVec_StrZ Bolt11Invoice_fallback_addresses(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_fallback_addresses")] public static extern long Bolt11Invoice_fallback_addresses(long _this_arg);
        // MUST_USE_RES struct LDKCVec_PrivateRouteZ Bolt11Invoice_private_routes(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_private_routes")] public static extern long[] Bolt11Invoice_private_routes(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_private_routes")] public static extern long Bolt11Invoice_private_routes(long _this_arg);
        // MUST_USE_RES struct LDKCVec_RouteHintZ Bolt11Invoice_route_hints(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_route_hints")] public static extern long[] Bolt11Invoice_route_hints(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_route_hints")] public static extern long Bolt11Invoice_route_hints(long _this_arg);
        // MUST_USE_RES enum LDKCurrency Bolt11Invoice_currency(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_currency")] public static extern Currency Bolt11Invoice_currency(long _this_arg);
        // MUST_USE_RES struct LDKCOption_u64Z Bolt11Invoice_amount_milli_satoshis(const struct LDKBolt11Invoice *NONNULL_PTR this_arg);
        [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(string _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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Description_into_inner")] public static extern string Description_into_inner(long _this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Description_into_inner")] public static extern long Description_into_inner(long _this_arg);
        // 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);
@@ -10655,7 +12231,7 @@ internal class bindings {
        // bool CreationError_eq(const enum LDKCreationError *NONNULL_PTR a, const enum LDKCreationError *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CreationError_eq")] public static extern bool CreationError_eq(long _a, long _b);
        // struct LDKStr CreationError_to_str(const enum LDKCreationError *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CreationError_to_str")] public static extern string CreationError_to_str(long _o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CreationError_to_str")] public static extern long CreationError_to_str(long _o);
        // enum LDKBolt11SemanticError Bolt11SemanticError_clone(const enum LDKBolt11SemanticError *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11SemanticError_clone")] public static extern Bolt11SemanticError Bolt11SemanticError_clone(long _orig);
        // enum LDKBolt11SemanticError Bolt11SemanticError_no_payment_hash(void);
@@ -10681,7 +12257,7 @@ internal class bindings {
        // bool Bolt11SemanticError_eq(const enum LDKBolt11SemanticError *NONNULL_PTR a, const enum LDKBolt11SemanticError *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11SemanticError_eq")] public static extern bool Bolt11SemanticError_eq(long _a, long _b);
        // struct LDKStr Bolt11SemanticError_to_str(const enum LDKBolt11SemanticError *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11SemanticError_to_str")] public static extern string Bolt11SemanticError_to_str(long _o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11SemanticError_to_str")] public static extern long Bolt11SemanticError_to_str(long _o);
        // void SignOrCreationError_free(struct LDKSignOrCreationError this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignOrCreationError_free")] public static extern void SignOrCreationError_free(long _this_ptr);
        // uint64_t SignOrCreationError_clone_ptr(LDKSignOrCreationError *NONNULL_PTR arg);
@@ -10695,15 +12271,19 @@ internal class bindings {
        // bool SignOrCreationError_eq(const struct LDKSignOrCreationError *NONNULL_PTR a, const struct LDKSignOrCreationError *NONNULL_PTR b);
        [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 string SignOrCreationError_to_str(long _o);
-       // struct LDKCResult_PaymentIdPaymentErrorZ pay_invoice(const struct LDKBolt11Invoice *NONNULL_PTR invoice, struct LDKRetry retry_strategy, const struct LDKChannelManager *NONNULL_PTR channelmanager);
+       [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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_id, long _retry_strategy, long _channelmanager);
-       // struct LDKCResult_PaymentIdPaymentErrorZ 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_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, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_id, long _retry_strategy, long _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);
@@ -10711,53 +12291,65 @@ internal class bindings {
        // 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(string _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);
-       // struct LDKCResult_Bolt11InvoiceSignOrCreationErrorZ create_phantom_invoice(struct LDKCOption_u64Z amt_msat, struct LDKCOption_PaymentHashZ 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, string _description, int _invoice_expiry_delta_secs, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] 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_PaymentHashZ 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);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_create_phantom_invoice_with_description_hash")] public static extern long create_phantom_invoice_with_description_hash(long _amt_msat, long _payment_hash, int _invoice_expiry_delta_secs, long _description_hash, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] long[] _phantom_route_hints, long _entropy_source, long _node_signer, long _logger, Currency _network, long _min_final_cltv_expiry_delta, long _duration_since_epoch);
+       // 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_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);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_create_phantom_invoice_with_description_hash")] public static extern long create_phantom_invoice_with_description_hash(long _amt_msat, long _payment_hash, int _invoice_expiry_delta_secs, long _description_hash, 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_invoice_from_channelmanager(const struct LDKChannelManager *NONNULL_PTR channelmanager, struct LDKNodeSigner node_signer, struct LDKLogger logger, enum LDKCurrency network, struct LDKCOption_u64Z amt_msat, struct LDKStr description, uint32_t invoice_expiry_delta_secs, struct LDKCOption_u16Z min_final_cltv_expiry_delta);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_create_invoice_from_channelmanager")] public static extern long create_invoice_from_channelmanager(long _channelmanager, long _node_signer, long _logger, Currency _network, long _amt_msat, string _description, int _invoice_expiry_delta_secs, long _min_final_cltv_expiry_delta);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_create_invoice_from_channelmanager")] public static extern long create_invoice_from_channelmanager(long _channelmanager, long _node_signer, long _logger, Currency _network, long _amt_msat, long _description, int _invoice_expiry_delta_secs, long _min_final_cltv_expiry_delta);
        // struct LDKCResult_Bolt11InvoiceSignOrCreationErrorZ create_invoice_from_channelmanager_with_description_hash(const struct LDKChannelManager *NONNULL_PTR channelmanager, struct LDKNodeSigner node_signer, struct LDKLogger logger, enum LDKCurrency network, struct LDKCOption_u64Z amt_msat, struct LDKSha256 description_hash, uint32_t invoice_expiry_delta_secs, struct LDKCOption_u16Z min_final_cltv_expiry_delta);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_create_invoice_from_channelmanager_with_description_hash")] public static extern long create_invoice_from_channelmanager_with_description_hash(long _channelmanager, long _node_signer, long _logger, Currency _network, long _amt_msat, long _description_hash, int _invoice_expiry_delta_secs, long _min_final_cltv_expiry_delta);
        // struct LDKCResult_Bolt11InvoiceSignOrCreationErrorZ create_invoice_from_channelmanager_with_description_hash_and_duration_since_epoch(const struct LDKChannelManager *NONNULL_PTR channelmanager, struct LDKNodeSigner node_signer, struct LDKLogger logger, enum LDKCurrency network, struct LDKCOption_u64Z amt_msat, struct LDKSha256 description_hash, uint64_t duration_since_epoch, uint32_t invoice_expiry_delta_secs, struct LDKCOption_u16Z min_final_cltv_expiry_delta);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_create_invoice_from_channelmanager_with_description_hash_and_duration_since_epoch")] public static extern long create_invoice_from_channelmanager_with_description_hash_and_duration_since_epoch(long _channelmanager, long _node_signer, long _logger, Currency _network, long _amt_msat, long _description_hash, long _duration_since_epoch, int _invoice_expiry_delta_secs, long _min_final_cltv_expiry_delta);
        // struct LDKCResult_Bolt11InvoiceSignOrCreationErrorZ create_invoice_from_channelmanager_and_duration_since_epoch(const struct LDKChannelManager *NONNULL_PTR channelmanager, struct LDKNodeSigner node_signer, struct LDKLogger logger, enum LDKCurrency network, struct LDKCOption_u64Z amt_msat, struct LDKStr description, uint64_t duration_since_epoch, uint32_t invoice_expiry_delta_secs, struct LDKCOption_u16Z min_final_cltv_expiry_delta);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_create_invoice_from_channelmanager_and_duration_since_epoch")] public static extern long create_invoice_from_channelmanager_and_duration_since_epoch(long _channelmanager, long _node_signer, long _logger, Currency _network, long _amt_msat, string _description, long _duration_since_epoch, int _invoice_expiry_delta_secs, long _min_final_cltv_expiry_delta);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_create_invoice_from_channelmanager_and_duration_since_epoch")] public static extern long create_invoice_from_channelmanager_and_duration_since_epoch(long _channelmanager, long _node_signer, long _logger, Currency _network, long _amt_msat, long _description, long _duration_since_epoch, int _invoice_expiry_delta_secs, long _min_final_cltv_expiry_delta);
        // struct LDKCResult_Bolt11InvoiceSignOrCreationErrorZ create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_hash(const struct LDKChannelManager *NONNULL_PTR channelmanager, struct LDKNodeSigner node_signer, struct LDKLogger logger, enum LDKCurrency network, struct LDKCOption_u64Z amt_msat, struct LDKStr description, uint64_t duration_since_epoch, uint32_t invoice_expiry_delta_secs, struct LDKThirtyTwoBytes payment_hash, struct LDKCOption_u16Z min_final_cltv_expiry_delta);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_hash")] public static extern long create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_hash(long _channelmanager, long _node_signer, long _logger, Currency _network, long _amt_msat, string _description, long _duration_since_epoch, int _invoice_expiry_delta_secs, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _payment_hash, long _min_final_cltv_expiry_delta);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_hash")] public static extern long create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_hash(long _channelmanager, long _node_signer, long _logger, Currency _network, long _amt_msat, long _description, long _duration_since_epoch, int _invoice_expiry_delta_secs, long _payment_hash, long _min_final_cltv_expiry_delta);
        // struct LDKCResult_SiPrefixBolt11ParseErrorZ SiPrefix_from_str(struct LDKStr s);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SiPrefix_from_str")] public static extern long SiPrefix_from_str(string _s);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SiPrefix_from_str")] public static extern long SiPrefix_from_str(long _s);
        // struct LDKCResult_Bolt11InvoiceParseOrSemanticErrorZ Bolt11Invoice_from_str(struct LDKStr s);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_from_str")] public static extern long Bolt11Invoice_from_str(string _s);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_from_str")] public static extern long Bolt11Invoice_from_str(long _s);
        // struct LDKCResult_SignedRawBolt11InvoiceBolt11ParseErrorZ SignedRawBolt11Invoice_from_str(struct LDKStr s);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignedRawBolt11Invoice_from_str")] public static extern long SignedRawBolt11Invoice_from_str(string _s);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignedRawBolt11Invoice_from_str")] public static extern long SignedRawBolt11Invoice_from_str(long _s);
        // struct LDKStr Bolt11ParseError_to_str(const struct LDKBolt11ParseError *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11ParseError_to_str")] public static extern string Bolt11ParseError_to_str(long _o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11ParseError_to_str")] public static extern long Bolt11ParseError_to_str(long _o);
        // struct LDKStr ParseOrSemanticError_to_str(const struct LDKParseOrSemanticError *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ParseOrSemanticError_to_str")] public static extern string ParseOrSemanticError_to_str(long _o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ParseOrSemanticError_to_str")] public static extern long ParseOrSemanticError_to_str(long _o);
        // struct LDKStr Bolt11Invoice_to_str(const struct LDKBolt11Invoice *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_to_str")] public static extern string Bolt11Invoice_to_str(long _o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_to_str")] public static extern long Bolt11Invoice_to_str(long _o);
        // struct LDKStr SignedRawBolt11Invoice_to_str(const struct LDKSignedRawBolt11Invoice *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignedRawBolt11Invoice_to_str")] public static extern string SignedRawBolt11Invoice_to_str(long _o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignedRawBolt11Invoice_to_str")] public static extern long SignedRawBolt11Invoice_to_str(long _o);
        // struct LDKStr Currency_to_str(const enum LDKCurrency *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Currency_to_str")] public static extern string Currency_to_str(long _o);
+       [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 string SiPrefix_to_str(long _o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SiPrefix_to_str")] public static extern long SiPrefix_to_str(long _o);
        // 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);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RapidGossipSync_new")] public static extern long RapidGossipSync_new(long _network_graph, long _logger);
        // MUST_USE_RES struct LDKCResult_u32GraphSyncErrorZ RapidGossipSync_sync_network_graph_with_file_path(const struct LDKRapidGossipSync *NONNULL_PTR this_arg, struct LDKStr sync_path);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RapidGossipSync_sync_network_graph_with_file_path")] public static extern long RapidGossipSync_sync_network_graph_with_file_path(long _this_arg, string _sync_path);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RapidGossipSync_sync_network_graph_with_file_path")] public static extern long RapidGossipSync_sync_network_graph_with_file_path(long _this_arg, long _sync_path);
        // MUST_USE_RES struct LDKCResult_u32GraphSyncErrorZ RapidGossipSync_update_network_graph(const struct LDKRapidGossipSync *NONNULL_PTR this_arg, struct LDKu8slice update_data);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RapidGossipSync_update_network_graph")] public static extern long RapidGossipSync_update_network_graph(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _update_data);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RapidGossipSync_update_network_graph")] public static extern long RapidGossipSync_update_network_graph(long _this_arg, long _update_data);
        // MUST_USE_RES struct LDKCResult_u32GraphSyncErrorZ RapidGossipSync_update_network_graph_no_std(const struct LDKRapidGossipSync *NONNULL_PTR this_arg, struct LDKu8slice update_data, struct LDKCOption_u64Z current_time_unix);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RapidGossipSync_update_network_graph_no_std")] public static extern long RapidGossipSync_update_network_graph_no_std(long _this_arg, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalType="org.ldk.impl.ArrayCoder")] byte[] _update_data, long _current_time_unix);
+       [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);
@@ -10770,7 +12362,1730 @@ internal class bindings {
        [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 bindings() {
+
+       static long c_callback_l_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 l_l");
+                       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_l");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 0:
+                               if (!(obj is LDKChannelSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelSigner in l_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKChannelSigner)obj).get_per_commitment_point(a);
+                       case 1:
+                               if (!(obj is LDKChannelSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelSigner in l_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKChannelSigner)obj).release_commitment_secret(a);
+                       case 7:
+                               if (!(obj is LDKEcdsaChannelSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKEcdsaChannelSigner in l_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKEcdsaChannelSigner)obj).sign_holder_commitment(a);
+                       case 12:
+                               if (!(obj is LDKEcdsaChannelSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKEcdsaChannelSigner in l_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKEcdsaChannelSigner)obj).sign_closing_transaction(a);
+                       case 14:
+                               if (!(obj is LDKEcdsaChannelSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKEcdsaChannelSigner in l_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKEcdsaChannelSigner)obj).sign_channel_announcement_with_funding_key(a);
+                       case 35:
+                               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:
+                               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:
+                               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:
+                               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);
+                               }
+                               return ((LDKPersister)obj).persist_manager(a);
+                       case 58:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_l");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate long l_l_callback(int obj_ptr, int fn_id, long a);
+       [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 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");
+                       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_ll");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 2:
+                               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 ((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");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKEcdsaChannelSigner)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");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKEcdsaChannelSigner)obj).sign_holder_anchor_input(a, b);
+                       case 25:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               if (!(obj is LDKCustomOnionMessageHandler)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKCustomOnionMessageHandler in l_ll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKCustomOnionMessageHandler)obj).read_custom_message(a, b);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_ll");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate long l_ll_callback(int obj_ptr, int fn_id, long a, long b);
+       [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 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_");
+                       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_");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 3:
+                               if (!(obj is LDKChannelSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelSigner in l_");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKChannelSigner)obj).channel_keys_id();
+                       case 15:
+                               if (!(obj is LDKWriteableEcdsaChannelSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKWriteableEcdsaChannelSigner in l_");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKWriteableEcdsaChannelSigner)obj).write();
+                       case 21:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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:
+                               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).get_change_script();
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate long l__callback(int obj_ptr, int fn_id);
+       [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 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");
+                       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 void_l");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 4:
+                               if (!(obj is LDKChannelSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelSigner in void_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((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:
+                               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);
+                               return;
+                       case 24:
+                               if (!(obj is LDKLogger)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKLogger in void_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKLogger)obj).log(a);
+                               return;
+                       case 29:
+                               if (!(obj is LDKBroadcasterInterface)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKBroadcasterInterface in void_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKBroadcasterInterface)obj).broadcast_transactions(a);
+                               return;
+                       case 52:
+                               if (!(obj is LDKFilter)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKFilter in void_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKFilter)obj).register_output(a);
+                               return;
+                       case 67:
+                               if (!(obj is LDKConfirm)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKConfirm in void_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKConfirm)obj).transaction_unconfirmed(a);
+                               return;
+                       case 70:
+                               if (!(obj is LDKEventHandler)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKEventHandler in void_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKEventHandler)obj).handle_event(a);
+                               return;
+                       case 71:
+                               if (!(obj is LDKEventsProvider)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKEventsProvider in void_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKEventsProvider)obj).process_pending_events(a);
+                               return;
+                       case 99:
+                               if (!(obj is LDKChannelMessageHandler)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).peer_disconnected(a);
+                               return;
+                       case 125:
+                               if (!(obj is LDKOnionMessageHandler)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKOnionMessageHandler in void_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKOnionMessageHandler)obj).peer_disconnected(a);
+                               return;
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in void_l");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return;
+               }
+       }
+       public delegate void void_l_callback(int obj_ptr, int fn_id, long a);
+       [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 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");
+                       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_llll");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 8:
+                               if (!(obj is LDKEcdsaChannelSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKEcdsaChannelSigner in l_llll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKEcdsaChannelSigner)obj).sign_justice_revoked_output(a, b, c, d);
+                       case 44:
+                               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:
+                               if (!(obj is LDKKVStore)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKKVStore in l_llll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKKVStore)obj).write(a, b, c, d);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_llll");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate long l_llll_callback(int obj_ptr, int fn_id, long a, long b, long c, long d);
+       [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 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");
+                       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_lllll");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 9:
+                               if (!(obj is LDKEcdsaChannelSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKEcdsaChannelSigner in l_lllll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKEcdsaChannelSigner)obj).sign_justice_revoked_htlc(a, b, c, d, e);
+                       case 11:
+                               if (!(obj is LDKEcdsaChannelSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKEcdsaChannelSigner in l_lllll");
+                                       Console.Error.Flush();
+                                       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();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate long l_lllll_callback(int obj_ptr, int fn_id, long a, long b, long c, long d, long e);
+       [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) {
+               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 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");
+                                       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");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKMessageRouter)obj).find_path(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);
+       [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);
+       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");
+                       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 void_ll");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 17:
+                               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);
+                               return;
+                       case 19:
+                               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);
+                               return;
+                       case 51:
+                               if (!(obj is LDKFilter)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKFilter in void_ll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKFilter)obj).register_tx(a, b);
+                               return;
+                       case 73:
+                               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_open_channel(a, b);
+                               return;
+                       case 74:
+                               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_open_channel_v2(a, b);
+                               return;
+                       case 75:
+                               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_accept_channel(a, b);
+                               return;
+                       case 76:
+                               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_accept_channel_v2(a, b);
+                               return;
+                       case 77:
+                               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_funding_created(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_funding_signed(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_channel_ready(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_shutdown(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_closing_signed(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_tx_add_input(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_tx_add_output(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_tx_remove_input(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_tx_remove_output(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_tx_complete(a, b);
+                               return;
+                       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_tx_signatures(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_tx_init_rbf(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_tx_ack_rbf(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_tx_abort(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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_update_add_htlc(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_update_fulfill_htlc(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_update_fail_htlc(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_update_fail_malformed_htlc(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_commitment_signed(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_revoke_and_ack(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_update_fee(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_announcement_signatures(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_channel_reestablish(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_channel_update(a, b);
+                               return;
+                       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();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_error(a, b);
+                               return;
+                       case 122:
+                               if (!(obj is LDKOnionMessageHandler)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKOnionMessageHandler in void_ll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKOnionMessageHandler)obj).handle_onion_message(a, b);
+                               return;
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in void_ll");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return;
+               }
+       }
+       public delegate void void_ll_callback(int obj_ptr, int fn_id, long a, long b);
+       [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 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");
+                       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 ChannelMonitorUpdateStatus_ll");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 27:
+                               if (!(obj is LDKWatch)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKWatch in ChannelMonitorUpdateStatus_ll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKWatch)obj).update_channel(a, b);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in ChannelMonitorUpdateStatus_ll");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate ChannelMonitorUpdateStatus ChannelMonitorUpdateStatus_ll_callback(int obj_ptr, int fn_id, long a, long b);
+       [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 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");
+                       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_Recipient");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 32:
+                               if (!(obj is LDKNodeSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKNodeSigner in l_Recipient");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKNodeSigner)obj).get_node_id(a);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_Recipient");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate long l_Recipient_callback(int obj_ptr, int fn_id, Recipient a);
+       [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 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");
+                       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_Recipientll");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 33:
+                               if (!(obj is LDKNodeSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKNodeSigner in l_Recipientll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKNodeSigner)obj).ecdh(a, b, c);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_Recipientll");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate long l_Recipientll_callback(int obj_ptr, int fn_id, Recipient a, long b, long c);
+       [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 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");
+                       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_llRecipient");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 34:
+                               if (!(obj is LDKNodeSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKNodeSigner in l_llRecipient");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKNodeSigner)obj).sign_invoice(a, b, c);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_llRecipient");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate long l_llRecipient_callback(int obj_ptr, int fn_id, long a, long b, Recipient c);
+       [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 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");
+                       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_bll");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 38:
+                               if (!(obj is LDKSignerProvider)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKSignerProvider in l_bll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKSignerProvider)obj).generate_channel_keys_id(a, b, c);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_bll");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate long l_bll_callback(int obj_ptr, int fn_id, bool a, long b, long c);
+       [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 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");
+                       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 i_ConfirmationTarget");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 43:
+                               if (!(obj is LDKFeeEstimator)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKFeeEstimator in i_ConfirmationTarget");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKFeeEstimator)obj).get_est_sat_per_1000_weight(a);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in i_ConfirmationTarget");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate int i_ConfirmationTarget_callback(int obj_ptr, int fn_id, ConfirmationTarget a);
+       [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 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");
+                       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_llllll");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 45:
+                               if (!(obj is LDKRouter)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKRouter in l_llllll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKRouter)obj).find_route_with_id(a, b, c, d, e, f);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_llllll");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate long l_llllll_callback(int obj_ptr, int fn_id, long a, long b, long c, long d, long e, long f);
+       [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 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_");
+                       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 s_");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 46:
+                               if (!(obj is LDKType)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKType in s_");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKType)obj).type_id();
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in s_");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate short s__callback(int obj_ptr, int fn_id);
+       [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 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");
+                       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_lllb");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 55:
+                               if (!(obj is LDKKVStore)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKKVStore in l_lllb");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKKVStore)obj).remove(a, b, c, d);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_lllb");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate long l_lllb_callback(int obj_ptr, int fn_id, long a, long b, long c, bool d);
+       [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 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");
+                       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 ChannelMonitorUpdateStatus_lll");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 60:
+                               if (!(obj is LDKPersist)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKPersist in ChannelMonitorUpdateStatus_lll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKPersist)obj).persist_new_channel(a, b, c);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in ChannelMonitorUpdateStatus_lll");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate ChannelMonitorUpdateStatus ChannelMonitorUpdateStatus_lll_callback(int obj_ptr, int fn_id, long a, long b, long c);
+       [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 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");
+                       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 ChannelMonitorUpdateStatus_llll");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 61:
+                               if (!(obj is LDKPersist)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKPersist in ChannelMonitorUpdateStatus_llll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKPersist)obj).update_persisted_channel(a, b, c, d);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in ChannelMonitorUpdateStatus_llll");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate ChannelMonitorUpdateStatus ChannelMonitorUpdateStatus_llll_callback(int obj_ptr, int fn_id, long a, long b, long c, long d);
+       [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 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_");
+                       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 void_");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 62:
+                               if (!(obj is LDKFutureCallback)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKFutureCallback in void_");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKFutureCallback)obj).call();
+                               return;
+                       case 137:
+                               if (!(obj is LDKSocketDescriptor)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKSocketDescriptor in void_");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKSocketDescriptor)obj).disconnect_socket();
+                               return;
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in void_");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return;
+               }
+       }
+       public delegate void void__callback(int obj_ptr, int fn_id);
+       [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 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");
+                       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 void_lli");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 63:
+                               if (!(obj is LDKListen)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKListen in void_lli");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKListen)obj).filtered_block_connected(a, b, c);
+                               return;
+                       case 66:
+                               if (!(obj is LDKConfirm)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKConfirm in void_lli");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKConfirm)obj).transactions_confirmed(a, b, c);
+                               return;
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in void_lli");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return;
+               }
+       }
+       public delegate void void_lli_callback(int obj_ptr, int fn_id, long a, long b, int c);
+       [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 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");
+                       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 void_li");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 64:
+                               if (!(obj is LDKListen)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKListen in void_li");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKListen)obj).block_connected(a, b);
+                               return;
+                       case 65:
+                               if (!(obj is LDKListen)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKListen in void_li");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKListen)obj).block_disconnected(a, b);
+                               return;
+                       case 68:
+                               if (!(obj is LDKConfirm)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKConfirm in void_li");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKConfirm)obj).best_block_updated(a, b);
+                               return;
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in void_li");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return;
+               }
+       }
+       public delegate void void_li_callback(int obj_ptr, int fn_id, long a, int b);
+       [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 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");
+                       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_llb");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 100:
+                               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:
+                               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:
+                               if (!(obj is LDKOnionMessageHandler)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKOnionMessageHandler in l_llb");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKOnionMessageHandler)obj).peer_connected(a, b, c);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_llb");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate long l_llb_callback(int obj_ptr, int fn_id, long a, long b, bool c);
+       [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 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_");
+                       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 b_");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 119:
+                               if (!(obj is LDKRoutingMessageHandler)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKRoutingMessageHandler in b_");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKRoutingMessageHandler)obj).processing_queue_high();
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in b_");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return false;
+               }
+       }
+       public delegate bool b__callback(int obj_ptr, int fn_id);
+       [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 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");
+                       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_sl");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 128:
+                               if (!(obj is LDKCustomMessageReader)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKCustomMessageReader in l_sl");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKCustomMessageReader)obj).read(a, b);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_sl");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate long l_sl_callback(int obj_ptr, int fn_id, short a, long b);
+       [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 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");
+                       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_lb");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 136:
+                               if (!(obj is LDKSocketDescriptor)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKSocketDescriptor in l_lb");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKSocketDescriptor)obj).send_data(a, b);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_lb");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate long l_lb_callback(int obj_ptr, int fn_id, long a, bool b);
+       [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 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");
+                       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 b_l");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 138:
+                               if (!(obj is LDKSocketDescriptor)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKSocketDescriptor in b_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKSocketDescriptor)obj).eq(a);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in b_l");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return false;
+               }
+       }
+       public delegate bool b_l_callback(int obj_ptr, int fn_id, long a);
+       [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 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");
+                       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_llli");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 142:
+                               if (!(obj is LDKCoinSelectionSource)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKCoinSelectionSource in l_llli");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKCoinSelectionSource)obj).select_confirmed_utxos(a, b, c, d);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_llli");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
        }
+       public delegate long l_llli_callback(int obj_ptr, int fn_id, long a, long b, long c, int d);
+       [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);
 }
-} } }
+} } }
\ No newline at end of file
diff --git a/c_sharp/src/org/ldk/impl/version.cs b/c_sharp/src/org/ldk/impl/version.cs
deleted file mode 100644 (file)
index 4221ca7..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-public class version {
-       public static string get_ldk_java_bindings_version() {
-               return "v0.0.116.0-3-gc2ad295f-dirty";
-       }
-}
\ No newline at end of file
diff --git a/c_sharp/src/org/ldk/structs/.BroadcasterInterface.cs.swo b/c_sharp/src/org/ldk/structs/.BroadcasterInterface.cs.swo
new file mode 100644 (file)
index 0000000..9c344d4
Binary files /dev/null and b/c_sharp/src/org/ldk/structs/.BroadcasterInterface.cs.swo differ
index bf71371bc8fbe5a769692666aadc1e22e5893190..a9218c8811f76bb8508d63a1f6cbaef410a82c71 100644 (file)
@@ -36,7 +36,9 @@ public class APIError : CommonBase {
                 */
                public string err;
                internal APIError_APIMisuseError(long ptr) : base(null, ptr) {
-                       this.err = bindings.LDKAPIError_APIMisuseError_get_err(ptr);
+                       long err = bindings.LDKAPIError_APIMisuseError_get_err(ptr);
+                       string err_conv = InternalUtils.decodeString(err);
+                       this.err = err_conv;
                }
        }
        /** A APIError of type FeeRateTooHigh */
@@ -50,7 +52,9 @@ public class APIError : CommonBase {
                 */
                public int feerate;
                internal APIError_FeeRateTooHigh(long ptr) : base(null, ptr) {
-                       this.err = bindings.LDKAPIError_FeeRateTooHigh_get_err(ptr);
+                       long err = bindings.LDKAPIError_FeeRateTooHigh_get_err(ptr);
+                       string err_conv = InternalUtils.decodeString(err);
+                       this.err = err_conv;
                        this.feerate = bindings.LDKAPIError_FeeRateTooHigh_get_feerate(ptr);
                }
        }
@@ -61,7 +65,9 @@ public class APIError : CommonBase {
                 */
                public string err;
                internal APIError_InvalidRoute(long ptr) : base(null, ptr) {
-                       this.err = bindings.LDKAPIError_InvalidRoute_get_err(ptr);
+                       long err = bindings.LDKAPIError_InvalidRoute_get_err(ptr);
+                       string err_conv = InternalUtils.decodeString(err);
+                       this.err = err_conv;
                }
        }
        /** A APIError of type ChannelUnavailable */
@@ -71,7 +77,9 @@ public class APIError : CommonBase {
                 */
                public string err;
                internal APIError_ChannelUnavailable(long ptr) : base(null, ptr) {
-                       this.err = bindings.LDKAPIError_ChannelUnavailable_get_err(ptr);
+                       long err = bindings.LDKAPIError_ChannelUnavailable_get_err(ptr);
+                       string err_conv = InternalUtils.decodeString(err);
+                       this.err = err_conv;
                }
        }
        /** A APIError of type MonitorUpdateInProgress */
@@ -114,7 +122,7 @@ public class APIError : CommonBase {
         * Utility method to constructs a new APIMisuseError-variant APIError
         */
        public static APIError apimisuse_error(string err) {
-               long ret = bindings.APIError_apimisuse_error(err);
+               long ret = bindings.APIError_apimisuse_error(InternalUtils.encodeString(err));
                GC.KeepAlive(err);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.APIError ret_hu_conv = org.ldk.structs.APIError.constr_from_ptr(ret);
@@ -126,7 +134,7 @@ public class APIError : CommonBase {
         * Utility method to constructs a new FeeRateTooHigh-variant APIError
         */
        public static APIError fee_rate_too_high(string err, int feerate) {
-               long ret = bindings.APIError_fee_rate_too_high(err, feerate);
+               long ret = bindings.APIError_fee_rate_too_high(InternalUtils.encodeString(err), feerate);
                GC.KeepAlive(err);
                GC.KeepAlive(feerate);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -139,7 +147,7 @@ public class APIError : CommonBase {
         * Utility method to constructs a new InvalidRoute-variant APIError
         */
        public static APIError invalid_route(string err) {
-               long ret = bindings.APIError_invalid_route(err);
+               long ret = bindings.APIError_invalid_route(InternalUtils.encodeString(err));
                GC.KeepAlive(err);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.APIError ret_hu_conv = org.ldk.structs.APIError.constr_from_ptr(ret);
@@ -151,7 +159,7 @@ public class APIError : CommonBase {
         * Utility method to constructs a new ChannelUnavailable-variant APIError
         */
        public static APIError channel_unavailable(string err) {
-               long ret = bindings.APIError_channel_unavailable(err);
+               long ret = bindings.APIError_channel_unavailable(InternalUtils.encodeString(err));
                GC.KeepAlive(err);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.APIError ret_hu_conv = org.ldk.structs.APIError.constr_from_ptr(ret);
@@ -202,9 +210,11 @@ public class APIError : CommonBase {
         * Serialize the APIError object into a byte array which can be read by APIError_read
         */
        public byte[] write() {
-               byte[] ret = bindings.APIError_write(this.ptr);
+               long ret = bindings.APIError_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index cfc20114af1012f0cef0d24d49de811166b66f14..78b053475a6a91a049ca238a05ad3a26c4ee1ce9 100644 (file)
@@ -23,16 +23,18 @@ public class AcceptChannel : CommonBase {
         * A temporary channel ID, until the funding outpoint is announced
         */
        public byte[] get_temporary_channel_id() {
-               byte[] ret = bindings.AcceptChannel_get_temporary_channel_id(this.ptr);
+               long ret = bindings.AcceptChannel_get_temporary_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * A temporary channel ID, until the funding outpoint is announced
         */
        public void set_temporary_channel_id(byte[] val) {
-               bindings.AcceptChannel_set_temporary_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.AcceptChannel_set_temporary_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -167,16 +169,18 @@ public class AcceptChannel : CommonBase {
         * The sender's key controlling the funding transaction
         */
        public byte[] get_funding_pubkey() {
-               byte[] ret = bindings.AcceptChannel_get_funding_pubkey(this.ptr);
+               long ret = bindings.AcceptChannel_get_funding_pubkey(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The sender's key controlling the funding transaction
         */
        public void set_funding_pubkey(byte[] val) {
-               bindings.AcceptChannel_set_funding_pubkey(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.AcceptChannel_set_funding_pubkey(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -185,16 +189,18 @@ public class AcceptChannel : CommonBase {
         * Used to derive a revocation key for transactions broadcast by counterparty
         */
        public byte[] get_revocation_basepoint() {
-               byte[] ret = bindings.AcceptChannel_get_revocation_basepoint(this.ptr);
+               long ret = bindings.AcceptChannel_get_revocation_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Used to derive a revocation key for transactions broadcast by counterparty
         */
        public void set_revocation_basepoint(byte[] val) {
-               bindings.AcceptChannel_set_revocation_basepoint(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.AcceptChannel_set_revocation_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -203,16 +209,18 @@ public class AcceptChannel : CommonBase {
         * A payment key to sender for transactions broadcast by counterparty
         */
        public byte[] get_payment_point() {
-               byte[] ret = bindings.AcceptChannel_get_payment_point(this.ptr);
+               long ret = bindings.AcceptChannel_get_payment_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * A payment key to sender for transactions broadcast by counterparty
         */
        public void set_payment_point(byte[] val) {
-               bindings.AcceptChannel_set_payment_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.AcceptChannel_set_payment_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -221,16 +229,18 @@ public class AcceptChannel : CommonBase {
         * Used to derive a payment key to sender for transactions broadcast by sender
         */
        public byte[] get_delayed_payment_basepoint() {
-               byte[] ret = bindings.AcceptChannel_get_delayed_payment_basepoint(this.ptr);
+               long ret = bindings.AcceptChannel_get_delayed_payment_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Used to derive a payment key to sender for transactions broadcast by sender
         */
        public void set_delayed_payment_basepoint(byte[] val) {
-               bindings.AcceptChannel_set_delayed_payment_basepoint(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.AcceptChannel_set_delayed_payment_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -239,16 +249,18 @@ public class AcceptChannel : CommonBase {
         * Used to derive an HTLC payment key to sender for transactions broadcast by counterparty
         */
        public byte[] get_htlc_basepoint() {
-               byte[] ret = bindings.AcceptChannel_get_htlc_basepoint(this.ptr);
+               long ret = bindings.AcceptChannel_get_htlc_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Used to derive an HTLC payment key to sender for transactions broadcast by counterparty
         */
        public void set_htlc_basepoint(byte[] val) {
-               bindings.AcceptChannel_set_htlc_basepoint(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.AcceptChannel_set_htlc_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -257,16 +269,18 @@ public class AcceptChannel : CommonBase {
         * The first to-be-broadcast-by-sender transaction's per commitment point
         */
        public byte[] get_first_per_commitment_point() {
-               byte[] ret = bindings.AcceptChannel_get_first_per_commitment_point(this.ptr);
+               long ret = bindings.AcceptChannel_get_first_per_commitment_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The first to-be-broadcast-by-sender transaction's per commitment point
         */
        public void set_first_per_commitment_point(byte[] val) {
-               bindings.AcceptChannel_set_first_per_commitment_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.AcceptChannel_set_first_per_commitment_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -274,11 +288,11 @@ public class AcceptChannel : CommonBase {
        /**
         * A request to pre-set the to-sender output's scriptPubkey for when we collaboratively close
         */
-       public Option_ScriptZ get_shutdown_scriptpubkey() {
+       public Option_CVec_u8ZZ get_shutdown_scriptpubkey() {
                long ret = bindings.AcceptChannel_get_shutdown_scriptpubkey(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_ScriptZ ret_hu_conv = org.ldk.structs.Option_ScriptZ.constr_from_ptr(ret);
+               org.ldk.structs.Option_CVec_u8ZZ ret_hu_conv = org.ldk.structs.Option_CVec_u8ZZ.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
                return ret_hu_conv;
        }
@@ -286,7 +300,7 @@ public class AcceptChannel : CommonBase {
        /**
         * A request to pre-set the to-sender output's scriptPubkey for when we collaboratively close
         */
-       public void set_shutdown_scriptpubkey(org.ldk.structs.Option_ScriptZ val) {
+       public void set_shutdown_scriptpubkey(org.ldk.structs.Option_CVec_u8ZZ val) {
                bindings.AcceptChannel_set_shutdown_scriptpubkey(this.ptr, val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
@@ -329,9 +343,11 @@ public class AcceptChannel : CommonBase {
 
        /**
         * Constructs a new AcceptChannel given each field
+        * 
+        * Note that channel_type_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
-       public static AcceptChannel of(byte[] temporary_channel_id_arg, long dust_limit_satoshis_arg, long max_htlc_value_in_flight_msat_arg, long channel_reserve_satoshis_arg, long htlc_minimum_msat_arg, int minimum_depth_arg, short to_self_delay_arg, short max_accepted_htlcs_arg, byte[] funding_pubkey_arg, byte[] revocation_basepoint_arg, byte[] payment_point_arg, byte[] delayed_payment_basepoint_arg, byte[] htlc_basepoint_arg, byte[] first_per_commitment_point_arg, org.ldk.structs.Option_ScriptZ shutdown_scriptpubkey_arg, org.ldk.structs.ChannelTypeFeatures channel_type_arg) {
-               long ret = bindings.AcceptChannel_new(InternalUtils.check_arr_len(temporary_channel_id_arg, 32), dust_limit_satoshis_arg, max_htlc_value_in_flight_msat_arg, channel_reserve_satoshis_arg, htlc_minimum_msat_arg, minimum_depth_arg, to_self_delay_arg, max_accepted_htlcs_arg, InternalUtils.check_arr_len(funding_pubkey_arg, 33), InternalUtils.check_arr_len(revocation_basepoint_arg, 33), InternalUtils.check_arr_len(payment_point_arg, 33), InternalUtils.check_arr_len(delayed_payment_basepoint_arg, 33), InternalUtils.check_arr_len(htlc_basepoint_arg, 33), InternalUtils.check_arr_len(first_per_commitment_point_arg, 33), shutdown_scriptpubkey_arg.ptr, channel_type_arg == null ? 0 : channel_type_arg.ptr);
+       public static AcceptChannel of(byte[] temporary_channel_id_arg, long dust_limit_satoshis_arg, long max_htlc_value_in_flight_msat_arg, long channel_reserve_satoshis_arg, long htlc_minimum_msat_arg, int minimum_depth_arg, short to_self_delay_arg, short max_accepted_htlcs_arg, byte[] funding_pubkey_arg, byte[] revocation_basepoint_arg, byte[] payment_point_arg, byte[] delayed_payment_basepoint_arg, byte[] htlc_basepoint_arg, byte[] first_per_commitment_point_arg, org.ldk.structs.Option_CVec_u8ZZ shutdown_scriptpubkey_arg, org.ldk.structs.ChannelTypeFeatures channel_type_arg) {
+               long ret = bindings.AcceptChannel_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(temporary_channel_id_arg, 32)), dust_limit_satoshis_arg, max_htlc_value_in_flight_msat_arg, channel_reserve_satoshis_arg, htlc_minimum_msat_arg, minimum_depth_arg, to_self_delay_arg, max_accepted_htlcs_arg, 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)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(first_per_commitment_point_arg, 33)), shutdown_scriptpubkey_arg.ptr, channel_type_arg == null ? 0 : channel_type_arg.ptr);
                GC.KeepAlive(temporary_channel_id_arg);
                GC.KeepAlive(dust_limit_satoshis_arg);
                GC.KeepAlive(max_htlc_value_in_flight_msat_arg);
@@ -395,16 +411,18 @@ public class AcceptChannel : CommonBase {
         * Serialize the AcceptChannel object into a byte array which can be read by AcceptChannel_read
         */
        public byte[] write() {
-               byte[] ret = bindings.AcceptChannel_write(this.ptr);
+               long ret = bindings.AcceptChannel_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a AcceptChannel from a byte array, created by AcceptChannel_write
         */
        public static Result_AcceptChannelDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.AcceptChannel_read(ser);
+               long ret = bindings.AcceptChannel_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_AcceptChannelDecodeErrorZ ret_hu_conv = Result_AcceptChannelDecodeErrorZ.constr_from_ptr(ret);
index 4e28737770ee3cc385b5d51644f19c5f123975a8..eea8b64cf475627a24af68fab3f05d2dfdb8adc8 100644 (file)
@@ -21,16 +21,18 @@ public class AcceptChannelV2 : CommonBase {
         * The same `temporary_channel_id` received from the initiator's `open_channel2` message.
         */
        public byte[] get_temporary_channel_id() {
-               byte[] ret = bindings.AcceptChannelV2_get_temporary_channel_id(this.ptr);
+               long ret = bindings.AcceptChannelV2_get_temporary_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The same `temporary_channel_id` received from the initiator's `open_channel2` message.
         */
        public void set_temporary_channel_id(byte[] val) {
-               bindings.AcceptChannelV2_set_temporary_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.AcceptChannelV2_set_temporary_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -169,16 +171,18 @@ public class AcceptChannelV2 : CommonBase {
         * The channel acceptor's key controlling the funding transaction
         */
        public byte[] get_funding_pubkey() {
-               byte[] ret = bindings.AcceptChannelV2_get_funding_pubkey(this.ptr);
+               long ret = bindings.AcceptChannelV2_get_funding_pubkey(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The channel acceptor's key controlling the funding transaction
         */
        public void set_funding_pubkey(byte[] val) {
-               bindings.AcceptChannelV2_set_funding_pubkey(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.AcceptChannelV2_set_funding_pubkey(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -187,16 +191,18 @@ public class AcceptChannelV2 : CommonBase {
         * Used to derive a revocation key for transactions broadcast by counterparty
         */
        public byte[] get_revocation_basepoint() {
-               byte[] ret = bindings.AcceptChannelV2_get_revocation_basepoint(this.ptr);
+               long ret = bindings.AcceptChannelV2_get_revocation_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Used to derive a revocation key for transactions broadcast by counterparty
         */
        public void set_revocation_basepoint(byte[] val) {
-               bindings.AcceptChannelV2_set_revocation_basepoint(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.AcceptChannelV2_set_revocation_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -205,16 +211,18 @@ public class AcceptChannelV2 : CommonBase {
         * A payment key to channel acceptor for transactions broadcast by counterparty
         */
        public byte[] get_payment_basepoint() {
-               byte[] ret = bindings.AcceptChannelV2_get_payment_basepoint(this.ptr);
+               long ret = bindings.AcceptChannelV2_get_payment_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * A payment key to channel acceptor for transactions broadcast by counterparty
         */
        public void set_payment_basepoint(byte[] val) {
-               bindings.AcceptChannelV2_set_payment_basepoint(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.AcceptChannelV2_set_payment_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -224,9 +232,11 @@ public class AcceptChannelV2 : CommonBase {
         * acceptor
         */
        public byte[] get_delayed_payment_basepoint() {
-               byte[] ret = bindings.AcceptChannelV2_get_delayed_payment_basepoint(this.ptr);
+               long ret = bindings.AcceptChannelV2_get_delayed_payment_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -234,7 +244,7 @@ public class AcceptChannelV2 : CommonBase {
         * acceptor
         */
        public void set_delayed_payment_basepoint(byte[] val) {
-               bindings.AcceptChannelV2_set_delayed_payment_basepoint(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.AcceptChannelV2_set_delayed_payment_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -243,16 +253,18 @@ public class AcceptChannelV2 : CommonBase {
         * Used to derive an HTLC payment key to channel acceptor for transactions broadcast by counterparty
         */
        public byte[] get_htlc_basepoint() {
-               byte[] ret = bindings.AcceptChannelV2_get_htlc_basepoint(this.ptr);
+               long ret = bindings.AcceptChannelV2_get_htlc_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Used to derive an HTLC payment key to channel acceptor for transactions broadcast by counterparty
         */
        public void set_htlc_basepoint(byte[] val) {
-               bindings.AcceptChannelV2_set_htlc_basepoint(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.AcceptChannelV2_set_htlc_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -261,16 +273,18 @@ public class AcceptChannelV2 : CommonBase {
         * The first to-be-broadcast-by-channel-acceptor transaction's per commitment point
         */
        public byte[] get_first_per_commitment_point() {
-               byte[] ret = bindings.AcceptChannelV2_get_first_per_commitment_point(this.ptr);
+               long ret = bindings.AcceptChannelV2_get_first_per_commitment_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The first to-be-broadcast-by-channel-acceptor transaction's per commitment point
         */
        public void set_first_per_commitment_point(byte[] val) {
-               bindings.AcceptChannelV2_set_first_per_commitment_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.AcceptChannelV2_set_first_per_commitment_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -279,16 +293,18 @@ public class AcceptChannelV2 : CommonBase {
         * The second to-be-broadcast-by-channel-acceptor transaction's per commitment point
         */
        public byte[] get_second_per_commitment_point() {
-               byte[] ret = bindings.AcceptChannelV2_get_second_per_commitment_point(this.ptr);
+               long ret = bindings.AcceptChannelV2_get_second_per_commitment_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The second to-be-broadcast-by-channel-acceptor transaction's per commitment point
         */
        public void set_second_per_commitment_point(byte[] val) {
-               bindings.AcceptChannelV2_set_second_per_commitment_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.AcceptChannelV2_set_second_per_commitment_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -297,11 +313,11 @@ public class AcceptChannelV2 : CommonBase {
         * Optionally, a request to pre-set the to-channel-acceptor output's scriptPubkey for when we
         * collaboratively close
         */
-       public Option_ScriptZ get_shutdown_scriptpubkey() {
+       public Option_CVec_u8ZZ get_shutdown_scriptpubkey() {
                long ret = bindings.AcceptChannelV2_get_shutdown_scriptpubkey(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_ScriptZ ret_hu_conv = org.ldk.structs.Option_ScriptZ.constr_from_ptr(ret);
+               org.ldk.structs.Option_CVec_u8ZZ ret_hu_conv = org.ldk.structs.Option_CVec_u8ZZ.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
                return ret_hu_conv;
        }
@@ -310,7 +326,7 @@ public class AcceptChannelV2 : CommonBase {
         * Optionally, a request to pre-set the to-channel-acceptor output's scriptPubkey for when we
         * collaboratively close
         */
-       public void set_shutdown_scriptpubkey(org.ldk.structs.Option_ScriptZ val) {
+       public void set_shutdown_scriptpubkey(org.ldk.structs.Option_CVec_u8ZZ val) {
                bindings.AcceptChannelV2_set_shutdown_scriptpubkey(this.ptr, val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
@@ -371,9 +387,11 @@ public class AcceptChannelV2 : CommonBase {
 
        /**
         * Constructs a new AcceptChannelV2 given each field
+        * 
+        * Note that channel_type_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
-       public static AcceptChannelV2 of(byte[] temporary_channel_id_arg, long funding_satoshis_arg, long dust_limit_satoshis_arg, long max_htlc_value_in_flight_msat_arg, long htlc_minimum_msat_arg, int minimum_depth_arg, short to_self_delay_arg, short max_accepted_htlcs_arg, byte[] funding_pubkey_arg, byte[] revocation_basepoint_arg, byte[] payment_basepoint_arg, byte[] delayed_payment_basepoint_arg, byte[] htlc_basepoint_arg, byte[] first_per_commitment_point_arg, byte[] second_per_commitment_point_arg, org.ldk.structs.Option_ScriptZ shutdown_scriptpubkey_arg, org.ldk.structs.ChannelTypeFeatures channel_type_arg, COption_NoneZ require_confirmed_inputs_arg) {
-               long ret = bindings.AcceptChannelV2_new(InternalUtils.check_arr_len(temporary_channel_id_arg, 32), funding_satoshis_arg, dust_limit_satoshis_arg, max_htlc_value_in_flight_msat_arg, htlc_minimum_msat_arg, minimum_depth_arg, to_self_delay_arg, max_accepted_htlcs_arg, InternalUtils.check_arr_len(funding_pubkey_arg, 33), InternalUtils.check_arr_len(revocation_basepoint_arg, 33), InternalUtils.check_arr_len(payment_basepoint_arg, 33), InternalUtils.check_arr_len(delayed_payment_basepoint_arg, 33), InternalUtils.check_arr_len(htlc_basepoint_arg, 33), InternalUtils.check_arr_len(first_per_commitment_point_arg, 33), InternalUtils.check_arr_len(second_per_commitment_point_arg, 33), shutdown_scriptpubkey_arg.ptr, channel_type_arg == null ? 0 : channel_type_arg.ptr, require_confirmed_inputs_arg);
+       public static AcceptChannelV2 of(byte[] temporary_channel_id_arg, long funding_satoshis_arg, long dust_limit_satoshis_arg, long max_htlc_value_in_flight_msat_arg, long htlc_minimum_msat_arg, int minimum_depth_arg, short to_self_delay_arg, short max_accepted_htlcs_arg, byte[] funding_pubkey_arg, byte[] revocation_basepoint_arg, byte[] payment_basepoint_arg, byte[] delayed_payment_basepoint_arg, byte[] htlc_basepoint_arg, byte[] first_per_commitment_point_arg, byte[] second_per_commitment_point_arg, org.ldk.structs.Option_CVec_u8ZZ shutdown_scriptpubkey_arg, org.ldk.structs.ChannelTypeFeatures channel_type_arg, COption_NoneZ require_confirmed_inputs_arg) {
+               long ret = bindings.AcceptChannelV2_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(temporary_channel_id_arg, 32)), funding_satoshis_arg, dust_limit_satoshis_arg, max_htlc_value_in_flight_msat_arg, htlc_minimum_msat_arg, minimum_depth_arg, to_self_delay_arg, max_accepted_htlcs_arg, 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_basepoint_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(delayed_payment_basepoint_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(htlc_basepoint_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(first_per_commitment_point_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(second_per_commitment_point_arg, 33)), shutdown_scriptpubkey_arg.ptr, channel_type_arg == null ? 0 : channel_type_arg.ptr, require_confirmed_inputs_arg);
                GC.KeepAlive(temporary_channel_id_arg);
                GC.KeepAlive(funding_satoshis_arg);
                GC.KeepAlive(dust_limit_satoshis_arg);
@@ -439,16 +457,18 @@ public class AcceptChannelV2 : CommonBase {
         * Serialize the AcceptChannelV2 object into a byte array which can be read by AcceptChannelV2_read
         */
        public byte[] write() {
-               byte[] ret = bindings.AcceptChannelV2_write(this.ptr);
+               long ret = bindings.AcceptChannelV2_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a AcceptChannelV2 from a byte array, created by AcceptChannelV2_write
         */
        public static Result_AcceptChannelV2DecodeErrorZ read(byte[] ser) {
-               long ret = bindings.AcceptChannelV2_read(ser);
+               long ret = bindings.AcceptChannelV2_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_AcceptChannelV2DecodeErrorZ ret_hu_conv = Result_AcceptChannelV2DecodeErrorZ.constr_from_ptr(ret);
index d1821b34156b2e43a3a3e9e9d514d0a41a920914..0fd351310cbc08a5a2e84734f977a5e490776717 100644 (file)
@@ -139,9 +139,11 @@ public class AnchorDescriptor : CommonBase {
         * Returns the witness script of the anchor output in the commitment transaction.
         */
        public byte[] witness_script() {
-               byte[] ret = bindings.AnchorDescriptor_witness_script(this.ptr);
+               long ret = bindings.AnchorDescriptor_witness_script(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -149,10 +151,12 @@ public class AnchorDescriptor : CommonBase {
         * transaction.
         */
        public byte[] tx_input_witness(byte[] signature) {
-               byte[] ret = bindings.AnchorDescriptor_tx_input_witness(this.ptr, InternalUtils.check_arr_len(signature, 64));
+               long ret = bindings.AnchorDescriptor_tx_input_witness(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(signature, 64)));
                GC.KeepAlive(this);
                GC.KeepAlive(signature);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
index 6a62b2db4dd9d91492d655d698ebb50ac9651798..34d31dd4d0475d1b16bceb4fa4e1dcb9b4212b35 100644 (file)
@@ -21,16 +21,18 @@ public class AnnouncementSignatures : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.AnnouncementSignatures_get_channel_id(this.ptr);
+               long ret = bindings.AnnouncementSignatures_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.AnnouncementSignatures_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.AnnouncementSignatures_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -57,16 +59,18 @@ public class AnnouncementSignatures : CommonBase {
         * A signature by the node key
         */
        public byte[] get_node_signature() {
-               byte[] ret = bindings.AnnouncementSignatures_get_node_signature(this.ptr);
+               long ret = bindings.AnnouncementSignatures_get_node_signature(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * A signature by the node key
         */
        public void set_node_signature(byte[] val) {
-               bindings.AnnouncementSignatures_set_node_signature(this.ptr, InternalUtils.check_arr_len(val, 64));
+               bindings.AnnouncementSignatures_set_node_signature(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 64)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -75,16 +79,18 @@ public class AnnouncementSignatures : CommonBase {
         * A signature by the funding key
         */
        public byte[] get_bitcoin_signature() {
-               byte[] ret = bindings.AnnouncementSignatures_get_bitcoin_signature(this.ptr);
+               long ret = bindings.AnnouncementSignatures_get_bitcoin_signature(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * A signature by the funding key
         */
        public void set_bitcoin_signature(byte[] val) {
-               bindings.AnnouncementSignatures_set_bitcoin_signature(this.ptr, InternalUtils.check_arr_len(val, 64));
+               bindings.AnnouncementSignatures_set_bitcoin_signature(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 64)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -93,7 +99,7 @@ public class AnnouncementSignatures : CommonBase {
         * Constructs a new AnnouncementSignatures given each field
         */
        public static AnnouncementSignatures of(byte[] channel_id_arg, long short_channel_id_arg, byte[] node_signature_arg, byte[] bitcoin_signature_arg) {
-               long ret = bindings.AnnouncementSignatures_new(InternalUtils.check_arr_len(channel_id_arg, 32), short_channel_id_arg, InternalUtils.check_arr_len(node_signature_arg, 64), InternalUtils.check_arr_len(bitcoin_signature_arg, 64));
+               long ret = bindings.AnnouncementSignatures_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), short_channel_id_arg, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_signature_arg, 64)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(bitcoin_signature_arg, 64)));
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(short_channel_id_arg);
                GC.KeepAlive(node_signature_arg);
@@ -143,16 +149,18 @@ public class AnnouncementSignatures : CommonBase {
         * Serialize the AnnouncementSignatures object into a byte array which can be read by AnnouncementSignatures_read
         */
        public byte[] write() {
-               byte[] ret = bindings.AnnouncementSignatures_write(this.ptr);
+               long ret = bindings.AnnouncementSignatures_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a AnnouncementSignatures from a byte array, created by AnnouncementSignatures_write
         */
        public static Result_AnnouncementSignaturesDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.AnnouncementSignatures_read(ser);
+               long ret = bindings.AnnouncementSignatures_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_AnnouncementSignaturesDecodeErrorZ ret_hu_conv = Result_AnnouncementSignaturesDecodeErrorZ.constr_from_ptr(ret);
index bd695de78449ff28d31838af3f9ee871f883f9b4..188408db8d297ce962ca993e832a11fd0fe4afba 100644 (file)
@@ -122,11 +122,11 @@ public class BackgroundProcessor : CommonBase {
         * 
         * [`ChannelManager`]: lightning::ln::channelmanager::ChannelManager
         */
-       public Result_NoneErrorZ join() {
+       public Result_NoneIOErrorZ join() {
                long ret = bindings.BackgroundProcessor_join(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NoneErrorZ ret_hu_conv = Result_NoneErrorZ.constr_from_ptr(ret);
+               Result_NoneIOErrorZ ret_hu_conv = Result_NoneIOErrorZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(this); };
                // Due to rust's strict-ownership memory model, in some cases we need to "move"
                // an object to pass exclusive ownership to the function being called.
@@ -150,11 +150,11 @@ public class BackgroundProcessor : CommonBase {
         * 
         * [`ChannelManager`]: lightning::ln::channelmanager::ChannelManager
         */
-       public Result_NoneErrorZ stop() {
+       public Result_NoneIOErrorZ stop() {
                long ret = bindings.BackgroundProcessor_stop(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NoneErrorZ ret_hu_conv = Result_NoneErrorZ.constr_from_ptr(ret);
+               Result_NoneIOErrorZ ret_hu_conv = Result_NoneIOErrorZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(this); };
                // Due to rust's strict-ownership memory model, in some cases we need to "move"
                // an object to pass exclusive ownership to the function being called.
index 071fe693766b387aa25213be71acea1252ba212c..74d10f64dd27935ef0c3f688f8a1cd54979917e7 100644 (file)
@@ -82,8 +82,12 @@ public class Balance : CommonBase {
                internal Balance_ContentiousClaimable(long ptr) : base(null, ptr) {
                        this.amount_satoshis = bindings.LDKBalance_ContentiousClaimable_get_amount_satoshis(ptr);
                        this.timeout_height = bindings.LDKBalance_ContentiousClaimable_get_timeout_height(ptr);
-                       this.payment_hash = bindings.LDKBalance_ContentiousClaimable_get_payment_hash(ptr);
-                       this.payment_preimage = bindings.LDKBalance_ContentiousClaimable_get_payment_preimage(ptr);
+                       long payment_hash = bindings.LDKBalance_ContentiousClaimable_get_payment_hash(ptr);
+                       byte[] payment_hash_conv = InternalUtils.decodeUint8Array(payment_hash);
+                       this.payment_hash = payment_hash_conv;
+                       long payment_preimage = bindings.LDKBalance_ContentiousClaimable_get_payment_preimage(ptr);
+                       byte[] payment_preimage_conv = InternalUtils.decodeUint8Array(payment_preimage);
+                       this.payment_preimage = payment_preimage_conv;
                }
        }
        /** A Balance of type MaybeTimeoutClaimableHTLC */
@@ -105,7 +109,9 @@ public class Balance : CommonBase {
                internal Balance_MaybeTimeoutClaimableHTLC(long ptr) : base(null, ptr) {
                        this.amount_satoshis = bindings.LDKBalance_MaybeTimeoutClaimableHTLC_get_amount_satoshis(ptr);
                        this.claimable_height = bindings.LDKBalance_MaybeTimeoutClaimableHTLC_get_claimable_height(ptr);
-                       this.payment_hash = bindings.LDKBalance_MaybeTimeoutClaimableHTLC_get_payment_hash(ptr);
+                       long payment_hash = bindings.LDKBalance_MaybeTimeoutClaimableHTLC_get_payment_hash(ptr);
+                       byte[] payment_hash_conv = InternalUtils.decodeUint8Array(payment_hash);
+                       this.payment_hash = payment_hash_conv;
                }
        }
        /** A Balance of type MaybePreimageClaimableHTLC */
@@ -127,7 +133,9 @@ public class Balance : CommonBase {
                internal Balance_MaybePreimageClaimableHTLC(long ptr) : base(null, ptr) {
                        this.amount_satoshis = bindings.LDKBalance_MaybePreimageClaimableHTLC_get_amount_satoshis(ptr);
                        this.expiry_height = bindings.LDKBalance_MaybePreimageClaimableHTLC_get_expiry_height(ptr);
-                       this.payment_hash = bindings.LDKBalance_MaybePreimageClaimableHTLC_get_payment_hash(ptr);
+                       long payment_hash = bindings.LDKBalance_MaybePreimageClaimableHTLC_get_payment_hash(ptr);
+                       byte[] payment_hash_conv = InternalUtils.decodeUint8Array(payment_hash);
+                       this.payment_hash = payment_hash_conv;
                }
        }
        /** A Balance of type CounterpartyRevokedOutputClaimable */
@@ -190,7 +198,7 @@ public class Balance : CommonBase {
         * Utility method to constructs a new ContentiousClaimable-variant Balance
         */
        public static Balance contentious_claimable(long amount_satoshis, int timeout_height, byte[] payment_hash, byte[] payment_preimage) {
-               long ret = bindings.Balance_contentious_claimable(amount_satoshis, timeout_height, InternalUtils.check_arr_len(payment_hash, 32), InternalUtils.check_arr_len(payment_preimage, 32));
+               long ret = bindings.Balance_contentious_claimable(amount_satoshis, timeout_height, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_preimage, 32)));
                GC.KeepAlive(amount_satoshis);
                GC.KeepAlive(timeout_height);
                GC.KeepAlive(payment_hash);
@@ -205,7 +213,7 @@ public class Balance : CommonBase {
         * Utility method to constructs a new MaybeTimeoutClaimableHTLC-variant Balance
         */
        public static Balance maybe_timeout_claimable_htlc(long amount_satoshis, int claimable_height, byte[] payment_hash) {
-               long ret = bindings.Balance_maybe_timeout_claimable_htlc(amount_satoshis, claimable_height, InternalUtils.check_arr_len(payment_hash, 32));
+               long ret = bindings.Balance_maybe_timeout_claimable_htlc(amount_satoshis, claimable_height, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)));
                GC.KeepAlive(amount_satoshis);
                GC.KeepAlive(claimable_height);
                GC.KeepAlive(payment_hash);
@@ -219,7 +227,7 @@ public class Balance : CommonBase {
         * Utility method to constructs a new MaybePreimageClaimableHTLC-variant Balance
         */
        public static Balance maybe_preimage_claimable_htlc(long amount_satoshis, int expiry_height, byte[] payment_hash) {
-               long ret = bindings.Balance_maybe_preimage_claimable_htlc(amount_satoshis, expiry_height, InternalUtils.check_arr_len(payment_hash, 32));
+               long ret = bindings.Balance_maybe_preimage_claimable_htlc(amount_satoshis, expiry_height, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)));
                GC.KeepAlive(amount_satoshis);
                GC.KeepAlive(expiry_height);
                GC.KeepAlive(payment_hash);
index 9968c9c3b194362732f56991c0a3c7fa15b47c43..3d46e2b06aed97a4a1c025dc7c55539786e6acf8 100644 (file)
@@ -67,7 +67,7 @@ public class BestBlock : CommonBase {
         * Returns a `BestBlock` as identified by the given block hash and height.
         */
        public static BestBlock of(byte[] block_hash, int height) {
-               long ret = bindings.BestBlock_new(InternalUtils.check_arr_len(block_hash, 32), height);
+               long ret = bindings.BestBlock_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(block_hash, 32)), height);
                GC.KeepAlive(block_hash);
                GC.KeepAlive(height);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -80,9 +80,11 @@ public class BestBlock : CommonBase {
         * Returns the best block hash.
         */
        public byte[] block_hash() {
-               byte[] ret = bindings.BestBlock_block_hash(this.ptr);
+               long ret = bindings.BestBlock_block_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
index f6963591f53baf731d2c285e2cfa8f8d707cda2f..d3bd35eb489e4ed9823d94d4312cc3fbcfd798c4 100644 (file)
@@ -10,10 +10,10 @@ public class BigEndianScalar : CommonBase {
        public readonly byte[] scalar_bytes;
 
     internal BigEndianScalar(object _dummy, long ptr) : base(ptr) {
-               this.scalar_bytes = bindings.BigEndianScalar_get_bytes(ptr);
+               this.scalar_bytes = InternalUtils.decodeUint8Array(bindings.BigEndianScalar_get_bytes(ptr));
        }
-    public BigEndianScalar(byte[] scalar_bytes) : base(bindings.BigEndianScalar_new(scalar_bytes)) {
-               this.scalar_bytes = bindings.BigEndianScalar_get_bytes(ptr);
+    public BigEndianScalar(byte[] scalar_bytes) : base(bindings.BigEndianScalar_new(InternalUtils.encodeUint8Array(scalar_bytes))) {
+               this.scalar_bytes = InternalUtils.decodeUint8Array(bindings.BigEndianScalar_get_bytes(ptr));
        }
 
        ~BigEndianScalar() {
index 9749cfc7cbc3e1cb621ca1bb80e261924afa25a9..2a0b0a4e018557d6f0a287bf7b93b7438a06931e 100644 (file)
@@ -96,16 +96,18 @@ public class BigSize : CommonBase {
         * Serialize the BigSize object into a byte array which can be read by BigSize_read
         */
        public byte[] write() {
-               byte[] ret = bindings.BigSize_write(this.ptr);
+               long ret = bindings.BigSize_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a BigSize from a byte array, created by BigSize_write
         */
        public static Result_BigSizeDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.BigSize_read(ser);
+               long ret = bindings.BigSize_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_BigSizeDecodeErrorZ ret_hu_conv = Result_BigSizeDecodeErrorZ.constr_from_ptr(ret);
index 170decf95198d6ac24e6c0eafb4557a20a3c3996..95bbe09eee7fe40388f131920b00288480190ee1 100644 (file)
@@ -7,8 +7,9 @@ namespace org { namespace ldk { namespace structs {
 
 
 /**
- * Used to construct the blinded hops portion of a blinded path. These hops cannot be identified
- * by outside observers and thus can be used to hide the identity of the recipient.
+ * An encrypted payload and node id corresponding to a hop in a payment or onion message path, to
+ * be encoded in the sender's onion packet. These hops cannot be identified by outside observers
+ * and thus can be used to hide the identity of the recipient.
  */
 public class BlindedHop : CommonBase {
        internal BlindedHop(object _dummy, long ptr) : base(ptr) { }
@@ -16,6 +17,61 @@ public class BlindedHop : CommonBase {
                if (ptr != 0) { bindings.BlindedHop_free(ptr); }
        }
 
+       /**
+        * The blinded node id of this hop in a [`BlindedPath`].
+        */
+       public byte[] get_blinded_node_id() {
+               long ret = bindings.BlindedHop_get_blinded_node_id(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The blinded node id of this hop in a [`BlindedPath`].
+        */
+       public void set_blinded_node_id(byte[] val) {
+               bindings.BlindedHop_set_blinded_node_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The encrypted payload intended for this hop in a [`BlindedPath`].
+        * 
+        * Returns a copy of the field.
+        */
+       public byte[] get_encrypted_payload() {
+               long ret = bindings.BlindedHop_get_encrypted_payload(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The encrypted payload intended for this hop in a [`BlindedPath`].
+        */
+       public void set_encrypted_payload(byte[] val) {
+               bindings.BlindedHop_set_encrypted_payload(this.ptr, InternalUtils.encodeUint8Array(val));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new BlindedHop given each field
+        */
+       public static BlindedHop of(byte[] blinded_node_id_arg, byte[] encrypted_payload_arg) {
+               long ret = bindings.BlindedHop_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(blinded_node_id_arg, 33)), InternalUtils.encodeUint8Array(encrypted_payload_arg));
+               GC.KeepAlive(blinded_node_id_arg);
+               GC.KeepAlive(encrypted_payload_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.BlindedHop ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.BlindedHop(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.BlindedHop_clone_ptr(this.ptr);
                GC.KeepAlive(this);
@@ -67,16 +123,18 @@ public class BlindedHop : CommonBase {
         * Serialize the BlindedHop object into a byte array which can be read by BlindedHop_read
         */
        public byte[] write() {
-               byte[] ret = bindings.BlindedHop_write(this.ptr);
+               long ret = bindings.BlindedHop_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a BlindedHop from a byte array, created by BlindedHop_write
         */
        public static Result_BlindedHopDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.BlindedHop_read(ser);
+               long ret = bindings.BlindedHop_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_BlindedHopDecodeErrorZ ret_hu_conv = Result_BlindedHopDecodeErrorZ.constr_from_ptr(ret);
index c71e11e9286ab8678d28032e39af227b53546c52..bf3c2cc47f558518b7a96cf4ecadcf5b8ca82b5c 100644 (file)
@@ -82,6 +82,42 @@ public class BlindedHopFeatures : CommonBase {
                return ret;
        }
 
+       /**
+        * Sets a required feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Required bits are even. If an odd bit is given, then the corresponding even bit will
+        * be set instead (i.e., `bit - 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_required_feature_bit(long bit) {
+               long ret = bindings.BlindedHopFeatures_set_required_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Sets an optional feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Optional bits are odd. If an even bit is given, then the corresponding odd bit will be
+        * set instead (i.e., `bit + 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_optional_feature_bit(long bit) {
+               long ret = bindings.BlindedHopFeatures_set_optional_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
        /**
         * Sets a required custom feature bit. Errors if `bit` is outside the custom range as defined
         * by [bLIP 2] or if it is a known `T` feature.
@@ -122,16 +158,18 @@ public class BlindedHopFeatures : CommonBase {
         * Serialize the BlindedHopFeatures object into a byte array which can be read by BlindedHopFeatures_read
         */
        public byte[] write() {
-               byte[] ret = bindings.BlindedHopFeatures_write(this.ptr);
+               long ret = bindings.BlindedHopFeatures_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a BlindedHopFeatures from a byte array, created by BlindedHopFeatures_write
         */
        public static Result_BlindedHopFeaturesDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.BlindedHopFeatures_read(ser);
+               long ret = bindings.BlindedHopFeatures_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_BlindedHopFeaturesDecodeErrorZ ret_hu_conv = Result_BlindedHopFeaturesDecodeErrorZ.constr_from_ptr(ret);
index 710a4c2e59ecdc52f6c19f9db6ec2b5e96fb27b9..4a24c4f3b834f4e6c8f22b17856165a88c7e506a 100644 (file)
@@ -16,6 +16,104 @@ public class BlindedPath : CommonBase {
                if (ptr != 0) { bindings.BlindedPath_free(ptr); }
        }
 
+       /**
+        * To send to a blinded path, the sender first finds a route to the unblinded
+        * `introduction_node_id`, which can unblind its [`encrypted_payload`] to find out the onion
+        * message or payment's next hop and forward it along.
+        * 
+        * [`encrypted_payload`]: BlindedHop::encrypted_payload
+        */
+       public byte[] get_introduction_node_id() {
+               long ret = bindings.BlindedPath_get_introduction_node_id(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * To send to a blinded path, the sender first finds a route to the unblinded
+        * `introduction_node_id`, which can unblind its [`encrypted_payload`] to find out the onion
+        * message or payment's next hop and forward it along.
+        * 
+        * [`encrypted_payload`]: BlindedHop::encrypted_payload
+        */
+       public void set_introduction_node_id(byte[] val) {
+               bindings.BlindedPath_set_introduction_node_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Used by the introduction node to decrypt its [`encrypted_payload`] to forward the onion
+        * message or payment.
+        * 
+        * [`encrypted_payload`]: BlindedHop::encrypted_payload
+        */
+       public byte[] get_blinding_point() {
+               long ret = bindings.BlindedPath_get_blinding_point(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Used by the introduction node to decrypt its [`encrypted_payload`] to forward the onion
+        * message or payment.
+        * 
+        * [`encrypted_payload`]: BlindedHop::encrypted_payload
+        */
+       public void set_blinding_point(byte[] val) {
+               bindings.BlindedPath_set_blinding_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The hops composing the blinded path.
+        */
+       public BlindedHop[] get_blinded_hops() {
+               long ret = bindings.BlindedPath_get_blinded_hops(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_12_len = InternalUtils.getArrayLength(ret);
+               BlindedHop[] ret_conv_12_arr = new BlindedHop[ret_conv_12_len];
+               for (int m = 0; m < ret_conv_12_len; m++) {
+                       long ret_conv_12 = InternalUtils.getU64ArrayElem(ret, m);
+                       org.ldk.structs.BlindedHop ret_conv_12_hu_conv = null; if (ret_conv_12 < 0 || ret_conv_12 > 4096) { ret_conv_12_hu_conv = new org.ldk.structs.BlindedHop(null, ret_conv_12); }
+                       if (ret_conv_12_hu_conv != null) { ret_conv_12_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_12_arr[m] = ret_conv_12_hu_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_12_arr;
+       }
+
+       /**
+        * The hops composing the blinded path.
+        */
+       public void set_blinded_hops(BlindedHop[] val) {
+               bindings.BlindedPath_set_blinded_hops(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(val, val_conv_12 => val_conv_12 == null ? 0 : val_conv_12.ptr)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+               foreach (BlindedHop val_conv_12 in val) { if (this != null) { this.ptrs_to.AddLast(val_conv_12); }; };
+       }
+
+       /**
+        * Constructs a new BlindedPath given each field
+        */
+       public static BlindedPath of(byte[] introduction_node_id_arg, byte[] blinding_point_arg, BlindedHop[] blinded_hops_arg) {
+               long ret = bindings.BlindedPath_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(introduction_node_id_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(blinding_point_arg, 33)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(blinded_hops_arg, blinded_hops_arg_conv_12 => blinded_hops_arg_conv_12 == null ? 0 : blinded_hops_arg_conv_12.ptr)));
+               GC.KeepAlive(introduction_node_id_arg);
+               GC.KeepAlive(blinding_point_arg);
+               GC.KeepAlive(blinded_hops_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.BlindedPath ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.BlindedPath(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               foreach (BlindedHop blinded_hops_arg_conv_12 in blinded_hops_arg) { if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(blinded_hops_arg_conv_12); }; };
+               return ret_hu_conv;
+       }
+
        internal long clone_ptr() {
                long ret = bindings.BlindedPath_clone_ptr(this.ptr);
                GC.KeepAlive(this);
@@ -63,14 +161,27 @@ public class BlindedPath : CommonBase {
                if (!(o is BlindedPath)) return false;
                return this.eq((BlindedPath)o);
        }
+       /**
+        * Create a one-hop blinded path for a message.
+        */
+       public static Result_BlindedPathNoneZ one_hop_for_message(byte[] recipient_node_id, org.ldk.structs.EntropySource entropy_source) {
+               long ret = bindings.BlindedPath_one_hop_for_message(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(recipient_node_id, 33)), entropy_source.ptr);
+               GC.KeepAlive(recipient_node_id);
+               GC.KeepAlive(entropy_source);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_BlindedPathNoneZ ret_hu_conv = Result_BlindedPathNoneZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(entropy_source); };
+               return ret_hu_conv;
+       }
+
        /**
         * Create a blinded path for an onion message, to be forwarded along `node_pks`. The last node
         * pubkey in `node_pks` will be the destination node.
         * 
-        * Errors if less than two hops are provided or if `node_pk`(s) are invalid.
+        * Errors if no hops are provided or if `node_pk`(s) are invalid.
         */
        public static Result_BlindedPathNoneZ new_for_message(byte[][] node_pks, org.ldk.structs.EntropySource entropy_source) {
-               long ret = bindings.BlindedPath_new_for_message(node_pks != null ? InternalUtils.mapArray(node_pks, node_pks_conv_8 => InternalUtils.check_arr_len(node_pks_conv_8, 33)) : null, entropy_source.ptr);
+               long ret = bindings.BlindedPath_new_for_message(InternalUtils.encodeUint64Array(InternalUtils.mapArray(node_pks, node_pks_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_pks_conv_8, 33)))), entropy_source.ptr);
                GC.KeepAlive(node_pks);
                GC.KeepAlive(entropy_source);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -83,16 +194,18 @@ public class BlindedPath : CommonBase {
         * Serialize the BlindedPath object into a byte array which can be read by BlindedPath_read
         */
        public byte[] write() {
-               byte[] ret = bindings.BlindedPath_write(this.ptr);
+               long ret = bindings.BlindedPath_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a BlindedPath from a byte array, created by BlindedPath_write
         */
        public static Result_BlindedPathDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.BlindedPath_read(ser);
+               long ret = bindings.BlindedPath_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_BlindedPathDecodeErrorZ ret_hu_conv = Result_BlindedPathDecodeErrorZ.constr_from_ptr(ret);
index aba93eceed85aa5fbfb3b7678091dffa8cd06df1..e788659bc9ca652447ae32e9dabfc37a90997ca3 100644 (file)
@@ -210,16 +210,18 @@ public class BlindedPayInfo : CommonBase {
         * Serialize the BlindedPayInfo object into a byte array which can be read by BlindedPayInfo_read
         */
        public byte[] write() {
-               byte[] ret = bindings.BlindedPayInfo_write(this.ptr);
+               long ret = bindings.BlindedPayInfo_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a BlindedPayInfo from a byte array, created by BlindedPayInfo_write
         */
        public static Result_BlindedPayInfoDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.BlindedPayInfo_read(ser);
+               long ret = bindings.BlindedPayInfo_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_BlindedPayInfoDecodeErrorZ ret_hu_conv = Result_BlindedPayInfoDecodeErrorZ.constr_from_ptr(ret);
index f0fcc39f3effa3a8c0be75b9978b7940a22f3a82..a92b3ac72d842ebc8455393ffd5a6ef7370cd7ca 100644 (file)
@@ -24,16 +24,18 @@ public class BlindedTail : CommonBase {
         * [`BlindedPath`]: crate::blinded_path::BlindedPath
         */
        public BlindedHop[] get_hops() {
-               long[] ret = bindings.BlindedTail_get_hops(this.ptr);
+               long ret = bindings.BlindedTail_get_hops(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_12_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_12_len = InternalUtils.getArrayLength(ret);
                BlindedHop[] ret_conv_12_arr = new BlindedHop[ret_conv_12_len];
                for (int m = 0; m < ret_conv_12_len; m++) {
-                       long ret_conv_12 = ret[m];
+                       long ret_conv_12 = InternalUtils.getU64ArrayElem(ret, m);
                        org.ldk.structs.BlindedHop ret_conv_12_hu_conv = null; if (ret_conv_12 < 0 || ret_conv_12 > 4096) { ret_conv_12_hu_conv = new org.ldk.structs.BlindedHop(null, ret_conv_12); }
                        if (ret_conv_12_hu_conv != null) { ret_conv_12_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_12_arr[m] = ret_conv_12_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_12_arr;
        }
 
@@ -43,7 +45,7 @@ public class BlindedTail : CommonBase {
         * [`BlindedPath`]: crate::blinded_path::BlindedPath
         */
        public void set_hops(BlindedHop[] val) {
-               bindings.BlindedTail_set_hops(this.ptr, val != null ? InternalUtils.mapArray(val, val_conv_12 => val_conv_12 == null ? 0 : val_conv_12.ptr) : null);
+               bindings.BlindedTail_set_hops(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(val, val_conv_12 => val_conv_12 == null ? 0 : val_conv_12.ptr)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
                foreach (BlindedHop val_conv_12 in val) { if (this != null) { this.ptrs_to.AddLast(val_conv_12); }; };
@@ -55,9 +57,11 @@ public class BlindedTail : CommonBase {
         * [`BlindedPath`]: crate::blinded_path::BlindedPath
         */
        public byte[] get_blinding_point() {
-               byte[] ret = bindings.BlindedTail_get_blinding_point(this.ptr);
+               long ret = bindings.BlindedTail_get_blinding_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -66,7 +70,7 @@ public class BlindedTail : CommonBase {
         * [`BlindedPath`]: crate::blinded_path::BlindedPath
         */
        public void set_blinding_point(byte[] val) {
-               bindings.BlindedTail_set_blinding_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.BlindedTail_set_blinding_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -113,7 +117,7 @@ public class BlindedTail : CommonBase {
         * Constructs a new BlindedTail given each field
         */
        public static BlindedTail of(BlindedHop[] hops_arg, byte[] blinding_point_arg, int excess_final_cltv_expiry_delta_arg, long final_value_msat_arg) {
-               long ret = bindings.BlindedTail_new(hops_arg != null ? InternalUtils.mapArray(hops_arg, hops_arg_conv_12 => hops_arg_conv_12 == null ? 0 : hops_arg_conv_12.ptr) : null, InternalUtils.check_arr_len(blinding_point_arg, 33), excess_final_cltv_expiry_delta_arg, final_value_msat_arg);
+               long ret = bindings.BlindedTail_new(InternalUtils.encodeUint64Array(InternalUtils.mapArray(hops_arg, hops_arg_conv_12 => hops_arg_conv_12 == null ? 0 : hops_arg_conv_12.ptr)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(blinding_point_arg, 33)), excess_final_cltv_expiry_delta_arg, final_value_msat_arg);
                GC.KeepAlive(hops_arg);
                GC.KeepAlive(blinding_point_arg);
                GC.KeepAlive(excess_final_cltv_expiry_delta_arg);
@@ -176,16 +180,18 @@ public class BlindedTail : CommonBase {
         * Serialize the BlindedTail object into a byte array which can be read by BlindedTail_read
         */
        public byte[] write() {
-               byte[] ret = bindings.BlindedTail_write(this.ptr);
+               long ret = bindings.BlindedTail_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a BlindedTail from a byte array, created by BlindedTail_write
         */
        public static Result_BlindedTailDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.BlindedTail_read(ser);
+               long ret = bindings.BlindedTail_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_BlindedTailDecodeErrorZ ret_hu_conv = Result_BlindedTailDecodeErrorZ.constr_from_ptr(ret);
index 3768dd0d720a2052a683a9ec55f3a2011ce4fc5b..81fbf4029160a29a15592939f2a25e6781909ebe 100644 (file)
@@ -73,9 +73,11 @@ public class Bolt11Invoice : CommonBase {
         * The hash of the [`RawBolt11Invoice`] that was signed.
         */
        public byte[] signable_hash() {
-               byte[] ret = bindings.Bolt11Invoice_signable_hash(this.ptr);
+               long ret = bindings.Bolt11Invoice_signable_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -155,9 +157,11 @@ public class Bolt11Invoice : CommonBase {
         * Returns the hash to which we will receive the preimage on completion of the payment
         */
        public byte[] payment_hash() {
-               byte[] ret = bindings.Bolt11Invoice_payment_hash(this.ptr);
+               long ret = bindings.Bolt11Invoice_payment_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -166,18 +170,22 @@ public class Bolt11Invoice : CommonBase {
         * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public byte[] payee_pub_key() {
-               byte[] ret = bindings.Bolt11Invoice_payee_pub_key(this.ptr);
+               long ret = bindings.Bolt11Invoice_payee_pub_key(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Get the payment secret if one was included in the invoice
         */
        public byte[] payment_secret() {
-               byte[] ret = bindings.Bolt11Invoice_payment_secret(this.ptr);
+               long ret = bindings.Bolt11Invoice_payment_secret(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -210,20 +218,22 @@ public class Bolt11Invoice : CommonBase {
         * Recover the payee's public key (only to be used if none was included in the invoice)
         */
        public byte[] recover_payee_pub_key() {
-               byte[] ret = bindings.Bolt11Invoice_recover_payee_pub_key(this.ptr);
+               long ret = bindings.Bolt11Invoice_recover_payee_pub_key(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Returns the Duration since the Unix epoch at which the invoice expires.
         * Returning None if overflow occurred.
         */
-       public Option_DurationZ expires_at() {
+       public Option_u64Z expires_at() {
                long ret = bindings.Bolt11Invoice_expires_at(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_DurationZ ret_hu_conv = org.ldk.structs.Option_DurationZ.constr_from_ptr(ret);
+               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;
        }
@@ -291,25 +301,36 @@ public class Bolt11Invoice : CommonBase {
         * Returns a list of all fallback addresses as [`Address`]es
         */
        public string[] fallback_addresses() {
-               string[] ret = bindings.Bolt11Invoice_fallback_addresses(this.ptr);
+               long ret = bindings.Bolt11Invoice_fallback_addresses(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_8_len = InternalUtils.getArrayLength(ret);
+               string[] ret_conv_8_arr = new string[ret_conv_8_len];
+               for (int i = 0; i < ret_conv_8_len; i++) {
+                       long ret_conv_8 = InternalUtils.getU32ArrayElem(ret, i);
+                       string ret_conv_8_conv = InternalUtils.decodeString(ret_conv_8);
+                       ret_conv_8_arr[i] = ret_conv_8_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_8_arr;
        }
 
        /**
         * Returns a list of all routes included in the invoice
         */
        public PrivateRoute[] private_routes() {
-               long[] ret = bindings.Bolt11Invoice_private_routes(this.ptr);
+               long ret = bindings.Bolt11Invoice_private_routes(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_14_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_14_len = InternalUtils.getArrayLength(ret);
                PrivateRoute[] ret_conv_14_arr = new PrivateRoute[ret_conv_14_len];
                for (int o = 0; o < ret_conv_14_len; o++) {
-                       long ret_conv_14 = ret[o];
+                       long ret_conv_14 = InternalUtils.getU64ArrayElem(ret, o);
                        org.ldk.structs.PrivateRoute ret_conv_14_hu_conv = null; if (ret_conv_14 < 0 || ret_conv_14 > 4096) { ret_conv_14_hu_conv = new org.ldk.structs.PrivateRoute(null, ret_conv_14); }
                        if (ret_conv_14_hu_conv != null) { ret_conv_14_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_14_arr[o] = ret_conv_14_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_14_arr;
        }
 
@@ -317,16 +338,18 @@ public class Bolt11Invoice : CommonBase {
         * Returns a list of all routes included in the invoice as the underlying hints
         */
        public RouteHint[] route_hints() {
-               long[] ret = bindings.Bolt11Invoice_route_hints(this.ptr);
+               long ret = bindings.Bolt11Invoice_route_hints(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_11_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_11_len = InternalUtils.getArrayLength(ret);
                RouteHint[] ret_conv_11_arr = new RouteHint[ret_conv_11_len];
                for (int l = 0; l < ret_conv_11_len; l++) {
-                       long ret_conv_11 = ret[l];
+                       long ret_conv_11 = InternalUtils.getU64ArrayElem(ret, l);
                        org.ldk.structs.RouteHint ret_conv_11_hu_conv = null; if (ret_conv_11 < 0 || ret_conv_11 > 4096) { ret_conv_11_hu_conv = new org.ldk.structs.RouteHint(null, ret_conv_11); }
                        if (ret_conv_11_hu_conv != null) { ret_conv_11_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_11_arr[l] = ret_conv_11_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_11_arr;
        }
 
@@ -355,7 +378,7 @@ public class Bolt11Invoice : CommonBase {
         * Read a Bolt11Invoice object from a string
         */
        public static Result_Bolt11InvoiceParseOrSemanticErrorZ from_str(string s) {
-               long ret = bindings.Bolt11Invoice_from_str(s);
+               long ret = bindings.Bolt11Invoice_from_str(InternalUtils.encodeString(s));
                GC.KeepAlive(s);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_Bolt11InvoiceParseOrSemanticErrorZ ret_hu_conv = Result_Bolt11InvoiceParseOrSemanticErrorZ.constr_from_ptr(ret);
@@ -366,9 +389,11 @@ public class Bolt11Invoice : CommonBase {
         * Get the string representation of a Bolt11Invoice object
         */
        public string to_str() {
-               string ret = bindings.Bolt11Invoice_to_str(this.ptr);
+               long ret = bindings.Bolt11Invoice_to_str(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
        }
 
 }
index cfbf1287640503b7bf6348f6e9755d2634a973e9..b1e77cc44f480685e04c74e93e9e431713093f7a 100644 (file)
@@ -82,6 +82,42 @@ public class Bolt11InvoiceFeatures : CommonBase {
                return ret;
        }
 
+       /**
+        * Sets a required feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Required bits are even. If an odd bit is given, then the corresponding even bit will
+        * be set instead (i.e., `bit - 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_required_feature_bit(long bit) {
+               long ret = bindings.Bolt11InvoiceFeatures_set_required_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Sets an optional feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Optional bits are odd. If an even bit is given, then the corresponding odd bit will be
+        * set instead (i.e., `bit + 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_optional_feature_bit(long bit) {
+               long ret = bindings.Bolt11InvoiceFeatures_set_optional_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
        /**
         * Sets a required custom feature bit. Errors if `bit` is outside the custom range as defined
         * by [bLIP 2] or if it is a known `T` feature.
@@ -122,16 +158,18 @@ public class Bolt11InvoiceFeatures : CommonBase {
         * Serialize the Bolt11InvoiceFeatures object into a byte array which can be read by Bolt11InvoiceFeatures_read
         */
        public byte[] write() {
-               byte[] ret = bindings.Bolt11InvoiceFeatures_write(this.ptr);
+               long ret = bindings.Bolt11InvoiceFeatures_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a Bolt11InvoiceFeatures from a byte array, created by Bolt11InvoiceFeatures_write
         */
        public static Result_Bolt11InvoiceFeaturesDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.Bolt11InvoiceFeatures_read(ser);
+               long ret = bindings.Bolt11InvoiceFeatures_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_Bolt11InvoiceFeaturesDecodeErrorZ ret_hu_conv = Result_Bolt11InvoiceFeaturesDecodeErrorZ.constr_from_ptr(ret);
index ad6115789242239bb289a1c81466adc462deb3a9..abf9712f2aaf9c6f9e85f8c63b13e698b1b29b00 100644 (file)
@@ -140,7 +140,9 @@ public class Bolt11ParseError : CommonBase {
        public class Bolt11ParseError_InvalidSliceLength : Bolt11ParseError {
                public string invalid_slice_length;
                internal Bolt11ParseError_InvalidSliceLength(long ptr) : base(null, ptr) {
-                       this.invalid_slice_length = bindings.LDKBolt11ParseError_InvalidSliceLength_get_invalid_slice_length(ptr);
+                       long invalid_slice_length = bindings.LDKBolt11ParseError_InvalidSliceLength_get_invalid_slice_length(ptr);
+                       string invalid_slice_length_conv = InternalUtils.decodeString(invalid_slice_length);
+                       this.invalid_slice_length = invalid_slice_length_conv;
                }
        }
        /** A Bolt11ParseError of type Skip */
@@ -351,7 +353,7 @@ public class Bolt11ParseError : CommonBase {
         * Utility method to constructs a new InvalidSliceLength-variant Bolt11ParseError
         */
        public static Bolt11ParseError invalid_slice_length(string a) {
-               long ret = bindings.Bolt11ParseError_invalid_slice_length(a);
+               long ret = bindings.Bolt11ParseError_invalid_slice_length(InternalUtils.encodeString(a));
                GC.KeepAlive(a);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.Bolt11ParseError ret_hu_conv = org.ldk.structs.Bolt11ParseError.constr_from_ptr(ret);
@@ -389,9 +391,11 @@ public class Bolt11ParseError : CommonBase {
         * Get the string representation of a Bolt11ParseError object
         */
        public string to_str() {
-               string ret = bindings.Bolt11ParseError_to_str(this.ptr);
+               long ret = bindings.Bolt11ParseError_to_str(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
        }
 
 }
index 85311e31607feb4f03b7ebb68ed457e75aa09e86..35f4e6517d0c9b8d1ea0ec7506d032aeb8ceb499 100644 (file)
@@ -41,8 +41,102 @@ public class Bolt12Invoice : CommonBase {
        }
 
        /**
-        * A complete description of the purpose of the originating offer or refund. Intended to be
-        * displayed to the user but with the caveat that it has not been verified in any way.
+        * The chains that may be used when paying a requested invoice.
+        * 
+        * From [`Offer::chains`]; `None` if the invoice was created in response to a [`Refund`].
+        * 
+        * [`Offer::chains`]: crate::offers::offer::Offer::chains
+        */
+       public Option_CVec_ThirtyTwoBytesZZ offer_chains() {
+               long ret = bindings.Bolt12Invoice_offer_chains(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_CVec_ThirtyTwoBytesZZ ret_hu_conv = org.ldk.structs.Option_CVec_ThirtyTwoBytesZZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The chain that must be used when paying the invoice; selected from [`offer_chains`] if the
+        * invoice originated from an offer.
+        * 
+        * From [`InvoiceRequest::chain`] or [`Refund::chain`].
+        * 
+        * [`offer_chains`]: Self::offer_chains
+        * [`InvoiceRequest::chain`]: crate::offers::invoice_request::InvoiceRequest::chain
+        */
+       public byte[] chain() {
+               long ret = bindings.Bolt12Invoice_chain(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Opaque bytes set by the originating [`Offer`].
+        * 
+        * From [`Offer::metadata`]; `None` if the invoice was created in response to a [`Refund`] or
+        * if the [`Offer`] did not set it.
+        * 
+        * [`Offer`]: crate::offers::offer::Offer
+        * [`Offer::metadata`]: crate::offers::offer::Offer::metadata
+        */
+       public Option_CVec_u8ZZ metadata() {
+               long ret = bindings.Bolt12Invoice_metadata(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_CVec_u8ZZ ret_hu_conv = org.ldk.structs.Option_CVec_u8ZZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The minimum amount required for a successful payment of a single item.
+        * 
+        * From [`Offer::amount`]; `None` if the invoice was created in response to a [`Refund`] or if
+        * the [`Offer`] did not set it.
+        * 
+        * [`Offer`]: crate::offers::offer::Offer
+        * [`Offer::amount`]: crate::offers::offer::Offer::amount
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public Amount amount() {
+               long ret = bindings.Bolt12Invoice_amount(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Amount ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Amount(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Features pertaining to the originating [`Offer`].
+        * 
+        * From [`Offer::offer_features`]; `None` if the invoice was created in response to a
+        * [`Refund`].
+        * 
+        * [`Offer`]: crate::offers::offer::Offer
+        * [`Offer::offer_features`]: crate::offers::offer::Offer::offer_features
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public OfferFeatures offer_features() {
+               long ret = bindings.Bolt12Invoice_offer_features(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.OfferFeatures ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.OfferFeatures(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * A complete description of the purpose of the originating offer or refund.
+        * 
+        * From [`Offer::description`] or [`Refund::description`].
+        * 
+        * [`Offer::description`]: crate::offers::offer::Offer::description
         */
        public PrintableString description() {
                long ret = bindings.Bolt12Invoice_description(this.ptr);
@@ -53,6 +147,153 @@ public class Bolt12Invoice : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Duration since the Unix epoch when an invoice should no longer be requested.
+        * 
+        * From [`Offer::absolute_expiry`] or [`Refund::absolute_expiry`].
+        * 
+        * [`Offer::absolute_expiry`]: crate::offers::offer::Offer::absolute_expiry
+        */
+       public Option_u64Z absolute_expiry() {
+               long ret = bindings.Bolt12Invoice_absolute_expiry(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 issuer of the offer or refund.
+        * 
+        * From [`Offer::issuer`] or [`Refund::issuer`].
+        * 
+        * [`Offer::issuer`]: crate::offers::offer::Offer::issuer
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public PrintableString issuer() {
+               long ret = bindings.Bolt12Invoice_issuer(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PrintableString ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PrintableString(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Paths to the recipient originating from publicly reachable nodes.
+        * 
+        * From [`Offer::paths`] or [`Refund::paths`].
+        * 
+        * [`Offer::paths`]: crate::offers::offer::Offer::paths
+        */
+       public BlindedPath[] message_paths() {
+               long ret = bindings.Bolt12Invoice_message_paths(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_13_len = InternalUtils.getArrayLength(ret);
+               BlindedPath[] ret_conv_13_arr = new BlindedPath[ret_conv_13_len];
+               for (int n = 0; n < ret_conv_13_len; n++) {
+                       long ret_conv_13 = InternalUtils.getU64ArrayElem(ret, n);
+                       org.ldk.structs.BlindedPath ret_conv_13_hu_conv = null; if (ret_conv_13 < 0 || ret_conv_13 > 4096) { ret_conv_13_hu_conv = new org.ldk.structs.BlindedPath(null, ret_conv_13); }
+                       if (ret_conv_13_hu_conv != null) { ret_conv_13_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_13_arr[n] = ret_conv_13_hu_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_13_arr;
+       }
+
+       /**
+        * The quantity of items supported.
+        * 
+        * From [`Offer::supported_quantity`]; `None` if the invoice was created in response to a
+        * [`Refund`].
+        * 
+        * [`Offer::supported_quantity`]: crate::offers::offer::Offer::supported_quantity
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public Quantity supported_quantity() {
+               long ret = bindings.Bolt12Invoice_supported_quantity(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Quantity ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Quantity(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * An unpredictable series of bytes from the payer.
+        * 
+        * From [`InvoiceRequest::payer_metadata`] or [`Refund::payer_metadata`].
+        */
+       public byte[] payer_metadata() {
+               long ret = bindings.Bolt12Invoice_payer_metadata(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Features pertaining to requesting an invoice.
+        * 
+        * From [`InvoiceRequest::invoice_request_features`] or [`Refund::features`].
+        */
+       public InvoiceRequestFeatures invoice_request_features() {
+               long ret = bindings.Bolt12Invoice_invoice_request_features(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.InvoiceRequestFeatures ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.InvoiceRequestFeatures(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The quantity of items requested or refunded for.
+        * 
+        * From [`InvoiceRequest::quantity`] or [`Refund::quantity`].
+        */
+       public Option_u64Z quantity() {
+               long ret = bindings.Bolt12Invoice_quantity(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;
+       }
+
+       /**
+        * A possibly transient pubkey used to sign the invoice request or to send an invoice for a
+        * refund in case there are no [`message_paths`].
+        * 
+        * [`message_paths`]: Self::message_paths
+        */
+       public byte[] payer_id() {
+               long ret = bindings.Bolt12Invoice_payer_id(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * A payer-provided note reflected back in the invoice.
+        * 
+        * From [`InvoiceRequest::payer_note`] or [`Refund::payer_note`].
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public PrintableString payer_note() {
+               long ret = bindings.Bolt12Invoice_payer_note(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PrintableString ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PrintableString(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
        /**
         * Duration since the Unix epoch when the invoice was created.
         */
@@ -85,9 +326,11 @@ public class Bolt12Invoice : CommonBase {
         * SHA256 hash of the payment preimage that will be given in return for paying the invoice.
         */
        public byte[] payment_hash() {
-               byte[] ret = bindings.Bolt12Invoice_payment_hash(this.ptr);
+               long ret = bindings.Bolt12Invoice_payment_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -102,8 +345,8 @@ public class Bolt12Invoice : CommonBase {
        /**
         * Features pertaining to paying an invoice.
         */
-       public Bolt12InvoiceFeatures features() {
-               long ret = bindings.Bolt12Invoice_features(this.ptr);
+       public Bolt12InvoiceFeatures invoice_features() {
+               long ret = bindings.Bolt12Invoice_invoice_features(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.Bolt12InvoiceFeatures ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Bolt12InvoiceFeatures(null, ret); }
@@ -115,38 +358,58 @@ public class Bolt12Invoice : CommonBase {
         * The public key corresponding to the key used to sign the invoice.
         */
        public byte[] signing_pubkey() {
-               byte[] ret = bindings.Bolt12Invoice_signing_pubkey(this.ptr);
+               long ret = bindings.Bolt12Invoice_signing_pubkey(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Signature of the invoice verified using [`Bolt12Invoice::signing_pubkey`].
+        */
+       public byte[] signature() {
+               long ret = bindings.Bolt12Invoice_signature(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Hash that was used for signing the invoice.
         */
        public byte[] signable_hash() {
-               byte[] ret = bindings.Bolt12Invoice_signable_hash(this.ptr);
+               long ret = bindings.Bolt12Invoice_signable_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
-        * Verifies that the invoice was for a request or refund created using the given key.
+        * Verifies that the invoice was for a request or refund created using the given key. Returns
+        * the associated [`PaymentId`] to use when sending the payment.
         */
-       public bool verify(org.ldk.structs.ExpandedKey key) {
-               bool ret = bindings.Bolt12Invoice_verify(this.ptr, key == null ? 0 : key.ptr);
+       public Result_ThirtyTwoBytesNoneZ verify(org.ldk.structs.ExpandedKey key) {
+               long ret = bindings.Bolt12Invoice_verify(this.ptr, key == null ? 0 : key.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(key);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ThirtyTwoBytesNoneZ ret_hu_conv = Result_ThirtyTwoBytesNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(key); };
-               return ret;
+               return ret_hu_conv;
        }
 
        /**
         * Serialize the Bolt12Invoice object into a byte array which can be read by Bolt12Invoice_read
         */
        public byte[] write() {
-               byte[] ret = bindings.Bolt12Invoice_write(this.ptr);
+               long ret = bindings.Bolt12Invoice_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index 6695827a238e89b8578002b7d70cf3b7d77a936c..517d44ae3bcf16e677e1ce5dfe4a5aba3ba50dc8 100644 (file)
@@ -82,6 +82,42 @@ public class Bolt12InvoiceFeatures : CommonBase {
                return ret;
        }
 
+       /**
+        * Sets a required feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Required bits are even. If an odd bit is given, then the corresponding even bit will
+        * be set instead (i.e., `bit - 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_required_feature_bit(long bit) {
+               long ret = bindings.Bolt12InvoiceFeatures_set_required_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Sets an optional feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Optional bits are odd. If an even bit is given, then the corresponding odd bit will be
+        * set instead (i.e., `bit + 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_optional_feature_bit(long bit) {
+               long ret = bindings.Bolt12InvoiceFeatures_set_optional_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
        /**
         * Sets a required custom feature bit. Errors if `bit` is outside the custom range as defined
         * by [bLIP 2] or if it is a known `T` feature.
@@ -122,16 +158,18 @@ public class Bolt12InvoiceFeatures : CommonBase {
         * Serialize the Bolt12InvoiceFeatures object into a byte array which can be read by Bolt12InvoiceFeatures_read
         */
        public byte[] write() {
-               byte[] ret = bindings.Bolt12InvoiceFeatures_write(this.ptr);
+               long ret = bindings.Bolt12InvoiceFeatures_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a Bolt12InvoiceFeatures from a byte array, created by Bolt12InvoiceFeatures_write
         */
        public static Result_Bolt12InvoiceFeaturesDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.Bolt12InvoiceFeatures_read(ser);
+               long ret = bindings.Bolt12InvoiceFeatures_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_Bolt12InvoiceFeaturesDecodeErrorZ ret_hu_conv = Result_Bolt12InvoiceFeaturesDecodeErrorZ.constr_from_ptr(ret);
index 5d791dd67fa51c3984a592d8d211b03f05ba4648..67c238a28ba52491c867304daa9ad0606ddbb425 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,53 +6,70 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of BroadcasterInterface */
+public interface BroadcasterInterfaceInterface {
+       /**Sends a list of transactions out to (hopefully) be mined.
+        * This only needs to handle the actual broadcasting of transactions, LDK will automatically
+        * rebroadcast transactions that haven't made it into a block.
+        * 
+        * In some cases LDK may attempt to broadcast a transaction which double-spends another
+        * and this isn't a bug and can be safely ignored.
+        * 
+        * If more than one transaction is given, these transactions should be considered to be a
+        * package and broadcast together. Some of the transactions may or may not depend on each other,
+        * 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
+        */
+       void broadcast_transactions(byte[][] txs);
+}
+
 /**
  * An interface to send a transaction to the Bitcoin network.
  */
 public class BroadcasterInterface : CommonBase {
-       internal readonly bindings.LDKBroadcasterInterface bindings_instance;
+       internal bindings.LDKBroadcasterInterface bindings_instance;
+       internal long instance_idx;
+
        internal BroadcasterInterface(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private BroadcasterInterface(bindings.LDKBroadcasterInterface arg) : base(bindings.LDKBroadcasterInterface_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~BroadcasterInterface() {
                if (ptr != 0) { bindings.BroadcasterInterface_free(ptr); }
        }
 
-       public interface BroadcasterInterfaceInterface {
-               /**
-                * Sends a list of transactions out to (hopefully) be mined.
-                * This only needs to handle the actual broadcasting of transactions, LDK will automatically
-                * rebroadcast transactions that haven't made it into a block.
-                * 
-                * In some cases LDK may attempt to broadcast a transaction which double-spends another
-                * and this isn't a bug and can be safely ignored.
-                * 
-                * If more than one transaction is given, these transactions should be considered to be a
-                * package and broadcast together. Some of the transactions may or may not depend on each other,
-                * 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
-                */
-               void broadcast_transactions(byte[][] _txs);
-       }
        private class LDKBroadcasterInterfaceHolder { internal BroadcasterInterface held; }
        private class LDKBroadcasterInterfaceImpl : bindings.LDKBroadcasterInterface {
                internal LDKBroadcasterInterfaceImpl(BroadcasterInterfaceInterface arg, LDKBroadcasterInterfaceHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private BroadcasterInterfaceInterface arg;
                private LDKBroadcasterInterfaceHolder impl_holder;
-               public void broadcast_transactions(byte[][] _txs) {
-                       arg.broadcast_transactions(_txs);
+               public void broadcast_transactions(long _txs) {
+                       int _txs_conv_8_len = InternalUtils.getArrayLength(_txs);
+                       byte[][] _txs_conv_8_arr = new byte[_txs_conv_8_len][];
+                       for (int i = 0; i < _txs_conv_8_len; i++) {
+                               long _txs_conv_8 = InternalUtils.getU64ArrayElem(_txs, i);
+                               byte[] _txs_conv_8_conv = InternalUtils.decodeUint8Array(_txs_conv_8);
+                               _txs_conv_8_arr[i] = _txs_conv_8_conv;
+                       }
+                       bindings.free_buffer(_txs);
+                       arg.broadcast_transactions(_txs_conv_8_arr);
                                GC.KeepAlive(arg);
                }
        }
+
+       /** Creates a new instance of BroadcasterInterface from a given implementation */
        public static BroadcasterInterface new_impl(BroadcasterInterfaceInterface arg) {
                LDKBroadcasterInterfaceHolder impl_holder = new LDKBroadcasterInterfaceHolder();
-               impl_holder.held = new BroadcasterInterface(new LDKBroadcasterInterfaceImpl(arg, impl_holder));
+               LDKBroadcasterInterfaceImpl impl = new LDKBroadcasterInterfaceImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKBroadcasterInterface_new(impl);
+
+               impl_holder.held = new BroadcasterInterface(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Sends a list of transactions out to (hopefully) be mined.
         * This only needs to handle the actual broadcasting of transactions, LDK will automatically
@@ -68,7 +86,7 @@ public class BroadcasterInterface : CommonBase {
         * https://github.com/bitcoin/bitcoin/blob/master/doc/policy/packages.md
         */
        public void broadcast_transactions(byte[][] txs) {
-               bindings.BroadcasterInterface_broadcast_transactions(this.ptr, txs);
+               bindings.BroadcasterInterface_broadcast_transactions(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(txs, txs_conv_8 => InternalUtils.encodeUint8Array(txs_conv_8))));
                GC.KeepAlive(this);
                GC.KeepAlive(txs);
        }
index f5452bee5d4c14baa4ed2c0b6f1cefd0005ce389..9b78bfeb0ddd7267bab805c893d946be7aa932ce 100644 (file)
@@ -19,16 +19,18 @@ public class BuiltCommitmentTransaction : CommonBase {
         * The commitment transaction
         */
        public byte[] get_transaction() {
-               byte[] ret = bindings.BuiltCommitmentTransaction_get_transaction(this.ptr);
+               long ret = bindings.BuiltCommitmentTransaction_get_transaction(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The commitment transaction
         */
        public void set_transaction(byte[] val) {
-               bindings.BuiltCommitmentTransaction_set_transaction(this.ptr, val);
+               bindings.BuiltCommitmentTransaction_set_transaction(this.ptr, InternalUtils.encodeUint8Array(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -40,9 +42,11 @@ public class BuiltCommitmentTransaction : CommonBase {
         * multiple times.
         */
        public byte[] get_txid() {
-               byte[] ret = bindings.BuiltCommitmentTransaction_get_txid(this.ptr);
+               long ret = bindings.BuiltCommitmentTransaction_get_txid(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -52,7 +56,7 @@ public class BuiltCommitmentTransaction : CommonBase {
         * multiple times.
         */
        public void set_txid(byte[] val) {
-               bindings.BuiltCommitmentTransaction_set_txid(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.BuiltCommitmentTransaction_set_txid(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -61,7 +65,7 @@ public class BuiltCommitmentTransaction : CommonBase {
         * Constructs a new BuiltCommitmentTransaction given each field
         */
        public static BuiltCommitmentTransaction of(byte[] transaction_arg, byte[] txid_arg) {
-               long ret = bindings.BuiltCommitmentTransaction_new(transaction_arg, InternalUtils.check_arr_len(txid_arg, 32));
+               long ret = bindings.BuiltCommitmentTransaction_new(InternalUtils.encodeUint8Array(transaction_arg), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(txid_arg, 32)));
                GC.KeepAlive(transaction_arg);
                GC.KeepAlive(txid_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -92,16 +96,18 @@ public class BuiltCommitmentTransaction : CommonBase {
         * Serialize the BuiltCommitmentTransaction object into a byte array which can be read by BuiltCommitmentTransaction_read
         */
        public byte[] write() {
-               byte[] ret = bindings.BuiltCommitmentTransaction_write(this.ptr);
+               long ret = bindings.BuiltCommitmentTransaction_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a BuiltCommitmentTransaction from a byte array, created by BuiltCommitmentTransaction_write
         */
        public static Result_BuiltCommitmentTransactionDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.BuiltCommitmentTransaction_read(ser);
+               long ret = bindings.BuiltCommitmentTransaction_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_BuiltCommitmentTransactionDecodeErrorZ ret_hu_conv = Result_BuiltCommitmentTransactionDecodeErrorZ.constr_from_ptr(ret);
@@ -114,37 +120,43 @@ public class BuiltCommitmentTransaction : CommonBase {
         * This can be used to verify a signature.
         */
        public byte[] get_sighash_all(byte[] funding_redeemscript, long channel_value_satoshis) {
-               byte[] ret = bindings.BuiltCommitmentTransaction_get_sighash_all(this.ptr, funding_redeemscript, channel_value_satoshis);
+               long ret = bindings.BuiltCommitmentTransaction_get_sighash_all(this.ptr, InternalUtils.encodeUint8Array(funding_redeemscript), channel_value_satoshis);
                GC.KeepAlive(this);
                GC.KeepAlive(funding_redeemscript);
                GC.KeepAlive(channel_value_satoshis);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Signs the counterparty's commitment transaction.
         */
        public byte[] sign_counterparty_commitment(byte[] funding_key, byte[] funding_redeemscript, long channel_value_satoshis) {
-               byte[] ret = bindings.BuiltCommitmentTransaction_sign_counterparty_commitment(this.ptr, InternalUtils.check_arr_len(funding_key, 32), funding_redeemscript, channel_value_satoshis);
+               long ret = bindings.BuiltCommitmentTransaction_sign_counterparty_commitment(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(funding_key, 32)), InternalUtils.encodeUint8Array(funding_redeemscript), channel_value_satoshis);
                GC.KeepAlive(this);
                GC.KeepAlive(funding_key);
                GC.KeepAlive(funding_redeemscript);
                GC.KeepAlive(channel_value_satoshis);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Signs the holder commitment transaction because we are about to broadcast it.
         */
        public byte[] sign_holder_commitment(byte[] funding_key, byte[] funding_redeemscript, long channel_value_satoshis, org.ldk.structs.EntropySource entropy_source) {
-               byte[] ret = bindings.BuiltCommitmentTransaction_sign_holder_commitment(this.ptr, InternalUtils.check_arr_len(funding_key, 32), funding_redeemscript, channel_value_satoshis, entropy_source.ptr);
+               long ret = bindings.BuiltCommitmentTransaction_sign_holder_commitment(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(funding_key, 32)), InternalUtils.encodeUint8Array(funding_redeemscript), channel_value_satoshis, entropy_source.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(funding_key);
                GC.KeepAlive(funding_redeemscript);
                GC.KeepAlive(channel_value_satoshis);
                GC.KeepAlive(entropy_source);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
                if (this != null) { this.ptrs_to.AddLast(entropy_source); };
-               return ret;
+               return ret_conv;
        }
 
 }
index 655ad08b825237fe77d623be565058040d559915..95b58176c00c063dc59b0991e17af48021e47a75 100644 (file)
@@ -61,23 +61,28 @@ public class BumpTransactionEvent : CommonBase {
                 */
                public HTLCOutputInCommitment[] pending_htlcs;
                internal BumpTransactionEvent_ChannelClose(long ptr) : base(null, ptr) {
-                       this.claim_id = bindings.LDKBumpTransactionEvent_ChannelClose_get_claim_id(ptr);
+                       long claim_id = bindings.LDKBumpTransactionEvent_ChannelClose_get_claim_id(ptr);
+                       byte[] claim_id_conv = InternalUtils.decodeUint8Array(claim_id);
+                       this.claim_id = claim_id_conv;
                        this.package_target_feerate_sat_per_1000_weight = bindings.LDKBumpTransactionEvent_ChannelClose_get_package_target_feerate_sat_per_1000_weight(ptr);
-                       this.commitment_tx = bindings.LDKBumpTransactionEvent_ChannelClose_get_commitment_tx(ptr);
+                       long commitment_tx = bindings.LDKBumpTransactionEvent_ChannelClose_get_commitment_tx(ptr);
+                       byte[] commitment_tx_conv = InternalUtils.decodeUint8Array(commitment_tx);
+                       this.commitment_tx = commitment_tx_conv;
                        this.commitment_tx_fee_satoshis = bindings.LDKBumpTransactionEvent_ChannelClose_get_commitment_tx_fee_satoshis(ptr);
                        long anchor_descriptor = bindings.LDKBumpTransactionEvent_ChannelClose_get_anchor_descriptor(ptr);
                        org.ldk.structs.AnchorDescriptor anchor_descriptor_hu_conv = null; if (anchor_descriptor < 0 || anchor_descriptor > 4096) { anchor_descriptor_hu_conv = new org.ldk.structs.AnchorDescriptor(null, anchor_descriptor); }
                        if (anchor_descriptor_hu_conv != null) { anchor_descriptor_hu_conv.ptrs_to.AddLast(this); };
                        this.anchor_descriptor = anchor_descriptor_hu_conv;
-                       long[] pending_htlcs = bindings.LDKBumpTransactionEvent_ChannelClose_get_pending_htlcs(ptr);
-                       int pending_htlcs_conv_24_len = pending_htlcs.Length;
+                       long pending_htlcs = bindings.LDKBumpTransactionEvent_ChannelClose_get_pending_htlcs(ptr);
+                       int pending_htlcs_conv_24_len = InternalUtils.getArrayLength(pending_htlcs);
                        HTLCOutputInCommitment[] pending_htlcs_conv_24_arr = new HTLCOutputInCommitment[pending_htlcs_conv_24_len];
                        for (int y = 0; y < pending_htlcs_conv_24_len; y++) {
-                               long pending_htlcs_conv_24 = pending_htlcs[y];
+                               long pending_htlcs_conv_24 = InternalUtils.getU64ArrayElem(pending_htlcs, y);
                                org.ldk.structs.HTLCOutputInCommitment pending_htlcs_conv_24_hu_conv = null; if (pending_htlcs_conv_24 < 0 || pending_htlcs_conv_24 > 4096) { pending_htlcs_conv_24_hu_conv = new org.ldk.structs.HTLCOutputInCommitment(null, pending_htlcs_conv_24); }
                                if (pending_htlcs_conv_24_hu_conv != null) { pending_htlcs_conv_24_hu_conv.ptrs_to.AddLast(this); };
                                pending_htlcs_conv_24_arr[y] = pending_htlcs_conv_24_hu_conv;
                        }
+                       bindings.free_buffer(pending_htlcs);
                        this.pending_htlcs = pending_htlcs_conv_24_arr;
                }
        }
@@ -106,17 +111,20 @@ public class BumpTransactionEvent : CommonBase {
                 */
                public int tx_lock_time;
                internal BumpTransactionEvent_HTLCResolution(long ptr) : base(null, ptr) {
-                       this.claim_id = bindings.LDKBumpTransactionEvent_HTLCResolution_get_claim_id(ptr);
+                       long claim_id = bindings.LDKBumpTransactionEvent_HTLCResolution_get_claim_id(ptr);
+                       byte[] claim_id_conv = InternalUtils.decodeUint8Array(claim_id);
+                       this.claim_id = claim_id_conv;
                        this.target_feerate_sat_per_1000_weight = bindings.LDKBumpTransactionEvent_HTLCResolution_get_target_feerate_sat_per_1000_weight(ptr);
-                       long[] htlc_descriptors = bindings.LDKBumpTransactionEvent_HTLCResolution_get_htlc_descriptors(ptr);
-                       int htlc_descriptors_conv_16_len = htlc_descriptors.Length;
+                       long htlc_descriptors = bindings.LDKBumpTransactionEvent_HTLCResolution_get_htlc_descriptors(ptr);
+                       int htlc_descriptors_conv_16_len = InternalUtils.getArrayLength(htlc_descriptors);
                        HTLCDescriptor[] htlc_descriptors_conv_16_arr = new HTLCDescriptor[htlc_descriptors_conv_16_len];
                        for (int q = 0; q < htlc_descriptors_conv_16_len; q++) {
-                               long htlc_descriptors_conv_16 = htlc_descriptors[q];
+                               long htlc_descriptors_conv_16 = InternalUtils.getU64ArrayElem(htlc_descriptors, q);
                                org.ldk.structs.HTLCDescriptor htlc_descriptors_conv_16_hu_conv = null; if (htlc_descriptors_conv_16 < 0 || htlc_descriptors_conv_16 > 4096) { htlc_descriptors_conv_16_hu_conv = new org.ldk.structs.HTLCDescriptor(null, htlc_descriptors_conv_16); }
                                if (htlc_descriptors_conv_16_hu_conv != null) { htlc_descriptors_conv_16_hu_conv.ptrs_to.AddLast(this); };
                                htlc_descriptors_conv_16_arr[q] = htlc_descriptors_conv_16_hu_conv;
                        }
+                       bindings.free_buffer(htlc_descriptors);
                        this.htlc_descriptors = htlc_descriptors_conv_16_arr;
                        this.tx_lock_time = bindings.LDKBumpTransactionEvent_HTLCResolution_get_tx_lock_time(ptr);
                }
@@ -143,7 +151,7 @@ public class BumpTransactionEvent : CommonBase {
         * Utility method to constructs a new ChannelClose-variant BumpTransactionEvent
         */
        public static BumpTransactionEvent channel_close(byte[] claim_id, int package_target_feerate_sat_per_1000_weight, byte[] commitment_tx, long commitment_tx_fee_satoshis, org.ldk.structs.AnchorDescriptor anchor_descriptor, HTLCOutputInCommitment[] pending_htlcs) {
-               long ret = bindings.BumpTransactionEvent_channel_close(InternalUtils.check_arr_len(claim_id, 32), package_target_feerate_sat_per_1000_weight, commitment_tx, commitment_tx_fee_satoshis, anchor_descriptor == null ? 0 : anchor_descriptor.ptr, pending_htlcs != null ? InternalUtils.mapArray(pending_htlcs, pending_htlcs_conv_24 => pending_htlcs_conv_24 == null ? 0 : pending_htlcs_conv_24.ptr) : null);
+               long ret = bindings.BumpTransactionEvent_channel_close(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(claim_id, 32)), package_target_feerate_sat_per_1000_weight, InternalUtils.encodeUint8Array(commitment_tx), commitment_tx_fee_satoshis, anchor_descriptor == null ? 0 : anchor_descriptor.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(pending_htlcs, pending_htlcs_conv_24 => pending_htlcs_conv_24 == null ? 0 : pending_htlcs_conv_24.ptr)));
                GC.KeepAlive(claim_id);
                GC.KeepAlive(package_target_feerate_sat_per_1000_weight);
                GC.KeepAlive(commitment_tx);
@@ -162,7 +170,7 @@ public class BumpTransactionEvent : CommonBase {
         * Utility method to constructs a new HTLCResolution-variant BumpTransactionEvent
         */
        public static BumpTransactionEvent htlcresolution(byte[] claim_id, int target_feerate_sat_per_1000_weight, HTLCDescriptor[] htlc_descriptors, int tx_lock_time) {
-               long ret = bindings.BumpTransactionEvent_htlcresolution(InternalUtils.check_arr_len(claim_id, 32), target_feerate_sat_per_1000_weight, htlc_descriptors != null ? InternalUtils.mapArray(htlc_descriptors, htlc_descriptors_conv_16 => htlc_descriptors_conv_16 == null ? 0 : htlc_descriptors_conv_16.ptr) : null, tx_lock_time);
+               long ret = bindings.BumpTransactionEvent_htlcresolution(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(claim_id, 32)), target_feerate_sat_per_1000_weight, InternalUtils.encodeUint64Array(InternalUtils.mapArray(htlc_descriptors, htlc_descriptors_conv_16 => htlc_descriptors_conv_16 == null ? 0 : htlc_descriptors_conv_16.ptr)), tx_lock_time);
                GC.KeepAlive(claim_id);
                GC.KeepAlive(target_feerate_sat_per_1000_weight);
                GC.KeepAlive(htlc_descriptors);
index 074b1ca921cd46d8691a9505ace44032169470cb..b3285516b222b3eaded165ebd9a3736d502a947b 100644 (file)
@@ -69,17 +69,19 @@ public class ChainMonitor : CommonBase {
         * inclusion in the return value.
         */
        public Balance[] get_claimable_balances(ChannelDetails[] ignored_channels) {
-               long[] ret = bindings.ChainMonitor_get_claimable_balances(this.ptr, ignored_channels != null ? InternalUtils.mapArray(ignored_channels, ignored_channels_conv_16 => ignored_channels_conv_16 == null ? 0 : ignored_channels_conv_16.ptr) : null);
+               long ret = bindings.ChainMonitor_get_claimable_balances(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(ignored_channels, ignored_channels_conv_16 => ignored_channels_conv_16 == null ? 0 : ignored_channels_conv_16.ptr)));
                GC.KeepAlive(this);
                GC.KeepAlive(ignored_channels);
-               int ret_conv_9_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_9_len = InternalUtils.getArrayLength(ret);
                Balance[] ret_conv_9_arr = new Balance[ret_conv_9_len];
                for (int j = 0; j < ret_conv_9_len; j++) {
-                       long ret_conv_9 = ret[j];
+                       long ret_conv_9 = InternalUtils.getU64ArrayElem(ret, j);
                        org.ldk.structs.Balance ret_conv_9_hu_conv = org.ldk.structs.Balance.constr_from_ptr(ret_conv_9);
                        if (ret_conv_9_hu_conv != null) { ret_conv_9_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_9_arr[j] = ret_conv_9_hu_conv;
                }
+               bindings.free_buffer(ret);
                foreach (ChannelDetails ignored_channels_conv_16 in ignored_channels) { if (this != null) { this.ptrs_to.AddLast(ignored_channels_conv_16); }; };
                return ret_conv_9_arr;
        }
@@ -108,16 +110,18 @@ public class ChainMonitor : CommonBase {
         * monitoring for on-chain state resolutions.
         */
        public OutPoint[] list_monitors() {
-               long[] ret = bindings.ChainMonitor_list_monitors(this.ptr);
+               long ret = bindings.ChainMonitor_list_monitors(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_10_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_10_len = InternalUtils.getArrayLength(ret);
                OutPoint[] ret_conv_10_arr = new OutPoint[ret_conv_10_len];
                for (int k = 0; k < ret_conv_10_len; k++) {
-                       long ret_conv_10 = ret[k];
+                       long ret_conv_10 = InternalUtils.getU64ArrayElem(ret, k);
                        org.ldk.structs.OutPoint ret_conv_10_hu_conv = null; if (ret_conv_10 < 0 || ret_conv_10 > 4096) { ret_conv_10_hu_conv = new org.ldk.structs.OutPoint(null, ret_conv_10); }
                        if (ret_conv_10_hu_conv != null) { ret_conv_10_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_10_arr[k] = ret_conv_10_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_10_arr;
        }
 
@@ -125,16 +129,18 @@ public class ChainMonitor : CommonBase {
         * Lists the pending updates for each [`ChannelMonitor`] (by `OutPoint` being monitored).
         */
        public TwoTuple_OutPointCVec_MonitorUpdateIdZZ[] list_pending_monitor_updates() {
-               long[] ret = bindings.ChainMonitor_list_pending_monitor_updates(this.ptr);
+               long ret = bindings.ChainMonitor_list_pending_monitor_updates(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_41_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_41_len = InternalUtils.getArrayLength(ret);
                TwoTuple_OutPointCVec_MonitorUpdateIdZZ[] ret_conv_41_arr = new TwoTuple_OutPointCVec_MonitorUpdateIdZZ[ret_conv_41_len];
                for (int p = 0; p < ret_conv_41_len; p++) {
-                       long ret_conv_41 = ret[p];
+                       long ret_conv_41 = InternalUtils.getU64ArrayElem(ret, p);
                        TwoTuple_OutPointCVec_MonitorUpdateIdZZ ret_conv_41_hu_conv = new TwoTuple_OutPointCVec_MonitorUpdateIdZZ(null, ret_conv_41);
                        if (ret_conv_41_hu_conv != null) { ret_conv_41_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_41_arr[p] = ret_conv_41_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_41_arr;
        }
 
index aa30a3a166ec604adea15c0d184a93695c77b728..1f8c8593fabee59ccce832494e883ef17d411607 100644 (file)
@@ -21,16 +21,18 @@ public class ChannelAnnouncement : CommonBase {
         * Authentication of the announcement by the first public node
         */
        public byte[] get_node_signature_1() {
-               byte[] ret = bindings.ChannelAnnouncement_get_node_signature_1(this.ptr);
+               long ret = bindings.ChannelAnnouncement_get_node_signature_1(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Authentication of the announcement by the first public node
         */
        public void set_node_signature_1(byte[] val) {
-               bindings.ChannelAnnouncement_set_node_signature_1(this.ptr, InternalUtils.check_arr_len(val, 64));
+               bindings.ChannelAnnouncement_set_node_signature_1(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 64)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -39,16 +41,18 @@ public class ChannelAnnouncement : CommonBase {
         * Authentication of the announcement by the second public node
         */
        public byte[] get_node_signature_2() {
-               byte[] ret = bindings.ChannelAnnouncement_get_node_signature_2(this.ptr);
+               long ret = bindings.ChannelAnnouncement_get_node_signature_2(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Authentication of the announcement by the second public node
         */
        public void set_node_signature_2(byte[] val) {
-               bindings.ChannelAnnouncement_set_node_signature_2(this.ptr, InternalUtils.check_arr_len(val, 64));
+               bindings.ChannelAnnouncement_set_node_signature_2(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 64)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -57,16 +61,18 @@ public class ChannelAnnouncement : CommonBase {
         * Proof of funding UTXO ownership by the first public node
         */
        public byte[] get_bitcoin_signature_1() {
-               byte[] ret = bindings.ChannelAnnouncement_get_bitcoin_signature_1(this.ptr);
+               long ret = bindings.ChannelAnnouncement_get_bitcoin_signature_1(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Proof of funding UTXO ownership by the first public node
         */
        public void set_bitcoin_signature_1(byte[] val) {
-               bindings.ChannelAnnouncement_set_bitcoin_signature_1(this.ptr, InternalUtils.check_arr_len(val, 64));
+               bindings.ChannelAnnouncement_set_bitcoin_signature_1(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 64)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -75,16 +81,18 @@ public class ChannelAnnouncement : CommonBase {
         * Proof of funding UTXO ownership by the second public node
         */
        public byte[] get_bitcoin_signature_2() {
-               byte[] ret = bindings.ChannelAnnouncement_get_bitcoin_signature_2(this.ptr);
+               long ret = bindings.ChannelAnnouncement_get_bitcoin_signature_2(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Proof of funding UTXO ownership by the second public node
         */
        public void set_bitcoin_signature_2(byte[] val) {
-               bindings.ChannelAnnouncement_set_bitcoin_signature_2(this.ptr, InternalUtils.check_arr_len(val, 64));
+               bindings.ChannelAnnouncement_set_bitcoin_signature_2(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 64)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -115,7 +123,7 @@ public class ChannelAnnouncement : CommonBase {
         * Constructs a new ChannelAnnouncement given each field
         */
        public static ChannelAnnouncement of(byte[] node_signature_1_arg, byte[] node_signature_2_arg, byte[] bitcoin_signature_1_arg, byte[] bitcoin_signature_2_arg, org.ldk.structs.UnsignedChannelAnnouncement contents_arg) {
-               long ret = bindings.ChannelAnnouncement_new(InternalUtils.check_arr_len(node_signature_1_arg, 64), InternalUtils.check_arr_len(node_signature_2_arg, 64), InternalUtils.check_arr_len(bitcoin_signature_1_arg, 64), InternalUtils.check_arr_len(bitcoin_signature_2_arg, 64), contents_arg == null ? 0 : contents_arg.ptr);
+               long ret = bindings.ChannelAnnouncement_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_signature_1_arg, 64)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_signature_2_arg, 64)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(bitcoin_signature_1_arg, 64)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(bitcoin_signature_2_arg, 64)), contents_arg == null ? 0 : contents_arg.ptr);
                GC.KeepAlive(node_signature_1_arg);
                GC.KeepAlive(node_signature_2_arg);
                GC.KeepAlive(bitcoin_signature_1_arg);
@@ -167,16 +175,18 @@ public class ChannelAnnouncement : CommonBase {
         * Serialize the ChannelAnnouncement object into a byte array which can be read by ChannelAnnouncement_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ChannelAnnouncement_write(this.ptr);
+               long ret = bindings.ChannelAnnouncement_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ChannelAnnouncement from a byte array, created by ChannelAnnouncement_write
         */
        public static Result_ChannelAnnouncementDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ChannelAnnouncement_read(ser);
+               long ret = bindings.ChannelAnnouncement_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ChannelAnnouncementDecodeErrorZ ret_hu_conv = Result_ChannelAnnouncementDecodeErrorZ.constr_from_ptr(ret);
index 05c0e3136189b59e1387b3788ce3ce341e57c32a..da4589dcc5ce4bf3f6dba7d12bffee0242e9b322 100644 (file)
@@ -209,20 +209,20 @@ public class ChannelConfig : CommonBase {
         * funder/initiator.
         * 
         * When we are the funder, because we have to pay the channel closing fee, we bound the
-        * acceptable fee by our [`Background`] and [`Normal`] fees, with the upper bound increased by
+        * acceptable fee by our [`ChannelCloseMinimum`] and [`NonAnchorChannelFee`] fees, with the upper bound increased by
         * this value. Because the on-chain fee we'd pay to force-close the channel is kept near our
-        * [`Normal`] feerate during normal operation, this value represents the additional fee we're
+        * [`NonAnchorChannelFee`] feerate during normal operation, this value represents the additional fee we're
         * willing to pay in order to avoid waiting for our counterparty's to_self_delay to reclaim our
         * funds.
         * 
         * When we are not the funder, we require the closing transaction fee pay at least our
-        * [`Background`] fee estimate, but allow our counterparty to pay as much fee as they like.
+        * [`ChannelCloseMinimum`] fee estimate, but allow our counterparty to pay as much fee as they like.
         * Thus, this value is ignored when we are not the funder.
         * 
         * Default value: 1000 satoshis.
         * 
-        * [`Normal`]: crate::chain::chaininterface::ConfirmationTarget::Normal
-        * [`Background`]: crate::chain::chaininterface::ConfirmationTarget::Background
+        * [`NonAnchorChannelFee`]: crate::chain::chaininterface::ConfirmationTarget::NonAnchorChannelFee
+        * [`ChannelCloseMinimum`]: crate::chain::chaininterface::ConfirmationTarget::ChannelCloseMinimum
         */
        public long get_force_close_avoidance_max_fee_satoshis() {
                long ret = bindings.ChannelConfig_get_force_close_avoidance_max_fee_satoshis(this.ptr);
@@ -239,20 +239,20 @@ public class ChannelConfig : CommonBase {
         * funder/initiator.
         * 
         * When we are the funder, because we have to pay the channel closing fee, we bound the
-        * acceptable fee by our [`Background`] and [`Normal`] fees, with the upper bound increased by
+        * acceptable fee by our [`ChannelCloseMinimum`] and [`NonAnchorChannelFee`] fees, with the upper bound increased by
         * this value. Because the on-chain fee we'd pay to force-close the channel is kept near our
-        * [`Normal`] feerate during normal operation, this value represents the additional fee we're
+        * [`NonAnchorChannelFee`] feerate during normal operation, this value represents the additional fee we're
         * willing to pay in order to avoid waiting for our counterparty's to_self_delay to reclaim our
         * funds.
         * 
         * When we are not the funder, we require the closing transaction fee pay at least our
-        * [`Background`] fee estimate, but allow our counterparty to pay as much fee as they like.
+        * [`ChannelCloseMinimum`] fee estimate, but allow our counterparty to pay as much fee as they like.
         * Thus, this value is ignored when we are not the funder.
         * 
         * Default value: 1000 satoshis.
         * 
-        * [`Normal`]: crate::chain::chaininterface::ConfirmationTarget::Normal
-        * [`Background`]: crate::chain::chaininterface::ConfirmationTarget::Background
+        * [`NonAnchorChannelFee`]: crate::chain::chaininterface::ConfirmationTarget::NonAnchorChannelFee
+        * [`ChannelCloseMinimum`]: crate::chain::chaininterface::ConfirmationTarget::ChannelCloseMinimum
         */
        public void set_force_close_avoidance_max_fee_satoshis(long val) {
                bindings.ChannelConfig_set_force_close_avoidance_max_fee_satoshis(this.ptr, val);
@@ -412,16 +412,18 @@ public class ChannelConfig : CommonBase {
         * Serialize the ChannelConfig object into a byte array which can be read by ChannelConfig_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ChannelConfig_write(this.ptr);
+               long ret = bindings.ChannelConfig_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ChannelConfig from a byte array, created by ChannelConfig_write
         */
        public static Result_ChannelConfigDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ChannelConfig_read(ser);
+               long ret = bindings.ChannelConfig_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ChannelConfigDecodeErrorZ ret_hu_conv = Result_ChannelConfigDecodeErrorZ.constr_from_ptr(ret);
index b8fb5ad73a484e9ef46cc43f8900d1f7ec58a31f..c994ea6c1eb7973331a418a8f2baf833247730b2 100644 (file)
@@ -20,16 +20,18 @@ public class ChannelCounterparty : CommonBase {
         * The node_id of our counterparty
         */
        public byte[] get_node_id() {
-               byte[] ret = bindings.ChannelCounterparty_get_node_id(this.ptr);
+               long ret = bindings.ChannelCounterparty_get_node_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The node_id of our counterparty
         */
        public void set_node_id(byte[] val) {
-               bindings.ChannelCounterparty_set_node_id(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.ChannelCounterparty_set_node_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -168,9 +170,11 @@ public class ChannelCounterparty : CommonBase {
 
        /**
         * Constructs a new ChannelCounterparty given each field
+        * 
+        * Note that forwarding_info_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public static ChannelCounterparty of(byte[] node_id_arg, org.ldk.structs.InitFeatures features_arg, long unspendable_punishment_reserve_arg, org.ldk.structs.CounterpartyForwardingInfo forwarding_info_arg, org.ldk.structs.Option_u64Z outbound_htlc_minimum_msat_arg, org.ldk.structs.Option_u64Z outbound_htlc_maximum_msat_arg) {
-               long ret = bindings.ChannelCounterparty_new(InternalUtils.check_arr_len(node_id_arg, 33), features_arg == null ? 0 : features_arg.ptr, unspendable_punishment_reserve_arg, forwarding_info_arg == null ? 0 : forwarding_info_arg.ptr, outbound_htlc_minimum_msat_arg.ptr, outbound_htlc_maximum_msat_arg.ptr);
+               long ret = bindings.ChannelCounterparty_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id_arg, 33)), features_arg == null ? 0 : features_arg.ptr, unspendable_punishment_reserve_arg, forwarding_info_arg == null ? 0 : forwarding_info_arg.ptr, outbound_htlc_minimum_msat_arg.ptr, outbound_htlc_maximum_msat_arg.ptr);
                GC.KeepAlive(node_id_arg);
                GC.KeepAlive(features_arg);
                GC.KeepAlive(unspendable_punishment_reserve_arg);
@@ -209,16 +213,18 @@ public class ChannelCounterparty : CommonBase {
         * Serialize the ChannelCounterparty object into a byte array which can be read by ChannelCounterparty_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ChannelCounterparty_write(this.ptr);
+               long ret = bindings.ChannelCounterparty_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ChannelCounterparty from a byte array, created by ChannelCounterparty_write
         */
        public static Result_ChannelCounterpartyDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ChannelCounterparty_read(ser);
+               long ret = bindings.ChannelCounterparty_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ChannelCounterpartyDecodeErrorZ ret_hu_conv = Result_ChannelCounterpartyDecodeErrorZ.constr_from_ptr(ret);
index 3dcf3f4a1f741ea87f19b871beeff1e212073a19..0b0d2d1d6d7622913dfe07e288f05634d1ec8af8 100644 (file)
@@ -37,16 +37,18 @@ public class ChannelDerivationParameters : CommonBase {
         * The unique identifier to re-derive the signer for the associated channel.
         */
        public byte[] get_keys_id() {
-               byte[] ret = bindings.ChannelDerivationParameters_get_keys_id(this.ptr);
+               long ret = bindings.ChannelDerivationParameters_get_keys_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The unique identifier to re-derive the signer for the associated channel.
         */
        public void set_keys_id(byte[] val) {
-               bindings.ChannelDerivationParameters_set_keys_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.ChannelDerivationParameters_set_keys_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -54,8 +56,6 @@ public class ChannelDerivationParameters : CommonBase {
        /**
         * The necessary channel parameters that need to be provided to the re-derived signer through
         * [`ChannelSigner::provide_channel_parameters`].
-        * 
-        * [`ChannelSigner::provide_channel_parameters`]: crate::sign::ChannelSigner::provide_channel_parameters
         */
        public ChannelTransactionParameters get_transaction_parameters() {
                long ret = bindings.ChannelDerivationParameters_get_transaction_parameters(this.ptr);
@@ -69,8 +69,6 @@ public class ChannelDerivationParameters : CommonBase {
        /**
         * The necessary channel parameters that need to be provided to the re-derived signer through
         * [`ChannelSigner::provide_channel_parameters`].
-        * 
-        * [`ChannelSigner::provide_channel_parameters`]: crate::sign::ChannelSigner::provide_channel_parameters
         */
        public void set_transaction_parameters(org.ldk.structs.ChannelTransactionParameters val) {
                bindings.ChannelDerivationParameters_set_transaction_parameters(this.ptr, val == null ? 0 : val.ptr);
@@ -83,7 +81,7 @@ public class ChannelDerivationParameters : CommonBase {
         * Constructs a new ChannelDerivationParameters given each field
         */
        public static ChannelDerivationParameters of(long value_satoshis_arg, byte[] keys_id_arg, org.ldk.structs.ChannelTransactionParameters transaction_parameters_arg) {
-               long ret = bindings.ChannelDerivationParameters_new(value_satoshis_arg, InternalUtils.check_arr_len(keys_id_arg, 32), transaction_parameters_arg == null ? 0 : transaction_parameters_arg.ptr);
+               long ret = bindings.ChannelDerivationParameters_new(value_satoshis_arg, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(keys_id_arg, 32)), transaction_parameters_arg == null ? 0 : transaction_parameters_arg.ptr);
                GC.KeepAlive(value_satoshis_arg);
                GC.KeepAlive(keys_id_arg);
                GC.KeepAlive(transaction_parameters_arg);
@@ -129,5 +127,27 @@ public class ChannelDerivationParameters : CommonBase {
                if (!(o is ChannelDerivationParameters)) return false;
                return this.eq((ChannelDerivationParameters)o);
        }
+       /**
+        * Serialize the ChannelDerivationParameters object into a byte array which can be read by ChannelDerivationParameters_read
+        */
+       public byte[] write() {
+               long ret = bindings.ChannelDerivationParameters_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a ChannelDerivationParameters from a byte array, created by ChannelDerivationParameters_write
+        */
+       public static Result_ChannelDerivationParametersDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.ChannelDerivationParameters_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ChannelDerivationParametersDecodeErrorZ ret_hu_conv = Result_ChannelDerivationParametersDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
 }
 } } }
index b806226b8a4fff17e599da3d8f7e59310e452ceb..dfaa9e4d36239fd006b8194b2c5acd22904ab036 100644 (file)
@@ -22,9 +22,11 @@ public class ChannelDetails : CommonBase {
         * lifetime of the channel.
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.ChannelDetails_get_channel_id(this.ptr);
+               long ret = bindings.ChannelDetails_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -34,7 +36,7 @@ public class ChannelDetails : CommonBase {
         * lifetime of the channel.
         */
        public void set_channel_id(byte[] val) {
-               bindings.ChannelDetails_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.ChannelDetails_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -306,24 +308,37 @@ public class ChannelDetails : CommonBase {
        }
 
        /**
-        * The `user_channel_id` passed in to create_channel, or a random value if the channel was
-        * inbound. This may be zero for inbound channels serialized with LDK versions prior to
-        * 0.0.113.
+        * The `user_channel_id` value passed in to [`ChannelManager::create_channel`] for outbound
+        * channels, or to [`ChannelManager::accept_inbound_channel`] for inbound channels if
+        * [`UserConfig::manually_accept_inbound_channels`] config flag is set to true. Otherwise
+        * `user_channel_id` will be randomized for an inbound channel.  This may be zero for objects
+        * serialized with LDK versions prior to 0.0.113.
+        * 
+        * [`ChannelManager::create_channel`]: crate::ln::channelmanager::ChannelManager::create_channel
+        * [`ChannelManager::accept_inbound_channel`]: crate::ln::channelmanager::ChannelManager::accept_inbound_channel
+        * [`UserConfig::manually_accept_inbound_channels`]: crate::util::config::UserConfig::manually_accept_inbound_channels
         */
        public UInt128 get_user_channel_id() {
-               byte[] ret = bindings.ChannelDetails_get_user_channel_id(this.ptr);
+               long ret = bindings.ChannelDetails_get_user_channel_id(this.ptr);
                GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.util.UInt128 ret_conv = new org.ldk.util.UInt128(ret);
                return ret_conv;
        }
 
        /**
-        * The `user_channel_id` passed in to create_channel, or a random value if the channel was
-        * inbound. This may be zero for inbound channels serialized with LDK versions prior to
-        * 0.0.113.
+        * The `user_channel_id` value passed in to [`ChannelManager::create_channel`] for outbound
+        * channels, or to [`ChannelManager::accept_inbound_channel`] for inbound channels if
+        * [`UserConfig::manually_accept_inbound_channels`] config flag is set to true. Otherwise
+        * `user_channel_id` will be randomized for an inbound channel.  This may be zero for objects
+        * serialized with LDK versions prior to 0.0.113.
+        * 
+        * [`ChannelManager::create_channel`]: crate::ln::channelmanager::ChannelManager::create_channel
+        * [`ChannelManager::accept_inbound_channel`]: crate::ln::channelmanager::ChannelManager::accept_inbound_channel
+        * [`UserConfig::manually_accept_inbound_channels`]: crate::util::config::UserConfig::manually_accept_inbound_channels
         */
        public void set_user_channel_id(org.ldk.util.UInt128 val) {
-               bindings.ChannelDetails_set_user_channel_id(this.ptr, val.getLEBytes());
+               bindings.ChannelDetails_set_user_channel_id(this.ptr, InternalUtils.encodeUint8Array(val.getLEBytes()));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -812,9 +827,13 @@ public class ChannelDetails : CommonBase {
 
        /**
         * Constructs a new ChannelDetails given each field
+        * 
+        * Note that funding_txo_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
+        * Note that channel_type_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
+        * Note that config_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public static ChannelDetails of(byte[] channel_id_arg, org.ldk.structs.ChannelCounterparty counterparty_arg, org.ldk.structs.OutPoint funding_txo_arg, org.ldk.structs.ChannelTypeFeatures channel_type_arg, org.ldk.structs.Option_u64Z short_channel_id_arg, org.ldk.structs.Option_u64Z outbound_scid_alias_arg, org.ldk.structs.Option_u64Z inbound_scid_alias_arg, long channel_value_satoshis_arg, org.ldk.structs.Option_u64Z unspendable_punishment_reserve_arg, org.ldk.util.UInt128 user_channel_id_arg, org.ldk.structs.Option_u32Z feerate_sat_per_1000_weight_arg, long balance_msat_arg, long outbound_capacity_msat_arg, long next_outbound_htlc_limit_msat_arg, long next_outbound_htlc_minimum_msat_arg, long inbound_capacity_msat_arg, org.ldk.structs.Option_u32Z confirmations_required_arg, org.ldk.structs.Option_u32Z confirmations_arg, org.ldk.structs.Option_u16Z force_close_spend_delay_arg, bool is_outbound_arg, bool is_channel_ready_arg, org.ldk.structs.Option_ChannelShutdownStateZ channel_shutdown_state_arg, bool is_usable_arg, bool is_public_arg, org.ldk.structs.Option_u64Z inbound_htlc_minimum_msat_arg, org.ldk.structs.Option_u64Z inbound_htlc_maximum_msat_arg, org.ldk.structs.ChannelConfig config_arg) {
-               long ret = bindings.ChannelDetails_new(InternalUtils.check_arr_len(channel_id_arg, 32), counterparty_arg == null ? 0 : counterparty_arg.ptr, funding_txo_arg == null ? 0 : funding_txo_arg.ptr, channel_type_arg == null ? 0 : channel_type_arg.ptr, short_channel_id_arg.ptr, outbound_scid_alias_arg.ptr, inbound_scid_alias_arg.ptr, channel_value_satoshis_arg, unspendable_punishment_reserve_arg.ptr, user_channel_id_arg.getLEBytes(), feerate_sat_per_1000_weight_arg.ptr, balance_msat_arg, outbound_capacity_msat_arg, next_outbound_htlc_limit_msat_arg, next_outbound_htlc_minimum_msat_arg, inbound_capacity_msat_arg, confirmations_required_arg.ptr, confirmations_arg.ptr, force_close_spend_delay_arg.ptr, is_outbound_arg, is_channel_ready_arg, channel_shutdown_state_arg.ptr, is_usable_arg, is_public_arg, inbound_htlc_minimum_msat_arg.ptr, inbound_htlc_maximum_msat_arg.ptr, config_arg == null ? 0 : config_arg.ptr);
+               long ret = bindings.ChannelDetails_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), counterparty_arg == null ? 0 : counterparty_arg.ptr, funding_txo_arg == null ? 0 : funding_txo_arg.ptr, channel_type_arg == null ? 0 : channel_type_arg.ptr, short_channel_id_arg.ptr, outbound_scid_alias_arg.ptr, inbound_scid_alias_arg.ptr, channel_value_satoshis_arg, unspendable_punishment_reserve_arg.ptr, InternalUtils.encodeUint8Array(user_channel_id_arg.getLEBytes()), feerate_sat_per_1000_weight_arg.ptr, balance_msat_arg, outbound_capacity_msat_arg, next_outbound_htlc_limit_msat_arg, next_outbound_htlc_minimum_msat_arg, inbound_capacity_msat_arg, confirmations_required_arg.ptr, confirmations_arg.ptr, force_close_spend_delay_arg.ptr, is_outbound_arg, is_channel_ready_arg, channel_shutdown_state_arg.ptr, is_usable_arg, is_public_arg, inbound_htlc_minimum_msat_arg.ptr, inbound_htlc_maximum_msat_arg.ptr, config_arg == null ? 0 : config_arg.ptr);
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(counterparty_arg);
                GC.KeepAlive(funding_txo_arg);
@@ -919,16 +938,18 @@ public class ChannelDetails : CommonBase {
         * Serialize the ChannelDetails object into a byte array which can be read by ChannelDetails_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ChannelDetails_write(this.ptr);
+               long ret = bindings.ChannelDetails_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ChannelDetails from a byte array, created by ChannelDetails_write
         */
        public static Result_ChannelDetailsDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ChannelDetails_read(ser);
+               long ret = bindings.ChannelDetails_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ChannelDetailsDecodeErrorZ ret_hu_conv = Result_ChannelDetailsDecodeErrorZ.constr_from_ptr(ret);
index 097e54c9a195c436861bac550bb0b1f25651550d..f598bab76d9398edd6842f3b26d12f995874465d 100644 (file)
@@ -82,6 +82,42 @@ public class ChannelFeatures : CommonBase {
                return ret;
        }
 
+       /**
+        * Sets a required feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Required bits are even. If an odd bit is given, then the corresponding even bit will
+        * be set instead (i.e., `bit - 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_required_feature_bit(long bit) {
+               long ret = bindings.ChannelFeatures_set_required_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Sets an optional feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Optional bits are odd. If an even bit is given, then the corresponding odd bit will be
+        * set instead (i.e., `bit + 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_optional_feature_bit(long bit) {
+               long ret = bindings.ChannelFeatures_set_optional_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
        /**
         * Sets a required custom feature bit. Errors if `bit` is outside the custom range as defined
         * by [bLIP 2] or if it is a known `T` feature.
@@ -122,16 +158,18 @@ public class ChannelFeatures : CommonBase {
         * Serialize the ChannelFeatures object into a byte array which can be read by ChannelFeatures_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ChannelFeatures_write(this.ptr);
+               long ret = bindings.ChannelFeatures_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ChannelFeatures from a byte array, created by ChannelFeatures_write
         */
        public static Result_ChannelFeaturesDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ChannelFeatures_read(ser);
+               long ret = bindings.ChannelFeatures_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ChannelFeaturesDecodeErrorZ ret_hu_conv = Result_ChannelFeaturesDecodeErrorZ.constr_from_ptr(ret);
index 9e841cc2ce0f8c3fc190bb4552a67e080003fb18..8a0d79a69d3aebca5724e47c0421f3b4e86ce45f 100644 (file)
@@ -242,16 +242,18 @@ public class ChannelInfo : CommonBase {
         * Serialize the ChannelInfo object into a byte array which can be read by ChannelInfo_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ChannelInfo_write(this.ptr);
+               long ret = bindings.ChannelInfo_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ChannelInfo from a byte array, created by ChannelInfo_write
         */
        public static Result_ChannelInfoDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ChannelInfo_read(ser);
+               long ret = bindings.ChannelInfo_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ChannelInfoDecodeErrorZ ret_hu_conv = Result_ChannelInfoDecodeErrorZ.constr_from_ptr(ret);
index 9ec10d69e62a4a79b881df4376ebf6d16ce3d838..b11bebee3fb1014e6736880f93b159e4c8a4fab6 100644 (file)
@@ -19,12 +19,14 @@ namespace org { namespace ldk { namespace structs {
  * called [`funding_transaction_generated`] for outbound channels) being closed.
  * 
  * Note that you can be a bit lazier about writing out `ChannelManager` than you can be with
- * [`ChannelMonitor`]. With [`ChannelMonitor`] you MUST write each monitor update out to disk before
- * returning from [`chain::Watch::watch_channel`]/[`update_channel`], with ChannelManagers, writing updates
- * happens out-of-band (and will prevent any other `ChannelManager` operations from occurring during
- * the serialization process). If the deserialized version is out-of-date compared to the
- * [`ChannelMonitor`] passed by reference to [`read`], those channels will be force-closed based on the
- * `ChannelMonitor` state and no funds will be lost (mod on-chain transaction fees).
+ * [`ChannelMonitor`]. With [`ChannelMonitor`] you MUST durably write each
+ * [`ChannelMonitorUpdate`] before returning from
+ * [`chain::Watch::watch_channel`]/[`update_channel`] or before completing async writes. With
+ * `ChannelManager`s, writing updates happens out-of-band (and will prevent any other
+ * `ChannelManager` operations from occurring during the serialization process). If the
+ * deserialized version is out-of-date compared to the [`ChannelMonitor`] passed by reference to
+ * [`read`], those channels will be force-closed based on the `ChannelMonitor` state and no funds
+ * will be lost (modulo on-chain transaction fees).
  * 
  * Note that the deserializer is only implemented for `(`[`BlockHash`]`, `[`ChannelManager`]`)`, which
  * tells you the last block hash which was connected. You should get the best block tip before using the manager.
@@ -159,8 +161,8 @@ public class ChannelManager : CommonBase {
         * 
         * Note that override_config (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
-       public Result__u832APIErrorZ 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.check_arr_len(their_network_key, 33), channel_value_satoshis, push_msat, 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.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);
                GC.KeepAlive(this);
                GC.KeepAlive(their_network_key);
                GC.KeepAlive(channel_value_satoshis);
@@ -168,7 +170,7 @@ public class ChannelManager : CommonBase {
                GC.KeepAlive(user_channel_id);
                GC.KeepAlive(override_config);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result__u832APIErrorZ ret_hu_conv = Result__u832APIErrorZ.constr_from_ptr(ret);
+               Result_ThirtyTwoBytesAPIErrorZ ret_hu_conv = Result_ThirtyTwoBytesAPIErrorZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(override_config); };
                return ret_hu_conv;
        }
@@ -178,16 +180,18 @@ public class ChannelManager : CommonBase {
         * more information.
         */
        public ChannelDetails[] list_channels() {
-               long[] ret = bindings.ChannelManager_list_channels(this.ptr);
+               long ret = bindings.ChannelManager_list_channels(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_16_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_16_len = InternalUtils.getArrayLength(ret);
                ChannelDetails[] ret_conv_16_arr = new ChannelDetails[ret_conv_16_len];
                for (int q = 0; q < ret_conv_16_len; q++) {
-                       long ret_conv_16 = ret[q];
+                       long ret_conv_16 = InternalUtils.getU64ArrayElem(ret, q);
                        org.ldk.structs.ChannelDetails ret_conv_16_hu_conv = null; if (ret_conv_16 < 0 || ret_conv_16 > 4096) { ret_conv_16_hu_conv = new org.ldk.structs.ChannelDetails(null, ret_conv_16); }
                        if (ret_conv_16_hu_conv != null) { ret_conv_16_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_16_arr[q] = ret_conv_16_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_16_arr;
        }
 
@@ -200,16 +204,18 @@ public class ChannelManager : CommonBase {
         * are.
         */
        public ChannelDetails[] list_usable_channels() {
-               long[] ret = bindings.ChannelManager_list_usable_channels(this.ptr);
+               long ret = bindings.ChannelManager_list_usable_channels(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_16_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_16_len = InternalUtils.getArrayLength(ret);
                ChannelDetails[] ret_conv_16_arr = new ChannelDetails[ret_conv_16_len];
                for (int q = 0; q < ret_conv_16_len; q++) {
-                       long ret_conv_16 = ret[q];
+                       long ret_conv_16 = InternalUtils.getU64ArrayElem(ret, q);
                        org.ldk.structs.ChannelDetails ret_conv_16_hu_conv = null; if (ret_conv_16 < 0 || ret_conv_16 > 4096) { ret_conv_16_hu_conv = new org.ldk.structs.ChannelDetails(null, ret_conv_16); }
                        if (ret_conv_16_hu_conv != null) { ret_conv_16_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_16_arr[q] = ret_conv_16_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_16_arr;
        }
 
@@ -217,17 +223,19 @@ public class ChannelManager : CommonBase {
         * Gets the list of channels we have with a given counterparty, in random order.
         */
        public ChannelDetails[] list_channels_with_counterparty(byte[] counterparty_node_id) {
-               long[] ret = bindings.ChannelManager_list_channels_with_counterparty(this.ptr, InternalUtils.check_arr_len(counterparty_node_id, 33));
+               long ret = bindings.ChannelManager_list_channels_with_counterparty(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_node_id, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(counterparty_node_id);
-               int ret_conv_16_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_16_len = InternalUtils.getArrayLength(ret);
                ChannelDetails[] ret_conv_16_arr = new ChannelDetails[ret_conv_16_len];
                for (int q = 0; q < ret_conv_16_len; q++) {
-                       long ret_conv_16 = ret[q];
+                       long ret_conv_16 = InternalUtils.getU64ArrayElem(ret, q);
                        org.ldk.structs.ChannelDetails ret_conv_16_hu_conv = null; if (ret_conv_16 < 0 || ret_conv_16 > 4096) { ret_conv_16_hu_conv = new org.ldk.structs.ChannelDetails(null, ret_conv_16); }
                        if (ret_conv_16_hu_conv != null) { ret_conv_16_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_16_arr[q] = ret_conv_16_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_16_arr;
        }
 
@@ -242,16 +250,18 @@ public class ChannelManager : CommonBase {
         * [`Event::PaymentSent`]: events::Event::PaymentSent
         */
        public RecentPaymentDetails[] list_recent_payments() {
-               long[] ret = bindings.ChannelManager_list_recent_payments(this.ptr);
+               long ret = bindings.ChannelManager_list_recent_payments(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_22_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_22_len = InternalUtils.getArrayLength(ret);
                RecentPaymentDetails[] ret_conv_22_arr = new RecentPaymentDetails[ret_conv_22_len];
                for (int w = 0; w < ret_conv_22_len; w++) {
-                       long ret_conv_22 = ret[w];
+                       long ret_conv_22 = InternalUtils.getU64ArrayElem(ret, w);
                        org.ldk.structs.RecentPaymentDetails ret_conv_22_hu_conv = org.ldk.structs.RecentPaymentDetails.constr_from_ptr(ret_conv_22);
                        if (ret_conv_22_hu_conv != null) { ret_conv_22_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_22_arr[w] = ret_conv_22_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_22_arr;
        }
 
@@ -260,11 +270,11 @@ public class ChannelManager : CommonBase {
         * will be accepted on the given channel, and after additional timeout/the closing of all
         * pending HTLCs, the channel will be closed on chain.
         * 
-        * If we are the channel initiator, we will pay between our [`Background`] and
-        * [`ChannelConfig::force_close_avoidance_max_fee_satoshis`] plus our [`Normal`] fee
-        * estimate.
+        * If we are the channel initiator, we will pay between our [`ChannelCloseMinimum`] and
+        * [`ChannelConfig::force_close_avoidance_max_fee_satoshis`] plus our [`NonAnchorChannelFee`]
+        * fee estimate.
         * If our counterparty is the channel initiator, we will require a channel closing
-        * transaction feerate of at least our [`Background`] feerate or the feerate which
+        * transaction feerate of at least our [`ChannelCloseMinimum`] feerate or the feerate which
         * would appear on a force-closure transaction, whichever is lower. We will allow our
         * counterparty to pay as much fee as they'd like, however.
         * 
@@ -276,12 +286,12 @@ public class ChannelManager : CommonBase {
         * channel.
         * 
         * [`ChannelConfig::force_close_avoidance_max_fee_satoshis`]: crate::util::config::ChannelConfig::force_close_avoidance_max_fee_satoshis
-        * [`Background`]: crate::chain::chaininterface::ConfirmationTarget::Background
-        * [`Normal`]: crate::chain::chaininterface::ConfirmationTarget::Normal
+        * [`ChannelCloseMinimum`]: crate::chain::chaininterface::ConfirmationTarget::ChannelCloseMinimum
+        * [`NonAnchorChannelFee`]: crate::chain::chaininterface::ConfirmationTarget::NonAnchorChannelFee
         * [`SendShutdown`]: crate::events::MessageSendEvent::SendShutdown
         */
        public Result_NoneAPIErrorZ close_channel(byte[] channel_id, byte[] counterparty_node_id) {
-               long ret = bindings.ChannelManager_close_channel(this.ptr, InternalUtils.check_arr_len(channel_id, 32), InternalUtils.check_arr_len(counterparty_node_id, 33));
+               long ret = bindings.ChannelManager_close_channel(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_node_id, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(channel_id);
                GC.KeepAlive(counterparty_node_id);
@@ -299,8 +309,8 @@ public class ChannelManager : CommonBase {
         * the channel being closed or not:
         * If we are the channel initiator, we will pay at least this feerate on the closing
         * transaction. The upper-bound is set by
-        * [`ChannelConfig::force_close_avoidance_max_fee_satoshis`] plus our [`Normal`] fee
-        * estimate (or `target_feerate_sat_per_1000_weight`, if it is greater).
+        * [`ChannelConfig::force_close_avoidance_max_fee_satoshis`] plus our [`NonAnchorChannelFee`]
+        * fee estimate (or `target_feerate_sat_per_1000_weight`, if it is greater).
         * If our counterparty is the channel initiator, we will refuse to accept a channel closure
         * transaction feerate below `target_feerate_sat_per_1000_weight` (or the feerate which
         * will appear on a force-closure transaction, whichever is lower).
@@ -318,14 +328,13 @@ public class ChannelManager : CommonBase {
         * channel.
         * 
         * [`ChannelConfig::force_close_avoidance_max_fee_satoshis`]: crate::util::config::ChannelConfig::force_close_avoidance_max_fee_satoshis
-        * [`Background`]: crate::chain::chaininterface::ConfirmationTarget::Background
-        * [`Normal`]: crate::chain::chaininterface::ConfirmationTarget::Normal
+        * [`NonAnchorChannelFee`]: crate::chain::chaininterface::ConfirmationTarget::NonAnchorChannelFee
         * [`SendShutdown`]: crate::events::MessageSendEvent::SendShutdown
         * 
         * Note that shutdown_script (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public Result_NoneAPIErrorZ close_channel_with_feerate_and_script(byte[] channel_id, byte[] counterparty_node_id, org.ldk.structs.Option_u32Z target_feerate_sats_per_1000_weight, org.ldk.structs.ShutdownScript shutdown_script) {
-               long ret = bindings.ChannelManager_close_channel_with_feerate_and_script(this.ptr, InternalUtils.check_arr_len(channel_id, 32), InternalUtils.check_arr_len(counterparty_node_id, 33), target_feerate_sats_per_1000_weight.ptr, shutdown_script == null ? 0 : shutdown_script.ptr);
+               long ret = bindings.ChannelManager_close_channel_with_feerate_and_script(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_node_id, 33)), target_feerate_sats_per_1000_weight.ptr, shutdown_script == null ? 0 : shutdown_script.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(channel_id);
                GC.KeepAlive(counterparty_node_id);
@@ -345,7 +354,7 @@ public class ChannelManager : CommonBase {
         * channel.
         */
        public Result_NoneAPIErrorZ force_close_broadcasting_latest_txn(byte[] channel_id, byte[] counterparty_node_id) {
-               long ret = bindings.ChannelManager_force_close_broadcasting_latest_txn(this.ptr, InternalUtils.check_arr_len(channel_id, 32), InternalUtils.check_arr_len(counterparty_node_id, 33));
+               long ret = bindings.ChannelManager_force_close_broadcasting_latest_txn(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_node_id, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(channel_id);
                GC.KeepAlive(counterparty_node_id);
@@ -363,7 +372,7 @@ public class ChannelManager : CommonBase {
         * [`ChannelMonitor::get_latest_holder_commitment_txn`].
         */
        public Result_NoneAPIErrorZ force_close_without_broadcasting_txn(byte[] channel_id, byte[] counterparty_node_id) {
-               long ret = bindings.ChannelManager_force_close_without_broadcasting_txn(this.ptr, InternalUtils.check_arr_len(channel_id, 32), InternalUtils.check_arr_len(counterparty_node_id, 33));
+               long ret = bindings.ChannelManager_force_close_without_broadcasting_txn(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_node_id, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(channel_id);
                GC.KeepAlive(counterparty_node_id);
@@ -427,9 +436,8 @@ public class ChannelManager : CommonBase {
         * In general, a path may raise:
         * [`APIError::InvalidRoute`] when an invalid route or forwarding parameter (cltv_delta, fee,
         * node public key) is specified.
-        * [`APIError::ChannelUnavailable`] if the next-hop channel is not available for updates
-        * (including due to previous monitor update failure or new permanent monitor update
-        * failure).
+        * [`APIError::ChannelUnavailable`] if the next-hop channel is not available as it has been
+        * closed, doesn't exist, or the peer is currently disconnected.
         * [`APIError::MonitorUpdateInProgress`] if a new monitor update failure prevented sending the
         * relevant updates.
         * 
@@ -445,7 +453,7 @@ public class ChannelManager : CommonBase {
         * [`ChannelMonitorUpdateStatus::InProgress`]: crate::chain::ChannelMonitorUpdateStatus::InProgress
         */
        public Result_NonePaymentSendFailureZ send_payment_with_route(org.ldk.structs.Route route, byte[] payment_hash, org.ldk.structs.RecipientOnionFields recipient_onion, byte[] payment_id) {
-               long ret = bindings.ChannelManager_send_payment_with_route(this.ptr, route == null ? 0 : route.ptr, InternalUtils.check_arr_len(payment_hash, 32), recipient_onion == null ? 0 : recipient_onion.ptr, InternalUtils.check_arr_len(payment_id, 32));
+               long ret = bindings.ChannelManager_send_payment_with_route(this.ptr, route == null ? 0 : route.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), recipient_onion == null ? 0 : recipient_onion.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(route);
                GC.KeepAlive(payment_hash);
@@ -463,7 +471,7 @@ public class ChannelManager : CommonBase {
         * `route_params` and retry failed payment paths based on `retry_strategy`.
         */
        public Result_NoneRetryableSendFailureZ send_payment(byte[] payment_hash, org.ldk.structs.RecipientOnionFields recipient_onion, byte[] payment_id, org.ldk.structs.RouteParameters route_params, org.ldk.structs.Retry retry_strategy) {
-               long ret = bindings.ChannelManager_send_payment(this.ptr, InternalUtils.check_arr_len(payment_hash, 32), recipient_onion == null ? 0 : recipient_onion.ptr, InternalUtils.check_arr_len(payment_id, 32), route_params == null ? 0 : route_params.ptr, retry_strategy.ptr);
+               long ret = bindings.ChannelManager_send_payment(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), recipient_onion == null ? 0 : recipient_onion.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)), route_params == null ? 0 : route_params.ptr, retry_strategy.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(payment_hash);
                GC.KeepAlive(recipient_onion);
@@ -479,10 +487,12 @@ public class ChannelManager : CommonBase {
        }
 
        /**
-        * Signals that no further retries for the given payment should occur. Useful if you have a
+        * Signals that no further attempts for the given payment should occur. Useful if you have a
         * pending outbound payment with retries remaining, but wish to stop retrying the payment before
         * retries are exhausted.
         * 
+        * # Event Generation
+        * 
         * If no [`Event::PaymentFailed`] event had been generated before, one will be generated as soon
         * as there are no remaining pending HTLCs for this payment.
         * 
@@ -490,14 +500,23 @@ public class ChannelManager : CommonBase {
         * wait until you receive either a [`Event::PaymentFailed`] or [`Event::PaymentSent`] event to
         * determine the ultimate status of a payment.
         * 
-        * If an [`Event::PaymentFailed`] event is generated and we restart without this
-        * [`ChannelManager`] having been persisted, another [`Event::PaymentFailed`] may be generated.
+        * # Requested Invoices
         * 
-        * [`Event::PaymentFailed`]: events::Event::PaymentFailed
-        * [`Event::PaymentSent`]: events::Event::PaymentSent
+        * In the case of paying a [`Bolt12Invoice`] via [`ChannelManager::pay_for_offer`], abandoning
+        * the payment prior to receiving the invoice will result in an [`Event::InvoiceRequestFailed`]
+        * and prevent any attempts at paying it once received. The other events may only be generated
+        * once the invoice has been received.
+        * 
+        * # Restart Behavior
+        * 
+        * If an [`Event::PaymentFailed`] is generated and we restart without first persisting the
+        * [`ChannelManager`], another [`Event::PaymentFailed`] may be generated; likewise for
+        * [`Event::InvoiceRequestFailed`].
+        * 
+        * [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
         */
        public void abandon_payment(byte[] payment_id) {
-               bindings.ChannelManager_abandon_payment(this.ptr, InternalUtils.check_arr_len(payment_id, 32));
+               bindings.ChannelManager_abandon_payment(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(payment_id);
        }
@@ -517,15 +536,15 @@ public class ChannelManager : CommonBase {
         * 
         * [`send_payment`]: Self::send_payment
         */
-       public Result_PaymentHashPaymentSendFailureZ send_spontaneous_payment(org.ldk.structs.Route route, org.ldk.structs.Option_PaymentPreimageZ payment_preimage, org.ldk.structs.RecipientOnionFields recipient_onion, byte[] payment_id) {
-               long ret = bindings.ChannelManager_send_spontaneous_payment(this.ptr, route == null ? 0 : route.ptr, payment_preimage.ptr, recipient_onion == null ? 0 : recipient_onion.ptr, InternalUtils.check_arr_len(payment_id, 32));
+       public Result_ThirtyTwoBytesPaymentSendFailureZ send_spontaneous_payment(org.ldk.structs.Route route, org.ldk.structs.Option_ThirtyTwoBytesZ payment_preimage, org.ldk.structs.RecipientOnionFields recipient_onion, byte[] payment_id) {
+               long ret = bindings.ChannelManager_send_spontaneous_payment(this.ptr, route == null ? 0 : route.ptr, payment_preimage.ptr, recipient_onion == null ? 0 : recipient_onion.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(route);
                GC.KeepAlive(payment_preimage);
                GC.KeepAlive(recipient_onion);
                GC.KeepAlive(payment_id);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentHashPaymentSendFailureZ ret_hu_conv = Result_PaymentHashPaymentSendFailureZ.constr_from_ptr(ret);
+               Result_ThirtyTwoBytesPaymentSendFailureZ ret_hu_conv = Result_ThirtyTwoBytesPaymentSendFailureZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(route); };
                if (this != null) { this.ptrs_to.AddLast(payment_preimage); };
                if (this != null) { this.ptrs_to.AddLast(recipient_onion); };
@@ -541,8 +560,8 @@ public class ChannelManager : CommonBase {
         * 
         * [`PaymentParameters::for_keysend`]: crate::routing::router::PaymentParameters::for_keysend
         */
-       public Result_PaymentHashRetryableSendFailureZ send_spontaneous_payment_with_retry(org.ldk.structs.Option_PaymentPreimageZ payment_preimage, org.ldk.structs.RecipientOnionFields recipient_onion, byte[] payment_id, org.ldk.structs.RouteParameters route_params, org.ldk.structs.Retry retry_strategy) {
-               long ret = bindings.ChannelManager_send_spontaneous_payment_with_retry(this.ptr, payment_preimage.ptr, recipient_onion == null ? 0 : recipient_onion.ptr, InternalUtils.check_arr_len(payment_id, 32), route_params == null ? 0 : route_params.ptr, retry_strategy.ptr);
+       public Result_ThirtyTwoBytesRetryableSendFailureZ send_spontaneous_payment_with_retry(org.ldk.structs.Option_ThirtyTwoBytesZ payment_preimage, org.ldk.structs.RecipientOnionFields recipient_onion, byte[] payment_id, org.ldk.structs.RouteParameters route_params, org.ldk.structs.Retry retry_strategy) {
+               long ret = bindings.ChannelManager_send_spontaneous_payment_with_retry(this.ptr, payment_preimage.ptr, recipient_onion == null ? 0 : recipient_onion.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)), route_params == null ? 0 : route_params.ptr, retry_strategy.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(payment_preimage);
                GC.KeepAlive(recipient_onion);
@@ -550,7 +569,7 @@ public class ChannelManager : CommonBase {
                GC.KeepAlive(route_params);
                GC.KeepAlive(retry_strategy);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentHashRetryableSendFailureZ ret_hu_conv = Result_PaymentHashRetryableSendFailureZ.constr_from_ptr(ret);
+               Result_ThirtyTwoBytesRetryableSendFailureZ ret_hu_conv = Result_ThirtyTwoBytesRetryableSendFailureZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(payment_preimage); };
                if (this != null) { this.ptrs_to.AddLast(recipient_onion); };
                if (this != null) { this.ptrs_to.AddLast(route_params); };
@@ -563,16 +582,63 @@ public class ChannelManager : CommonBase {
         * [`PaymentHash`] of probes based on a static secret and a random [`PaymentId`], which allows
         * us to easily discern them from real payments.
         */
-       public Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ send_probe(org.ldk.structs.Path path) {
+       public Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ send_probe(org.ldk.structs.Path path) {
                long ret = bindings.ChannelManager_send_probe(this.ptr, path == null ? 0 : path.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(path);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ ret_hu_conv = Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ.constr_from_ptr(ret);
+               Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(path); };
                return ret_hu_conv;
        }
 
+       /**
+        * Sends payment probes over all paths of a route that would be used to pay the given
+        * amount to the given `node_id`.
+        * 
+        * See [`ChannelManager::send_preflight_probes`] for more information.
+        */
+       public Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ send_spontaneous_preflight_probes(byte[] node_id, long amount_msat, int final_cltv_expiry_delta, org.ldk.structs.Option_u64Z liquidity_limit_multiplier) {
+               long ret = bindings.ChannelManager_send_spontaneous_preflight_probes(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id, 33)), amount_msat, final_cltv_expiry_delta, liquidity_limit_multiplier.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(node_id);
+               GC.KeepAlive(amount_msat);
+               GC.KeepAlive(final_cltv_expiry_delta);
+               GC.KeepAlive(liquidity_limit_multiplier);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ ret_hu_conv = Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ.constr_from_ptr(ret);
+               if (this != null) { this.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 a route found
+        * according to the given [`RouteParameters`].
+        * 
+        * This may be used to send \"pre-flight\" probes, i.e., to train our scorer before conducting
+        * the actual payment. Note this is only useful if there likely is sufficient time for the
+        * probe to settle before sending out the actual payment, e.g., when waiting for user
+        * confirmation in a wallet UI.
+        * 
+        * Otherwise, there is a chance the probe could take up some liquidity needed to complete the
+        * actual payment. Users should therefore be cautious and might avoid sending probes if
+        * liquidity is scarce and/or they don't expect the probe to return before they send the
+        * payment. To mitigate this issue, channels with available liquidity less than the required
+        * amount times the given `liquidity_limit_multiplier` won't be used to send pre-flight
+        * probes. If `None` is given as `liquidity_limit_multiplier`, it defaults to `3`.
+        */
+       public Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ send_preflight_probes(org.ldk.structs.RouteParameters route_params, org.ldk.structs.Option_u64Z liquidity_limit_multiplier) {
+               long ret = bindings.ChannelManager_send_preflight_probes(this.ptr, route_params == null ? 0 : route_params.ptr, liquidity_limit_multiplier.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(route_params);
+               GC.KeepAlive(liquidity_limit_multiplier);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ ret_hu_conv = Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ.constr_from_ptr(ret);
+               if (this != null) { this.ptrs_to.AddLast(route_params); };
+               if (this != null) { this.ptrs_to.AddLast(liquidity_limit_multiplier); };
+               return ret_hu_conv;
+       }
+
        /**
         * Call this upon creation of a funding transaction for the given channel.
         * 
@@ -606,7 +672,7 @@ public class ChannelManager : CommonBase {
         * [`Event::ChannelClosed`]: crate::events::Event::ChannelClosed
         */
        public Result_NoneAPIErrorZ funding_transaction_generated(byte[] temporary_channel_id, byte[] counterparty_node_id, byte[] funding_transaction) {
-               long ret = bindings.ChannelManager_funding_transaction_generated(this.ptr, InternalUtils.check_arr_len(temporary_channel_id, 32), InternalUtils.check_arr_len(counterparty_node_id, 33), funding_transaction);
+               long ret = bindings.ChannelManager_funding_transaction_generated(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(temporary_channel_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_node_id, 33)), InternalUtils.encodeUint8Array(funding_transaction));
                GC.KeepAlive(this);
                GC.KeepAlive(temporary_channel_id);
                GC.KeepAlive(counterparty_node_id);
@@ -616,6 +682,28 @@ public class ChannelManager : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Call this upon creation of a batch funding transaction for the given channels.
+        * 
+        * 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
+        * will only be broadcast when we have safely received and persisted the counterparty's
+        * signature for each channel.
+        * 
+        * If there is an error, all channels in the batch are to be considered closed.
+        */
+       public Result_NoneAPIErrorZ batch_funding_transaction_generated(TwoTuple_ThirtyTwoBytesPublicKeyZ[] temporary_channels, byte[] funding_transaction) {
+               long ret = bindings.ChannelManager_batch_funding_transaction_generated(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(temporary_channels, temporary_channels_conv_35 => temporary_channels_conv_35 != null ? temporary_channels_conv_35.ptr : 0)), InternalUtils.encodeUint8Array(funding_transaction));
+               GC.KeepAlive(this);
+               GC.KeepAlive(temporary_channels);
+               GC.KeepAlive(funding_transaction);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneAPIErrorZ ret_hu_conv = Result_NoneAPIErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
        /**
         * Atomically applies partial updates to the [`ChannelConfig`] of the given channels.
         * 
@@ -641,7 +729,7 @@ public class ChannelManager : CommonBase {
         * [`APIMisuseError`]: APIError::APIMisuseError
         */
        public Result_NoneAPIErrorZ update_partial_channel_config(byte[] counterparty_node_id, byte[][] channel_ids, org.ldk.structs.ChannelConfigUpdate config_update) {
-               long ret = bindings.ChannelManager_update_partial_channel_config(this.ptr, InternalUtils.check_arr_len(counterparty_node_id, 33), channel_ids != null ? InternalUtils.mapArray(channel_ids, channel_ids_conv_8 => InternalUtils.check_arr_len(channel_ids_conv_8, 32)) : null, config_update == null ? 0 : config_update.ptr);
+               long ret = bindings.ChannelManager_update_partial_channel_config(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_node_id, 33)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(channel_ids, channel_ids_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_ids_conv_8, 32)))), config_update == null ? 0 : config_update.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(counterparty_node_id);
                GC.KeepAlive(channel_ids);
@@ -677,7 +765,7 @@ public class ChannelManager : CommonBase {
         * [`APIMisuseError`]: APIError::APIMisuseError
         */
        public Result_NoneAPIErrorZ update_channel_config(byte[] counterparty_node_id, byte[][] channel_ids, org.ldk.structs.ChannelConfig config) {
-               long ret = bindings.ChannelManager_update_channel_config(this.ptr, InternalUtils.check_arr_len(counterparty_node_id, 33), channel_ids != null ? InternalUtils.mapArray(channel_ids, channel_ids_conv_8 => InternalUtils.check_arr_len(channel_ids_conv_8, 32)) : null, config == null ? 0 : config.ptr);
+               long ret = bindings.ChannelManager_update_channel_config(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_node_id, 33)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(channel_ids, channel_ids_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_ids_conv_8, 32)))), config == null ? 0 : config.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(counterparty_node_id);
                GC.KeepAlive(channel_ids);
@@ -714,7 +802,7 @@ public class ChannelManager : CommonBase {
         * [`HTLCIntercepted::expected_outbound_amount_msat`]: events::Event::HTLCIntercepted::expected_outbound_amount_msat
         */
        public Result_NoneAPIErrorZ forward_intercepted_htlc(byte[] intercept_id, byte[] next_hop_channel_id, byte[] next_node_id, long amt_to_forward_msat) {
-               long ret = bindings.ChannelManager_forward_intercepted_htlc(this.ptr, InternalUtils.check_arr_len(intercept_id, 32), InternalUtils.check_arr_len(next_hop_channel_id, 32), InternalUtils.check_arr_len(next_node_id, 33), amt_to_forward_msat);
+               long ret = bindings.ChannelManager_forward_intercepted_htlc(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(intercept_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(next_hop_channel_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(next_node_id, 33)), amt_to_forward_msat);
                GC.KeepAlive(this);
                GC.KeepAlive(intercept_id);
                GC.KeepAlive(next_hop_channel_id);
@@ -735,7 +823,7 @@ public class ChannelManager : CommonBase {
         * [`HTLCIntercepted`]: events::Event::HTLCIntercepted
         */
        public Result_NoneAPIErrorZ fail_intercepted_htlc(byte[] intercept_id) {
-               long ret = bindings.ChannelManager_fail_intercepted_htlc(this.ptr, InternalUtils.check_arr_len(intercept_id, 32));
+               long ret = bindings.ChannelManager_fail_intercepted_htlc(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(intercept_id, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(intercept_id);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -766,6 +854,10 @@ public class ChannelManager : CommonBase {
         * with the current [`ChannelConfig`].
         * Removing peers which have disconnected but and no longer have any channels.
         * Force-closing and removing channels which have not completed establishment in a timely manner.
+        * Forgetting about stale outbound payments, either those that have already been fulfilled
+        * or those awaiting an invoice that hasn't been delivered in the necessary amount of time.
+        * The latter is determined using the system clock in `std` and the highest seen block time
+        * minus two hours in `no-std`.
         * 
         * Note that this may cause reentrancy through [`chain::Watch::update_channel`] calls or feerate
         * estimate fetches.
@@ -794,7 +886,7 @@ public class ChannelManager : CommonBase {
         * startup during which time claims that were in-progress at shutdown may be replayed.
         */
        public void fail_htlc_backwards(byte[] payment_hash) {
-               bindings.ChannelManager_fail_htlc_backwards(this.ptr, InternalUtils.check_arr_len(payment_hash, 32));
+               bindings.ChannelManager_fail_htlc_backwards(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(payment_hash);
        }
@@ -805,11 +897,12 @@ public class ChannelManager : CommonBase {
         * 
         * See [`FailureCode`] for valid failure codes.
         */
-       public void fail_htlc_backwards_with_reason(byte[] payment_hash, FailureCode failure_code) {
-               bindings.ChannelManager_fail_htlc_backwards_with_reason(this.ptr, InternalUtils.check_arr_len(payment_hash, 32), failure_code);
+       public void fail_htlc_backwards_with_reason(byte[] payment_hash, org.ldk.structs.FailureCode failure_code) {
+               bindings.ChannelManager_fail_htlc_backwards_with_reason(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), failure_code.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(payment_hash);
                GC.KeepAlive(failure_code);
+               if (this != null) { this.ptrs_to.AddLast(failure_code); };
        }
 
        /**
@@ -826,15 +919,37 @@ public class ChannelManager : CommonBase {
         * event matches your expectation. If you fail to do so and call this method, you may provide
         * the sender \"proof-of-payment\" when they did not fulfill the full expected payment.
         * 
+        * This function will fail the payment if it has custom TLVs with even type numbers, as we
+        * will assume they are unknown. If you intend to accept even custom TLVs, you should use
+        * [`claim_funds_with_known_custom_tlvs`].
+        * 
         * [`Event::PaymentClaimable`]: crate::events::Event::PaymentClaimable
         * [`Event::PaymentClaimable::claim_deadline`]: crate::events::Event::PaymentClaimable::claim_deadline
         * [`Event::PaymentClaimed`]: crate::events::Event::PaymentClaimed
         * [`process_pending_events`]: EventsProvider::process_pending_events
         * [`create_inbound_payment`]: Self::create_inbound_payment
         * [`create_inbound_payment_for_hash`]: Self::create_inbound_payment_for_hash
+        * [`claim_funds_with_known_custom_tlvs`]: Self::claim_funds_with_known_custom_tlvs
         */
        public void claim_funds(byte[] payment_preimage) {
-               bindings.ChannelManager_claim_funds(this.ptr, InternalUtils.check_arr_len(payment_preimage, 32));
+               bindings.ChannelManager_claim_funds(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_preimage, 32)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(payment_preimage);
+       }
+
+       /**
+        * This is a variant of [`claim_funds`] that allows accepting a payment with custom TLVs with
+        * even type numbers.
+        * 
+        * # Note
+        * 
+        * You MUST check you've understood all even TLVs before using this to
+        * claim, otherwise you may unintentionally agree to some protocol you do not understand.
+        * 
+        * [`claim_funds`]: Self::claim_funds
+        */
+       public void claim_funds_with_known_custom_tlvs(byte[] payment_preimage) {
+               bindings.ChannelManager_claim_funds_with_known_custom_tlvs(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_preimage, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(payment_preimage);
        }
@@ -843,9 +958,11 @@ public class ChannelManager : CommonBase {
         * Gets the node_id held by this ChannelManager
         */
        public byte[] get_our_node_id() {
-               byte[] ret = bindings.ChannelManager_get_our_node_id(this.ptr);
+               long ret = bindings.ChannelManager_get_our_node_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -867,7 +984,7 @@ public class ChannelManager : CommonBase {
         * [`Event::ChannelClosed::user_channel_id`]: events::Event::ChannelClosed::user_channel_id
         */
        public Result_NoneAPIErrorZ accept_inbound_channel(byte[] temporary_channel_id, byte[] counterparty_node_id, org.ldk.util.UInt128 user_channel_id) {
-               long ret = bindings.ChannelManager_accept_inbound_channel(this.ptr, InternalUtils.check_arr_len(temporary_channel_id, 32), InternalUtils.check_arr_len(counterparty_node_id, 33), user_channel_id.getLEBytes());
+               long ret = bindings.ChannelManager_accept_inbound_channel(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(temporary_channel_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_node_id, 33)), InternalUtils.encodeUint8Array(user_channel_id.getLEBytes()));
                GC.KeepAlive(this);
                GC.KeepAlive(temporary_channel_id);
                GC.KeepAlive(counterparty_node_id);
@@ -898,7 +1015,7 @@ public class ChannelManager : CommonBase {
         * [`Event::ChannelClosed::user_channel_id`]: events::Event::ChannelClosed::user_channel_id
         */
        public Result_NoneAPIErrorZ accept_inbound_channel_from_trusted_peer_0conf(byte[] temporary_channel_id, byte[] counterparty_node_id, org.ldk.util.UInt128 user_channel_id) {
-               long ret = bindings.ChannelManager_accept_inbound_channel_from_trusted_peer_0conf(this.ptr, InternalUtils.check_arr_len(temporary_channel_id, 32), InternalUtils.check_arr_len(counterparty_node_id, 33), user_channel_id.getLEBytes());
+               long ret = bindings.ChannelManager_accept_inbound_channel_from_trusted_peer_0conf(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(temporary_channel_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_node_id, 33)), InternalUtils.encodeUint8Array(user_channel_id.getLEBytes()));
                GC.KeepAlive(this);
                GC.KeepAlive(temporary_channel_id);
                GC.KeepAlive(counterparty_node_id);
@@ -908,6 +1025,106 @@ public class ChannelManager : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Pays for an [`Offer`] using the given parameters by creating an [`InvoiceRequest`] and
+        * enqueuing it to be sent via an onion message. [`ChannelManager`] will pay the actual
+        * [`Bolt12Invoice`] once it is received.
+        * 
+        * Uses [`InvoiceRequestBuilder`] such that the [`InvoiceRequest`] it builds is recognized by
+        * the [`ChannelManager`] when handling a [`Bolt12Invoice`] message in response to the request.
+        * The optional parameters are used in the builder, if `Some`:
+        * - `quantity` for [`InvoiceRequest::quantity`] which must be set if
+        * [`Offer::expects_quantity`] is `true`.
+        * - `amount_msats` if overpaying what is required for the given `quantity` is desired, and
+        * - `payer_note` for [`InvoiceRequest::payer_note`].
+        * 
+        * If `max_total_routing_fee_msat` is not specified, The default from
+        * [`RouteParameters::from_payment_params_and_value`] is applied.
+        * 
+        * # Payment
+        * 
+        * The provided `payment_id` is used to ensure that only one invoice is paid for the request
+        * when received. See [Avoiding Duplicate Payments] for other requirements once the payment has
+        * been sent.
+        * 
+        * To revoke the request, use [`ChannelManager::abandon_payment`] prior to receiving the
+        * invoice. If abandoned, or an invoice isn't received in a reasonable amount of time, the
+        * payment will fail with an [`Event::InvoiceRequestFailed`].
+        * 
+        * # Privacy
+        * 
+        * Uses a one-hop [`BlindedPath`] for the reply path with [`ChannelManager::get_our_node_id`]
+        * as the introduction node and a derived payer id for payer privacy. As such, currently, the
+        * node must be announced. Otherwise, there is no way to find a path to the introduction node
+        * in order to send the [`Bolt12Invoice`].
+        * 
+        * # Limitations
+        * 
+        * Requires a direct connection to an introduction node in [`Offer::paths`] or to
+        * [`Offer::signing_pubkey`], if empty. A similar restriction applies to the responding
+        * [`Bolt12Invoice::payment_paths`].
+        * 
+        * # 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.
+        * 
+        * [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest
+        * [`InvoiceRequest::quantity`]: crate::offers::invoice_request::InvoiceRequest::quantity
+        * [`InvoiceRequest::payer_note`]: crate::offers::invoice_request::InvoiceRequest::payer_note
+        * [`InvoiceRequestBuilder`]: crate::offers::invoice_request::InvoiceRequestBuilder
+        * [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
+        * [`Bolt12Invoice::payment_paths`]: crate::offers::invoice::Bolt12Invoice::payment_paths
+        * [Avoiding Duplicate Payments]: #avoiding-duplicate-payments
+        */
+       public Result_NoneBolt12SemanticErrorZ pay_for_offer(org.ldk.structs.Offer offer, org.ldk.structs.Option_u64Z quantity, org.ldk.structs.Option_u64Z amount_msats, org.ldk.structs.Option_StrZ payer_note, byte[] payment_id, org.ldk.structs.Retry retry_strategy, org.ldk.structs.Option_u64Z max_total_routing_fee_msat) {
+               long ret = bindings.ChannelManager_pay_for_offer(this.ptr, offer == null ? 0 : offer.ptr, quantity.ptr, amount_msats.ptr, payer_note.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)), retry_strategy.ptr, max_total_routing_fee_msat.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(offer);
+               GC.KeepAlive(quantity);
+               GC.KeepAlive(amount_msats);
+               GC.KeepAlive(payer_note);
+               GC.KeepAlive(payment_id);
+               GC.KeepAlive(retry_strategy);
+               GC.KeepAlive(max_total_routing_fee_msat);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneBolt12SemanticErrorZ ret_hu_conv = Result_NoneBolt12SemanticErrorZ.constr_from_ptr(ret);
+               if (this != null) { this.ptrs_to.AddLast(offer); };
+               if (this != null) { this.ptrs_to.AddLast(quantity); };
+               if (this != null) { this.ptrs_to.AddLast(amount_msats); };
+               if (this != null) { this.ptrs_to.AddLast(payer_note); };
+               if (this != null) { this.ptrs_to.AddLast(retry_strategy); };
+               if (this != null) { this.ptrs_to.AddLast(max_total_routing_fee_msat); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a [`Bolt12Invoice`] for a [`Refund`] and enqueues it to be sent via an onion
+        * message.
+        * 
+        * The resulting invoice uses a [`PaymentHash`] recognized by the [`ChannelManager`] and a
+        * [`BlindedPath`] containing the [`PaymentSecret`] needed to reconstruct the corresponding
+        * [`PaymentPreimage`].
+        * 
+        * # Limitations
+        * 
+        * Requires a direct connection to an introduction node in [`Refund::paths`] or to
+        * [`Refund::payer_id`], if empty. This request is best effort; an invoice will be sent to each
+        * node meeting the aforementioned criteria, but there's no guarantee that they will be
+        * received and no retries will be made.
+        * 
+        * [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
+        */
+       public Result_NoneBolt12SemanticErrorZ request_refund_payment(org.ldk.structs.Refund refund) {
+               long ret = bindings.ChannelManager_request_refund_payment(this.ptr, refund == null ? 0 : refund.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(refund);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneBolt12SemanticErrorZ ret_hu_conv = Result_NoneBolt12SemanticErrorZ.constr_from_ptr(ret);
+               if (this != null) { this.ptrs_to.AddLast(refund); };
+               return ret_hu_conv;
+       }
+
        /**
         * Gets a payment secret and payment hash for use in an invoice given to a third party wishing
         * to pay us.
@@ -942,14 +1159,14 @@ public class ChannelManager : CommonBase {
         * [`PaymentPurpose::InvoicePayment::payment_preimage`]: events::PaymentPurpose::InvoicePayment::payment_preimage
         * [`create_inbound_payment_for_hash`]: Self::create_inbound_payment_for_hash
         */
-       public Result_C2Tuple_PaymentHashPaymentSecretZNoneZ create_inbound_payment(org.ldk.structs.Option_u64Z min_value_msat, int invoice_expiry_delta_secs, org.ldk.structs.Option_u16Z min_final_cltv_expiry_delta) {
+       public Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ create_inbound_payment(org.ldk.structs.Option_u64Z min_value_msat, int invoice_expiry_delta_secs, org.ldk.structs.Option_u16Z min_final_cltv_expiry_delta) {
                long ret = bindings.ChannelManager_create_inbound_payment(this.ptr, min_value_msat.ptr, invoice_expiry_delta_secs, min_final_cltv_expiry_delta.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(min_value_msat);
                GC.KeepAlive(invoice_expiry_delta_secs);
                GC.KeepAlive(min_final_cltv_expiry_delta);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_PaymentHashPaymentSecretZNoneZ ret_hu_conv = Result_C2Tuple_PaymentHashPaymentSecretZNoneZ.constr_from_ptr(ret);
+               Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(min_value_msat); };
                if (this != null) { this.ptrs_to.AddLast(min_final_cltv_expiry_delta); };
                return ret_hu_conv;
@@ -1003,15 +1220,15 @@ public class ChannelManager : CommonBase {
         * [`create_inbound_payment`]: Self::create_inbound_payment
         * [`PaymentClaimable`]: events::Event::PaymentClaimable
         */
-       public Result_PaymentSecretNoneZ create_inbound_payment_for_hash(byte[] payment_hash, org.ldk.structs.Option_u64Z min_value_msat, int invoice_expiry_delta_secs, org.ldk.structs.Option_u16Z min_final_cltv_expiry) {
-               long ret = bindings.ChannelManager_create_inbound_payment_for_hash(this.ptr, InternalUtils.check_arr_len(payment_hash, 32), min_value_msat.ptr, invoice_expiry_delta_secs, min_final_cltv_expiry.ptr);
+       public Result_ThirtyTwoBytesNoneZ create_inbound_payment_for_hash(byte[] payment_hash, org.ldk.structs.Option_u64Z min_value_msat, int invoice_expiry_delta_secs, org.ldk.structs.Option_u16Z min_final_cltv_expiry) {
+               long ret = bindings.ChannelManager_create_inbound_payment_for_hash(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), min_value_msat.ptr, invoice_expiry_delta_secs, min_final_cltv_expiry.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(payment_hash);
                GC.KeepAlive(min_value_msat);
                GC.KeepAlive(invoice_expiry_delta_secs);
                GC.KeepAlive(min_final_cltv_expiry);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentSecretNoneZ ret_hu_conv = Result_PaymentSecretNoneZ.constr_from_ptr(ret);
+               Result_ThirtyTwoBytesNoneZ ret_hu_conv = Result_ThirtyTwoBytesNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(min_value_msat); };
                if (this != null) { this.ptrs_to.AddLast(min_final_cltv_expiry); };
                return ret_hu_conv;
@@ -1023,13 +1240,13 @@ public class ChannelManager : CommonBase {
         * 
         * [`create_inbound_payment`]: Self::create_inbound_payment
         */
-       public Result_PaymentPreimageAPIErrorZ get_payment_preimage(byte[] payment_hash, byte[] payment_secret) {
-               long ret = bindings.ChannelManager_get_payment_preimage(this.ptr, InternalUtils.check_arr_len(payment_hash, 32), InternalUtils.check_arr_len(payment_secret, 32));
+       public Result_ThirtyTwoBytesAPIErrorZ get_payment_preimage(byte[] payment_hash, byte[] payment_secret) {
+               long ret = bindings.ChannelManager_get_payment_preimage(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_secret, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(payment_hash);
                GC.KeepAlive(payment_secret);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentPreimageAPIErrorZ ret_hu_conv = Result_PaymentPreimageAPIErrorZ.constr_from_ptr(ret);
+               Result_ThirtyTwoBytesAPIErrorZ ret_hu_conv = Result_ThirtyTwoBytesAPIErrorZ.constr_from_ptr(ret);
                return ret_hu_conv;
        }
 
@@ -1139,13 +1356,17 @@ public class ChannelManager : CommonBase {
        }
 
        /**
-        * Gets a [`Future`] that completes when this [`ChannelManager`] needs to be persisted.
+        * Gets a [`Future`] that completes when this [`ChannelManager`] may need to be persisted or
+        * may have events that need processing.
+        * 
+        * In order to check if this [`ChannelManager`] needs persisting, call
+        * [`Self::get_and_clear_needs_persistence`].
         * 
         * Note that callbacks registered on the [`Future`] MUST NOT call back into this
         * [`ChannelManager`] and should instead register actions to be taken later.
         */
-       public Future get_persistable_update_future() {
-               long ret = bindings.ChannelManager_get_persistable_update_future(this.ptr);
+       public Future get_event_or_persistence_needed_future() {
+               long ret = bindings.ChannelManager_get_event_or_persistence_needed_future(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.Future ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Future(null, ret); }
@@ -1153,6 +1374,15 @@ public class ChannelManager : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Returns true if this [`ChannelManager`] needs to be persisted.
+        */
+       public bool get_and_clear_needs_persistence() {
+               bool ret = bindings.ChannelManager_get_and_clear_needs_persistence(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
        /**
         * Gets the latest best block which was connected either via the [`chain::Listen`] or
         * [`chain::Confirm`] interfaces.
@@ -1167,7 +1397,7 @@ public class ChannelManager : CommonBase {
        }
 
        /**
-        * Fetches the set of [`NodeFeatures`] flags which are provided by or required by
+        * Fetches the set of [`NodeFeatures`] flags that are provided by or required by
         * [`ChannelManager`].
         */
        public NodeFeatures node_features() {
@@ -1180,7 +1410,7 @@ public class ChannelManager : CommonBase {
        }
 
        /**
-        * Fetches the set of [`ChannelFeatures`] flags which are provided by or required by
+        * Fetches the set of [`ChannelFeatures`] flags that are provided by or required by
         * [`ChannelManager`].
         */
        public ChannelFeatures channel_features() {
@@ -1193,7 +1423,7 @@ public class ChannelManager : CommonBase {
        }
 
        /**
-        * Fetches the set of [`ChannelTypeFeatures`] flags which are provided by or required by
+        * Fetches the set of [`ChannelTypeFeatures`] flags that are provided by or required by
         * [`ChannelManager`].
         */
        public ChannelTypeFeatures channel_type_features() {
@@ -1206,7 +1436,7 @@ public class ChannelManager : CommonBase {
        }
 
        /**
-        * Fetches the set of [`InitFeatures`] flags which are provided by or required by
+        * Fetches the set of [`InitFeatures`] flags that are provided by or required by
         * [`ChannelManager`].
         */
        public InitFeatures init_features() {
@@ -1231,13 +1461,28 @@ public class ChannelManager : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Constructs a new OffersMessageHandler which calls the relevant methods on this_arg.
+        * This copies the `inner` pointer in this_arg and thus the returned OffersMessageHandler must be freed before this_arg is
+        */
+       public OffersMessageHandler as_OffersMessageHandler() {
+               long ret = bindings.ChannelManager_as_OffersMessageHandler(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               OffersMessageHandler ret_hu_conv = new OffersMessageHandler(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
        /**
         * Serialize the ChannelManager object into a byte array which can be read by ChannelManager_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ChannelManager_write(this.ptr);
+               long ret = bindings.ChannelManager_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index 11fe0ddfd05b75f37e857e588c1bf3be19b545fd..624de695611598f1b19bcc2e9f46bf93532d4d0b 100644 (file)
@@ -280,7 +280,7 @@ public class ChannelManagerReadArgs : CommonBase {
         * populate a HashMap directly from C.
         */
        public static ChannelManagerReadArgs of(org.ldk.structs.EntropySource entropy_source, org.ldk.structs.NodeSigner node_signer, org.ldk.structs.SignerProvider signer_provider, org.ldk.structs.FeeEstimator fee_estimator, org.ldk.structs.Watch chain_monitor, org.ldk.structs.BroadcasterInterface tx_broadcaster, org.ldk.structs.Router router, org.ldk.structs.Logger logger, org.ldk.structs.UserConfig default_config, ChannelMonitor[] channel_monitors) {
-               long ret = bindings.ChannelManagerReadArgs_new(entropy_source.ptr, node_signer.ptr, signer_provider.ptr, fee_estimator.ptr, chain_monitor.ptr, tx_broadcaster.ptr, router.ptr, logger.ptr, default_config == null ? 0 : default_config.ptr, channel_monitors != null ? InternalUtils.mapArray(channel_monitors, channel_monitors_conv_16 => channel_monitors_conv_16 == null ? 0 : channel_monitors_conv_16.ptr) : null);
+               long ret = bindings.ChannelManagerReadArgs_new(entropy_source.ptr, node_signer.ptr, signer_provider.ptr, fee_estimator.ptr, chain_monitor.ptr, tx_broadcaster.ptr, router.ptr, logger.ptr, default_config == null ? 0 : default_config.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(channel_monitors, channel_monitors_conv_16 => channel_monitors_conv_16 == null ? 0 : channel_monitors_conv_16.ptr)));
                GC.KeepAlive(entropy_source);
                GC.KeepAlive(node_signer);
                GC.KeepAlive(signer_provider);
index cd3fc2c72d02764c8f8423e251e934a697d734ec..ad7d0e377d15f856d5ed196ac6dd938eee0c6d20 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,6 +6,127 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of ChannelMessageHandler */
+public interface ChannelMessageHandlerInterface {
+       /**Handle an incoming `open_channel` message from the given peer.
+        */
+       void handle_open_channel(byte[] their_node_id, OpenChannel msg);
+       /**Handle an incoming `open_channel2` message from the given peer.
+        */
+       void handle_open_channel_v2(byte[] their_node_id, OpenChannelV2 msg);
+       /**Handle an incoming `accept_channel` message from the given peer.
+        */
+       void handle_accept_channel(byte[] their_node_id, AcceptChannel msg);
+       /**Handle an incoming `accept_channel2` message from the given peer.
+        */
+       void handle_accept_channel_v2(byte[] their_node_id, AcceptChannelV2 msg);
+       /**Handle an incoming `funding_created` message from the given peer.
+        */
+       void handle_funding_created(byte[] their_node_id, FundingCreated msg);
+       /**Handle an incoming `funding_signed` message from the given peer.
+        */
+       void handle_funding_signed(byte[] their_node_id, FundingSigned msg);
+       /**Handle an incoming `channel_ready` message from the given peer.
+        */
+       void handle_channel_ready(byte[] their_node_id, ChannelReady msg);
+       /**Handle an incoming `shutdown` message from the given peer.
+        */
+       void handle_shutdown(byte[] their_node_id, Shutdown msg);
+       /**Handle an incoming `closing_signed` message from the given peer.
+        */
+       void handle_closing_signed(byte[] their_node_id, ClosingSigned msg);
+       /**Handle an incoming `tx_add_input message` from the given peer.
+        */
+       void handle_tx_add_input(byte[] their_node_id, TxAddInput msg);
+       /**Handle an incoming `tx_add_output` message from the given peer.
+        */
+       void handle_tx_add_output(byte[] their_node_id, TxAddOutput msg);
+       /**Handle an incoming `tx_remove_input` message from the given peer.
+        */
+       void handle_tx_remove_input(byte[] their_node_id, TxRemoveInput msg);
+       /**Handle an incoming `tx_remove_output` message from the given peer.
+        */
+       void handle_tx_remove_output(byte[] their_node_id, TxRemoveOutput msg);
+       /**Handle an incoming `tx_complete message` from the given peer.
+        */
+       void handle_tx_complete(byte[] their_node_id, TxComplete msg);
+       /**Handle an incoming `tx_signatures` message from the given peer.
+        */
+       void handle_tx_signatures(byte[] their_node_id, TxSignatures msg);
+       /**Handle an incoming `tx_init_rbf` message from the given peer.
+        */
+       void handle_tx_init_rbf(byte[] their_node_id, TxInitRbf msg);
+       /**Handle an incoming `tx_ack_rbf` message from the given peer.
+        */
+       void handle_tx_ack_rbf(byte[] their_node_id, TxAckRbf msg);
+       /**Handle an incoming `tx_abort message` from the given peer.
+        */
+       void handle_tx_abort(byte[] their_node_id, TxAbort msg);
+       /**Handle an incoming `update_add_htlc` message from the given peer.
+        */
+       void handle_update_add_htlc(byte[] their_node_id, UpdateAddHTLC msg);
+       /**Handle an incoming `update_fulfill_htlc` message from the given peer.
+        */
+       void handle_update_fulfill_htlc(byte[] their_node_id, UpdateFulfillHTLC msg);
+       /**Handle an incoming `update_fail_htlc` message from the given peer.
+        */
+       void handle_update_fail_htlc(byte[] their_node_id, UpdateFailHTLC msg);
+       /**Handle an incoming `update_fail_malformed_htlc` message from the given peer.
+        */
+       void handle_update_fail_malformed_htlc(byte[] their_node_id, UpdateFailMalformedHTLC msg);
+       /**Handle an incoming `commitment_signed` message from the given peer.
+        */
+       void handle_commitment_signed(byte[] their_node_id, CommitmentSigned msg);
+       /**Handle an incoming `revoke_and_ack` message from the given peer.
+        */
+       void handle_revoke_and_ack(byte[] their_node_id, RevokeAndACK msg);
+       /**Handle an incoming `update_fee` message from the given peer.
+        */
+       void handle_update_fee(byte[] their_node_id, UpdateFee msg);
+       /**Handle an incoming `announcement_signatures` message from the given peer.
+        */
+       void handle_announcement_signatures(byte[] their_node_id, AnnouncementSignatures msg);
+       /**Indicates a connection to the peer failed/an existing connection was lost.
+        */
+       void peer_disconnected(byte[] their_node_id);
+       /**Handle a peer reconnecting, possibly generating `channel_reestablish` message(s).
+        * 
+        * May return an `Err(())` if the features the peer supports are not sufficient to communicate
+        * with us. Implementors should be somewhat conservative about doing so, however, as other
+        * message handlers may still wish to communicate with this peer.
+        */
+       Result_NoneNoneZ peer_connected(byte[] their_node_id, Init msg, bool inbound);
+       /**Handle an incoming `channel_reestablish` message from the given peer.
+        */
+       void handle_channel_reestablish(byte[] their_node_id, ChannelReestablish msg);
+       /**Handle an incoming `channel_update` message from the given peer.
+        */
+       void handle_channel_update(byte[] their_node_id, ChannelUpdate msg);
+       /**Handle an incoming `error` message from the given peer.
+        */
+       void handle_error(byte[] their_node_id, ErrorMessage msg);
+       /**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.
+        */
+       NodeFeatures provided_node_features();
+       /**Gets the init feature flags which should be sent to the given peer. All available handlers
+        * are queried similarly and their feature flags are OR'd together to form the [`InitFeatures`]
+        * which are sent in our [`Init`] message.
+        * 
+        * Note that this method is called before [`Self::peer_connected`].
+        */
+       InitFeatures provided_init_features(byte[] their_node_id);
+       /**Gets the chain hashes for this `ChannelMessageHandler` indicating which chains it supports.
+        * 
+        * If it's `None`, then no particular network chain hash compatibility will be enforced when
+        * connecting to peers.
+        */
+       Option_CVec_ThirtyTwoBytesZZ get_chain_hashes();
+}
+
 /**
  * A trait to describe an object which can receive channel messages.
  * 
@@ -12,327 +134,204 @@ namespace org { namespace ldk { namespace structs {
  * they MUST NOT be called in parallel when the two calls have the same `their_node_id`.
  */
 public class ChannelMessageHandler : CommonBase {
-       internal readonly bindings.LDKChannelMessageHandler bindings_instance;
+       internal bindings.LDKChannelMessageHandler bindings_instance;
+       internal long instance_idx;
+
        internal ChannelMessageHandler(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private ChannelMessageHandler(bindings.LDKChannelMessageHandler arg, bindings.LDKMessageSendEventsProvider MessageSendEventsProvider) : base(bindings.LDKChannelMessageHandler_new(arg, MessageSendEventsProvider)) {
-               this.ptrs_to.AddLast(arg);
-               this.ptrs_to.AddLast(MessageSendEventsProvider);
-               this.bindings_instance = arg;
-       }
        ~ChannelMessageHandler() {
                if (ptr != 0) { bindings.ChannelMessageHandler_free(ptr); }
        }
 
-       public interface ChannelMessageHandlerInterface {
-               /**
-                * Handle an incoming `open_channel` message from the given peer.
-                */
-               void handle_open_channel(byte[] _their_node_id, OpenChannel _msg);
-               /**
-                * Handle an incoming `open_channel2` message from the given peer.
-                */
-               void handle_open_channel_v2(byte[] _their_node_id, OpenChannelV2 _msg);
-               /**
-                * Handle an incoming `accept_channel` message from the given peer.
-                */
-               void handle_accept_channel(byte[] _their_node_id, AcceptChannel _msg);
-               /**
-                * Handle an incoming `accept_channel2` message from the given peer.
-                */
-               void handle_accept_channel_v2(byte[] _their_node_id, AcceptChannelV2 _msg);
-               /**
-                * Handle an incoming `funding_created` message from the given peer.
-                */
-               void handle_funding_created(byte[] _their_node_id, FundingCreated _msg);
-               /**
-                * Handle an incoming `funding_signed` message from the given peer.
-                */
-               void handle_funding_signed(byte[] _their_node_id, FundingSigned _msg);
-               /**
-                * Handle an incoming `channel_ready` message from the given peer.
-                */
-               void handle_channel_ready(byte[] _their_node_id, ChannelReady _msg);
-               /**
-                * Handle an incoming `shutdown` message from the given peer.
-                */
-               void handle_shutdown(byte[] _their_node_id, Shutdown _msg);
-               /**
-                * Handle an incoming `closing_signed` message from the given peer.
-                */
-               void handle_closing_signed(byte[] _their_node_id, ClosingSigned _msg);
-               /**
-                * Handle an incoming `tx_add_input message` from the given peer.
-                */
-               void handle_tx_add_input(byte[] _their_node_id, TxAddInput _msg);
-               /**
-                * Handle an incoming `tx_add_output` message from the given peer.
-                */
-               void handle_tx_add_output(byte[] _their_node_id, TxAddOutput _msg);
-               /**
-                * Handle an incoming `tx_remove_input` message from the given peer.
-                */
-               void handle_tx_remove_input(byte[] _their_node_id, TxRemoveInput _msg);
-               /**
-                * Handle an incoming `tx_remove_output` message from the given peer.
-                */
-               void handle_tx_remove_output(byte[] _their_node_id, TxRemoveOutput _msg);
-               /**
-                * Handle an incoming `tx_complete message` from the given peer.
-                */
-               void handle_tx_complete(byte[] _their_node_id, TxComplete _msg);
-               /**
-                * Handle an incoming `tx_signatures` message from the given peer.
-                */
-               void handle_tx_signatures(byte[] _their_node_id, TxSignatures _msg);
-               /**
-                * Handle an incoming `tx_init_rbf` message from the given peer.
-                */
-               void handle_tx_init_rbf(byte[] _their_node_id, TxInitRbf _msg);
-               /**
-                * Handle an incoming `tx_ack_rbf` message from the given peer.
-                */
-               void handle_tx_ack_rbf(byte[] _their_node_id, TxAckRbf _msg);
-               /**
-                * Handle an incoming `tx_abort message` from the given peer.
-                */
-               void handle_tx_abort(byte[] _their_node_id, TxAbort _msg);
-               /**
-                * Handle an incoming `update_add_htlc` message from the given peer.
-                */
-               void handle_update_add_htlc(byte[] _their_node_id, UpdateAddHTLC _msg);
-               /**
-                * Handle an incoming `update_fulfill_htlc` message from the given peer.
-                */
-               void handle_update_fulfill_htlc(byte[] _their_node_id, UpdateFulfillHTLC _msg);
-               /**
-                * Handle an incoming `update_fail_htlc` message from the given peer.
-                */
-               void handle_update_fail_htlc(byte[] _their_node_id, UpdateFailHTLC _msg);
-               /**
-                * Handle an incoming `update_fail_malformed_htlc` message from the given peer.
-                */
-               void handle_update_fail_malformed_htlc(byte[] _their_node_id, UpdateFailMalformedHTLC _msg);
-               /**
-                * Handle an incoming `commitment_signed` message from the given peer.
-                */
-               void handle_commitment_signed(byte[] _their_node_id, CommitmentSigned _msg);
-               /**
-                * Handle an incoming `revoke_and_ack` message from the given peer.
-                */
-               void handle_revoke_and_ack(byte[] _their_node_id, RevokeAndACK _msg);
-               /**
-                * Handle an incoming `update_fee` message from the given peer.
-                */
-               void handle_update_fee(byte[] _their_node_id, UpdateFee _msg);
-               /**
-                * Handle an incoming `announcement_signatures` message from the given peer.
-                */
-               void handle_announcement_signatures(byte[] _their_node_id, AnnouncementSignatures _msg);
-               /**
-                * Indicates a connection to the peer failed/an existing connection was lost.
-                */
-               void peer_disconnected(byte[] _their_node_id);
-               /**
-                * Handle a peer reconnecting, possibly generating `channel_reestablish` message(s).
-                * 
-                * May return an `Err(())` if the features the peer supports are not sufficient to communicate
-                * with us. Implementors should be somewhat conservative about doing so, however, as other
-                * message handlers may still wish to communicate with this peer.
-                */
-               Result_NoneNoneZ peer_connected(byte[] _their_node_id, Init _msg, bool _inbound);
-               /**
-                * Handle an incoming `channel_reestablish` message from the given peer.
-                */
-               void handle_channel_reestablish(byte[] _their_node_id, ChannelReestablish _msg);
-               /**
-                * Handle an incoming `channel_update` message from the given peer.
-                */
-               void handle_channel_update(byte[] _their_node_id, ChannelUpdate _msg);
-               /**
-                * Handle an incoming `error` message from the given peer.
-                */
-               void handle_error(byte[] _their_node_id, ErrorMessage _msg);
-               /**
-                * 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.
-                */
-               NodeFeatures provided_node_features();
-               /**
-                * Gets the init feature flags which should be sent to the given peer. All available handlers
-                * are queried similarly and their feature flags are OR'd together to form the [`InitFeatures`]
-                * which are sent in our [`Init`] message.
-                * 
-                * Note that this method is called before [`Self::peer_connected`].
-                */
-               InitFeatures provided_init_features(byte[] _their_node_id);
-               /**
-                * Gets the genesis hashes for this `ChannelMessageHandler` indicating which chains it supports.
-                * 
-                * If it's `None`, then no particular network chain hash compatibility will be enforced when
-                * connecting to peers.
-                */
-               Option_CVec_ChainHashZZ get_genesis_hashes();
-       }
        private class LDKChannelMessageHandlerHolder { internal ChannelMessageHandler held; }
        private class LDKChannelMessageHandlerImpl : bindings.LDKChannelMessageHandler {
                internal LDKChannelMessageHandlerImpl(ChannelMessageHandlerInterface arg, LDKChannelMessageHandlerHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private ChannelMessageHandlerInterface arg;
                private LDKChannelMessageHandlerHolder impl_holder;
-               public void handle_open_channel(byte[] _their_node_id, long _msg) {
+               public void handle_open_channel(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.OpenChannel _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.OpenChannel(null, _msg); }
-                       arg.handle_open_channel(_their_node_id, _msg_hu_conv);
+                       arg.handle_open_channel(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_open_channel_v2(byte[] _their_node_id, long _msg) {
+               public void handle_open_channel_v2(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.OpenChannelV2 _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.OpenChannelV2(null, _msg); }
-                       arg.handle_open_channel_v2(_their_node_id, _msg_hu_conv);
+                       arg.handle_open_channel_v2(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_accept_channel(byte[] _their_node_id, long _msg) {
+               public void handle_accept_channel(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.AcceptChannel _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.AcceptChannel(null, _msg); }
-                       arg.handle_accept_channel(_their_node_id, _msg_hu_conv);
+                       arg.handle_accept_channel(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_accept_channel_v2(byte[] _their_node_id, long _msg) {
+               public void handle_accept_channel_v2(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.AcceptChannelV2 _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.AcceptChannelV2(null, _msg); }
-                       arg.handle_accept_channel_v2(_their_node_id, _msg_hu_conv);
+                       arg.handle_accept_channel_v2(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_funding_created(byte[] _their_node_id, long _msg) {
+               public void handle_funding_created(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.FundingCreated _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.FundingCreated(null, _msg); }
-                       arg.handle_funding_created(_their_node_id, _msg_hu_conv);
+                       arg.handle_funding_created(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_funding_signed(byte[] _their_node_id, long _msg) {
+               public void handle_funding_signed(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.FundingSigned _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.FundingSigned(null, _msg); }
-                       arg.handle_funding_signed(_their_node_id, _msg_hu_conv);
+                       arg.handle_funding_signed(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_channel_ready(byte[] _their_node_id, long _msg) {
+               public void handle_channel_ready(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.ChannelReady _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.ChannelReady(null, _msg); }
-                       arg.handle_channel_ready(_their_node_id, _msg_hu_conv);
+                       arg.handle_channel_ready(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_shutdown(byte[] _their_node_id, long _msg) {
+               public void handle_shutdown(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.Shutdown _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.Shutdown(null, _msg); }
-                       arg.handle_shutdown(_their_node_id, _msg_hu_conv);
+                       arg.handle_shutdown(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_closing_signed(byte[] _their_node_id, long _msg) {
+               public void handle_closing_signed(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.ClosingSigned _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.ClosingSigned(null, _msg); }
-                       arg.handle_closing_signed(_their_node_id, _msg_hu_conv);
+                       arg.handle_closing_signed(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_tx_add_input(byte[] _their_node_id, long _msg) {
+               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); }
-                       arg.handle_tx_add_input(_their_node_id, _msg_hu_conv);
+                       arg.handle_tx_add_input(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_tx_add_output(byte[] _their_node_id, long _msg) {
+               public void handle_tx_add_output(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.TxAddOutput _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.TxAddOutput(null, _msg); }
-                       arg.handle_tx_add_output(_their_node_id, _msg_hu_conv);
+                       arg.handle_tx_add_output(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_tx_remove_input(byte[] _their_node_id, long _msg) {
+               public void handle_tx_remove_input(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.TxRemoveInput _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.TxRemoveInput(null, _msg); }
-                       arg.handle_tx_remove_input(_their_node_id, _msg_hu_conv);
+                       arg.handle_tx_remove_input(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_tx_remove_output(byte[] _their_node_id, long _msg) {
+               public void handle_tx_remove_output(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.TxRemoveOutput _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.TxRemoveOutput(null, _msg); }
-                       arg.handle_tx_remove_output(_their_node_id, _msg_hu_conv);
+                       arg.handle_tx_remove_output(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_tx_complete(byte[] _their_node_id, long _msg) {
+               public void handle_tx_complete(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.TxComplete _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.TxComplete(null, _msg); }
-                       arg.handle_tx_complete(_their_node_id, _msg_hu_conv);
+                       arg.handle_tx_complete(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_tx_signatures(byte[] _their_node_id, long _msg) {
+               public void handle_tx_signatures(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.TxSignatures _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.TxSignatures(null, _msg); }
-                       arg.handle_tx_signatures(_their_node_id, _msg_hu_conv);
+                       arg.handle_tx_signatures(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_tx_init_rbf(byte[] _their_node_id, long _msg) {
+               public void handle_tx_init_rbf(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.TxInitRbf _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.TxInitRbf(null, _msg); }
-                       arg.handle_tx_init_rbf(_their_node_id, _msg_hu_conv);
+                       arg.handle_tx_init_rbf(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_tx_ack_rbf(byte[] _their_node_id, long _msg) {
+               public void handle_tx_ack_rbf(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.TxAckRbf _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.TxAckRbf(null, _msg); }
-                       arg.handle_tx_ack_rbf(_their_node_id, _msg_hu_conv);
+                       arg.handle_tx_ack_rbf(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_tx_abort(byte[] _their_node_id, long _msg) {
+               public void handle_tx_abort(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.TxAbort _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.TxAbort(null, _msg); }
-                       arg.handle_tx_abort(_their_node_id, _msg_hu_conv);
+                       arg.handle_tx_abort(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_update_add_htlc(byte[] _their_node_id, long _msg) {
+               public void handle_update_add_htlc(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.UpdateAddHTLC _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.UpdateAddHTLC(null, _msg); }
-                       arg.handle_update_add_htlc(_their_node_id, _msg_hu_conv);
+                       arg.handle_update_add_htlc(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_update_fulfill_htlc(byte[] _their_node_id, long _msg) {
+               public void handle_update_fulfill_htlc(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.UpdateFulfillHTLC _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.UpdateFulfillHTLC(null, _msg); }
-                       arg.handle_update_fulfill_htlc(_their_node_id, _msg_hu_conv);
+                       arg.handle_update_fulfill_htlc(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_update_fail_htlc(byte[] _their_node_id, long _msg) {
+               public void handle_update_fail_htlc(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.UpdateFailHTLC _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.UpdateFailHTLC(null, _msg); }
-                       arg.handle_update_fail_htlc(_their_node_id, _msg_hu_conv);
+                       arg.handle_update_fail_htlc(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_update_fail_malformed_htlc(byte[] _their_node_id, long _msg) {
+               public void handle_update_fail_malformed_htlc(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.UpdateFailMalformedHTLC _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.UpdateFailMalformedHTLC(null, _msg); }
-                       arg.handle_update_fail_malformed_htlc(_their_node_id, _msg_hu_conv);
+                       arg.handle_update_fail_malformed_htlc(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_commitment_signed(byte[] _their_node_id, long _msg) {
+               public void handle_commitment_signed(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.CommitmentSigned _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.CommitmentSigned(null, _msg); }
-                       arg.handle_commitment_signed(_their_node_id, _msg_hu_conv);
+                       arg.handle_commitment_signed(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_revoke_and_ack(byte[] _their_node_id, long _msg) {
+               public void handle_revoke_and_ack(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.RevokeAndACK _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.RevokeAndACK(null, _msg); }
-                       arg.handle_revoke_and_ack(_their_node_id, _msg_hu_conv);
+                       arg.handle_revoke_and_ack(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_update_fee(byte[] _their_node_id, long _msg) {
+               public void handle_update_fee(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.UpdateFee _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.UpdateFee(null, _msg); }
-                       arg.handle_update_fee(_their_node_id, _msg_hu_conv);
+                       arg.handle_update_fee(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_announcement_signatures(byte[] _their_node_id, long _msg) {
+               public void handle_announcement_signatures(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.AnnouncementSignatures _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.AnnouncementSignatures(null, _msg); }
-                       arg.handle_announcement_signatures(_their_node_id, _msg_hu_conv);
+                       arg.handle_announcement_signatures(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void peer_disconnected(byte[] _their_node_id) {
-                       arg.peer_disconnected(_their_node_id);
+               public void peer_disconnected(long _their_node_id) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
+                       arg.peer_disconnected(_their_node_id_conv);
                                GC.KeepAlive(arg);
                }
-               public long peer_connected(byte[] _their_node_id, long _msg, bool _inbound) {
+               public long peer_connected(long _their_node_id, long _msg, bool _inbound) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.Init _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.Init(null, _msg); }
-                       Result_NoneNoneZ ret = arg.peer_connected(_their_node_id, _msg_hu_conv, _inbound);
+                       Result_NoneNoneZ ret = arg.peer_connected(_their_node_id_conv, _msg_hu_conv, _inbound);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public void handle_channel_reestablish(byte[] _their_node_id, long _msg) {
+               public void handle_channel_reestablish(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.ChannelReestablish _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.ChannelReestablish(null, _msg); }
-                       arg.handle_channel_reestablish(_their_node_id, _msg_hu_conv);
+                       arg.handle_channel_reestablish(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_channel_update(byte[] _their_node_id, long _msg) {
+               public void handle_channel_update(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.ChannelUpdate _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.ChannelUpdate(null, _msg); }
-                       arg.handle_channel_update(_their_node_id, _msg_hu_conv);
+                       arg.handle_channel_update(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public void handle_error(byte[] _their_node_id, long _msg) {
+               public void handle_error(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.ErrorMessage _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.ErrorMessage(null, _msg); }
-                       arg.handle_error(_their_node_id, _msg_hu_conv);
+                       arg.handle_error(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
                public long provided_node_features() {
@@ -341,40 +340,41 @@ public class ChannelMessageHandler : CommonBase {
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long provided_init_features(byte[] _their_node_id) {
-                       InitFeatures ret = arg.provided_init_features(_their_node_id);
+               public long provided_init_features(long _their_node_id) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
+                       InitFeatures ret = arg.provided_init_features(_their_node_id_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long get_genesis_hashes() {
-                       Option_CVec_ChainHashZZ ret = arg.get_genesis_hashes();
+               public long get_chain_hashes() {
+                       Option_CVec_ThirtyTwoBytesZZ ret = arg.get_chain_hashes();
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        if (impl_holder.held != null) { impl_holder.held.ptrs_to.AddLast(ret); };
                        return result;
                }
        }
-       public static ChannelMessageHandler new_impl(ChannelMessageHandlerInterface arg, MessageSendEventsProvider.MessageSendEventsProviderInterface MessageSendEventsProvider_impl) {
+
+       /** Creates a new instance of ChannelMessageHandler from a given implementation */
+       public static ChannelMessageHandler new_impl(ChannelMessageHandlerInterface arg, MessageSendEventsProviderInterface messageSendEventsProvider_impl) {
                LDKChannelMessageHandlerHolder impl_holder = new LDKChannelMessageHandlerHolder();
-               impl_holder.held = new ChannelMessageHandler(new LDKChannelMessageHandlerImpl(arg, impl_holder), MessageSendEventsProvider.new_impl(MessageSendEventsProvider_impl).bindings_instance);
+               LDKChannelMessageHandlerImpl impl = new LDKChannelMessageHandlerImpl(arg, impl_holder);
+               MessageSendEventsProvider messageSendEventsProvider = MessageSendEventsProvider.new_impl(messageSendEventsProvider_impl);
+               long[] ptr_idx = bindings.LDKChannelMessageHandler_new(impl, messageSendEventsProvider.instance_idx);
+
+               impl_holder.held = new ChannelMessageHandler(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
+               impl_holder.held.ptrs_to.AddLast(messageSendEventsProvider);
                return impl_holder.held;
        }
 
-       /**
-        * Gets the underlying MessageSendEventsProvider.
-        */
-       public MessageSendEventsProvider get_message_send_events_provider() {
-               MessageSendEventsProvider res = new MessageSendEventsProvider(null, bindings.LDKChannelMessageHandler_get_MessageSendEventsProvider(this.ptr));
-               this.ptrs_to.AddLast(res);
-               return res;
-       }
-
        /**
         * Handle an incoming `open_channel` message from the given peer.
         */
        public void handle_open_channel(byte[] their_node_id, org.ldk.structs.OpenChannel msg) {
-               bindings.ChannelMessageHandler_handle_open_channel(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_open_channel(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);
@@ -385,7 +385,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `open_channel2` message from the given peer.
         */
        public void handle_open_channel_v2(byte[] their_node_id, org.ldk.structs.OpenChannelV2 msg) {
-               bindings.ChannelMessageHandler_handle_open_channel_v2(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_open_channel_v2(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);
@@ -396,7 +396,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `accept_channel` message from the given peer.
         */
        public void handle_accept_channel(byte[] their_node_id, org.ldk.structs.AcceptChannel msg) {
-               bindings.ChannelMessageHandler_handle_accept_channel(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_accept_channel(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);
@@ -407,7 +407,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `accept_channel2` message from the given peer.
         */
        public void handle_accept_channel_v2(byte[] their_node_id, org.ldk.structs.AcceptChannelV2 msg) {
-               bindings.ChannelMessageHandler_handle_accept_channel_v2(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_accept_channel_v2(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);
@@ -418,7 +418,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `funding_created` message from the given peer.
         */
        public void handle_funding_created(byte[] their_node_id, org.ldk.structs.FundingCreated msg) {
-               bindings.ChannelMessageHandler_handle_funding_created(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_funding_created(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);
@@ -429,7 +429,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `funding_signed` message from the given peer.
         */
        public void handle_funding_signed(byte[] their_node_id, org.ldk.structs.FundingSigned msg) {
-               bindings.ChannelMessageHandler_handle_funding_signed(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_funding_signed(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);
@@ -440,7 +440,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `channel_ready` message from the given peer.
         */
        public void handle_channel_ready(byte[] their_node_id, org.ldk.structs.ChannelReady msg) {
-               bindings.ChannelMessageHandler_handle_channel_ready(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_channel_ready(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);
@@ -451,7 +451,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `shutdown` message from the given peer.
         */
        public void handle_shutdown(byte[] their_node_id, org.ldk.structs.Shutdown msg) {
-               bindings.ChannelMessageHandler_handle_shutdown(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_shutdown(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);
@@ -462,7 +462,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `closing_signed` message from the given peer.
         */
        public void handle_closing_signed(byte[] their_node_id, org.ldk.structs.ClosingSigned msg) {
-               bindings.ChannelMessageHandler_handle_closing_signed(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_closing_signed(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);
@@ -473,7 +473,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `tx_add_input message` from the given peer.
         */
        public void handle_tx_add_input(byte[] their_node_id, org.ldk.structs.TxAddInput msg) {
-               bindings.ChannelMessageHandler_handle_tx_add_input(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_tx_add_input(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);
@@ -484,7 +484,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `tx_add_output` message from the given peer.
         */
        public void handle_tx_add_output(byte[] their_node_id, org.ldk.structs.TxAddOutput msg) {
-               bindings.ChannelMessageHandler_handle_tx_add_output(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_tx_add_output(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);
@@ -495,7 +495,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `tx_remove_input` message from the given peer.
         */
        public void handle_tx_remove_input(byte[] their_node_id, org.ldk.structs.TxRemoveInput msg) {
-               bindings.ChannelMessageHandler_handle_tx_remove_input(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_tx_remove_input(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);
@@ -506,7 +506,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `tx_remove_output` message from the given peer.
         */
        public void handle_tx_remove_output(byte[] their_node_id, org.ldk.structs.TxRemoveOutput msg) {
-               bindings.ChannelMessageHandler_handle_tx_remove_output(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_tx_remove_output(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);
@@ -517,7 +517,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `tx_complete message` from the given peer.
         */
        public void handle_tx_complete(byte[] their_node_id, org.ldk.structs.TxComplete msg) {
-               bindings.ChannelMessageHandler_handle_tx_complete(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_tx_complete(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);
@@ -528,7 +528,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `tx_signatures` message from the given peer.
         */
        public void handle_tx_signatures(byte[] their_node_id, org.ldk.structs.TxSignatures msg) {
-               bindings.ChannelMessageHandler_handle_tx_signatures(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_tx_signatures(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);
@@ -539,7 +539,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `tx_init_rbf` message from the given peer.
         */
        public void handle_tx_init_rbf(byte[] their_node_id, org.ldk.structs.TxInitRbf msg) {
-               bindings.ChannelMessageHandler_handle_tx_init_rbf(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_tx_init_rbf(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);
@@ -550,7 +550,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `tx_ack_rbf` message from the given peer.
         */
        public void handle_tx_ack_rbf(byte[] their_node_id, org.ldk.structs.TxAckRbf msg) {
-               bindings.ChannelMessageHandler_handle_tx_ack_rbf(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_tx_ack_rbf(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);
@@ -561,7 +561,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `tx_abort message` from the given peer.
         */
        public void handle_tx_abort(byte[] their_node_id, org.ldk.structs.TxAbort msg) {
-               bindings.ChannelMessageHandler_handle_tx_abort(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_tx_abort(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);
@@ -572,7 +572,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `update_add_htlc` message from the given peer.
         */
        public void handle_update_add_htlc(byte[] their_node_id, org.ldk.structs.UpdateAddHTLC msg) {
-               bindings.ChannelMessageHandler_handle_update_add_htlc(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_update_add_htlc(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);
@@ -583,7 +583,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `update_fulfill_htlc` message from the given peer.
         */
        public void handle_update_fulfill_htlc(byte[] their_node_id, org.ldk.structs.UpdateFulfillHTLC msg) {
-               bindings.ChannelMessageHandler_handle_update_fulfill_htlc(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_update_fulfill_htlc(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);
@@ -594,7 +594,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `update_fail_htlc` message from the given peer.
         */
        public void handle_update_fail_htlc(byte[] their_node_id, org.ldk.structs.UpdateFailHTLC msg) {
-               bindings.ChannelMessageHandler_handle_update_fail_htlc(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_update_fail_htlc(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);
@@ -605,7 +605,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `update_fail_malformed_htlc` message from the given peer.
         */
        public void handle_update_fail_malformed_htlc(byte[] their_node_id, org.ldk.structs.UpdateFailMalformedHTLC msg) {
-               bindings.ChannelMessageHandler_handle_update_fail_malformed_htlc(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_update_fail_malformed_htlc(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);
@@ -616,7 +616,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `commitment_signed` message from the given peer.
         */
        public void handle_commitment_signed(byte[] their_node_id, org.ldk.structs.CommitmentSigned msg) {
-               bindings.ChannelMessageHandler_handle_commitment_signed(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_commitment_signed(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);
@@ -627,7 +627,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `revoke_and_ack` message from the given peer.
         */
        public void handle_revoke_and_ack(byte[] their_node_id, org.ldk.structs.RevokeAndACK msg) {
-               bindings.ChannelMessageHandler_handle_revoke_and_ack(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_revoke_and_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);
@@ -638,7 +638,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `update_fee` message from the given peer.
         */
        public void handle_update_fee(byte[] their_node_id, org.ldk.structs.UpdateFee msg) {
-               bindings.ChannelMessageHandler_handle_update_fee(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_update_fee(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);
@@ -649,7 +649,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `announcement_signatures` message from the given peer.
         */
        public void handle_announcement_signatures(byte[] their_node_id, org.ldk.structs.AnnouncementSignatures msg) {
-               bindings.ChannelMessageHandler_handle_announcement_signatures(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_announcement_signatures(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);
@@ -660,7 +660,7 @@ public class ChannelMessageHandler : CommonBase {
         * Indicates a connection to the peer failed/an existing connection was lost.
         */
        public void peer_disconnected(byte[] their_node_id) {
-               bindings.ChannelMessageHandler_peer_disconnected(this.ptr, InternalUtils.check_arr_len(their_node_id, 33));
+               bindings.ChannelMessageHandler_peer_disconnected(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_node_id, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(their_node_id);
        }
@@ -673,7 +673,7 @@ public class ChannelMessageHandler : CommonBase {
         * message handlers may still wish to communicate with this peer.
         */
        public Result_NoneNoneZ peer_connected(byte[] their_node_id, org.ldk.structs.Init msg, bool inbound) {
-               long ret = bindings.ChannelMessageHandler_peer_connected(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr, inbound);
+               long ret = bindings.ChannelMessageHandler_peer_connected(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_node_id, 33)), msg == null ? 0 : msg.ptr, inbound);
                GC.KeepAlive(this);
                GC.KeepAlive(their_node_id);
                GC.KeepAlive(msg);
@@ -688,7 +688,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `channel_reestablish` message from the given peer.
         */
        public void handle_channel_reestablish(byte[] their_node_id, org.ldk.structs.ChannelReestablish msg) {
-               bindings.ChannelMessageHandler_handle_channel_reestablish(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_channel_reestablish(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);
@@ -699,7 +699,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `channel_update` message from the given peer.
         */
        public void handle_channel_update(byte[] their_node_id, org.ldk.structs.ChannelUpdate msg) {
-               bindings.ChannelMessageHandler_handle_channel_update(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_channel_update(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);
@@ -710,7 +710,7 @@ public class ChannelMessageHandler : CommonBase {
         * Handle an incoming `error` message from the given peer.
         */
        public void handle_error(byte[] their_node_id, org.ldk.structs.ErrorMessage msg) {
-               bindings.ChannelMessageHandler_handle_error(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.ChannelMessageHandler_handle_error(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);
@@ -739,7 +739,7 @@ public class ChannelMessageHandler : CommonBase {
         * Note that this method is called before [`Self::peer_connected`].
         */
        public InitFeatures provided_init_features(byte[] their_node_id) {
-               long ret = bindings.ChannelMessageHandler_provided_init_features(this.ptr, InternalUtils.check_arr_len(their_node_id, 33));
+               long ret = bindings.ChannelMessageHandler_provided_init_features(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_node_id, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(their_node_id);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -749,16 +749,16 @@ public class ChannelMessageHandler : CommonBase {
        }
 
        /**
-        * Gets the genesis hashes for this `ChannelMessageHandler` indicating which chains it supports.
+        * Gets the chain hashes for this `ChannelMessageHandler` indicating which chains it supports.
         * 
         * If it's `None`, then no particular network chain hash compatibility will be enforced when
         * connecting to peers.
         */
-       public Option_CVec_ChainHashZZ get_genesis_hashes() {
-               long ret = bindings.ChannelMessageHandler_get_genesis_hashes(this.ptr);
+       public Option_CVec_ThirtyTwoBytesZZ get_chain_hashes() {
+               long ret = bindings.ChannelMessageHandler_get_chain_hashes(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_CVec_ChainHashZZ ret_hu_conv = org.ldk.structs.Option_CVec_ChainHashZZ.constr_from_ptr(ret);
+               org.ldk.structs.Option_CVec_ThirtyTwoBytesZZ ret_hu_conv = org.ldk.structs.Option_CVec_ThirtyTwoBytesZZ.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
                return ret_hu_conv;
        }
index 19300a5941a8564c96a4836dd6889442341743f8..a435ba6a8f6e3c94b603ed483081e40a90b4ff83 100644 (file)
@@ -47,9 +47,11 @@ public class ChannelMonitor : CommonBase {
         * Serialize the ChannelMonitor object into a byte array which can be read by ChannelMonitor_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ChannelMonitor_write(this.ptr);
+               long ret = bindings.ChannelMonitor_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -87,11 +89,11 @@ public class ChannelMonitor : CommonBase {
        /**
         * Gets the funding transaction outpoint of the channel this ChannelMonitor is monitoring for.
         */
-       public TwoTuple_OutPointScriptZ get_funding_txo() {
+       public TwoTuple_OutPointCVec_u8ZZ get_funding_txo() {
                long ret = bindings.ChannelMonitor_get_funding_txo(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_OutPointScriptZ ret_hu_conv = new TwoTuple_OutPointScriptZ(null, ret);
+               TwoTuple_OutPointCVec_u8ZZ ret_hu_conv = new TwoTuple_OutPointCVec_u8ZZ(null, ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
                return ret_hu_conv;
        }
@@ -100,18 +102,20 @@ public class ChannelMonitor : CommonBase {
         * Gets a list of txids, with their output scripts (in the order they appear in the
         * transaction), which we must learn about spends of via block_connected().
         */
-       public TwoTuple_TxidCVec_C2Tuple_u32ScriptZZZ[] get_outputs_to_watch() {
-               long[] ret = bindings.ChannelMonitor_get_outputs_to_watch(this.ptr);
+       public TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ[] get_outputs_to_watch() {
+               long ret = bindings.ChannelMonitor_get_outputs_to_watch(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_40_len = ret.Length;
-               TwoTuple_TxidCVec_C2Tuple_u32ScriptZZZ[] ret_conv_40_arr = new TwoTuple_TxidCVec_C2Tuple_u32ScriptZZZ[ret_conv_40_len];
-               for (int o = 0; o < ret_conv_40_len; o++) {
-                       long ret_conv_40 = ret[o];
-                       TwoTuple_TxidCVec_C2Tuple_u32ScriptZZZ ret_conv_40_hu_conv = new TwoTuple_TxidCVec_C2Tuple_u32ScriptZZZ(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;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_52_len = InternalUtils.getArrayLength(ret);
+               TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ[] ret_conv_52_arr = new TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ[ret_conv_52_len];
+               for (int a = 0; a < ret_conv_52_len; a++) {
+                       long ret_conv_52 = InternalUtils.getU64ArrayElem(ret, a);
+                       TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ ret_conv_52_hu_conv = new TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ(null, ret_conv_52);
+                       if (ret_conv_52_hu_conv != null) { ret_conv_52_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_52_arr[a] = ret_conv_52_hu_conv;
                }
-               return ret_conv_40_arr;
+               bindings.free_buffer(ret);
+               return ret_conv_52_arr;
        }
 
        /**
@@ -131,16 +135,18 @@ public class ChannelMonitor : CommonBase {
         * ChannelManager via [`chain::Watch::release_pending_monitor_events`].
         */
        public MonitorEvent[] get_and_clear_pending_monitor_events() {
-               long[] ret = bindings.ChannelMonitor_get_and_clear_pending_monitor_events(this.ptr);
+               long ret = bindings.ChannelMonitor_get_and_clear_pending_monitor_events(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_14_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_14_len = InternalUtils.getArrayLength(ret);
                MonitorEvent[] ret_conv_14_arr = new MonitorEvent[ret_conv_14_len];
                for (int o = 0; o < ret_conv_14_len; o++) {
-                       long ret_conv_14 = ret[o];
+                       long ret_conv_14 = InternalUtils.getU64ArrayElem(ret, o);
                        org.ldk.structs.MonitorEvent ret_conv_14_hu_conv = org.ldk.structs.MonitorEvent.constr_from_ptr(ret_conv_14);
                        if (ret_conv_14_hu_conv != null) { ret_conv_14_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_14_arr[o] = ret_conv_14_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_14_arr;
        }
 
@@ -166,6 +172,102 @@ public class ChannelMonitor : CommonBase {
                if (this != null) { this.ptrs_to.AddLast(handler); };
        }
 
+       /**
+        * Gets the counterparty's initial commitment transaction. The returned commitment
+        * transaction is unsigned. This is intended to be called during the initial persistence of
+        * the monitor (inside an implementation of [`Persist::persist_new_channel`]), to allow for
+        * watchtowers in the persistence pipeline to have enough data to form justice transactions.
+        * 
+        * This is similar to [`Self::counterparty_commitment_txs_from_update`], except
+        * that for the initial commitment transaction, we don't have a corresponding update.
+        * 
+        * This will only return `Some` for channel monitors that have been created after upgrading
+        * to LDK 0.0.117+.
+        * 
+        * [`Persist::persist_new_channel`]: crate::chain::chainmonitor::Persist::persist_new_channel
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public CommitmentTransaction initial_counterparty_commitment_tx() {
+               long ret = bindings.ChannelMonitor_initial_counterparty_commitment_tx(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.CommitmentTransaction ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.CommitmentTransaction(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Gets all of the counterparty commitment transactions provided by the given update. This
+        * may be empty if the update doesn't include any new counterparty commitments. Returned
+        * commitment transactions are unsigned.
+        * 
+        * This is provided so that watchtower clients in the persistence pipeline are able to build
+        * justice transactions for each counterparty commitment upon each update. It's intended to be
+        * used within an implementation of [`Persist::update_persisted_channel`], which is provided
+        * with a monitor and an update. Once revoked, signing a justice transaction can be done using
+        * [`Self::sign_to_local_justice_tx`].
+        * 
+        * It is expected that a watchtower client may use this method to retrieve the latest counterparty
+        * commitment transaction(s), and then hold the necessary data until a later update in which
+        * the monitor has been updated with the corresponding revocation data, at which point the
+        * monitor can sign the justice transaction.
+        * 
+        * This will only return a non-empty list for monitor updates that have been created after
+        * upgrading to LDK 0.0.117+. Note that no restriction lies on the monitors themselves, which
+        * may have been created prior to upgrading.
+        * 
+        * [`Persist::update_persisted_channel`]: crate::chain::chainmonitor::Persist::update_persisted_channel
+        */
+       public CommitmentTransaction[] counterparty_commitment_txs_from_update(org.ldk.structs.ChannelMonitorUpdate update) {
+               long ret = bindings.ChannelMonitor_counterparty_commitment_txs_from_update(this.ptr, update == null ? 0 : update.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(update);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_23_len = InternalUtils.getArrayLength(ret);
+               CommitmentTransaction[] ret_conv_23_arr = new CommitmentTransaction[ret_conv_23_len];
+               for (int x = 0; x < ret_conv_23_len; x++) {
+                       long ret_conv_23 = InternalUtils.getU64ArrayElem(ret, x);
+                       org.ldk.structs.CommitmentTransaction ret_conv_23_hu_conv = null; if (ret_conv_23 < 0 || ret_conv_23 > 4096) { ret_conv_23_hu_conv = new org.ldk.structs.CommitmentTransaction(null, ret_conv_23); }
+                       if (ret_conv_23_hu_conv != null) { ret_conv_23_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_23_arr[x] = ret_conv_23_hu_conv;
+               }
+               bindings.free_buffer(ret);
+               if (this != null) { this.ptrs_to.AddLast(update); };
+               return ret_conv_23_arr;
+       }
+
+       /**
+        * Wrapper around [`EcdsaChannelSigner::sign_justice_revoked_output`] to make
+        * signing the justice transaction easier for implementors of
+        * [`chain::chainmonitor::Persist`]. On success this method returns the provided transaction
+        * signing the input at `input_idx`. This method will only produce a valid signature for
+        * a transaction spending the `to_local` output of a commitment transaction, i.e. this cannot
+        * be used for revoked HTLC outputs.
+        * 
+        * `Value` is the value of the output being spent by the input at `input_idx`, committed
+        * in the BIP 143 signature.
+        * 
+        * This method will only succeed if this monitor has received the revocation secret for the
+        * provided `commitment_number`. If a commitment number is provided that does not correspond
+        * 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
+        * [`Persist`]: crate::chain::chainmonitor::Persist
+        */
+       public Result_TransactionNoneZ sign_to_local_justice_tx(byte[] justice_tx, long input_idx, long value, long commitment_number) {
+               long ret = bindings.ChannelMonitor_sign_to_local_justice_tx(this.ptr, InternalUtils.encodeUint8Array(justice_tx), input_idx, value, commitment_number);
+               GC.KeepAlive(this);
+               GC.KeepAlive(justice_tx);
+               GC.KeepAlive(input_idx);
+               GC.KeepAlive(value);
+               GC.KeepAlive(commitment_number);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_TransactionNoneZ ret_hu_conv = Result_TransactionNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
        /**
         * Gets the `node_id` of the counterparty for this channel.
         * 
@@ -175,34 +277,44 @@ public class ChannelMonitor : CommonBase {
         * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public byte[] get_counterparty_node_id() {
-               byte[] ret = bindings.ChannelMonitor_get_counterparty_node_id(this.ptr);
+               long ret = bindings.ChannelMonitor_get_counterparty_node_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
-        * Used by ChannelManager deserialization to broadcast the latest holder state if its copy of
-        * the Channel was out-of-date.
+        * Used by [`ChannelManager`] deserialization to broadcast the latest holder state if its copy
+        * of the channel state was out-of-date.
         * 
         * You may also use this to broadcast the latest local commitment transaction, either because
-        * a monitor update failed with [`ChannelMonitorUpdateStatus::PermanentFailure`] or because we've
-        * fallen behind (i.e. we've received proof that our counterparty side knows a revocation
-        * secret we gave them that they shouldn't know).
+        * a monitor update failed or because we've fallen behind (i.e. we've received proof that our
+        * counterparty side knows a revocation secret we gave them that they shouldn't know).
         * 
         * Broadcasting these transactions in the second case is UNSAFE, as they allow counterparty
         * side to punish you. Nevertheless you may want to broadcast them if counterparty doesn't
         * close channel with their commitment transaction after a substantial amount of time. Best
         * may be to contact the other node operator out-of-band to coordinate other options available
-        * to you. In any-case, the choice is up to you.
+        * to you.
         * 
-        * [`ChannelMonitorUpdateStatus::PermanentFailure`]: super::ChannelMonitorUpdateStatus::PermanentFailure
+        * [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
         */
        public byte[][] get_latest_holder_commitment_txn(org.ldk.structs.Logger logger) {
-               byte[][] ret = bindings.ChannelMonitor_get_latest_holder_commitment_txn(this.ptr, logger.ptr);
+               long ret = bindings.ChannelMonitor_get_latest_holder_commitment_txn(this.ptr, logger.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(logger);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_8_len = InternalUtils.getArrayLength(ret);
+               byte[][] ret_conv_8_arr = new byte[ret_conv_8_len][];
+               for (int i = 0; i < ret_conv_8_len; i++) {
+                       long ret_conv_8 = InternalUtils.getU64ArrayElem(ret, i);
+                       byte[] ret_conv_8_conv = InternalUtils.decodeUint8Array(ret_conv_8);
+                       ret_conv_8_arr[i] = ret_conv_8_conv;
+               }
+               bindings.free_buffer(ret);
                if (this != null) { this.ptrs_to.AddLast(logger); };
-               return ret;
+               return ret_conv_8_arr;
        }
 
        /**
@@ -218,8 +330,8 @@ public class ChannelMonitor : CommonBase {
         * 
         * [`get_outputs_to_watch`]: #method.get_outputs_to_watch
         */
-       public TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ[] block_connected(byte[] header, TwoTuple_usizeTransactionZ[] txdata, int height, org.ldk.structs.BroadcasterInterface broadcaster, org.ldk.structs.FeeEstimator fee_estimator, org.ldk.structs.Logger logger) {
-               long[] ret = bindings.ChannelMonitor_block_connected(this.ptr, InternalUtils.check_arr_len(header, 80), txdata != null ? InternalUtils.mapArray(txdata, txdata_conv_28 => txdata_conv_28 != null ? txdata_conv_28.ptr : 0) : null, height, broadcaster.ptr, fee_estimator.ptr, logger.ptr);
+       public TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ[] block_connected(byte[] header, TwoTuple_usizeTransactionZ[] txdata, int height, org.ldk.structs.BroadcasterInterface broadcaster, org.ldk.structs.FeeEstimator fee_estimator, org.ldk.structs.Logger logger) {
+               long ret = bindings.ChannelMonitor_block_connected(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(header, 80)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(txdata, txdata_conv_28 => txdata_conv_28 != null ? txdata_conv_28.ptr : 0)), height, broadcaster.ptr, fee_estimator.ptr, logger.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(header);
                GC.KeepAlive(txdata);
@@ -227,18 +339,20 @@ public class ChannelMonitor : CommonBase {
                GC.KeepAlive(broadcaster);
                GC.KeepAlive(fee_estimator);
                GC.KeepAlive(logger);
-               int ret_conv_39_len = ret.Length;
-               TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ[] ret_conv_39_arr = new TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ[ret_conv_39_len];
-               for (int n = 0; n < ret_conv_39_len; n++) {
-                       long ret_conv_39 = ret[n];
-                       TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ ret_conv_39_hu_conv = new TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ(null, ret_conv_39);
-                       if (ret_conv_39_hu_conv != null) { ret_conv_39_hu_conv.ptrs_to.AddLast(this); };
-                       ret_conv_39_arr[n] = ret_conv_39_hu_conv;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_49_len = InternalUtils.getArrayLength(ret);
+               TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ[] ret_conv_49_arr = new TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ[ret_conv_49_len];
+               for (int x = 0; x < ret_conv_49_len; x++) {
+                       long ret_conv_49 = InternalUtils.getU64ArrayElem(ret, x);
+                       TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ ret_conv_49_hu_conv = new TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ(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;
                }
+               bindings.free_buffer(ret);
                if (this != null) { this.ptrs_to.AddLast(broadcaster); };
                if (this != null) { this.ptrs_to.AddLast(fee_estimator); };
                if (this != null) { this.ptrs_to.AddLast(logger); };
-               return ret_conv_39_arr;
+               return ret_conv_49_arr;
        }
 
        /**
@@ -246,7 +360,7 @@ public class ChannelMonitor : CommonBase {
         * appropriately.
         */
        public void block_disconnected(byte[] header, int height, org.ldk.structs.BroadcasterInterface broadcaster, org.ldk.structs.FeeEstimator fee_estimator, org.ldk.structs.Logger logger) {
-               bindings.ChannelMonitor_block_disconnected(this.ptr, InternalUtils.check_arr_len(header, 80), height, broadcaster.ptr, fee_estimator.ptr, logger.ptr);
+               bindings.ChannelMonitor_block_disconnected(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(header, 80)), height, broadcaster.ptr, fee_estimator.ptr, logger.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(header);
                GC.KeepAlive(height);
@@ -267,8 +381,8 @@ public class ChannelMonitor : CommonBase {
         * 
         * [`block_connected`]: Self::block_connected
         */
-       public TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ[] transactions_confirmed(byte[] header, TwoTuple_usizeTransactionZ[] txdata, int height, org.ldk.structs.BroadcasterInterface broadcaster, org.ldk.structs.FeeEstimator fee_estimator, org.ldk.structs.Logger logger) {
-               long[] ret = bindings.ChannelMonitor_transactions_confirmed(this.ptr, InternalUtils.check_arr_len(header, 80), txdata != null ? InternalUtils.mapArray(txdata, txdata_conv_28 => txdata_conv_28 != null ? txdata_conv_28.ptr : 0) : null, height, broadcaster.ptr, fee_estimator.ptr, logger.ptr);
+       public TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ[] transactions_confirmed(byte[] header, TwoTuple_usizeTransactionZ[] txdata, int height, org.ldk.structs.BroadcasterInterface broadcaster, org.ldk.structs.FeeEstimator fee_estimator, org.ldk.structs.Logger logger) {
+               long ret = bindings.ChannelMonitor_transactions_confirmed(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(header, 80)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(txdata, txdata_conv_28 => txdata_conv_28 != null ? txdata_conv_28.ptr : 0)), height, broadcaster.ptr, fee_estimator.ptr, logger.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(header);
                GC.KeepAlive(txdata);
@@ -276,18 +390,20 @@ public class ChannelMonitor : CommonBase {
                GC.KeepAlive(broadcaster);
                GC.KeepAlive(fee_estimator);
                GC.KeepAlive(logger);
-               int ret_conv_39_len = ret.Length;
-               TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ[] ret_conv_39_arr = new TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ[ret_conv_39_len];
-               for (int n = 0; n < ret_conv_39_len; n++) {
-                       long ret_conv_39 = ret[n];
-                       TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ ret_conv_39_hu_conv = new TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ(null, ret_conv_39);
-                       if (ret_conv_39_hu_conv != null) { ret_conv_39_hu_conv.ptrs_to.AddLast(this); };
-                       ret_conv_39_arr[n] = ret_conv_39_hu_conv;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_49_len = InternalUtils.getArrayLength(ret);
+               TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ[] ret_conv_49_arr = new TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ[ret_conv_49_len];
+               for (int x = 0; x < ret_conv_49_len; x++) {
+                       long ret_conv_49 = InternalUtils.getU64ArrayElem(ret, x);
+                       TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ ret_conv_49_hu_conv = new TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ(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;
                }
+               bindings.free_buffer(ret);
                if (this != null) { this.ptrs_to.AddLast(broadcaster); };
                if (this != null) { this.ptrs_to.AddLast(fee_estimator); };
                if (this != null) { this.ptrs_to.AddLast(logger); };
-               return ret_conv_39_arr;
+               return ret_conv_49_arr;
        }
 
        /**
@@ -299,7 +415,7 @@ public class ChannelMonitor : CommonBase {
         * [`block_disconnected`]: Self::block_disconnected
         */
        public void transaction_unconfirmed(byte[] txid, org.ldk.structs.BroadcasterInterface broadcaster, org.ldk.structs.FeeEstimator fee_estimator, org.ldk.structs.Logger logger) {
-               bindings.ChannelMonitor_transaction_unconfirmed(this.ptr, InternalUtils.check_arr_len(txid, 32), broadcaster.ptr, fee_estimator.ptr, logger.ptr);
+               bindings.ChannelMonitor_transaction_unconfirmed(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(txid, 32)), broadcaster.ptr, fee_estimator.ptr, logger.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(txid);
                GC.KeepAlive(broadcaster);
@@ -319,43 +435,47 @@ public class ChannelMonitor : CommonBase {
         * 
         * [`block_connected`]: Self::block_connected
         */
-       public TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ[] best_block_updated(byte[] header, int height, org.ldk.structs.BroadcasterInterface broadcaster, org.ldk.structs.FeeEstimator fee_estimator, org.ldk.structs.Logger logger) {
-               long[] ret = bindings.ChannelMonitor_best_block_updated(this.ptr, InternalUtils.check_arr_len(header, 80), height, broadcaster.ptr, fee_estimator.ptr, logger.ptr);
+       public TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ[] best_block_updated(byte[] header, int height, org.ldk.structs.BroadcasterInterface broadcaster, org.ldk.structs.FeeEstimator fee_estimator, org.ldk.structs.Logger logger) {
+               long ret = bindings.ChannelMonitor_best_block_updated(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(header, 80)), height, broadcaster.ptr, fee_estimator.ptr, logger.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(header);
                GC.KeepAlive(height);
                GC.KeepAlive(broadcaster);
                GC.KeepAlive(fee_estimator);
                GC.KeepAlive(logger);
-               int ret_conv_39_len = ret.Length;
-               TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ[] ret_conv_39_arr = new TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ[ret_conv_39_len];
-               for (int n = 0; n < ret_conv_39_len; n++) {
-                       long ret_conv_39 = ret[n];
-                       TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ ret_conv_39_hu_conv = new TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ(null, ret_conv_39);
-                       if (ret_conv_39_hu_conv != null) { ret_conv_39_hu_conv.ptrs_to.AddLast(this); };
-                       ret_conv_39_arr[n] = ret_conv_39_hu_conv;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_49_len = InternalUtils.getArrayLength(ret);
+               TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ[] ret_conv_49_arr = new TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ[ret_conv_49_len];
+               for (int x = 0; x < ret_conv_49_len; x++) {
+                       long ret_conv_49 = InternalUtils.getU64ArrayElem(ret, x);
+                       TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ ret_conv_49_hu_conv = new TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ(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;
                }
+               bindings.free_buffer(ret);
                if (this != null) { this.ptrs_to.AddLast(broadcaster); };
                if (this != null) { this.ptrs_to.AddLast(fee_estimator); };
                if (this != null) { this.ptrs_to.AddLast(logger); };
-               return ret_conv_39_arr;
+               return ret_conv_49_arr;
        }
 
        /**
         * Returns the set of txids that should be monitored for re-organization out of the chain.
         */
-       public TwoTuple_TxidCOption_BlockHashZZ[] get_relevant_txids() {
-               long[] ret = bindings.ChannelMonitor_get_relevant_txids(this.ptr);
+       public TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ[] get_relevant_txids() {
+               long ret = bindings.ChannelMonitor_get_relevant_txids(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_34_len = ret.Length;
-               TwoTuple_TxidCOption_BlockHashZZ[] ret_conv_34_arr = new TwoTuple_TxidCOption_BlockHashZZ[ret_conv_34_len];
-               for (int i = 0; i < ret_conv_34_len; i++) {
-                       long ret_conv_34 = ret[i];
-                       TwoTuple_TxidCOption_BlockHashZZ ret_conv_34_hu_conv = new TwoTuple_TxidCOption_BlockHashZZ(null, ret_conv_34);
-                       if (ret_conv_34_hu_conv != null) { ret_conv_34_hu_conv.ptrs_to.AddLast(this); };
-                       ret_conv_34_arr[i] = ret_conv_34_hu_conv;
+               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;
                }
-               return ret_conv_34_arr;
+               bindings.free_buffer(ret);
+               return ret_conv_49_arr;
        }
 
        /**
@@ -389,6 +509,44 @@ public class ChannelMonitor : CommonBase {
                if (this != null) { this.ptrs_to.AddLast(logger); };
        }
 
+       /**
+        * Returns the descriptors for relevant outputs (i.e., those that we can spend) within the
+        * transaction if they exist and the transaction has at least [`ANTI_REORG_DELAY`]
+        * confirmations. For [`SpendableOutputDescriptor::DelayedPaymentOutput`] descriptors to be
+        * returned, the transaction must have at least `max(ANTI_REORG_DELAY, to_self_delay)`
+        * confirmations.
+        * 
+        * Descriptors returned by this method are primarily exposed via [`Event::SpendableOutputs`]
+        * once they are no longer under reorg risk. This method serves as a way to retrieve these
+        * descriptors at a later time, either for historical purposes, or to replay any
+        * missed/unhandled descriptors. For the purpose of gathering historical records, if the
+        * channel close has fully resolved (i.e., [`ChannelMonitor::get_claimable_balances`] returns
+        * an empty set), you can retrieve all spendable outputs by providing all descendant spending
+        * transactions starting from the channel's funding transaction and going down three levels.
+        * 
+        * `tx` is a transaction we'll scan the outputs of. Any transaction can be provided. If any
+        * outputs which can be spent by us are found, at least one descriptor is returned.
+        * 
+        * `confirmation_height` must be the height of the block in which `tx` was included in.
+        */
+       public SpendableOutputDescriptor[] get_spendable_outputs(byte[] tx, int confirmation_height) {
+               long ret = bindings.ChannelMonitor_get_spendable_outputs(this.ptr, InternalUtils.encodeUint8Array(tx), confirmation_height);
+               GC.KeepAlive(this);
+               GC.KeepAlive(tx);
+               GC.KeepAlive(confirmation_height);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_27_len = InternalUtils.getArrayLength(ret);
+               SpendableOutputDescriptor[] ret_conv_27_arr = new SpendableOutputDescriptor[ret_conv_27_len];
+               for (int b = 0; b < ret_conv_27_len; b++) {
+                       long ret_conv_27 = InternalUtils.getU64ArrayElem(ret, b);
+                       org.ldk.structs.SpendableOutputDescriptor ret_conv_27_hu_conv = org.ldk.structs.SpendableOutputDescriptor.constr_from_ptr(ret_conv_27);
+                       if (ret_conv_27_hu_conv != null) { ret_conv_27_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_27_arr[b] = ret_conv_27_hu_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_27_arr;
+       }
+
        /**
         * Gets the balances in this channel which are either claimable by us if we were to
         * force-close the channel now or which are claimable on-chain (possibly awaiting
@@ -400,23 +558,24 @@ public class ChannelMonitor : CommonBase {
         * confirmations on the claim transaction.
         * 
         * Note that for `ChannelMonitors` which track a channel which went on-chain with versions of
-        * LDK prior to 0.0.111, balances may not be fully captured if our counterparty broadcasted
-        * a revoked state.
+        * LDK prior to 0.0.111, not all or excess balances may be included.
         * 
         * See [`Balance`] for additional details on the types of claimable balances which
         * may be returned here and their meanings.
         */
        public Balance[] get_claimable_balances() {
-               long[] ret = bindings.ChannelMonitor_get_claimable_balances(this.ptr);
+               long ret = bindings.ChannelMonitor_get_claimable_balances(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_9_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_9_len = InternalUtils.getArrayLength(ret);
                Balance[] ret_conv_9_arr = new Balance[ret_conv_9_len];
                for (int j = 0; j < ret_conv_9_len; j++) {
-                       long ret_conv_9 = ret[j];
+                       long ret_conv_9 = InternalUtils.getU64ArrayElem(ret, j);
                        org.ldk.structs.Balance ret_conv_9_hu_conv = org.ldk.structs.Balance.constr_from_ptr(ret_conv_9);
                        if (ret_conv_9_hu_conv != null) { ret_conv_9_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_9_arr[j] = ret_conv_9_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_9_arr;
        }
 
index 20b4eb3750bc327932c9d264b61879eddd2d211b..cc3bd5d1abe9b1e076343b7474a51100d90b31b6 100644 (file)
@@ -106,16 +106,18 @@ public class ChannelMonitorUpdate : CommonBase {
         * Serialize the ChannelMonitorUpdate object into a byte array which can be read by ChannelMonitorUpdate_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ChannelMonitorUpdate_write(this.ptr);
+               long ret = bindings.ChannelMonitorUpdate_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ChannelMonitorUpdate from a byte array, created by ChannelMonitorUpdate_write
         */
        public static Result_ChannelMonitorUpdateDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ChannelMonitorUpdate_read(ser);
+               long ret = bindings.ChannelMonitorUpdate_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ChannelMonitorUpdateDecodeErrorZ ret_hu_conv = Result_ChannelMonitorUpdateDecodeErrorZ.constr_from_ptr(ret);
index 4040b54d07274cbb53334474dc449dec5f71c777..347c8cf13781dfd9f6bdd6d3cdbad146003b7138 100644 (file)
@@ -20,9 +20,11 @@ public class ChannelPublicKeys : CommonBase {
         * on-chain channel lock-in 2-of-2 multisig output.
         */
        public byte[] get_funding_pubkey() {
-               byte[] ret = bindings.ChannelPublicKeys_get_funding_pubkey(this.ptr);
+               long ret = bindings.ChannelPublicKeys_get_funding_pubkey(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -30,7 +32,7 @@ public class ChannelPublicKeys : CommonBase {
         * on-chain channel lock-in 2-of-2 multisig output.
         */
        public void set_funding_pubkey(byte[] val) {
-               bindings.ChannelPublicKeys_set_funding_pubkey(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.ChannelPublicKeys_set_funding_pubkey(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -42,9 +44,11 @@ public class ChannelPublicKeys : CommonBase {
         * states.
         */
        public byte[] get_revocation_basepoint() {
-               byte[] ret = bindings.ChannelPublicKeys_get_revocation_basepoint(this.ptr);
+               long ret = bindings.ChannelPublicKeys_get_revocation_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -54,7 +58,7 @@ public class ChannelPublicKeys : CommonBase {
         * states.
         */
        public void set_revocation_basepoint(byte[] val) {
-               bindings.ChannelPublicKeys_set_revocation_basepoint(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.ChannelPublicKeys_set_revocation_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -65,9 +69,11 @@ public class ChannelPublicKeys : CommonBase {
         * static across every commitment transaction.
         */
        public byte[] get_payment_point() {
-               byte[] ret = bindings.ChannelPublicKeys_get_payment_point(this.ptr);
+               long ret = bindings.ChannelPublicKeys_get_payment_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -76,7 +82,7 @@ public class ChannelPublicKeys : CommonBase {
         * static across every commitment transaction.
         */
        public void set_payment_point(byte[] val) {
-               bindings.ChannelPublicKeys_set_payment_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.ChannelPublicKeys_set_payment_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -87,9 +93,11 @@ public class ChannelPublicKeys : CommonBase {
         * after some delay (or can be claimed via the revocation path).
         */
        public byte[] get_delayed_payment_basepoint() {
-               byte[] ret = bindings.ChannelPublicKeys_get_delayed_payment_basepoint(this.ptr);
+               long ret = bindings.ChannelPublicKeys_get_delayed_payment_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -98,7 +106,7 @@ public class ChannelPublicKeys : CommonBase {
         * 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.check_arr_len(val, 33));
+               bindings.ChannelPublicKeys_set_delayed_payment_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -108,9 +116,11 @@ public class ChannelPublicKeys : CommonBase {
         * which is used to encumber HTLC-in-flight outputs.
         */
        public byte[] get_htlc_basepoint() {
-               byte[] ret = bindings.ChannelPublicKeys_get_htlc_basepoint(this.ptr);
+               long ret = bindings.ChannelPublicKeys_get_htlc_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -118,7 +128,7 @@ public class ChannelPublicKeys : CommonBase {
         * which is used to encumber HTLC-in-flight outputs.
         */
        public void set_htlc_basepoint(byte[] val) {
-               bindings.ChannelPublicKeys_set_htlc_basepoint(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.ChannelPublicKeys_set_htlc_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -127,7 +137,7 @@ public class ChannelPublicKeys : CommonBase {
         * 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.check_arr_len(funding_pubkey_arg, 33), InternalUtils.check_arr_len(revocation_basepoint_arg, 33), InternalUtils.check_arr_len(payment_point_arg, 33), InternalUtils.check_arr_len(delayed_payment_basepoint_arg, 33), InternalUtils.check_arr_len(htlc_basepoint_arg, 33));
+               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)));
                GC.KeepAlive(funding_pubkey_arg);
                GC.KeepAlive(revocation_basepoint_arg);
                GC.KeepAlive(payment_point_arg);
@@ -157,6 +167,18 @@ public class ChannelPublicKeys : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the ChannelPublicKeys.
+        */
+       public long hash() {
+               long ret = bindings.ChannelPublicKeys_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two ChannelPublicKeyss contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
@@ -178,16 +200,18 @@ public class ChannelPublicKeys : CommonBase {
         * Serialize the ChannelPublicKeys object into a byte array which can be read by ChannelPublicKeys_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ChannelPublicKeys_write(this.ptr);
+               long ret = bindings.ChannelPublicKeys_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ChannelPublicKeys from a byte array, created by ChannelPublicKeys_write
         */
        public static Result_ChannelPublicKeysDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ChannelPublicKeys_read(ser);
+               long ret = bindings.ChannelPublicKeys_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ChannelPublicKeysDecodeErrorZ ret_hu_conv = Result_ChannelPublicKeysDecodeErrorZ.constr_from_ptr(ret);
index 2fb90c2a1d850b1c36591549990b53163f571839..dca74b7536cf1017caab71d943540a8c90a41fec 100644 (file)
@@ -21,16 +21,18 @@ public class ChannelReady : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.ChannelReady_get_channel_id(this.ptr);
+               long ret = bindings.ChannelReady_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.ChannelReady_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.ChannelReady_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -39,16 +41,18 @@ public class ChannelReady : CommonBase {
         * The per-commitment point of the second commitment transaction
         */
        public byte[] get_next_per_commitment_point() {
-               byte[] ret = bindings.ChannelReady_get_next_per_commitment_point(this.ptr);
+               long ret = bindings.ChannelReady_get_next_per_commitment_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The per-commitment point of the second commitment transaction
         */
        public void set_next_per_commitment_point(byte[] val) {
-               bindings.ChannelReady_set_next_per_commitment_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.ChannelReady_set_next_per_commitment_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -85,7 +89,7 @@ public class ChannelReady : CommonBase {
         * Constructs a new ChannelReady given each field
         */
        public static ChannelReady of(byte[] channel_id_arg, byte[] next_per_commitment_point_arg, org.ldk.structs.Option_u64Z short_channel_id_alias_arg) {
-               long ret = bindings.ChannelReady_new(InternalUtils.check_arr_len(channel_id_arg, 32), InternalUtils.check_arr_len(next_per_commitment_point_arg, 33), short_channel_id_alias_arg.ptr);
+               long ret = bindings.ChannelReady_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(next_per_commitment_point_arg, 33)), short_channel_id_alias_arg.ptr);
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(next_per_commitment_point_arg);
                GC.KeepAlive(short_channel_id_alias_arg);
@@ -135,16 +139,18 @@ public class ChannelReady : CommonBase {
         * Serialize the ChannelReady object into a byte array which can be read by ChannelReady_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ChannelReady_write(this.ptr);
+               long ret = bindings.ChannelReady_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ChannelReady from a byte array, created by ChannelReady_write
         */
        public static Result_ChannelReadyDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ChannelReady_read(ser);
+               long ret = bindings.ChannelReady_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ChannelReadyDecodeErrorZ ret_hu_conv = Result_ChannelReadyDecodeErrorZ.constr_from_ptr(ret);
index 9218cd62779c0bffe66bd6fa1f0be147204621b6..b070cceb1eff6e306e6d8be49d2ae48435fa2343 100644 (file)
@@ -21,16 +21,18 @@ public class ChannelReestablish : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.ChannelReestablish_get_channel_id(this.ptr);
+               long ret = bindings.ChannelReestablish_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.ChannelReestablish_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.ChannelReestablish_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -76,9 +78,11 @@ public class ChannelReestablish : CommonBase {
         * belonging to the recipient
         */
        public byte[] get_your_last_per_commitment_secret() {
-               byte[] ret = bindings.ChannelReestablish_get_your_last_per_commitment_secret(this.ptr);
+               long ret = bindings.ChannelReestablish_get_your_last_per_commitment_secret(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -86,7 +90,7 @@ public class ChannelReestablish : CommonBase {
         * belonging to the recipient
         */
        public void set_your_last_per_commitment_secret(byte[] val) {
-               bindings.ChannelReestablish_set_your_last_per_commitment_secret(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.ChannelReestablish_set_your_last_per_commitment_secret(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -95,16 +99,18 @@ public class ChannelReestablish : CommonBase {
         * The sender's per-commitment point for their current commitment transaction
         */
        public byte[] get_my_current_per_commitment_point() {
-               byte[] ret = bindings.ChannelReestablish_get_my_current_per_commitment_point(this.ptr);
+               long ret = bindings.ChannelReestablish_get_my_current_per_commitment_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The sender's per-commitment point for their current commitment transaction
         */
        public void set_my_current_per_commitment_point(byte[] val) {
-               bindings.ChannelReestablish_set_my_current_per_commitment_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.ChannelReestablish_set_my_current_per_commitment_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -112,11 +118,11 @@ public class ChannelReestablish : CommonBase {
        /**
         * The next funding transaction ID
         */
-       public Option_TxidZ get_next_funding_txid() {
+       public Option_ThirtyTwoBytesZ get_next_funding_txid() {
                long ret = bindings.ChannelReestablish_get_next_funding_txid(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_TxidZ ret_hu_conv = org.ldk.structs.Option_TxidZ.constr_from_ptr(ret);
+               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;
        }
@@ -124,7 +130,7 @@ public class ChannelReestablish : CommonBase {
        /**
         * The next funding transaction ID
         */
-       public void set_next_funding_txid(org.ldk.structs.Option_TxidZ val) {
+       public void set_next_funding_txid(org.ldk.structs.Option_ThirtyTwoBytesZ val) {
                bindings.ChannelReestablish_set_next_funding_txid(this.ptr, val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
@@ -134,8 +140,8 @@ public class ChannelReestablish : CommonBase {
        /**
         * Constructs a new ChannelReestablish given each field
         */
-       public static ChannelReestablish of(byte[] channel_id_arg, long next_local_commitment_number_arg, long next_remote_commitment_number_arg, byte[] your_last_per_commitment_secret_arg, byte[] my_current_per_commitment_point_arg, org.ldk.structs.Option_TxidZ next_funding_txid_arg) {
-               long ret = bindings.ChannelReestablish_new(InternalUtils.check_arr_len(channel_id_arg, 32), next_local_commitment_number_arg, next_remote_commitment_number_arg, InternalUtils.check_arr_len(your_last_per_commitment_secret_arg, 32), InternalUtils.check_arr_len(my_current_per_commitment_point_arg, 33), next_funding_txid_arg.ptr);
+       public static ChannelReestablish of(byte[] channel_id_arg, long next_local_commitment_number_arg, long next_remote_commitment_number_arg, byte[] your_last_per_commitment_secret_arg, byte[] my_current_per_commitment_point_arg, org.ldk.structs.Option_ThirtyTwoBytesZ next_funding_txid_arg) {
+               long ret = bindings.ChannelReestablish_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), next_local_commitment_number_arg, next_remote_commitment_number_arg, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(your_last_per_commitment_secret_arg, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(my_current_per_commitment_point_arg, 33)), next_funding_txid_arg.ptr);
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(next_local_commitment_number_arg);
                GC.KeepAlive(next_remote_commitment_number_arg);
@@ -188,16 +194,18 @@ public class ChannelReestablish : CommonBase {
         * Serialize the ChannelReestablish object into a byte array which can be read by ChannelReestablish_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ChannelReestablish_write(this.ptr);
+               long ret = bindings.ChannelReestablish_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ChannelReestablish from a byte array, created by ChannelReestablish_write
         */
        public static Result_ChannelReestablishDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ChannelReestablish_read(ser);
+               long ret = bindings.ChannelReestablish_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ChannelReestablishDecodeErrorZ ret_hu_conv = Result_ChannelReestablishDecodeErrorZ.constr_from_ptr(ret);
index 24f3b17b85b7f3d02fbef1be79b867f5dfd39884..e3ab4bdef0f8350c1dc7a367e034447aa91b5a63 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,102 +6,107 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of ChannelSigner */
+public interface ChannelSignerInterface {
+       /**Gets the per-commitment point for a specific commitment number
+        * 
+        * Note that the commitment number starts at `(1 << 48) - 1` and counts backwards.
+        */
+       byte[] get_per_commitment_point(long idx);
+       /**Gets the commitment secret for a specific commitment number as part of the revocation process
+        * 
+        * An external signer implementation should error here if the commitment was already signed
+        * and should refuse to sign it in the future.
+        * 
+        * May be called more than once for the same index.
+        * 
+        * Note that the commitment number starts at `(1 << 48) - 1` and counts backwards.
+        */
+       byte[] release_commitment_secret(long idx);
+       /**Validate the counterparty's signatures on the holder commitment transaction and HTLCs.
+        * 
+        * This is required in order for the signer to make sure that releasing a commitment
+        * secret won't leave us without a broadcastable holder transaction.
+        * 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.
+        * 
+        * 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);
+       /**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.
+        */
+       byte[] channel_keys_id();
+       /**Set the counterparty static channel data, including basepoints,
+        * `counterparty_selected`/`holder_selected_contest_delay` and funding outpoint.
+        * 
+        * This data is static, and will never change for a channel once set. For a given [`ChannelSigner`]
+        * instance, LDK will call this method exactly once - either immediately after construction
+        * (not including if done via [`SignerProvider::read_chan_signer`]) or when the funding
+        * information has been generated.
+        * 
+        * channel_parameters.is_populated() MUST be true.
+        */
+       void provide_channel_parameters(ChannelTransactionParameters channel_parameters);
+}
+
 /**
  * A trait to handle Lightning channel key material without concretizing the channel type or
  * the signature mechanism.
  */
 public class ChannelSigner : CommonBase {
-       internal readonly bindings.LDKChannelSigner bindings_instance;
+       internal bindings.LDKChannelSigner bindings_instance;
+       internal long instance_idx;
+
        internal ChannelSigner(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private ChannelSigner(bindings.LDKChannelSigner arg, ChannelPublicKeys pubkeys) : base(bindings.LDKChannelSigner_new(arg, pubkeys == null ? 0 : pubkeys.clone_ptr())) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~ChannelSigner() {
                if (ptr != 0) { bindings.ChannelSigner_free(ptr); }
        }
 
-       public interface ChannelSignerInterface {
-               /**
-                * Gets the per-commitment point for a specific commitment number
-                * 
-                * Note that the commitment number starts at `(1 << 48) - 1` and counts backwards.
-                */
-               byte[] get_per_commitment_point(long _idx);
-               /**
-                * Gets the commitment secret for a specific commitment number as part of the revocation process
-                * 
-                * An external signer implementation should error here if the commitment was already signed
-                * and should refuse to sign it in the future.
-                * 
-                * May be called more than once for the same index.
-                * 
-                * Note that the commitment number starts at `(1 << 48) - 1` and counts backwards.
-                */
-               byte[] release_commitment_secret(long _idx);
-               /**
-                * Validate the counterparty's signatures on the holder commitment transaction and HTLCs.
-                * 
-                * This is required in order for the signer to make sure that releasing a commitment
-                * secret won't leave us without a broadcastable holder transaction.
-                * 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.
-                * 
-                * 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);
-               /**
-                * 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.
-                */
-               byte[] channel_keys_id();
-               /**
-                * Set the counterparty static channel data, including basepoints,
-                * `counterparty_selected`/`holder_selected_contest_delay` and funding outpoint.
-                * 
-                * This data is static, and will never change for a channel once set. For a given [`ChannelSigner`]
-                * instance, LDK will call this method exactly once - either immediately after construction
-                * (not including if done via [`SignerProvider::read_chan_signer`]) or when the funding
-                * information has been generated.
-                * 
-                * channel_parameters.is_populated() MUST be true.
-                */
-               void provide_channel_parameters(ChannelTransactionParameters _channel_parameters);
-       }
        private class LDKChannelSignerHolder { internal ChannelSigner held; }
        private class LDKChannelSignerImpl : bindings.LDKChannelSigner {
                internal LDKChannelSignerImpl(ChannelSignerInterface arg, LDKChannelSignerHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private ChannelSignerInterface arg;
                private LDKChannelSignerHolder impl_holder;
-               public byte[] get_per_commitment_point(long _idx) {
+               public long get_per_commitment_point(long _idx) {
                        byte[] ret = arg.get_per_commitment_point(_idx);
                                GC.KeepAlive(arg);
-                       byte[] result = InternalUtils.check_arr_len(ret, 33);
+                       long result = InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(ret, 33));
                        return result;
                }
-               public byte[] release_commitment_secret(long _idx) {
+               public long release_commitment_secret(long _idx) {
                        byte[] ret = arg.release_commitment_secret(_idx);
                                GC.KeepAlive(arg);
-                       byte[] result = InternalUtils.check_arr_len(ret, 32);
+                       long result = InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(ret, 32));
                        return result;
                }
-               public long validate_holder_commitment(long _holder_tx, byte[][] _preimages) {
+               public long validate_holder_commitment(long _holder_tx, long _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); }
-                       Result_NoneNoneZ ret = arg.validate_holder_commitment(_holder_tx_hu_conv, _preimages);
+                       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;
+                       }
+                       bindings.free_buffer(_preimages);
+                       Result_NoneNoneZ ret = arg.validate_holder_commitment(_holder_tx_hu_conv, _preimages_conv_8_arr);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public byte[] channel_keys_id() {
+               public long channel_keys_id() {
                        byte[] ret = arg.channel_keys_id();
                                GC.KeepAlive(arg);
-                       byte[] result = InternalUtils.check_arr_len(ret, 32);
+                       long result = InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(ret, 32));
                        return result;
                }
                public void provide_channel_parameters(long _channel_parameters) {
@@ -109,21 +115,31 @@ public class ChannelSigner : CommonBase {
                                GC.KeepAlive(arg);
                }
        }
+
+       /** Creates a new instance of ChannelSigner from a given implementation */
        public static ChannelSigner new_impl(ChannelSignerInterface arg, ChannelPublicKeys pubkeys) {
                LDKChannelSignerHolder impl_holder = new LDKChannelSignerHolder();
-               impl_holder.held = new ChannelSigner(new LDKChannelSignerImpl(arg, impl_holder), pubkeys);
+               LDKChannelSignerImpl impl = new LDKChannelSignerImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKChannelSigner_new(impl, pubkeys == null ? 0 : pubkeys.clone_ptr());
+
+               impl_holder.held = new ChannelSigner(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Gets the per-commitment point for a specific commitment number
         * 
         * Note that the commitment number starts at `(1 << 48) - 1` and counts backwards.
         */
        public byte[] get_per_commitment_point(long idx) {
-               byte[] ret = bindings.ChannelSigner_get_per_commitment_point(this.ptr, idx);
+               long ret = bindings.ChannelSigner_get_per_commitment_point(this.ptr, idx);
                GC.KeepAlive(this);
                GC.KeepAlive(idx);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -137,10 +153,12 @@ public class ChannelSigner : CommonBase {
         * Note that the commitment number starts at `(1 << 48) - 1` and counts backwards.
         */
        public byte[] release_commitment_secret(long idx) {
-               byte[] ret = bindings.ChannelSigner_release_commitment_secret(this.ptr, idx);
+               long ret = bindings.ChannelSigner_release_commitment_secret(this.ptr, idx);
                GC.KeepAlive(this);
                GC.KeepAlive(idx);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -159,7 +177,7 @@ public class ChannelSigner : CommonBase {
         * 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, preimages != null ? InternalUtils.mapArray(preimages, preimages_conv_8 => InternalUtils.check_arr_len(preimages_conv_8, 32)) : null);
+               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)))));
                GC.KeepAlive(this);
                GC.KeepAlive(holder_tx);
                GC.KeepAlive(preimages);
@@ -175,9 +193,11 @@ public class ChannelSigner : CommonBase {
         * [`EcdsaChannelSigner`] object uniquely and lookup or re-derive its keys.
         */
        public byte[] channel_keys_id() {
-               byte[] ret = bindings.ChannelSigner_channel_keys_id(this.ptr);
+               long ret = bindings.ChannelSigner_channel_keys_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
index 62a413c2498c207043a49014bf7fe77864ebe217..974dfe6b9bb612c979575b2fae6f3e055eb88634 100644 (file)
@@ -159,6 +159,9 @@ public class ChannelTransactionParameters : CommonBase {
 
        /**
         * Constructs a new ChannelTransactionParameters given each field
+        * 
+        * Note that counterparty_parameters_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
+        * Note that funding_outpoint_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public static ChannelTransactionParameters of(org.ldk.structs.ChannelPublicKeys holder_pubkeys_arg, short holder_selected_contest_delay_arg, bool is_outbound_from_holder_arg, org.ldk.structs.CounterpartyChannelTransactionParameters counterparty_parameters_arg, org.ldk.structs.OutPoint funding_outpoint_arg, org.ldk.structs.ChannelTypeFeatures channel_type_features_arg) {
                long ret = bindings.ChannelTransactionParameters_new(holder_pubkeys_arg == null ? 0 : holder_pubkeys_arg.ptr, holder_selected_contest_delay_arg, is_outbound_from_holder_arg, counterparty_parameters_arg == null ? 0 : counterparty_parameters_arg.ptr, funding_outpoint_arg == null ? 0 : funding_outpoint_arg.ptr, channel_type_features_arg == null ? 0 : channel_type_features_arg.ptr);
@@ -196,6 +199,18 @@ public class ChannelTransactionParameters : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the ChannelTransactionParameters.
+        */
+       public long hash() {
+               long ret = bindings.ChannelTransactionParameters_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two ChannelTransactionParameterss contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
@@ -256,16 +271,18 @@ public class ChannelTransactionParameters : CommonBase {
         * Serialize the ChannelTransactionParameters object into a byte array which can be read by ChannelTransactionParameters_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ChannelTransactionParameters_write(this.ptr);
+               long ret = bindings.ChannelTransactionParameters_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ChannelTransactionParameters from a byte array, created by ChannelTransactionParameters_write
         */
        public static Result_ChannelTransactionParametersDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ChannelTransactionParameters_read(ser);
+               long ret = bindings.ChannelTransactionParameters_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ChannelTransactionParametersDecodeErrorZ ret_hu_conv = Result_ChannelTransactionParametersDecodeErrorZ.constr_from_ptr(ret);
index 949cb55678f9c1ea2ea4d625287f4c858e52b6aa..b575a7fd1331bb1f98739af9af23ba7cac2ea992 100644 (file)
@@ -91,6 +91,42 @@ public class ChannelTypeFeatures : CommonBase {
                return ret;
        }
 
+       /**
+        * Sets a required feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Required bits are even. If an odd bit is given, then the corresponding even bit will
+        * be set instead (i.e., `bit - 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_required_feature_bit(long bit) {
+               long ret = bindings.ChannelTypeFeatures_set_required_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Sets an optional feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Optional bits are odd. If an even bit is given, then the corresponding odd bit will be
+        * set instead (i.e., `bit + 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_optional_feature_bit(long bit) {
+               long ret = bindings.ChannelTypeFeatures_set_optional_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
        /**
         * Sets a required custom feature bit. Errors if `bit` is outside the custom range as defined
         * by [bLIP 2] or if it is a known `T` feature.
@@ -131,16 +167,18 @@ public class ChannelTypeFeatures : CommonBase {
         * Serialize the ChannelTypeFeatures object into a byte array which can be read by ChannelTypeFeatures_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ChannelTypeFeatures_write(this.ptr);
+               long ret = bindings.ChannelTypeFeatures_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ChannelTypeFeatures from a byte array, created by ChannelTypeFeatures_write
         */
        public static Result_ChannelTypeFeaturesDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ChannelTypeFeatures_read(ser);
+               long ret = bindings.ChannelTypeFeatures_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ChannelTypeFeaturesDecodeErrorZ ret_hu_conv = Result_ChannelTypeFeaturesDecodeErrorZ.constr_from_ptr(ret);
@@ -249,6 +287,40 @@ public class ChannelTypeFeatures : CommonBase {
                return ret;
        }
 
+       /**
+        * Set this feature as optional.
+        */
+       public void set_taproot_optional() {
+               bindings.ChannelTypeFeatures_set_taproot_optional(this.ptr);
+               GC.KeepAlive(this);
+       }
+
+       /**
+        * Set this feature as required.
+        */
+       public void set_taproot_required() {
+               bindings.ChannelTypeFeatures_set_taproot_required(this.ptr);
+               GC.KeepAlive(this);
+       }
+
+       /**
+        * Checks if this feature is supported.
+        */
+       public bool supports_taproot() {
+               bool ret = bindings.ChannelTypeFeatures_supports_taproot(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Checks if this feature is required.
+        */
+       public bool requires_taproot() {
+               bool ret = bindings.ChannelTypeFeatures_requires_taproot(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
        /**
         * Set this feature as optional.
         */
index af39a9aa7bf45d7123f8561425ccc2596f0413a5..8bde69b461c675fd612744ad8fc30fa11f9ed1b8 100644 (file)
@@ -21,16 +21,18 @@ public class ChannelUpdate : CommonBase {
         * A signature of the channel update
         */
        public byte[] get_signature() {
-               byte[] ret = bindings.ChannelUpdate_get_signature(this.ptr);
+               long ret = bindings.ChannelUpdate_get_signature(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * A signature of the channel update
         */
        public void set_signature(byte[] val) {
-               bindings.ChannelUpdate_set_signature(this.ptr, InternalUtils.check_arr_len(val, 64));
+               bindings.ChannelUpdate_set_signature(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 64)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -61,7 +63,7 @@ public class ChannelUpdate : CommonBase {
         * Constructs a new ChannelUpdate given each field
         */
        public static ChannelUpdate of(byte[] signature_arg, org.ldk.structs.UnsignedChannelUpdate contents_arg) {
-               long ret = bindings.ChannelUpdate_new(InternalUtils.check_arr_len(signature_arg, 64), contents_arg == null ? 0 : contents_arg.ptr);
+               long ret = bindings.ChannelUpdate_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(signature_arg, 64)), contents_arg == null ? 0 : contents_arg.ptr);
                GC.KeepAlive(signature_arg);
                GC.KeepAlive(contents_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -110,16 +112,18 @@ public class ChannelUpdate : CommonBase {
         * Serialize the ChannelUpdate object into a byte array which can be read by ChannelUpdate_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ChannelUpdate_write(this.ptr);
+               long ret = bindings.ChannelUpdate_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ChannelUpdate from a byte array, created by ChannelUpdate_write
         */
        public static Result_ChannelUpdateDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ChannelUpdate_read(ser);
+               long ret = bindings.ChannelUpdate_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ChannelUpdateDecodeErrorZ ret_hu_conv = Result_ChannelUpdateDecodeErrorZ.constr_from_ptr(ret);
index b0c832a809c5ce616d4f3abcc12f531512bc6930..164682b013838a025bef0ad318b5b4d4a007f4f5 100644 (file)
@@ -163,6 +163,8 @@ public class ChannelUpdateInfo : CommonBase {
 
        /**
         * Constructs a new ChannelUpdateInfo given each field
+        * 
+        * Note that last_update_message_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public static ChannelUpdateInfo of(int last_update_arg, bool enabled_arg, short cltv_expiry_delta_arg, long htlc_minimum_msat_arg, long htlc_maximum_msat_arg, org.ldk.structs.RoutingFees fees_arg, org.ldk.structs.ChannelUpdate last_update_message_arg) {
                long ret = bindings.ChannelUpdateInfo_new(last_update_arg, enabled_arg, cltv_expiry_delta_arg, htlc_minimum_msat_arg, htlc_maximum_msat_arg, fees_arg == null ? 0 : fees_arg.ptr, last_update_message_arg == null ? 0 : last_update_message_arg.ptr);
@@ -220,16 +222,18 @@ public class ChannelUpdateInfo : CommonBase {
         * Serialize the ChannelUpdateInfo object into a byte array which can be read by ChannelUpdateInfo_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ChannelUpdateInfo_write(this.ptr);
+               long ret = bindings.ChannelUpdateInfo_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ChannelUpdateInfo from a byte array, created by ChannelUpdateInfo_write
         */
        public static Result_ChannelUpdateInfoDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ChannelUpdateInfo_read(ser);
+               long ret = bindings.ChannelUpdateInfo_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ChannelUpdateInfoDecodeErrorZ ret_hu_conv = Result_ChannelUpdateInfoDecodeErrorZ.constr_from_ptr(ret);
index 0da6b1e47fa20248f6aef9af1374a00a42b24ccc..8d20c5deb4f045338723da842789e6ce594ae29c 100644 (file)
@@ -7,7 +7,7 @@ namespace org { namespace ldk { namespace structs {
 
 
 /**
- * Proposed use of a channel passed as a parameter to [`Score::channel_penalty_msat`].
+ * Proposed use of a channel passed as a parameter to [`ScoreLookUp::channel_penalty_msat`].
  */
 public class ChannelUsage : CommonBase {
        internal ChannelUsage(object _dummy, long ptr) : base(ptr) { }
diff --git a/c_sharp/src/org/ldk/structs/ClaimedHTLC.cs b/c_sharp/src/org/ldk/structs/ClaimedHTLC.cs
new file mode 100644 (file)
index 0000000..08063f2
--- /dev/null
@@ -0,0 +1,191 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * Information about an HTLC that is part of a payment that can be claimed.
+ */
+public class ClaimedHTLC : CommonBase {
+       internal ClaimedHTLC(object _dummy, long ptr) : base(ptr) { }
+       ~ClaimedHTLC() {
+               if (ptr != 0) { bindings.ClaimedHTLC_free(ptr); }
+       }
+
+       /**
+        * The `channel_id` of the channel over which the HTLC was received.
+        */
+       public byte[] get_channel_id() {
+               long ret = bindings.ClaimedHTLC_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` of the channel over which the HTLC was received.
+        */
+       public void set_channel_id(byte[] val) {
+               bindings.ClaimedHTLC_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The `user_channel_id` of the channel over which the HTLC was received. This is the value
+        * passed in to [`ChannelManager::create_channel`] for outbound channels, or to
+        * [`ChannelManager::accept_inbound_channel`] for inbound channels if
+        * [`UserConfig::manually_accept_inbound_channels`] config flag is set to true. Otherwise
+        * `user_channel_id` will be randomized for an inbound channel.
+        * 
+        * This field will be zero for a payment that was serialized prior to LDK version 0.0.117. (This
+        * should only happen in the case that a payment was claimable prior to LDK version 0.0.117, but
+        * was not actually claimed until after upgrading.)
+        * 
+        * [`ChannelManager::create_channel`]: crate::ln::channelmanager::ChannelManager::create_channel
+        * [`ChannelManager::accept_inbound_channel`]: crate::ln::channelmanager::ChannelManager::accept_inbound_channel
+        * [`UserConfig::manually_accept_inbound_channels`]: crate::util::config::UserConfig::manually_accept_inbound_channels
+        */
+       public UInt128 get_user_channel_id() {
+               long ret = bindings.ClaimedHTLC_get_user_channel_id(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.util.UInt128 ret_conv = new org.ldk.util.UInt128(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The `user_channel_id` of the channel over which the HTLC was received. This is the value
+        * passed in to [`ChannelManager::create_channel`] for outbound channels, or to
+        * [`ChannelManager::accept_inbound_channel`] for inbound channels if
+        * [`UserConfig::manually_accept_inbound_channels`] config flag is set to true. Otherwise
+        * `user_channel_id` will be randomized for an inbound channel.
+        * 
+        * This field will be zero for a payment that was serialized prior to LDK version 0.0.117. (This
+        * should only happen in the case that a payment was claimable prior to LDK version 0.0.117, but
+        * was not actually claimed until after upgrading.)
+        * 
+        * [`ChannelManager::create_channel`]: crate::ln::channelmanager::ChannelManager::create_channel
+        * [`ChannelManager::accept_inbound_channel`]: crate::ln::channelmanager::ChannelManager::accept_inbound_channel
+        * [`UserConfig::manually_accept_inbound_channels`]: crate::util::config::UserConfig::manually_accept_inbound_channels
+        */
+       public void set_user_channel_id(org.ldk.util.UInt128 val) {
+               bindings.ClaimedHTLC_set_user_channel_id(this.ptr, InternalUtils.encodeUint8Array(val.getLEBytes()));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The block height at which this HTLC expires.
+        */
+       public int get_cltv_expiry() {
+               int ret = bindings.ClaimedHTLC_get_cltv_expiry(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * The block height at which this HTLC expires.
+        */
+       public void set_cltv_expiry(int val) {
+               bindings.ClaimedHTLC_set_cltv_expiry(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The amount (in msats) of this part of an MPP.
+        */
+       public long get_value_msat() {
+               long ret = bindings.ClaimedHTLC_get_value_msat(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * The amount (in msats) of this part of an MPP.
+        */
+       public void set_value_msat(long val) {
+               bindings.ClaimedHTLC_set_value_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);
+               GC.KeepAlive(channel_id_arg);
+               GC.KeepAlive(user_channel_id_arg);
+               GC.KeepAlive(cltv_expiry_arg);
+               GC.KeepAlive(value_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); };
+               return ret_hu_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.ClaimedHTLC_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the ClaimedHTLC
+        */
+       public ClaimedHTLC clone() {
+               long ret = bindings.ClaimedHTLC_clone(this.ptr);
+               GC.KeepAlive(this);
+               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(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if two ClaimedHTLCs 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.ClaimedHTLC b) {
+               bool ret = bindings.ClaimedHTLC_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 ClaimedHTLC)) return false;
+               return this.eq((ClaimedHTLC)o);
+       }
+       /**
+        * Serialize the ClaimedHTLC object into a byte array which can be read by ClaimedHTLC_read
+        */
+       public byte[] write() {
+               long ret = bindings.ClaimedHTLC_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a ClaimedHTLC from a byte array, created by ClaimedHTLC_write
+        */
+       public static Result_ClaimedHTLCDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.ClaimedHTLC_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ClaimedHTLCDecodeErrorZ ret_hu_conv = Result_ClaimedHTLCDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
index cf10db07a9a7ff983618bbbb3d3c200a820668ad..18f75ddc02bc078e9c77510e157cf03076e9f91d 100644 (file)
@@ -21,16 +21,18 @@ public class ClosingSigned : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.ClosingSigned_get_channel_id(this.ptr);
+               long ret = bindings.ClosingSigned_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.ClosingSigned_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.ClosingSigned_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -57,16 +59,18 @@ public class ClosingSigned : CommonBase {
         * A signature on the closing transaction
         */
        public byte[] get_signature() {
-               byte[] ret = bindings.ClosingSigned_get_signature(this.ptr);
+               long ret = bindings.ClosingSigned_get_signature(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * A signature on the closing transaction
         */
        public void set_signature(byte[] val) {
-               bindings.ClosingSigned_set_signature(this.ptr, InternalUtils.check_arr_len(val, 64));
+               bindings.ClosingSigned_set_signature(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 64)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -101,9 +105,11 @@ public class ClosingSigned : CommonBase {
 
        /**
         * Constructs a new ClosingSigned given each field
+        * 
+        * Note that fee_range_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public static ClosingSigned of(byte[] channel_id_arg, long fee_satoshis_arg, byte[] signature_arg, org.ldk.structs.ClosingSignedFeeRange fee_range_arg) {
-               long ret = bindings.ClosingSigned_new(InternalUtils.check_arr_len(channel_id_arg, 32), fee_satoshis_arg, InternalUtils.check_arr_len(signature_arg, 64), fee_range_arg == null ? 0 : fee_range_arg.ptr);
+               long ret = bindings.ClosingSigned_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), fee_satoshis_arg, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(signature_arg, 64)), fee_range_arg == null ? 0 : fee_range_arg.ptr);
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(fee_satoshis_arg);
                GC.KeepAlive(signature_arg);
@@ -154,16 +160,18 @@ public class ClosingSigned : CommonBase {
         * Serialize the ClosingSigned object into a byte array which can be read by ClosingSigned_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ClosingSigned_write(this.ptr);
+               long ret = bindings.ClosingSigned_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ClosingSigned from a byte array, created by ClosingSigned_write
         */
        public static Result_ClosingSignedDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ClosingSigned_read(ser);
+               long ret = bindings.ClosingSigned_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ClosingSignedDecodeErrorZ ret_hu_conv = Result_ClosingSignedDecodeErrorZ.constr_from_ptr(ret);
index 571e81507cfed46eb595c324e858e4463c428a49..78dfa13cd4aa2006fae8ed07ad436fd50a2e41ed 100644 (file)
@@ -110,16 +110,18 @@ public class ClosingSignedFeeRange : CommonBase {
         * Serialize the ClosingSignedFeeRange object into a byte array which can be read by ClosingSignedFeeRange_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ClosingSignedFeeRange_write(this.ptr);
+               long ret = bindings.ClosingSignedFeeRange_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ClosingSignedFeeRange from a byte array, created by ClosingSignedFeeRange_write
         */
        public static Result_ClosingSignedFeeRangeDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ClosingSignedFeeRange_read(ser);
+               long ret = bindings.ClosingSignedFeeRange_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ClosingSignedFeeRangeDecodeErrorZ ret_hu_conv = Result_ClosingSignedFeeRangeDecodeErrorZ.constr_from_ptr(ret);
index 37edba0c335ab8b77bd4a976ea4906c59db20f96..c6f33357a745bfae795668507728c548b7e0926a 100644 (file)
@@ -70,7 +70,7 @@ public class ClosingTransaction : CommonBase {
         * Construct an object of the class
         */
        public static ClosingTransaction of(long to_holder_value_sat, long to_counterparty_value_sat, byte[] to_holder_script, byte[] to_counterparty_script, org.ldk.structs.OutPoint funding_outpoint) {
-               long ret = bindings.ClosingTransaction_new(to_holder_value_sat, to_counterparty_value_sat, to_holder_script, to_counterparty_script, funding_outpoint == null ? 0 : funding_outpoint.ptr);
+               long ret = bindings.ClosingTransaction_new(to_holder_value_sat, to_counterparty_value_sat, InternalUtils.encodeUint8Array(to_holder_script), InternalUtils.encodeUint8Array(to_counterparty_script), funding_outpoint == null ? 0 : funding_outpoint.ptr);
                GC.KeepAlive(to_holder_value_sat);
                GC.KeepAlive(to_counterparty_value_sat);
                GC.KeepAlive(to_holder_script);
@@ -140,18 +140,22 @@ public class ClosingTransaction : CommonBase {
         * The destination of the holder's output
         */
        public byte[] to_holder_script() {
-               byte[] ret = bindings.ClosingTransaction_to_holder_script(this.ptr);
+               long ret = bindings.ClosingTransaction_to_holder_script(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The destination of the counterparty's output
         */
        public byte[] to_counterparty_script() {
-               byte[] ret = bindings.ClosingTransaction_to_counterparty_script(this.ptr);
+               long ret = bindings.ClosingTransaction_to_counterparty_script(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index ed67928d8da9bcb31d154175a41b7332cb5d1bfe..87a3088faf3799ec6cf19c4ccac1c5368b222a5d 100644 (file)
@@ -26,6 +26,7 @@ public class ClosureReason : CommonBase {
                        case 6: return new ClosureReason_DisconnectedPeer(ptr);
                        case 7: return new ClosureReason_OutdatedChannelManager(ptr);
                        case 8: return new ClosureReason_CounterpartyCoopClosedUnfundedChannel(ptr);
+                       case 9: return new ClosureReason_FundingBatchClosure(ptr);
                        default:
                                throw new ArgumentException("Impossible enum variant");
                }
@@ -77,7 +78,9 @@ public class ClosureReason : CommonBase {
                 */
                public string err;
                internal ClosureReason_ProcessingError(long ptr) : base(null, ptr) {
-                       this.err = bindings.LDKClosureReason_ProcessingError_get_err(ptr);
+                       long err = bindings.LDKClosureReason_ProcessingError_get_err(ptr);
+                       string err_conv = InternalUtils.decodeString(err);
+                       this.err = err_conv;
                }
        }
        /** A ClosureReason of type DisconnectedPeer */
@@ -95,6 +98,11 @@ public class ClosureReason : CommonBase {
                internal ClosureReason_CounterpartyCoopClosedUnfundedChannel(long ptr) : base(null, ptr) {
                }
        }
+       /** A ClosureReason of type FundingBatchClosure */
+       public class ClosureReason_FundingBatchClosure : ClosureReason {
+               internal ClosureReason_FundingBatchClosure(long ptr) : base(null, ptr) {
+               }
+       }
        internal long clone_ptr() {
                long ret = bindings.ClosureReason_clone_ptr(this.ptr);
                GC.KeepAlive(this);
@@ -174,7 +182,7 @@ public class ClosureReason : CommonBase {
         * Utility method to constructs a new ProcessingError-variant ClosureReason
         */
        public static ClosureReason processing_error(string err) {
-               long ret = bindings.ClosureReason_processing_error(err);
+               long ret = bindings.ClosureReason_processing_error(InternalUtils.encodeString(err));
                GC.KeepAlive(err);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.ClosureReason ret_hu_conv = org.ldk.structs.ClosureReason.constr_from_ptr(ret);
@@ -215,6 +223,17 @@ public class ClosureReason : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Utility method to constructs a new FundingBatchClosure-variant ClosureReason
+        */
+       public static ClosureReason funding_batch_closure() {
+               long ret = bindings.ClosureReason_funding_batch_closure();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ClosureReason ret_hu_conv = org.ldk.structs.ClosureReason.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
        /**
         * Checks if two ClosureReasons contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
@@ -234,9 +253,11 @@ public class ClosureReason : CommonBase {
         * Serialize the ClosureReason object into a byte array which can be read by ClosureReason_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ClosureReason_write(this.ptr);
+               long ret = bindings.ClosureReason_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index fc1ca1cc65eda8f760364a6fc1978c293a783c1e..2db0813cb60389c4fff23dab2eaa447b5fb4b120 100644 (file)
@@ -21,16 +21,18 @@ public class CoinSelection : CommonBase {
         * requiring additional fees.
         */
        public Utxo[] get_confirmed_utxos() {
-               long[] ret = bindings.CoinSelection_get_confirmed_utxos(this.ptr);
+               long ret = bindings.CoinSelection_get_confirmed_utxos(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_6_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_6_len = InternalUtils.getArrayLength(ret);
                Utxo[] ret_conv_6_arr = new Utxo[ret_conv_6_len];
                for (int g = 0; g < ret_conv_6_len; g++) {
-                       long ret_conv_6 = ret[g];
+                       long ret_conv_6 = InternalUtils.getU64ArrayElem(ret, g);
                        org.ldk.structs.Utxo ret_conv_6_hu_conv = null; if (ret_conv_6 < 0 || ret_conv_6 > 4096) { ret_conv_6_hu_conv = new org.ldk.structs.Utxo(null, ret_conv_6); }
                        if (ret_conv_6_hu_conv != null) { ret_conv_6_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_6_arr[g] = ret_conv_6_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_6_arr;
        }
 
@@ -39,7 +41,7 @@ public class CoinSelection : CommonBase {
         * requiring additional fees.
         */
        public void set_confirmed_utxos(Utxo[] val) {
-               bindings.CoinSelection_set_confirmed_utxos(this.ptr, val != null ? InternalUtils.mapArray(val, val_conv_6 => val_conv_6 == null ? 0 : val_conv_6.ptr) : null);
+               bindings.CoinSelection_set_confirmed_utxos(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(val, val_conv_6 => val_conv_6 == null ? 0 : val_conv_6.ptr)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
                foreach (Utxo val_conv_6 in val) { if (this != null) { this.ptrs_to.AddLast(val_conv_6); }; };
@@ -77,7 +79,7 @@ public class CoinSelection : CommonBase {
         * Constructs a new CoinSelection given each field
         */
        public static CoinSelection of(Utxo[] confirmed_utxos_arg, org.ldk.structs.Option_TxOutZ change_output_arg) {
-               long ret = bindings.CoinSelection_new(confirmed_utxos_arg != null ? InternalUtils.mapArray(confirmed_utxos_arg, confirmed_utxos_arg_conv_6 => confirmed_utxos_arg_conv_6 == null ? 0 : confirmed_utxos_arg_conv_6.ptr) : null, change_output_arg.ptr);
+               long ret = bindings.CoinSelection_new(InternalUtils.encodeUint64Array(InternalUtils.mapArray(confirmed_utxos_arg, confirmed_utxos_arg_conv_6 => confirmed_utxos_arg_conv_6 == null ? 0 : confirmed_utxos_arg_conv_6.ptr)), change_output_arg.ptr);
                GC.KeepAlive(confirmed_utxos_arg);
                GC.KeepAlive(change_output_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
index 8c2c5514255014a81540793cffc3a0cbc4ee81ca..192231e49935ab77bddfb7dd08eb86a91de10243 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,6 +6,44 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of CoinSelectionSource */
+public interface CoinSelectionSourceInterface {
+       /**Performs coin selection of a set of UTXOs, with at least 1 confirmation each, that are
+        * available to spend. Implementations are free to pick their coin selection algorithm of
+        * choice, as long as the following requirements are met:
+        * 
+        * 1. `must_spend` contains a set of [`Input`]s that must be included in the transaction
+        * throughout coin selection, but must not be returned as part of the result.
+        * 2. `must_pay_to` contains a set of [`TxOut`]s that must be included in the transaction
+        * throughout coin selection. In some cases, like when funding an anchor transaction, this
+        * set is empty. Implementations should ensure they handle this correctly on their end,
+        * e.g., Bitcoin Core's `fundrawtransaction` RPC requires at least one output to be
+        * provided, in which case a zero-value empty OP_RETURN output can be used instead.
+        * 3. Enough inputs must be selected/contributed for the resulting transaction (including the
+        * inputs and outputs noted above) to meet `target_feerate_sat_per_1000_weight`.
+        * 
+        * Implementations must take note that [`Input::satisfaction_weight`] only tracks the weight of
+        * the input's `script_sig` and `witness`. Some wallets, like Bitcoin Core's, may require
+        * providing the full input weight. Failing to do so may lead to underestimating fee bumps and
+        * delaying block inclusion.
+        * 
+        * The `claim_id` must map to the set of external UTXOs assigned to the claim, such that they
+        * can be re-used within new fee-bumped iterations of the original claiming transaction,
+        * ensuring that claims don't double spend each other. If a specific `claim_id` has never had a
+        * transaction associated with it, and all of the available UTXOs have already been assigned to
+        * other claims, implementations must be willing to double spend their UTXOs. The choice of
+        * which UTXOs to double spend is left to the implementation, but it must strive to keep the
+        * set of other claims being double spent to a minimum.
+        */
+       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`]).
+        */
+       Result_TransactionNoneZ sign_tx(byte[] tx);
+}
+
 /**
  * An abstraction over a bitcoin wallet that can perform coin selection over a set of UTXOs and can
  * sign for them. The coin selection method aims to mimic Bitcoin Core's `fundrawtransaction` RPC,
@@ -12,90 +51,64 @@ namespace org { namespace ldk { namespace structs {
  * which can provide a default implementation of this trait when used with [`Wallet`].
  */
 public class CoinSelectionSource : CommonBase {
-       internal readonly bindings.LDKCoinSelectionSource bindings_instance;
+       internal bindings.LDKCoinSelectionSource bindings_instance;
+       internal long instance_idx;
+
        internal CoinSelectionSource(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private CoinSelectionSource(bindings.LDKCoinSelectionSource arg) : base(bindings.LDKCoinSelectionSource_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~CoinSelectionSource() {
                if (ptr != 0) { bindings.CoinSelectionSource_free(ptr); }
        }
 
-       public interface CoinSelectionSourceInterface {
-               /**
-                * Performs coin selection of a set of UTXOs, with at least 1 confirmation each, that are
-                * available to spend. Implementations are free to pick their coin selection algorithm of
-                * choice, as long as the following requirements are met:
-                * 
-                * 1. `must_spend` contains a set of [`Input`]s that must be included in the transaction
-                * throughout coin selection, but must not be returned as part of the result.
-                * 2. `must_pay_to` contains a set of [`TxOut`]s that must be included in the transaction
-                * throughout coin selection. In some cases, like when funding an anchor transaction, this
-                * set is empty. Implementations should ensure they handle this correctly on their end,
-                * e.g., Bitcoin Core's `fundrawtransaction` RPC requires at least one output to be
-                * provided, in which case a zero-value empty OP_RETURN output can be used instead.
-                * 3. Enough inputs must be selected/contributed for the resulting transaction (including the
-                * inputs and outputs noted above) to meet `target_feerate_sat_per_1000_weight`.
-                * 
-                * Implementations must take note that [`Input::satisfaction_weight`] only tracks the weight of
-                * the input's `script_sig` and `witness`. Some wallets, like Bitcoin Core's, may require
-                * providing the full input weight. Failing to do so may lead to underestimating fee bumps and
-                * delaying block inclusion.
-                * 
-                * The `claim_id` must map to the set of external UTXOs assigned to the claim, such that they
-                * can be re-used within new fee-bumped iterations of the original claiming transaction,
-                * ensuring that claims don't double spend each other. If a specific `claim_id` has never had a
-                * transaction associated with it, and all of the available UTXOs have already been assigned to
-                * other claims, implementations must be willing to double spend their UTXOs. The choice of
-                * which UTXOs to double spend is left to the implementation, but it must strive to keep the
-                * set of other claims being double spent to a minimum.
-                */
-               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`]).
-                */
-               Result_TransactionNoneZ sign_tx(byte[] _tx);
-       }
        private class LDKCoinSelectionSourceHolder { internal CoinSelectionSource held; }
        private class LDKCoinSelectionSourceImpl : bindings.LDKCoinSelectionSource {
                internal LDKCoinSelectionSourceImpl(CoinSelectionSourceInterface arg, LDKCoinSelectionSourceHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private CoinSelectionSourceInterface arg;
                private LDKCoinSelectionSourceHolder impl_holder;
-               public long select_confirmed_utxos(byte[] _claim_id, long[] _must_spend, long[] _must_pay_to, int _target_feerate_sat_per_1000_weight) {
-                       int _must_spend_conv_7_len = _must_spend.Length;
+               public long select_confirmed_utxos(long _claim_id, long _must_spend, long _must_pay_to, int _target_feerate_sat_per_1000_weight) {
+                       byte[] _claim_id_conv = InternalUtils.decodeUint8Array(_claim_id);
+                       int _must_spend_conv_7_len = InternalUtils.getArrayLength(_must_spend);
                        Input[] _must_spend_conv_7_arr = new Input[_must_spend_conv_7_len];
                        for (int h = 0; h < _must_spend_conv_7_len; h++) {
-                               long _must_spend_conv_7 = _must_spend[h];
+                               long _must_spend_conv_7 = InternalUtils.getU64ArrayElem(_must_spend, h);
                                org.ldk.structs.Input _must_spend_conv_7_hu_conv = null; if (_must_spend_conv_7 < 0 || _must_spend_conv_7 > 4096) { _must_spend_conv_7_hu_conv = new org.ldk.structs.Input(null, _must_spend_conv_7); }
                                if (_must_spend_conv_7_hu_conv != null) { _must_spend_conv_7_hu_conv.ptrs_to.AddLast(this); };
                                _must_spend_conv_7_arr[h] = _must_spend_conv_7_hu_conv;
                        }
-                       int _must_pay_to_conv_7_len = _must_pay_to.Length;
+                       bindings.free_buffer(_must_spend);
+                       int _must_pay_to_conv_7_len = InternalUtils.getArrayLength(_must_pay_to);
                        TxOut[] _must_pay_to_conv_7_arr = new TxOut[_must_pay_to_conv_7_len];
                        for (int h = 0; h < _must_pay_to_conv_7_len; h++) {
-                               long _must_pay_to_conv_7 = _must_pay_to[h];
+                               long _must_pay_to_conv_7 = InternalUtils.getU64ArrayElem(_must_pay_to, h);
                                TxOut _must_pay_to_conv_7_conv = new TxOut(null, _must_pay_to_conv_7);
                                _must_pay_to_conv_7_arr[h] = _must_pay_to_conv_7_conv;
                        }
-                       Result_CoinSelectionNoneZ ret = arg.select_confirmed_utxos(_claim_id, _must_spend_conv_7_arr, _must_pay_to_conv_7_arr, _target_feerate_sat_per_1000_weight);
+                       bindings.free_buffer(_must_pay_to);
+                       Result_CoinSelectionNoneZ ret = arg.select_confirmed_utxos(_claim_id_conv, _must_spend_conv_7_arr, _must_pay_to_conv_7_arr, _target_feerate_sat_per_1000_weight);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long sign_tx(byte[] _tx) {
-                       Result_TransactionNoneZ ret = arg.sign_tx(_tx);
+               public long sign_tx(long _tx) {
+                       byte[] _tx_conv = InternalUtils.decodeUint8Array(_tx);
+                       Result_TransactionNoneZ ret = arg.sign_tx(_tx_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
        }
+
+       /** Creates a new instance of CoinSelectionSource from a given implementation */
        public static CoinSelectionSource new_impl(CoinSelectionSourceInterface arg) {
                LDKCoinSelectionSourceHolder impl_holder = new LDKCoinSelectionSourceHolder();
-               impl_holder.held = new CoinSelectionSource(new LDKCoinSelectionSourceImpl(arg, impl_holder));
+               LDKCoinSelectionSourceImpl impl = new LDKCoinSelectionSourceImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKCoinSelectionSource_new(impl);
+
+               impl_holder.held = new CoinSelectionSource(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Performs coin selection of a set of UTXOs, with at least 1 confirmation each, that are
         * available to spend. Implementations are free to pick their coin selection algorithm of
@@ -125,7 +138,7 @@ public class CoinSelectionSource : CommonBase {
         * set of other claims being double spent to a minimum.
         */
        public Result_CoinSelectionNoneZ select_confirmed_utxos(byte[] claim_id, Input[] must_spend, TxOut[] must_pay_to, int target_feerate_sat_per_1000_weight) {
-               long ret = bindings.CoinSelectionSource_select_confirmed_utxos(this.ptr, InternalUtils.check_arr_len(claim_id, 32), must_spend != null ? InternalUtils.mapArray(must_spend, must_spend_conv_7 => must_spend_conv_7 == null ? 0 : must_spend_conv_7.ptr) : null, must_pay_to != null ? InternalUtils.mapArray(must_pay_to, must_pay_to_conv_7 => must_pay_to_conv_7.ptr) : null, target_feerate_sat_per_1000_weight);
+               long ret = bindings.CoinSelectionSource_select_confirmed_utxos(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(claim_id, 32)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(must_spend, must_spend_conv_7 => must_spend_conv_7 == null ? 0 : must_spend_conv_7.ptr)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(must_pay_to, must_pay_to_conv_7 => must_pay_to_conv_7.ptr)), target_feerate_sat_per_1000_weight);
                GC.KeepAlive(this);
                GC.KeepAlive(claim_id);
                GC.KeepAlive(must_spend);
@@ -142,7 +155,7 @@ public class CoinSelectionSource : CommonBase {
         * trait (i.e., any provided via [`CoinSelectionSource::select_confirmed_utxos`]).
         */
        public Result_TransactionNoneZ sign_tx(byte[] tx) {
-               long ret = bindings.CoinSelectionSource_sign_tx(this.ptr, tx);
+               long ret = bindings.CoinSelectionSource_sign_tx(this.ptr, InternalUtils.encodeUint8Array(tx));
                GC.KeepAlive(this);
                GC.KeepAlive(tx);
                if (ret >= 0 && ret <= 4096) { return null; }
index bb3d72fe9d98df488869067fa0ff79d289c92800..adcfc649fb1defbca574f5203326a6fa0c1a1b1a 100644 (file)
@@ -21,16 +21,18 @@ public class CommitmentSigned : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.CommitmentSigned_get_channel_id(this.ptr);
+               long ret = bindings.CommitmentSigned_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.CommitmentSigned_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.CommitmentSigned_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -39,16 +41,18 @@ public class CommitmentSigned : CommonBase {
         * A signature on the commitment transaction
         */
        public byte[] get_signature() {
-               byte[] ret = bindings.CommitmentSigned_get_signature(this.ptr);
+               long ret = bindings.CommitmentSigned_get_signature(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * A signature on the commitment transaction
         */
        public void set_signature(byte[] val) {
-               bindings.CommitmentSigned_set_signature(this.ptr, InternalUtils.check_arr_len(val, 64));
+               bindings.CommitmentSigned_set_signature(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 64)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -59,16 +63,25 @@ public class CommitmentSigned : CommonBase {
         * Returns a copy of the field.
         */
        public byte[][] get_htlc_signatures() {
-               byte[][] ret = bindings.CommitmentSigned_get_htlc_signatures(this.ptr);
+               long ret = bindings.CommitmentSigned_get_htlc_signatures(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_8_len = InternalUtils.getArrayLength(ret);
+               byte[][] ret_conv_8_arr = new byte[ret_conv_8_len][];
+               for (int i = 0; i < ret_conv_8_len; i++) {
+                       long ret_conv_8 = InternalUtils.getU64ArrayElem(ret, i);
+                       byte[] ret_conv_8_conv = InternalUtils.decodeUint8Array(ret_conv_8);
+                       ret_conv_8_arr[i] = ret_conv_8_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_8_arr;
        }
 
        /**
         * Signatures on the HTLC transactions
         */
        public void set_htlc_signatures(byte[][] val) {
-               bindings.CommitmentSigned_set_htlc_signatures(this.ptr, val != null ? InternalUtils.mapArray(val, val_conv_8 => InternalUtils.check_arr_len(val_conv_8, 64)) : null);
+               bindings.CommitmentSigned_set_htlc_signatures(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(val, val_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val_conv_8, 64)))));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -77,7 +90,7 @@ public class CommitmentSigned : CommonBase {
         * Constructs a new CommitmentSigned given each field
         */
        public static CommitmentSigned of(byte[] channel_id_arg, byte[] signature_arg, byte[][] htlc_signatures_arg) {
-               long ret = bindings.CommitmentSigned_new(InternalUtils.check_arr_len(channel_id_arg, 32), InternalUtils.check_arr_len(signature_arg, 64), htlc_signatures_arg != null ? InternalUtils.mapArray(htlc_signatures_arg, htlc_signatures_arg_conv_8 => InternalUtils.check_arr_len(htlc_signatures_arg_conv_8, 64)) : null);
+               long ret = bindings.CommitmentSigned_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(signature_arg, 64)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(htlc_signatures_arg, htlc_signatures_arg_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(htlc_signatures_arg_conv_8, 64)))));
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(signature_arg);
                GC.KeepAlive(htlc_signatures_arg);
@@ -126,16 +139,18 @@ public class CommitmentSigned : CommonBase {
         * Serialize the CommitmentSigned object into a byte array which can be read by CommitmentSigned_read
         */
        public byte[] write() {
-               byte[] ret = bindings.CommitmentSigned_write(this.ptr);
+               long ret = bindings.CommitmentSigned_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a CommitmentSigned from a byte array, created by CommitmentSigned_write
         */
        public static Result_CommitmentSignedDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.CommitmentSigned_read(ser);
+               long ret = bindings.CommitmentSigned_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_CommitmentSignedDecodeErrorZ ret_hu_conv = Result_CommitmentSignedDecodeErrorZ.constr_from_ptr(ret);
index c34c454317eecb39c5b95662090539f6b582953a..b3bcf613023e04bee39e8aac5c2516a4e7fdb4c1 100644 (file)
@@ -42,16 +42,18 @@ public class CommitmentTransaction : CommonBase {
         * Serialize the CommitmentTransaction object into a byte array which can be read by CommitmentTransaction_read
         */
        public byte[] write() {
-               byte[] ret = bindings.CommitmentTransaction_write(this.ptr);
+               long ret = bindings.CommitmentTransaction_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a CommitmentTransaction from a byte array, created by CommitmentTransaction_write
         */
        public static Result_CommitmentTransactionDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.CommitmentTransaction_read(ser);
+               long ret = bindings.CommitmentTransaction_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_CommitmentTransactionDecodeErrorZ ret_hu_conv = Result_CommitmentTransactionDecodeErrorZ.constr_from_ptr(ret);
@@ -67,6 +69,17 @@ public class CommitmentTransaction : CommonBase {
                return ret;
        }
 
+       /**
+        * The per commitment point used by the broadcaster.
+        */
+       public byte[] per_commitment_point() {
+               long ret = bindings.CommitmentTransaction_per_commitment_point(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
        /**
         * The value to be sent to the broadcaster
         */
index 58f44e2f2afedecc5d1a0472b9650d1f9ef85096..9ec94107ae401945da7677bc326f42c1fd692c5d 100644 (file)
@@ -20,16 +20,18 @@ public class CommitmentUpdate : CommonBase {
         * `update_add_htlc` messages which should be sent
         */
        public UpdateAddHTLC[] get_update_add_htlcs() {
-               long[] ret = bindings.CommitmentUpdate_get_update_add_htlcs(this.ptr);
+               long ret = bindings.CommitmentUpdate_get_update_add_htlcs(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_15_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_15_len = InternalUtils.getArrayLength(ret);
                UpdateAddHTLC[] ret_conv_15_arr = new UpdateAddHTLC[ret_conv_15_len];
                for (int p = 0; p < ret_conv_15_len; p++) {
-                       long ret_conv_15 = ret[p];
+                       long ret_conv_15 = InternalUtils.getU64ArrayElem(ret, p);
                        org.ldk.structs.UpdateAddHTLC ret_conv_15_hu_conv = null; if (ret_conv_15 < 0 || ret_conv_15 > 4096) { ret_conv_15_hu_conv = new org.ldk.structs.UpdateAddHTLC(null, 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;
        }
 
@@ -37,7 +39,7 @@ public class CommitmentUpdate : CommonBase {
         * `update_add_htlc` messages which should be sent
         */
        public void set_update_add_htlcs(UpdateAddHTLC[] val) {
-               bindings.CommitmentUpdate_set_update_add_htlcs(this.ptr, val != null ? InternalUtils.mapArray(val, val_conv_15 => val_conv_15 == null ? 0 : val_conv_15.ptr) : null);
+               bindings.CommitmentUpdate_set_update_add_htlcs(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(val, val_conv_15 => val_conv_15 == null ? 0 : val_conv_15.ptr)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
                foreach (UpdateAddHTLC val_conv_15 in val) { if (this != null) { this.ptrs_to.AddLast(val_conv_15); }; };
@@ -47,16 +49,18 @@ public class CommitmentUpdate : CommonBase {
         * `update_fulfill_htlc` messages which should be sent
         */
        public UpdateFulfillHTLC[] get_update_fulfill_htlcs() {
-               long[] ret = bindings.CommitmentUpdate_get_update_fulfill_htlcs(this.ptr);
+               long ret = bindings.CommitmentUpdate_get_update_fulfill_htlcs(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_19_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_19_len = InternalUtils.getArrayLength(ret);
                UpdateFulfillHTLC[] ret_conv_19_arr = new UpdateFulfillHTLC[ret_conv_19_len];
                for (int t = 0; t < ret_conv_19_len; t++) {
-                       long ret_conv_19 = ret[t];
+                       long ret_conv_19 = InternalUtils.getU64ArrayElem(ret, t);
                        org.ldk.structs.UpdateFulfillHTLC ret_conv_19_hu_conv = null; if (ret_conv_19 < 0 || ret_conv_19 > 4096) { ret_conv_19_hu_conv = new org.ldk.structs.UpdateFulfillHTLC(null, ret_conv_19); }
                        if (ret_conv_19_hu_conv != null) { ret_conv_19_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_19_arr[t] = ret_conv_19_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_19_arr;
        }
 
@@ -64,7 +68,7 @@ public class CommitmentUpdate : CommonBase {
         * `update_fulfill_htlc` messages which should be sent
         */
        public void set_update_fulfill_htlcs(UpdateFulfillHTLC[] val) {
-               bindings.CommitmentUpdate_set_update_fulfill_htlcs(this.ptr, val != null ? InternalUtils.mapArray(val, val_conv_19 => val_conv_19 == null ? 0 : val_conv_19.ptr) : null);
+               bindings.CommitmentUpdate_set_update_fulfill_htlcs(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(val, val_conv_19 => val_conv_19 == null ? 0 : val_conv_19.ptr)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
                foreach (UpdateFulfillHTLC val_conv_19 in val) { if (this != null) { this.ptrs_to.AddLast(val_conv_19); }; };
@@ -74,16 +78,18 @@ public class CommitmentUpdate : CommonBase {
         * `update_fail_htlc` messages which should be sent
         */
        public UpdateFailHTLC[] get_update_fail_htlcs() {
-               long[] ret = bindings.CommitmentUpdate_get_update_fail_htlcs(this.ptr);
+               long ret = bindings.CommitmentUpdate_get_update_fail_htlcs(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_16_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_16_len = InternalUtils.getArrayLength(ret);
                UpdateFailHTLC[] ret_conv_16_arr = new UpdateFailHTLC[ret_conv_16_len];
                for (int q = 0; q < ret_conv_16_len; q++) {
-                       long ret_conv_16 = ret[q];
+                       long ret_conv_16 = InternalUtils.getU64ArrayElem(ret, q);
                        org.ldk.structs.UpdateFailHTLC ret_conv_16_hu_conv = null; if (ret_conv_16 < 0 || ret_conv_16 > 4096) { ret_conv_16_hu_conv = new org.ldk.structs.UpdateFailHTLC(null, ret_conv_16); }
                        if (ret_conv_16_hu_conv != null) { ret_conv_16_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_16_arr[q] = ret_conv_16_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_16_arr;
        }
 
@@ -91,7 +97,7 @@ public class CommitmentUpdate : CommonBase {
         * `update_fail_htlc` messages which should be sent
         */
        public void set_update_fail_htlcs(UpdateFailHTLC[] val) {
-               bindings.CommitmentUpdate_set_update_fail_htlcs(this.ptr, val != null ? InternalUtils.mapArray(val, val_conv_16 => val_conv_16 == null ? 0 : val_conv_16.ptr) : null);
+               bindings.CommitmentUpdate_set_update_fail_htlcs(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(val, val_conv_16 => val_conv_16 == null ? 0 : val_conv_16.ptr)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
                foreach (UpdateFailHTLC val_conv_16 in val) { if (this != null) { this.ptrs_to.AddLast(val_conv_16); }; };
@@ -101,16 +107,18 @@ public class CommitmentUpdate : CommonBase {
         * `update_fail_malformed_htlc` messages which should be sent
         */
        public UpdateFailMalformedHTLC[] get_update_fail_malformed_htlcs() {
-               long[] ret = bindings.CommitmentUpdate_get_update_fail_malformed_htlcs(this.ptr);
+               long ret = bindings.CommitmentUpdate_get_update_fail_malformed_htlcs(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_25_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_25_len = InternalUtils.getArrayLength(ret);
                UpdateFailMalformedHTLC[] ret_conv_25_arr = new UpdateFailMalformedHTLC[ret_conv_25_len];
                for (int z = 0; z < ret_conv_25_len; z++) {
-                       long ret_conv_25 = ret[z];
+                       long ret_conv_25 = InternalUtils.getU64ArrayElem(ret, z);
                        org.ldk.structs.UpdateFailMalformedHTLC ret_conv_25_hu_conv = null; if (ret_conv_25 < 0 || ret_conv_25 > 4096) { ret_conv_25_hu_conv = new org.ldk.structs.UpdateFailMalformedHTLC(null, ret_conv_25); }
                        if (ret_conv_25_hu_conv != null) { ret_conv_25_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_25_arr[z] = ret_conv_25_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_25_arr;
        }
 
@@ -118,7 +126,7 @@ public class CommitmentUpdate : CommonBase {
         * `update_fail_malformed_htlc` messages which should be sent
         */
        public void set_update_fail_malformed_htlcs(UpdateFailMalformedHTLC[] val) {
-               bindings.CommitmentUpdate_set_update_fail_malformed_htlcs(this.ptr, val != null ? InternalUtils.mapArray(val, val_conv_25 => val_conv_25 == null ? 0 : val_conv_25.ptr) : null);
+               bindings.CommitmentUpdate_set_update_fail_malformed_htlcs(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(val, val_conv_25 => val_conv_25 == null ? 0 : val_conv_25.ptr)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
                foreach (UpdateFailMalformedHTLC val_conv_25 in val) { if (this != null) { this.ptrs_to.AddLast(val_conv_25); }; };
@@ -174,9 +182,11 @@ public class CommitmentUpdate : CommonBase {
 
        /**
         * Constructs a new CommitmentUpdate given each field
+        * 
+        * Note that update_fee_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public static CommitmentUpdate of(UpdateAddHTLC[] update_add_htlcs_arg, UpdateFulfillHTLC[] update_fulfill_htlcs_arg, UpdateFailHTLC[] update_fail_htlcs_arg, UpdateFailMalformedHTLC[] update_fail_malformed_htlcs_arg, org.ldk.structs.UpdateFee update_fee_arg, org.ldk.structs.CommitmentSigned commitment_signed_arg) {
-               long ret = bindings.CommitmentUpdate_new(update_add_htlcs_arg != null ? InternalUtils.mapArray(update_add_htlcs_arg, update_add_htlcs_arg_conv_15 => update_add_htlcs_arg_conv_15 == null ? 0 : update_add_htlcs_arg_conv_15.ptr) : null, update_fulfill_htlcs_arg != null ? InternalUtils.mapArray(update_fulfill_htlcs_arg, update_fulfill_htlcs_arg_conv_19 => update_fulfill_htlcs_arg_conv_19 == null ? 0 : update_fulfill_htlcs_arg_conv_19.ptr) : null, update_fail_htlcs_arg != null ? InternalUtils.mapArray(update_fail_htlcs_arg, update_fail_htlcs_arg_conv_16 => update_fail_htlcs_arg_conv_16 == null ? 0 : update_fail_htlcs_arg_conv_16.ptr) : null, update_fail_malformed_htlcs_arg != null ? InternalUtils.mapArray(update_fail_malformed_htlcs_arg, update_fail_malformed_htlcs_arg_conv_25 => update_fail_malformed_htlcs_arg_conv_25 == null ? 0 : update_fail_malformed_htlcs_arg_conv_25.ptr) : null, update_fee_arg == null ? 0 : update_fee_arg.ptr, commitment_signed_arg == null ? 0 : commitment_signed_arg.ptr);
+               long ret = bindings.CommitmentUpdate_new(InternalUtils.encodeUint64Array(InternalUtils.mapArray(update_add_htlcs_arg, update_add_htlcs_arg_conv_15 => update_add_htlcs_arg_conv_15 == null ? 0 : update_add_htlcs_arg_conv_15.ptr)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(update_fulfill_htlcs_arg, update_fulfill_htlcs_arg_conv_19 => update_fulfill_htlcs_arg_conv_19 == null ? 0 : update_fulfill_htlcs_arg_conv_19.ptr)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(update_fail_htlcs_arg, update_fail_htlcs_arg_conv_16 => update_fail_htlcs_arg_conv_16 == null ? 0 : update_fail_htlcs_arg_conv_16.ptr)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(update_fail_malformed_htlcs_arg, update_fail_malformed_htlcs_arg_conv_25 => update_fail_malformed_htlcs_arg_conv_25 == null ? 0 : update_fail_malformed_htlcs_arg_conv_25.ptr)), update_fee_arg == null ? 0 : update_fee_arg.ptr, commitment_signed_arg == null ? 0 : commitment_signed_arg.ptr);
                GC.KeepAlive(update_add_htlcs_arg);
                GC.KeepAlive(update_fulfill_htlcs_arg);
                GC.KeepAlive(update_fail_htlcs_arg);
index 767eea914fe7f984e29d8fc2ba96ab979788acf0..01eae0baaaa3fc9312d2d4f09779b815ef299897 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,6 +6,67 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of Confirm */
+public interface ConfirmInterface {
+       /**Notifies LDK of transactions confirmed in a block with a given header and height.
+        * 
+        * Must be called for any transactions registered by [`Filter::register_tx`] or any
+        * transactions spending an output registered by [`Filter::register_output`]. Such transactions
+        * appearing in the same block do not need to be included in the same call; instead, multiple
+        * calls with additional transactions may be made so long as they are made in [chain order].
+        * 
+        * May be called before or after [`best_block_updated`] for the corresponding block. However,
+        * in the event of a chain reorganization, it must not be called with a `header` that is no
+        * longer in the chain as of the last call to [`best_block_updated`].
+        * 
+        * [chain order]: Confirm#order
+        * [`best_block_updated`]: Self::best_block_updated
+        */
+       void transactions_confirmed(byte[] header, TwoTuple_usizeTransactionZ[] txdata, int height);
+       /**Notifies LDK of a transaction that is no longer confirmed as result of a chain reorganization.
+        * 
+        * Must be called for any transaction returned by [`get_relevant_txids`] if it has been
+        * reorganized out of the best chain or if it is no longer confirmed in the block with the
+        * given block hash. Once called, the given transaction will not be returned
+        * by [`get_relevant_txids`], unless it has been reconfirmed via [`transactions_confirmed`].
+        * 
+        * [`get_relevant_txids`]: Self::get_relevant_txids
+        * [`transactions_confirmed`]: Self::transactions_confirmed
+        */
+       void transaction_unconfirmed(byte[] txid);
+       /**Notifies LDK of an update to the best header connected at the given height.
+        * 
+        * Must be called whenever a new chain tip becomes available. May be skipped for intermediary
+        * blocks.
+        */
+       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.
+        * 
+        * 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.
+        * 
+        * Will include any transactions passed to [`transactions_confirmed`] that have insufficient
+        * confirmations to be safe from a chain reorganization. Will not include any transactions
+        * passed to [`transaction_unconfirmed`], unless later reconfirmed.
+        * 
+        * Must be called to determine the subset of transactions that must be monitored for
+        * reorganization. Will be idempotent between calls but may change as a result of calls to the
+        * other interface methods. Thus, this is useful to determine which transactions must be
+        * 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.
+        * 
+        * [`transactions_confirmed`]: Self::transactions_confirmed
+        * [`transaction_unconfirmed`]: Self::transaction_unconfirmed
+        */
+       TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ[] get_relevant_txids();
+}
+
 /**
  * The `Confirm` trait is used to notify LDK when relevant transactions have been confirmed on
  * chain or unconfirmed during a chain reorganization.
@@ -44,114 +106,63 @@ namespace org { namespace ldk { namespace structs {
  * [`get_relevant_txids`]: Self::get_relevant_txids
  */
 public class Confirm : CommonBase {
-       internal readonly bindings.LDKConfirm bindings_instance;
+       internal bindings.LDKConfirm bindings_instance;
+       internal long instance_idx;
+
        internal Confirm(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private Confirm(bindings.LDKConfirm arg) : base(bindings.LDKConfirm_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~Confirm() {
                if (ptr != 0) { bindings.Confirm_free(ptr); }
        }
 
-       public interface ConfirmInterface {
-               /**
-                * Notifies LDK of transactions confirmed in a block with a given header and height.
-                * 
-                * Must be called for any transactions registered by [`Filter::register_tx`] or any
-                * transactions spending an output registered by [`Filter::register_output`]. Such transactions
-                * appearing in the same block do not need to be included in the same call; instead, multiple
-                * calls with additional transactions may be made so long as they are made in [chain order].
-                * 
-                * May be called before or after [`best_block_updated`] for the corresponding block. However,
-                * in the event of a chain reorganization, it must not be called with a `header` that is no
-                * longer in the chain as of the last call to [`best_block_updated`].
-                * 
-                * [chain order]: Confirm#order
-                * [`best_block_updated`]: Self::best_block_updated
-                */
-               void transactions_confirmed(byte[] _header, TwoTuple_usizeTransactionZ[] _txdata, int _height);
-               /**
-                * Notifies LDK of a transaction that is no longer confirmed as result of a chain reorganization.
-                * 
-                * Must be called for any transaction returned by [`get_relevant_txids`] if it has been
-                * reorganized out of the best chain or if it is no longer confirmed in the block with the
-                * given block hash. Once called, the given transaction will not be returned
-                * by [`get_relevant_txids`], unless it has been reconfirmed via [`transactions_confirmed`].
-                * 
-                * [`get_relevant_txids`]: Self::get_relevant_txids
-                * [`transactions_confirmed`]: Self::transactions_confirmed
-                */
-               void transaction_unconfirmed(byte[] _txid);
-               /**
-                * Notifies LDK of an update to the best header connected at the given height.
-                * 
-                * Must be called whenever a new chain tip becomes available. May be skipped for intermediary
-                * blocks.
-                */
-               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.
-                * 
-                * 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.
-                * 
-                * Will include any transactions passed to [`transactions_confirmed`] that have insufficient
-                * confirmations to be safe from a chain reorganization. Will not include any transactions
-                * passed to [`transaction_unconfirmed`], unless later reconfirmed.
-                * 
-                * Must be called to determine the subset of transactions that must be monitored for
-                * reorganization. Will be idempotent between calls but may change as a result of calls to the
-                * other interface methods. Thus, this is useful to determine which transactions must be
-                * 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.
-                * 
-                * [`transactions_confirmed`]: Self::transactions_confirmed
-                * [`transaction_unconfirmed`]: Self::transaction_unconfirmed
-                */
-               TwoTuple_TxidCOption_BlockHashZZ[] get_relevant_txids();
-       }
        private class LDKConfirmHolder { internal Confirm held; }
        private class LDKConfirmImpl : bindings.LDKConfirm {
                internal LDKConfirmImpl(ConfirmInterface arg, LDKConfirmHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private ConfirmInterface arg;
                private LDKConfirmHolder impl_holder;
-               public void transactions_confirmed(byte[] _header, long[] _txdata, int _height) {
-                       int _txdata_conv_28_len = _txdata.Length;
+               public void transactions_confirmed(long _header, long _txdata, int _height) {
+                       byte[] _header_conv = InternalUtils.decodeUint8Array(_header);
+                       int _txdata_conv_28_len = InternalUtils.getArrayLength(_txdata);
                        TwoTuple_usizeTransactionZ[] _txdata_conv_28_arr = new TwoTuple_usizeTransactionZ[_txdata_conv_28_len];
                        for (int c = 0; c < _txdata_conv_28_len; c++) {
-                               long _txdata_conv_28 = _txdata[c];
+                               long _txdata_conv_28 = InternalUtils.getU64ArrayElem(_txdata, c);
                                TwoTuple_usizeTransactionZ _txdata_conv_28_hu_conv = new TwoTuple_usizeTransactionZ(null, _txdata_conv_28);
                                if (_txdata_conv_28_hu_conv != null) { _txdata_conv_28_hu_conv.ptrs_to.AddLast(this); };
                                _txdata_conv_28_arr[c] = _txdata_conv_28_hu_conv;
                        }
-                       arg.transactions_confirmed(_header, _txdata_conv_28_arr, _height);
+                       bindings.free_buffer(_txdata);
+                       arg.transactions_confirmed(_header_conv, _txdata_conv_28_arr, _height);
                                GC.KeepAlive(arg);
                }
-               public void transaction_unconfirmed(byte[] _txid) {
-                       arg.transaction_unconfirmed(_txid);
+               public void transaction_unconfirmed(long _txid) {
+                       byte[] _txid_conv = InternalUtils.decodeUint8Array(_txid);
+                       arg.transaction_unconfirmed(_txid_conv);
                                GC.KeepAlive(arg);
                }
-               public void best_block_updated(byte[] _header, int _height) {
-                       arg.best_block_updated(_header, _height);
+               public void best_block_updated(long _header, int _height) {
+                       byte[] _header_conv = InternalUtils.decodeUint8Array(_header);
+                       arg.best_block_updated(_header_conv, _height);
                                GC.KeepAlive(arg);
                }
-               public long[] get_relevant_txids() {
-                       TwoTuple_TxidCOption_BlockHashZZ[] ret = arg.get_relevant_txids();
+               public long get_relevant_txids() {
+                       TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ[] ret = arg.get_relevant_txids();
                                GC.KeepAlive(arg);
-                       long[] result = ret != null ? InternalUtils.mapArray(ret, ret_conv_34 => ret_conv_34 == null ? 0 : ret_conv_34.clone_ptr()) : null;
+                       long result = InternalUtils.encodeUint64Array(InternalUtils.mapArray(ret, ret_conv_49 => ret_conv_49 == null ? 0 : ret_conv_49.clone_ptr()));
                        return result;
                }
        }
+
+       /** Creates a new instance of Confirm from a given implementation */
        public static Confirm new_impl(ConfirmInterface arg) {
                LDKConfirmHolder impl_holder = new LDKConfirmHolder();
-               impl_holder.held = new Confirm(new LDKConfirmImpl(arg, impl_holder));
+               LDKConfirmImpl impl = new LDKConfirmImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKConfirm_new(impl);
+
+               impl_holder.held = new Confirm(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Notifies LDK of transactions confirmed in a block with a given header and height.
         * 
@@ -168,7 +179,7 @@ public class Confirm : CommonBase {
         * [`best_block_updated`]: Self::best_block_updated
         */
        public void transactions_confirmed(byte[] header, TwoTuple_usizeTransactionZ[] txdata, int height) {
-               bindings.Confirm_transactions_confirmed(this.ptr, InternalUtils.check_arr_len(header, 80), txdata != null ? InternalUtils.mapArray(txdata, txdata_conv_28 => txdata_conv_28 != null ? txdata_conv_28.ptr : 0) : null, height);
+               bindings.Confirm_transactions_confirmed(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(header, 80)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(txdata, txdata_conv_28 => txdata_conv_28 != null ? txdata_conv_28.ptr : 0)), height);
                GC.KeepAlive(this);
                GC.KeepAlive(header);
                GC.KeepAlive(txdata);
@@ -187,7 +198,7 @@ public class Confirm : CommonBase {
         * [`transactions_confirmed`]: Self::transactions_confirmed
         */
        public void transaction_unconfirmed(byte[] txid) {
-               bindings.Confirm_transaction_unconfirmed(this.ptr, InternalUtils.check_arr_len(txid, 32));
+               bindings.Confirm_transaction_unconfirmed(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(txid, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(txid);
        }
@@ -199,7 +210,7 @@ public class Confirm : CommonBase {
         * blocks.
         */
        public void best_block_updated(byte[] header, int height) {
-               bindings.Confirm_best_block_updated(this.ptr, InternalUtils.check_arr_len(header, 80), height);
+               bindings.Confirm_best_block_updated(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(header, 80)), height);
                GC.KeepAlive(this);
                GC.KeepAlive(header);
                GC.KeepAlive(height);
@@ -228,18 +239,20 @@ public class Confirm : CommonBase {
         * [`transactions_confirmed`]: Self::transactions_confirmed
         * [`transaction_unconfirmed`]: Self::transaction_unconfirmed
         */
-       public TwoTuple_TxidCOption_BlockHashZZ[] get_relevant_txids() {
-               long[] ret = bindings.Confirm_get_relevant_txids(this.ptr);
+       public TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ[] get_relevant_txids() {
+               long ret = bindings.Confirm_get_relevant_txids(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_34_len = ret.Length;
-               TwoTuple_TxidCOption_BlockHashZZ[] ret_conv_34_arr = new TwoTuple_TxidCOption_BlockHashZZ[ret_conv_34_len];
-               for (int i = 0; i < ret_conv_34_len; i++) {
-                       long ret_conv_34 = ret[i];
-                       TwoTuple_TxidCOption_BlockHashZZ ret_conv_34_hu_conv = new TwoTuple_TxidCOption_BlockHashZZ(null, ret_conv_34);
-                       if (ret_conv_34_hu_conv != null) { ret_conv_34_hu_conv.ptrs_to.AddLast(this); };
-                       ret_conv_34_arr[i] = ret_conv_34_hu_conv;
+               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;
                }
-               return ret_conv_34_arr;
+               bindings.free_buffer(ret);
+               return ret_conv_49_arr;
        }
 
 }
index 4b00e21436a806a860ed9a2e21527c9f7303f440..85da52f9a799f70c395269c047c2f3e2bc708bab 100644 (file)
@@ -87,6 +87,18 @@ public class CounterpartyChannelTransactionParameters : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the CounterpartyChannelTransactionParameters.
+        */
+       public long hash() {
+               long ret = bindings.CounterpartyChannelTransactionParameters_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two CounterpartyChannelTransactionParameterss contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
@@ -108,16 +120,18 @@ public class CounterpartyChannelTransactionParameters : CommonBase {
         * Serialize the CounterpartyChannelTransactionParameters object into a byte array which can be read by CounterpartyChannelTransactionParameters_read
         */
        public byte[] write() {
-               byte[] ret = bindings.CounterpartyChannelTransactionParameters_write(this.ptr);
+               long ret = bindings.CounterpartyChannelTransactionParameters_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a CounterpartyChannelTransactionParameters from a byte array, created by CounterpartyChannelTransactionParameters_write
         */
        public static Result_CounterpartyChannelTransactionParametersDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.CounterpartyChannelTransactionParameters_read(ser);
+               long ret = bindings.CounterpartyChannelTransactionParameters_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_CounterpartyChannelTransactionParametersDecodeErrorZ ret_hu_conv = Result_CounterpartyChannelTransactionParametersDecodeErrorZ.constr_from_ptr(ret);
index 8af8752f4624b3bd45c285724aec759d75eb2449..b5ac119128d973b5236f2231295761b22551d013 100644 (file)
@@ -63,7 +63,7 @@ public class CounterpartyCommitmentSecrets : CommonBase {
         * was generated in accordance with BOLT 3 and is consistent with previous secrets.
         */
        public Result_NoneNoneZ provide_secret(long idx, byte[] secret) {
-               long ret = bindings.CounterpartyCommitmentSecrets_provide_secret(this.ptr, idx, InternalUtils.check_arr_len(secret, 32));
+               long ret = bindings.CounterpartyCommitmentSecrets_provide_secret(this.ptr, idx, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(secret, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(idx);
                GC.KeepAlive(secret);
@@ -79,26 +79,30 @@ public class CounterpartyCommitmentSecrets : CommonBase {
         * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public byte[] get_secret(long idx) {
-               byte[] ret = bindings.CounterpartyCommitmentSecrets_get_secret(this.ptr, idx);
+               long ret = bindings.CounterpartyCommitmentSecrets_get_secret(this.ptr, idx);
                GC.KeepAlive(this);
                GC.KeepAlive(idx);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Serialize the CounterpartyCommitmentSecrets object into a byte array which can be read by CounterpartyCommitmentSecrets_read
         */
        public byte[] write() {
-               byte[] ret = bindings.CounterpartyCommitmentSecrets_write(this.ptr);
+               long ret = bindings.CounterpartyCommitmentSecrets_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a CounterpartyCommitmentSecrets from a byte array, created by CounterpartyCommitmentSecrets_write
         */
        public static Result_CounterpartyCommitmentSecretsDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.CounterpartyCommitmentSecrets_read(ser);
+               long ret = bindings.CounterpartyCommitmentSecrets_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_CounterpartyCommitmentSecretsDecodeErrorZ ret_hu_conv = Result_CounterpartyCommitmentSecretsDecodeErrorZ.constr_from_ptr(ret);
index 5afec689dd377a2f1da7423a13a60500983f3565..dc264cc09142172af7ecc4afe4c0406c92e075d5 100644 (file)
@@ -109,16 +109,18 @@ public class CounterpartyForwardingInfo : CommonBase {
         * Serialize the CounterpartyForwardingInfo object into a byte array which can be read by CounterpartyForwardingInfo_read
         */
        public byte[] write() {
-               byte[] ret = bindings.CounterpartyForwardingInfo_write(this.ptr);
+               long ret = bindings.CounterpartyForwardingInfo_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a CounterpartyForwardingInfo from a byte array, created by CounterpartyForwardingInfo_write
         */
        public static Result_CounterpartyForwardingInfoDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.CounterpartyForwardingInfo_read(ser);
+               long ret = bindings.CounterpartyForwardingInfo_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_CounterpartyForwardingInfoDecodeErrorZ ret_hu_conv = Result_CounterpartyForwardingInfoDecodeErrorZ.constr_from_ptr(ret);
index 32d39c27929b0de9114cc53b23a482e6b6d831b9..fdec99ad4ae32e27b869972c021691fecd52c4ea 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,6 +6,36 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of CustomMessageHandler */
+public interface CustomMessageHandlerInterface {
+       /**Handles the given message sent from `sender_node_id`, possibly producing messages for
+        * [`CustomMessageHandler::get_and_clear_pending_msg`] to return and thus for [`PeerManager`]
+        * to send.
+        */
+       Result_NoneLightningErrorZ handle_custom_message(Type msg, byte[] sender_node_id);
+       /**Returns the list of pending messages that were generated by the handler, clearing the list
+        * in the process. Each message is paired with the node id of the intended recipient. If no
+        * connection to the node exists, then the message is simply not sent.
+        */
+       TwoTuple_PublicKeyTypeZ[] get_and_clear_pending_msg();
+       /**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.
+        * 
+        * [`NodeAnnouncement`]: crate::ln::msgs::NodeAnnouncement
+        */
+       NodeFeatures provided_node_features();
+       /**Gets the init feature flags which should be sent to the given peer. All available handlers
+        * are queried similarly and their feature flags are OR'd together to form the [`InitFeatures`]
+        * which are sent in our [`Init`] message.
+        * 
+        * [`Init`]: crate::ln::msgs::Init
+        */
+       InitFeatures provided_init_features(byte[] their_node_id);
+}
+
 /**
  * A handler provided to [`PeerManager`] for reading and handling custom messages.
  * 
@@ -16,64 +47,32 @@ namespace org { namespace ldk { namespace structs {
  * [`lightning_custom_message`]: https://docs.rs/lightning_custom_message/latest/lightning_custom_message
  */
 public class CustomMessageHandler : CommonBase {
-       internal readonly bindings.LDKCustomMessageHandler bindings_instance;
+       internal bindings.LDKCustomMessageHandler bindings_instance;
+       internal long instance_idx;
+
        internal CustomMessageHandler(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private CustomMessageHandler(bindings.LDKCustomMessageHandler arg, bindings.LDKCustomMessageReader CustomMessageReader) : base(bindings.LDKCustomMessageHandler_new(arg, CustomMessageReader)) {
-               this.ptrs_to.AddLast(arg);
-               this.ptrs_to.AddLast(CustomMessageReader);
-               this.bindings_instance = arg;
-       }
        ~CustomMessageHandler() {
                if (ptr != 0) { bindings.CustomMessageHandler_free(ptr); }
        }
 
-       public interface CustomMessageHandlerInterface {
-               /**
-                * Handles the given message sent from `sender_node_id`, possibly producing messages for
-                * [`CustomMessageHandler::get_and_clear_pending_msg`] to return and thus for [`PeerManager`]
-                * to send.
-                */
-               Result_NoneLightningErrorZ handle_custom_message(Type _msg, byte[] _sender_node_id);
-               /**
-                * Returns the list of pending messages that were generated by the handler, clearing the list
-                * in the process. Each message is paired with the node id of the intended recipient. If no
-                * connection to the node exists, then the message is simply not sent.
-                */
-               TwoTuple_PublicKeyTypeZ[] get_and_clear_pending_msg();
-               /**
-                * 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.
-                * 
-                * [`NodeAnnouncement`]: crate::ln::msgs::NodeAnnouncement
-                */
-               NodeFeatures provided_node_features();
-               /**
-                * Gets the init feature flags which should be sent to the given peer. All available handlers
-                * are queried similarly and their feature flags are OR'd together to form the [`InitFeatures`]
-                * which are sent in our [`Init`] message.
-                * 
-                * [`Init`]: crate::ln::msgs::Init
-                */
-               InitFeatures provided_init_features(byte[] _their_node_id);
-       }
        private class LDKCustomMessageHandlerHolder { internal CustomMessageHandler held; }
        private class LDKCustomMessageHandlerImpl : bindings.LDKCustomMessageHandler {
                internal LDKCustomMessageHandlerImpl(CustomMessageHandlerInterface arg, LDKCustomMessageHandlerHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private CustomMessageHandlerInterface arg;
                private LDKCustomMessageHandlerHolder impl_holder;
-               public long handle_custom_message(long _msg, byte[] _sender_node_id) {
+               public long handle_custom_message(long _msg, long _sender_node_id) {
                        Type ret_hu_conv = new Type(null, _msg);
                        if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-                       Result_NoneLightningErrorZ ret = arg.handle_custom_message(ret_hu_conv, _sender_node_id);
+                       byte[] _sender_node_id_conv = InternalUtils.decodeUint8Array(_sender_node_id);
+                       Result_NoneLightningErrorZ ret = arg.handle_custom_message(ret_hu_conv, _sender_node_id_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long[] get_and_clear_pending_msg() {
+               public long get_and_clear_pending_msg() {
                        TwoTuple_PublicKeyTypeZ[] ret = arg.get_and_clear_pending_msg();
                                GC.KeepAlive(arg);
-                       long[] result = ret != null ? InternalUtils.mapArray(ret, ret_conv_25 => ret_conv_25 == null ? 0 : ret_conv_25.clone_ptr()) : null;
+                       long result = InternalUtils.encodeUint64Array(InternalUtils.mapArray(ret, ret_conv_25 => ret_conv_25 == null ? 0 : ret_conv_25.clone_ptr()));
                        return result;
                }
                public long provided_node_features() {
@@ -82,26 +81,27 @@ public class CustomMessageHandler : CommonBase {
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long provided_init_features(byte[] _their_node_id) {
-                       InitFeatures ret = arg.provided_init_features(_their_node_id);
+               public long provided_init_features(long _their_node_id) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
+                       InitFeatures ret = arg.provided_init_features(_their_node_id_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
        }
-       public static CustomMessageHandler new_impl(CustomMessageHandlerInterface arg, CustomMessageReader.CustomMessageReaderInterface CustomMessageReader_impl) {
+
+       /** Creates a new instance of CustomMessageHandler from a given implementation */
+       public static CustomMessageHandler new_impl(CustomMessageHandlerInterface arg, CustomMessageReaderInterface customMessageReader_impl) {
                LDKCustomMessageHandlerHolder impl_holder = new LDKCustomMessageHandlerHolder();
-               impl_holder.held = new CustomMessageHandler(new LDKCustomMessageHandlerImpl(arg, impl_holder), CustomMessageReader.new_impl(CustomMessageReader_impl).bindings_instance);
-               return impl_holder.held;
-       }
+               LDKCustomMessageHandlerImpl impl = new LDKCustomMessageHandlerImpl(arg, impl_holder);
+               CustomMessageReader customMessageReader = CustomMessageReader.new_impl(customMessageReader_impl);
+               long[] ptr_idx = bindings.LDKCustomMessageHandler_new(impl, customMessageReader.instance_idx);
 
-       /**
-        * Gets the underlying CustomMessageReader.
-        */
-       public CustomMessageReader get_custom_message_reader() {
-               CustomMessageReader res = new CustomMessageReader(null, bindings.LDKCustomMessageHandler_get_CustomMessageReader(this.ptr));
-               this.ptrs_to.AddLast(res);
-               return res;
+               impl_holder.held = new CustomMessageHandler(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
+               impl_holder.held.ptrs_to.AddLast(customMessageReader);
+               return impl_holder.held;
        }
 
        /**
@@ -110,7 +110,7 @@ public class CustomMessageHandler : CommonBase {
         * to send.
         */
        public Result_NoneLightningErrorZ handle_custom_message(org.ldk.structs.Type msg, byte[] sender_node_id) {
-               long ret = bindings.CustomMessageHandler_handle_custom_message(this.ptr, msg.ptr, InternalUtils.check_arr_len(sender_node_id, 33));
+               long ret = bindings.CustomMessageHandler_handle_custom_message(this.ptr, msg.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(sender_node_id, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(msg);
                GC.KeepAlive(sender_node_id);
@@ -126,16 +126,18 @@ public class CustomMessageHandler : CommonBase {
         * connection to the node exists, then the message is simply not sent.
         */
        public TwoTuple_PublicKeyTypeZ[] get_and_clear_pending_msg() {
-               long[] ret = bindings.CustomMessageHandler_get_and_clear_pending_msg(this.ptr);
+               long ret = bindings.CustomMessageHandler_get_and_clear_pending_msg(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_25_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_25_len = InternalUtils.getArrayLength(ret);
                TwoTuple_PublicKeyTypeZ[] ret_conv_25_arr = new TwoTuple_PublicKeyTypeZ[ret_conv_25_len];
                for (int z = 0; z < ret_conv_25_len; z++) {
-                       long ret_conv_25 = ret[z];
+                       long ret_conv_25 = InternalUtils.getU64ArrayElem(ret, z);
                        TwoTuple_PublicKeyTypeZ ret_conv_25_hu_conv = new TwoTuple_PublicKeyTypeZ(null, ret_conv_25);
                        if (ret_conv_25_hu_conv != null) { ret_conv_25_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_25_arr[z] = ret_conv_25_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_25_arr;
        }
 
@@ -163,7 +165,7 @@ public class CustomMessageHandler : CommonBase {
         * [`Init`]: crate::ln::msgs::Init
         */
        public InitFeatures provided_init_features(byte[] their_node_id) {
-               long ret = bindings.CustomMessageHandler_provided_init_features(this.ptr, InternalUtils.check_arr_len(their_node_id, 33));
+               long ret = bindings.CustomMessageHandler_provided_init_features(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_node_id, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(their_node_id);
                if (ret >= 0 && ret <= 4096) { return null; }
index 0b230d54b8261427a41499dc12f0df959d713c59..fad16dbe0b402216280c477adf9276b6fa12cc6f 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,47 +6,57 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of CustomMessageReader */
+public interface CustomMessageReaderInterface {
+       /**Decodes a custom message to `CustomMessageType`. If the given message type is known to the
+        * implementation and the message could be decoded, must return `Ok(Some(message))`. If the
+        * message type is unknown to the implementation, must return `Ok(None)`. If a decoding error
+        * occur, must return `Err(DecodeError::X)` where `X` details the encountered error.
+        */
+       Result_COption_TypeZDecodeErrorZ read(short message_type, byte[] buffer);
+}
+
 /**
  * Trait to be implemented by custom message (unrelated to the channel/gossip LN layers)
  * decoders.
  */
 public class CustomMessageReader : CommonBase {
-       internal readonly bindings.LDKCustomMessageReader bindings_instance;
+       internal bindings.LDKCustomMessageReader bindings_instance;
+       internal long instance_idx;
+
        internal CustomMessageReader(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private CustomMessageReader(bindings.LDKCustomMessageReader arg) : base(bindings.LDKCustomMessageReader_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~CustomMessageReader() {
                if (ptr != 0) { bindings.CustomMessageReader_free(ptr); }
        }
 
-       public interface CustomMessageReaderInterface {
-               /**
-                * Decodes a custom message to `CustomMessageType`. If the given message type is known to the
-                * implementation and the message could be decoded, must return `Ok(Some(message))`. If the
-                * message type is unknown to the implementation, must return `Ok(None)`. If a decoding error
-                * occur, must return `Err(DecodeError::X)` where `X` details the encountered error.
-                */
-               Result_COption_TypeZDecodeErrorZ read(short _message_type, byte[] _buffer);
-       }
        private class LDKCustomMessageReaderHolder { internal CustomMessageReader held; }
        private class LDKCustomMessageReaderImpl : bindings.LDKCustomMessageReader {
                internal LDKCustomMessageReaderImpl(CustomMessageReaderInterface arg, LDKCustomMessageReaderHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private CustomMessageReaderInterface arg;
                private LDKCustomMessageReaderHolder impl_holder;
-               public long read(short _message_type, byte[] _buffer) {
-                       Result_COption_TypeZDecodeErrorZ ret = arg.read(_message_type, _buffer);
+               public long read(short _message_type, long _buffer) {
+                       byte[] _buffer_conv = InternalUtils.decodeUint8Array(_buffer);
+                       Result_COption_TypeZDecodeErrorZ ret = arg.read(_message_type, _buffer_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
        }
+
+       /** Creates a new instance of CustomMessageReader from a given implementation */
        public static CustomMessageReader new_impl(CustomMessageReaderInterface arg) {
                LDKCustomMessageReaderHolder impl_holder = new LDKCustomMessageReaderHolder();
-               impl_holder.held = new CustomMessageReader(new LDKCustomMessageReaderImpl(arg, impl_holder));
+               LDKCustomMessageReaderImpl impl = new LDKCustomMessageReaderImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKCustomMessageReader_new(impl);
+
+               impl_holder.held = new CustomMessageReader(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Decodes a custom message to `CustomMessageType`. If the given message type is known to the
         * implementation and the message could be decoded, must return `Ok(Some(message))`. If the
@@ -53,7 +64,7 @@ public class CustomMessageReader : CommonBase {
         * occur, must return `Err(DecodeError::X)` where `X` details the encountered error.
         */
        public Result_COption_TypeZDecodeErrorZ read(short message_type, byte[] buffer) {
-               long ret = bindings.CustomMessageReader_read(this.ptr, message_type, buffer);
+               long ret = bindings.CustomMessageReader_read(this.ptr, message_type, InternalUtils.encodeUint8Array(buffer));
                GC.KeepAlive(this);
                GC.KeepAlive(message_type);
                GC.KeepAlive(buffer);
diff --git a/c_sharp/src/org/ldk/structs/CustomOnionMessageContents.cs b/c_sharp/src/org/ldk/structs/CustomOnionMessageContents.cs
deleted file mode 100644 (file)
index fec8d51..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * The contents of a custom onion message.
- */
-public class CustomOnionMessageContents : CommonBase {
-       internal readonly bindings.LDKCustomOnionMessageContents bindings_instance;
-       internal CustomOnionMessageContents(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private CustomOnionMessageContents(bindings.LDKCustomOnionMessageContents arg) : base(bindings.LDKCustomOnionMessageContents_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
-       ~CustomOnionMessageContents() {
-               if (ptr != 0) { bindings.CustomOnionMessageContents_free(ptr); }
-       }
-
-       public interface CustomOnionMessageContentsInterface {
-               /**
-                * Returns the TLV type identifying the message contents. MUST be >= 64.
-                */
-               long tlv_type();
-               /**
-                * Serialize the object into a byte array
-                */
-               byte[] write();
-       }
-       private class LDKCustomOnionMessageContentsHolder { internal CustomOnionMessageContents held; }
-       private class LDKCustomOnionMessageContentsImpl : bindings.LDKCustomOnionMessageContents {
-               internal LDKCustomOnionMessageContentsImpl(CustomOnionMessageContentsInterface arg, LDKCustomOnionMessageContentsHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
-               private CustomOnionMessageContentsInterface arg;
-               private LDKCustomOnionMessageContentsHolder impl_holder;
-               public long tlv_type() {
-                       long ret = arg.tlv_type();
-                               GC.KeepAlive(arg);
-                       return ret;
-               }
-               public byte[] write() {
-                       byte[] ret = arg.write();
-                               GC.KeepAlive(arg);
-                       return ret;
-               }
-       }
-       public static CustomOnionMessageContents new_impl(CustomOnionMessageContentsInterface arg) {
-               LDKCustomOnionMessageContentsHolder impl_holder = new LDKCustomOnionMessageContentsHolder();
-               impl_holder.held = new CustomOnionMessageContents(new LDKCustomOnionMessageContentsImpl(arg, impl_holder));
-               return impl_holder.held;
-       }
-       /**
-        * Returns the TLV type identifying the message contents. MUST be >= 64.
-        */
-       public long tlv_type() {
-               long ret = bindings.CustomOnionMessageContents_tlv_type(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Serialize the object into a byte array
-        */
-       public byte[] write() {
-               byte[] ret = bindings.CustomOnionMessageContents_write(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CustomOnionMessageContents_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a copy of a CustomOnionMessageContents
-        */
-       public CustomOnionMessageContents clone() {
-               long ret = bindings.CustomOnionMessageContents_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               CustomOnionMessageContents ret_hu_conv = new CustomOnionMessageContents(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-}
-} } }
index 86e23eec402d88e32ba72bd7b80e83e807a94879..0a254aa3be38694fc934092181da43cd61f94003 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,6 +6,27 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of CustomOnionMessageHandler */
+public interface CustomOnionMessageHandlerInterface {
+       /**Called with the custom message that was received, returning a response to send, if any.
+        * 
+        * The returned [`Self::CustomMessage`], if any, is enqueued to be sent by [`OnionMessenger`].
+        */
+       Option_OnionMessageContentsZ handle_custom_message(OnionMessageContents msg);
+       /**Read a custom message of type `message_type` from `buffer`, returning `Ok(None)` if the
+        * message type is unknown.
+        */
+       Result_COption_OnionMessageContentsZDecodeErrorZ read_custom_message(long message_type, byte[] buffer);
+       /**Releases any [`Self::CustomMessage`]s that need to be sent.
+        * 
+        * Typically, this is used for messages initiating a message flow rather than in response to
+        * another message. The latter should use the return value of [`Self::handle_custom_message`].
+        */
+       ThreeTuple_OnionMessageContentsDestinationBlindedPathZ[] release_pending_custom_messages();
+}
+
 /**
  * Handler for custom onion messages. If you are using [`SimpleArcOnionMessenger`],
  * [`SimpleRefOnionMessenger`], or prefer to ignore inbound custom onion messages,
@@ -18,62 +40,66 @@ namespace org { namespace ldk { namespace structs {
  * [`CustomMessage`]: Self::CustomMessage
  */
 public class CustomOnionMessageHandler : CommonBase {
-       internal readonly bindings.LDKCustomOnionMessageHandler bindings_instance;
+       internal bindings.LDKCustomOnionMessageHandler bindings_instance;
+       internal long instance_idx;
+
        internal CustomOnionMessageHandler(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private CustomOnionMessageHandler(bindings.LDKCustomOnionMessageHandler arg) : base(bindings.LDKCustomOnionMessageHandler_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~CustomOnionMessageHandler() {
                if (ptr != 0) { bindings.CustomOnionMessageHandler_free(ptr); }
        }
 
-       public interface CustomOnionMessageHandlerInterface {
-               /**
-                * Called with the custom message that was received, returning a response to send, if any.
-                */
-               Option_CustomOnionMessageContentsZ handle_custom_message(CustomOnionMessageContents _msg);
-               /**
-                * Read a custom message of type `message_type` from `buffer`, returning `Ok(None)` if the
-                * message type is unknown.
-                */
-               Result_COption_CustomOnionMessageContentsZDecodeErrorZ read_custom_message(long _message_type, byte[] _buffer);
-       }
        private class LDKCustomOnionMessageHandlerHolder { internal CustomOnionMessageHandler held; }
        private class LDKCustomOnionMessageHandlerImpl : bindings.LDKCustomOnionMessageHandler {
                internal LDKCustomOnionMessageHandlerImpl(CustomOnionMessageHandlerInterface arg, LDKCustomOnionMessageHandlerHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private CustomOnionMessageHandlerInterface arg;
                private LDKCustomOnionMessageHandlerHolder impl_holder;
                public long handle_custom_message(long _msg) {
-                       CustomOnionMessageContents ret_hu_conv = new CustomOnionMessageContents(null, _msg);
+                       OnionMessageContents ret_hu_conv = new OnionMessageContents(null, _msg);
                        if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-                       Option_CustomOnionMessageContentsZ ret = arg.handle_custom_message(ret_hu_conv);
+                       Option_OnionMessageContentsZ ret = arg.handle_custom_message(ret_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        if (impl_holder.held != null) { impl_holder.held.ptrs_to.AddLast(ret); };
                        return result;
                }
-               public long read_custom_message(long _message_type, byte[] _buffer) {
-                       Result_COption_CustomOnionMessageContentsZDecodeErrorZ ret = arg.read_custom_message(_message_type, _buffer);
+               public long read_custom_message(long _message_type, long _buffer) {
+                       byte[] _buffer_conv = InternalUtils.decodeUint8Array(_buffer);
+                       Result_COption_OnionMessageContentsZDecodeErrorZ ret = arg.read_custom_message(_message_type, _buffer_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
+               public long release_pending_custom_messages() {
+                       ThreeTuple_OnionMessageContentsDestinationBlindedPathZ[] ret = arg.release_pending_custom_messages();
+                               GC.KeepAlive(arg);
+                       long result = InternalUtils.encodeUint64Array(InternalUtils.mapArray(ret, ret_conv_56 => ret_conv_56 == null ? 0 : ret_conv_56.clone_ptr()));
+                       return result;
+               }
        }
+
+       /** Creates a new instance of CustomOnionMessageHandler from a given implementation */
        public static CustomOnionMessageHandler new_impl(CustomOnionMessageHandlerInterface arg) {
                LDKCustomOnionMessageHandlerHolder impl_holder = new LDKCustomOnionMessageHandlerHolder();
-               impl_holder.held = new CustomOnionMessageHandler(new LDKCustomOnionMessageHandlerImpl(arg, impl_holder));
+               LDKCustomOnionMessageHandlerImpl impl = new LDKCustomOnionMessageHandlerImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKCustomOnionMessageHandler_new(impl);
+
+               impl_holder.held = new CustomOnionMessageHandler(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Called with the custom message that was received, returning a response to send, if any.
+        * 
+        * The returned [`Self::CustomMessage`], if any, is enqueued to be sent by [`OnionMessenger`].
         */
-       public Option_CustomOnionMessageContentsZ handle_custom_message(org.ldk.structs.CustomOnionMessageContents msg) {
+       public Option_OnionMessageContentsZ handle_custom_message(org.ldk.structs.OnionMessageContents msg) {
                long ret = bindings.CustomOnionMessageHandler_handle_custom_message(this.ptr, msg.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(msg);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_CustomOnionMessageContentsZ ret_hu_conv = org.ldk.structs.Option_CustomOnionMessageContentsZ.constr_from_ptr(ret);
+               org.ldk.structs.Option_OnionMessageContentsZ ret_hu_conv = org.ldk.structs.Option_OnionMessageContentsZ.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
                if (this != null) { this.ptrs_to.AddLast(msg); };
                return ret_hu_conv;
@@ -83,15 +109,37 @@ public class CustomOnionMessageHandler : CommonBase {
         * Read a custom message of type `message_type` from `buffer`, returning `Ok(None)` if the
         * message type is unknown.
         */
-       public Result_COption_CustomOnionMessageContentsZDecodeErrorZ read_custom_message(long message_type, byte[] buffer) {
-               long ret = bindings.CustomOnionMessageHandler_read_custom_message(this.ptr, message_type, buffer);
+       public Result_COption_OnionMessageContentsZDecodeErrorZ read_custom_message(long message_type, byte[] buffer) {
+               long ret = bindings.CustomOnionMessageHandler_read_custom_message(this.ptr, message_type, InternalUtils.encodeUint8Array(buffer));
                GC.KeepAlive(this);
                GC.KeepAlive(message_type);
                GC.KeepAlive(buffer);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_COption_CustomOnionMessageContentsZDecodeErrorZ ret_hu_conv = Result_COption_CustomOnionMessageContentsZDecodeErrorZ.constr_from_ptr(ret);
+               Result_COption_OnionMessageContentsZDecodeErrorZ ret_hu_conv = Result_COption_OnionMessageContentsZDecodeErrorZ.constr_from_ptr(ret);
                return ret_hu_conv;
        }
 
+       /**
+        * Releases any [`Self::CustomMessage`]s that need to be sent.
+        * 
+        * Typically, this is used for messages initiating a message flow rather than in response to
+        * another message. The latter should use the return value of [`Self::handle_custom_message`].
+        */
+       public ThreeTuple_OnionMessageContentsDestinationBlindedPathZ[] release_pending_custom_messages() {
+               long ret = bindings.CustomOnionMessageHandler_release_pending_custom_messages(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_56_len = InternalUtils.getArrayLength(ret);
+               ThreeTuple_OnionMessageContentsDestinationBlindedPathZ[] ret_conv_56_arr = new ThreeTuple_OnionMessageContentsDestinationBlindedPathZ[ret_conv_56_len];
+               for (int e = 0; e < ret_conv_56_len; e++) {
+                       long ret_conv_56 = InternalUtils.getU64ArrayElem(ret, e);
+                       ThreeTuple_OnionMessageContentsDestinationBlindedPathZ ret_conv_56_hu_conv = new ThreeTuple_OnionMessageContentsDestinationBlindedPathZ(null, ret_conv_56);
+                       if (ret_conv_56_hu_conv != null) { ret_conv_56_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_56_arr[e] = ret_conv_56_hu_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_56_arr;
+       }
+
 }
 } } }
index 6489199dd49714ce237139920c275c2326322818..ab161ea11eeb86b6e48668c8891823b1182a78e6 100644 (file)
@@ -7,7 +7,7 @@ namespace org { namespace ldk { namespace structs {
 
 
 /**
- * A [`MessageRouter`] that always fails.
+ * A [`MessageRouter`] that can only route to a directly connected [`Destination`].
  */
 public class DefaultMessageRouter : CommonBase {
        internal DefaultMessageRouter(object _dummy, long ptr) : base(ptr) { }
index 8235e7b30484a267fbac1bb3c93efd5756459842..6fd84172fc3fd9fa7fbc33a7d5140de4c62e276e 100644 (file)
@@ -19,7 +19,7 @@ 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.check_arr_len(random_seed_bytes, 32), scorer.ptr, score_params == null ? 0 : score_params.ptr);
+               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);
                GC.KeepAlive(network_graph);
                GC.KeepAlive(logger);
                GC.KeepAlive(random_seed_bytes);
index 2fa6015e02ba4353c61a51a33ebebd8c5eed2963..cb13ce907ab29174d8d8334a0fb844c6448f3e5a 100644 (file)
@@ -43,16 +43,18 @@ public class DelayedPaymentOutputDescriptor : CommonBase {
         * Per commitment point to derive the delayed payment key by key holder.
         */
        public byte[] get_per_commitment_point() {
-               byte[] ret = bindings.DelayedPaymentOutputDescriptor_get_per_commitment_point(this.ptr);
+               long ret = bindings.DelayedPaymentOutputDescriptor_get_per_commitment_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Per commitment point to derive the delayed payment key by key holder.
         */
        public void set_per_commitment_point(byte[] val) {
-               bindings.DelayedPaymentOutputDescriptor_set_per_commitment_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.DelayedPaymentOutputDescriptor_set_per_commitment_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -102,9 +104,11 @@ public class DelayedPaymentOutputDescriptor : CommonBase {
         * derive the witnessScript for this output.
         */
        public byte[] get_revocation_pubkey() {
-               byte[] ret = bindings.DelayedPaymentOutputDescriptor_get_revocation_pubkey(this.ptr);
+               long ret = bindings.DelayedPaymentOutputDescriptor_get_revocation_pubkey(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -112,7 +116,7 @@ public class DelayedPaymentOutputDescriptor : CommonBase {
         * derive the witnessScript for this output.
         */
        public void set_revocation_pubkey(byte[] val) {
-               bindings.DelayedPaymentOutputDescriptor_set_revocation_pubkey(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.DelayedPaymentOutputDescriptor_set_revocation_pubkey(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -122,9 +126,11 @@ public class DelayedPaymentOutputDescriptor : CommonBase {
         * This may be useful in re-deriving keys used in the channel to spend the output.
         */
        public byte[] get_channel_keys_id() {
-               byte[] ret = bindings.DelayedPaymentOutputDescriptor_get_channel_keys_id(this.ptr);
+               long ret = bindings.DelayedPaymentOutputDescriptor_get_channel_keys_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -132,7 +138,7 @@ public class DelayedPaymentOutputDescriptor : CommonBase {
         * This may be useful in re-deriving keys used in the channel to spend the output.
         */
        public void set_channel_keys_id(byte[] val) {
-               bindings.DelayedPaymentOutputDescriptor_set_channel_keys_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.DelayedPaymentOutputDescriptor_set_channel_keys_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -159,7 +165,7 @@ 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.check_arr_len(per_commitment_point_arg, 33), to_self_delay_arg, output_arg.ptr, InternalUtils.check_arr_len(revocation_pubkey_arg, 33), InternalUtils.check_arr_len(channel_keys_id_arg, 32), 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);
                GC.KeepAlive(outpoint_arg);
                GC.KeepAlive(per_commitment_point_arg);
                GC.KeepAlive(to_self_delay_arg);
@@ -192,6 +198,18 @@ public class DelayedPaymentOutputDescriptor : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the DelayedPaymentOutputDescriptor.
+        */
+       public long hash() {
+               long ret = bindings.DelayedPaymentOutputDescriptor_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two DelayedPaymentOutputDescriptors contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
@@ -213,16 +231,18 @@ public class DelayedPaymentOutputDescriptor : CommonBase {
         * Serialize the DelayedPaymentOutputDescriptor object into a byte array which can be read by DelayedPaymentOutputDescriptor_read
         */
        public byte[] write() {
-               byte[] ret = bindings.DelayedPaymentOutputDescriptor_write(this.ptr);
+               long ret = bindings.DelayedPaymentOutputDescriptor_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a DelayedPaymentOutputDescriptor from a byte array, created by DelayedPaymentOutputDescriptor_write
         */
        public static Result_DelayedPaymentOutputDescriptorDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.DelayedPaymentOutputDescriptor_read(ser);
+               long ret = bindings.DelayedPaymentOutputDescriptor_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_DelayedPaymentOutputDescriptorDecodeErrorZ ret_hu_conv = Result_DelayedPaymentOutputDescriptorDecodeErrorZ.constr_from_ptr(ret);
index 46b03515e1e029ac3ea0ac0567dc942cc48f8d37..adbbd7910792c5ce522fb28de67617c88a430d4f 100644 (file)
@@ -72,7 +72,7 @@ public class Description : CommonBase {
         * Please note that single characters may use more than one byte due to UTF8 encoding.
         */
        public static Result_DescriptionCreationErrorZ of(string description) {
-               long ret = bindings.Description_new(description);
+               long ret = bindings.Description_new(InternalUtils.encodeString(description));
                GC.KeepAlive(description);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_DescriptionCreationErrorZ ret_hu_conv = Result_DescriptionCreationErrorZ.constr_from_ptr(ret);
@@ -83,10 +83,12 @@ public class Description : CommonBase {
         * Returns the underlying description [`String`]
         */
        public string into_inner() {
-               string ret = bindings.Description_into_inner(this.ptr);
+               long ret = bindings.Description_into_inner(this.ptr);
                GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
                if (this != null) { this.ptrs_to.AddLast(this); };
-               return ret;
+               return ret_conv;
        }
 
 }
index 1fd19a55f81ad9654931fbbe2cc299f56ab09e84..3d009773074571e494cd2eda88e2d073582d2fe6 100644 (file)
@@ -28,7 +28,9 @@ public class Destination : CommonBase {
        public class Destination_Node : Destination {
                public byte[] node;
                internal Destination_Node(long ptr) : base(null, ptr) {
-                       this.node = bindings.LDKDestination_Node_get_node(ptr);
+                       long node = bindings.LDKDestination_Node_get_node(ptr);
+                       byte[] node_conv = InternalUtils.decodeUint8Array(node);
+                       this.node = node_conv;
                }
        }
        /** A Destination of type BlindedPath */
@@ -63,7 +65,7 @@ public class Destination : CommonBase {
         * Utility method to constructs a new Node-variant Destination
         */
        public static Destination node(byte[] a) {
-               long ret = bindings.Destination_node(InternalUtils.check_arr_len(a, 33));
+               long ret = bindings.Destination_node(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 33)));
                GC.KeepAlive(a);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.Destination ret_hu_conv = org.ldk.structs.Destination.constr_from_ptr(ret);
index e5c55b5143b228c1ee687e39d20a09168516775e..cb33ab8895ce22ac5f95389337851e6fd5b63600 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,6 +6,132 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of EcdsaChannelSigner */
+public interface EcdsaChannelSignerInterface {
+       /**Create a signature for a counterparty's commitment transaction and associated HTLC transactions.
+        * 
+        * Note that if signing fails or is rejected, the channel will be force-closed.
+        * 
+        * 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.
+        * 
+        * 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);
+       /**Creates a signature for a holder's commitment transaction.
+        * 
+        * This will be called
+        * - with a non-revoked `commitment_tx`.
+        * - with the latest `commitment_tx` when we initiate a force-close.
+        * 
+        * This may be called multiple times for the same transaction.
+        * 
+        * An external signer implementation should check that the commitment has not been revoked.
+        */
+       Result_ECDSASignatureNoneZ sign_holder_commitment(HolderCommitmentTransaction commitment_tx);
+       /**Create a signature for the given input in a transaction spending an HTLC transaction output
+        * or a commitment transaction `to_local` output when our counterparty broadcasts an old state.
+        * 
+        * A justice transaction may claim multiple outputs at the same time if timelocks are
+        * similar, but only a signature for the input at index `input` should be signed for here.
+        * It may be called multiple times for same output(s) if a fee-bump is needed with regards
+        * to an upcoming timelock expiration.
+        * 
+        * Amount is value of the output spent by this input, committed to in the BIP 143 signature.
+        * 
+        * `per_commitment_key` is revocation secret which was provided by our counterparty when they
+        * revoked the state which they eventually broadcast. It's not a _holder_ secret key and does
+        * not allow the spending of any funds by itself (you need our holder `revocation_secret` to do
+        * so).
+        */
+       Result_ECDSASignatureNoneZ sign_justice_revoked_output(byte[] justice_tx, long input, long amount, byte[] per_commitment_key);
+       /**Create a signature for the given input in a transaction spending a commitment transaction
+        * HTLC output when our counterparty broadcasts an old state.
+        * 
+        * A justice transaction may claim multiple outputs at the same time if timelocks are
+        * similar, but only a signature for the input at index `input` should be signed for here.
+        * It may be called multiple times for same output(s) if a fee-bump is needed with regards
+        * to an upcoming timelock expiration.
+        * 
+        * `amount` is the value of the output spent by this input, committed to in the BIP 143
+        * signature.
+        * 
+        * `per_commitment_key` is revocation secret which was provided by our counterparty when they
+        * revoked the state which they eventually broadcast. It's not a _holder_ secret key and does
+        * not allow the spending of any funds by itself (you need our holder revocation_secret to do
+        * so).
+        * 
+        * `htlc` holds HTLC elements (hash, timelock), thus changing the format of the witness script
+        * (which is committed to in the BIP 143 signatures).
+        */
+       Result_ECDSASignatureNoneZ sign_justice_revoked_htlc(byte[] justice_tx, long input, long amount, byte[] per_commitment_key, HTLCOutputInCommitment htlc);
+       /**Computes the signature for a commitment transaction's HTLC output used as an input within
+        * `htlc_tx`, which spends the commitment transaction at index `input`. The signature returned
+        * must be be computed using [`EcdsaSighashType::All`].
+        * 
+        * Note that this may be called for HTLCs in the penultimate commitment transaction if a
+        * [`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
+        * [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor
+        */
+       Result_ECDSASignatureNoneZ sign_holder_htlc_transaction(byte[] htlc_tx, long input, HTLCDescriptor htlc_descriptor);
+       /**Create a signature for a claiming transaction for a HTLC output on a counterparty's commitment
+        * transaction, either offered or received.
+        * 
+        * Such a transaction may claim multiples offered outputs at same time if we know the
+        * preimage for each when we create it, but only the input at index `input` should be
+        * signed for here. It may be called multiple times for same output(s) if a fee-bump is
+        * needed with regards to an upcoming timelock expiration.
+        * 
+        * `witness_script` is either an offered or received script as defined in BOLT3 for HTLC
+        * outputs.
+        * 
+        * `amount` is value of the output spent by this input, committed to in the BIP 143 signature.
+        * 
+        * `per_commitment_point` is the dynamic point corresponding to the channel state
+        * detected onchain. It has been generated by our counterparty and is used to derive
+        * channel state keys, which are then included in the witness script and committed to in the
+        * BIP 143 signature.
+        */
+       Result_ECDSASignatureNoneZ sign_counterparty_htlc_transaction(byte[] htlc_tx, long input, long amount, byte[] per_commitment_point, HTLCOutputInCommitment htlc);
+       /**Create a signature for a (proposed) closing transaction.
+        * 
+        * Note that, due to rounding, there may be one \"missing\" satoshi, and either party may have
+        * chosen to forgo their output as dust.
+        */
+       Result_ECDSASignatureNoneZ sign_closing_transaction(ClosingTransaction closing_tx);
+       /**Computes the signature for a commitment transaction's anchor output used as an
+        * input within `anchor_tx`, which spends the commitment transaction, at index `input`.
+        */
+       Result_ECDSASignatureNoneZ sign_holder_anchor_input(byte[] anchor_tx, long input);
+       /**Signs a channel announcement message with our funding key proving it comes from one of the
+        * channel participants.
+        * 
+        * Channel announcements also require a signature from each node's network key. Our node
+        * signature is computed through [`NodeSigner::sign_gossip_message`].
+        * 
+        * 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.
+        */
+       Result_ECDSASignatureNoneZ sign_channel_announcement_with_funding_key(UnsignedChannelAnnouncement msg);
+}
+
 /**
  * A trait to sign Lightning channel transactions as described in
  * [BOLT 3](https://github.com/lightning/bolts/blob/master/03-transactions.md).
@@ -15,238 +142,117 @@ namespace org { namespace ldk { namespace structs {
  * for an example of such policies.
  */
 public class EcdsaChannelSigner : CommonBase {
-       internal readonly bindings.LDKEcdsaChannelSigner bindings_instance;
+       internal bindings.LDKEcdsaChannelSigner bindings_instance;
+       internal long instance_idx;
+
        internal EcdsaChannelSigner(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private EcdsaChannelSigner(bindings.LDKEcdsaChannelSigner arg, bindings.LDKChannelSigner ChannelSigner, ChannelPublicKeys pubkeys) : base(bindings.LDKEcdsaChannelSigner_new(arg, ChannelSigner, pubkeys == null ? 0 : pubkeys.clone_ptr())) {
-               this.ptrs_to.AddLast(arg);
-               this.ptrs_to.AddLast(ChannelSigner);
-               this.bindings_instance = arg;
-       }
        ~EcdsaChannelSigner() {
                if (ptr != 0) { bindings.EcdsaChannelSigner_free(ptr); }
        }
 
-       public interface EcdsaChannelSignerInterface {
-               /**
-                * Create a signature for a counterparty's commitment transaction and associated HTLC transactions.
-                * 
-                * Note that if signing fails or is rejected, the channel will be force-closed.
-                * 
-                * 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.
-                * 
-                * Note that all the relevant preimages will be provided, but there may also be additional
-                * irrelevant or duplicate preimages.
-                */
-               Result_C2Tuple_SignatureCVec_SignatureZZNoneZ 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);
-               /**
-                * Creates a signature for a holder's commitment transaction and its claiming HTLC transactions.
-                * 
-                * This will be called
-                * - with a non-revoked `commitment_tx`.
-                * - with the latest `commitment_tx` when we initiate a force-close.
-                * - with the previous `commitment_tx`, just to get claiming HTLC
-                * signatures, if we are reacting to a [`ChannelMonitor`]
-                * [replica](https://github.com/lightningdevkit/rust-lightning/blob/main/GLOSSARY.md#monitor-replicas)
-                * that decided to broadcast before it had been updated to the latest `commitment_tx`.
-                * 
-                * This may be called multiple times for the same transaction.
-                * 
-                * An external signer implementation should check that the commitment has not been revoked.
-                * 
-                * [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor
-                */
-               Result_C2Tuple_SignatureCVec_SignatureZZNoneZ sign_holder_commitment_and_htlcs(HolderCommitmentTransaction _commitment_tx);
-               /**
-                * Create a signature for the given input in a transaction spending an HTLC transaction output
-                * or a commitment transaction `to_local` output when our counterparty broadcasts an old state.
-                * 
-                * A justice transaction may claim multiple outputs at the same time if timelocks are
-                * similar, but only a signature for the input at index `input` should be signed for here.
-                * It may be called multiple times for same output(s) if a fee-bump is needed with regards
-                * to an upcoming timelock expiration.
-                * 
-                * Amount is value of the output spent by this input, committed to in the BIP 143 signature.
-                * 
-                * `per_commitment_key` is revocation secret which was provided by our counterparty when they
-                * revoked the state which they eventually broadcast. It's not a _holder_ secret key and does
-                * not allow the spending of any funds by itself (you need our holder `revocation_secret` to do
-                * so).
-                */
-               Result_SignatureNoneZ sign_justice_revoked_output(byte[] _justice_tx, long _input, long _amount, byte[] _per_commitment_key);
-               /**
-                * Create a signature for the given input in a transaction spending a commitment transaction
-                * HTLC output when our counterparty broadcasts an old state.
-                * 
-                * A justice transaction may claim multiple outputs at the same time if timelocks are
-                * similar, but only a signature for the input at index `input` should be signed for here.
-                * It may be called multiple times for same output(s) if a fee-bump is needed with regards
-                * to an upcoming timelock expiration.
-                * 
-                * `amount` is the value of the output spent by this input, committed to in the BIP 143
-                * signature.
-                * 
-                * `per_commitment_key` is revocation secret which was provided by our counterparty when they
-                * revoked the state which they eventually broadcast. It's not a _holder_ secret key and does
-                * not allow the spending of any funds by itself (you need our holder revocation_secret to do
-                * so).
-                * 
-                * `htlc` holds HTLC elements (hash, timelock), thus changing the format of the witness script
-                * (which is committed to in the BIP 143 signatures).
-                */
-               Result_SignatureNoneZ sign_justice_revoked_htlc(byte[] _justice_tx, long _input, long _amount, byte[] _per_commitment_key, HTLCOutputInCommitment _htlc);
-               /**
-                * Computes the signature for a commitment transaction's HTLC output used as an input within
-                * `htlc_tx`, which spends the commitment transaction at index `input`. The signature returned
-                * must be be computed using [`EcdsaSighashType::All`]. Note that this should only be used to
-                * sign HTLC transactions from channels supporting anchor outputs after all additional
-                * inputs/outputs have been added to the transaction.
-                * 
-                * [`EcdsaSighashType::All`]: bitcoin::blockdata::transaction::EcdsaSighashType::All
-                */
-               Result_SignatureNoneZ sign_holder_htlc_transaction(byte[] _htlc_tx, long _input, HTLCDescriptor _htlc_descriptor);
-               /**
-                * Create a signature for a claiming transaction for a HTLC output on a counterparty's commitment
-                * transaction, either offered or received.
-                * 
-                * Such a transaction may claim multiples offered outputs at same time if we know the
-                * preimage for each when we create it, but only the input at index `input` should be
-                * signed for here. It may be called multiple times for same output(s) if a fee-bump is
-                * needed with regards to an upcoming timelock expiration.
-                * 
-                * `witness_script` is either an offered or received script as defined in BOLT3 for HTLC
-                * outputs.
-                * 
-                * `amount` is value of the output spent by this input, committed to in the BIP 143 signature.
-                * 
-                * `per_commitment_point` is the dynamic point corresponding to the channel state
-                * detected onchain. It has been generated by our counterparty and is used to derive
-                * channel state keys, which are then included in the witness script and committed to in the
-                * BIP 143 signature.
-                */
-               Result_SignatureNoneZ sign_counterparty_htlc_transaction(byte[] _htlc_tx, long _input, long _amount, byte[] _per_commitment_point, HTLCOutputInCommitment _htlc);
-               /**
-                * Create a signature for a (proposed) closing transaction.
-                * 
-                * Note that, due to rounding, there may be one \"missing\" satoshi, and either party may have
-                * chosen to forgo their output as dust.
-                */
-               Result_SignatureNoneZ sign_closing_transaction(ClosingTransaction _closing_tx);
-               /**
-                * Computes the signature for a commitment transaction's anchor output used as an
-                * input within `anchor_tx`, which spends the commitment transaction, at index `input`.
-                */
-               Result_SignatureNoneZ sign_holder_anchor_input(byte[] _anchor_tx, long _input);
-               /**
-                * Signs a channel announcement message with our funding key proving it comes from one of the
-                * channel participants.
-                * 
-                * Channel announcements also require a signature from each node's network key. Our node
-                * signature is computed through [`NodeSigner::sign_gossip_message`].
-                * 
-                * 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.
-                */
-               Result_SignatureNoneZ sign_channel_announcement_with_funding_key(UnsignedChannelAnnouncement _msg);
-       }
        private class LDKEcdsaChannelSignerHolder { internal EcdsaChannelSigner held; }
        private class LDKEcdsaChannelSignerImpl : bindings.LDKEcdsaChannelSigner {
                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, byte[][] _preimages) {
+               public long sign_counterparty_commitment(long _commitment_tx, long _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); }
-                       Result_C2Tuple_SignatureCVec_SignatureZZNoneZ ret = arg.sign_counterparty_commitment(_commitment_tx_hu_conv, _preimages);
+                       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;
+                       }
+                       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, byte[] _secret) {
-                       Result_NoneNoneZ ret = arg.validate_counterparty_revocation(_idx, _secret);
+               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;
                }
-               public long sign_holder_commitment_and_htlcs(long _commitment_tx) {
+               public long sign_holder_commitment(long _commitment_tx) {
                        org.ldk.structs.HolderCommitmentTransaction _commitment_tx_hu_conv = null; if (_commitment_tx < 0 || _commitment_tx > 4096) { _commitment_tx_hu_conv = new org.ldk.structs.HolderCommitmentTransaction(null, _commitment_tx); }
-                       Result_C2Tuple_SignatureCVec_SignatureZZNoneZ ret = arg.sign_holder_commitment_and_htlcs(_commitment_tx_hu_conv);
+                       Result_ECDSASignatureNoneZ ret = arg.sign_holder_commitment(_commitment_tx_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long sign_justice_revoked_output(byte[] _justice_tx, long _input, long _amount, byte[] _per_commitment_key) {
-                       Result_SignatureNoneZ ret = arg.sign_justice_revoked_output(_justice_tx, _input, _amount, _per_commitment_key);
+               public long sign_justice_revoked_output(long _justice_tx, long _input, long _amount, long _per_commitment_key) {
+                       byte[] _justice_tx_conv = InternalUtils.decodeUint8Array(_justice_tx);
+                       byte[] _per_commitment_key_conv = InternalUtils.decodeUint8Array(_per_commitment_key);
+                       Result_ECDSASignatureNoneZ ret = arg.sign_justice_revoked_output(_justice_tx_conv, _input, _amount, _per_commitment_key_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long sign_justice_revoked_htlc(byte[] _justice_tx, long _input, long _amount, byte[] _per_commitment_key, long _htlc) {
+               public long sign_justice_revoked_htlc(long _justice_tx, long _input, long _amount, long _per_commitment_key, long _htlc) {
+                       byte[] _justice_tx_conv = InternalUtils.decodeUint8Array(_justice_tx);
+                       byte[] _per_commitment_key_conv = InternalUtils.decodeUint8Array(_per_commitment_key);
                        org.ldk.structs.HTLCOutputInCommitment _htlc_hu_conv = null; if (_htlc < 0 || _htlc > 4096) { _htlc_hu_conv = new org.ldk.structs.HTLCOutputInCommitment(null, _htlc); }
-                       Result_SignatureNoneZ ret = arg.sign_justice_revoked_htlc(_justice_tx, _input, _amount, _per_commitment_key, _htlc_hu_conv);
+                       Result_ECDSASignatureNoneZ ret = arg.sign_justice_revoked_htlc(_justice_tx_conv, _input, _amount, _per_commitment_key_conv, _htlc_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long sign_holder_htlc_transaction(byte[] _htlc_tx, long _input, long _htlc_descriptor) {
+               public long sign_holder_htlc_transaction(long _htlc_tx, long _input, long _htlc_descriptor) {
+                       byte[] _htlc_tx_conv = InternalUtils.decodeUint8Array(_htlc_tx);
                        org.ldk.structs.HTLCDescriptor _htlc_descriptor_hu_conv = null; if (_htlc_descriptor < 0 || _htlc_descriptor > 4096) { _htlc_descriptor_hu_conv = new org.ldk.structs.HTLCDescriptor(null, _htlc_descriptor); }
-                       Result_SignatureNoneZ ret = arg.sign_holder_htlc_transaction(_htlc_tx, _input, _htlc_descriptor_hu_conv);
+                       Result_ECDSASignatureNoneZ ret = arg.sign_holder_htlc_transaction(_htlc_tx_conv, _input, _htlc_descriptor_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long sign_counterparty_htlc_transaction(byte[] _htlc_tx, long _input, long _amount, byte[] _per_commitment_point, long _htlc) {
+               public long sign_counterparty_htlc_transaction(long _htlc_tx, long _input, long _amount, long _per_commitment_point, long _htlc) {
+                       byte[] _htlc_tx_conv = InternalUtils.decodeUint8Array(_htlc_tx);
+                       byte[] _per_commitment_point_conv = InternalUtils.decodeUint8Array(_per_commitment_point);
                        org.ldk.structs.HTLCOutputInCommitment _htlc_hu_conv = null; if (_htlc < 0 || _htlc > 4096) { _htlc_hu_conv = new org.ldk.structs.HTLCOutputInCommitment(null, _htlc); }
-                       Result_SignatureNoneZ ret = arg.sign_counterparty_htlc_transaction(_htlc_tx, _input, _amount, _per_commitment_point, _htlc_hu_conv);
+                       Result_ECDSASignatureNoneZ ret = arg.sign_counterparty_htlc_transaction(_htlc_tx_conv, _input, _amount, _per_commitment_point_conv, _htlc_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
                public long sign_closing_transaction(long _closing_tx) {
                        org.ldk.structs.ClosingTransaction _closing_tx_hu_conv = null; if (_closing_tx < 0 || _closing_tx > 4096) { _closing_tx_hu_conv = new org.ldk.structs.ClosingTransaction(null, _closing_tx); }
-                       Result_SignatureNoneZ ret = arg.sign_closing_transaction(_closing_tx_hu_conv);
+                       Result_ECDSASignatureNoneZ ret = arg.sign_closing_transaction(_closing_tx_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long sign_holder_anchor_input(byte[] _anchor_tx, long _input) {
-                       Result_SignatureNoneZ ret = arg.sign_holder_anchor_input(_anchor_tx, _input);
+               public long sign_holder_anchor_input(long _anchor_tx, long _input) {
+                       byte[] _anchor_tx_conv = InternalUtils.decodeUint8Array(_anchor_tx);
+                       Result_ECDSASignatureNoneZ ret = arg.sign_holder_anchor_input(_anchor_tx_conv, _input);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
                public long sign_channel_announcement_with_funding_key(long _msg) {
                        org.ldk.structs.UnsignedChannelAnnouncement _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.UnsignedChannelAnnouncement(null, _msg); }
-                       Result_SignatureNoneZ ret = arg.sign_channel_announcement_with_funding_key(_msg_hu_conv);
+                       Result_ECDSASignatureNoneZ ret = arg.sign_channel_announcement_with_funding_key(_msg_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
        }
-       public static EcdsaChannelSigner new_impl(EcdsaChannelSignerInterface arg, ChannelSigner.ChannelSignerInterface ChannelSigner_impl, ChannelPublicKeys pubkeys) {
+
+       /** Creates a new instance of EcdsaChannelSigner from a given implementation */
+       public static EcdsaChannelSigner new_impl(EcdsaChannelSignerInterface arg, ChannelSignerInterface channelSigner_impl, ChannelPublicKeys pubkeys) {
                LDKEcdsaChannelSignerHolder impl_holder = new LDKEcdsaChannelSignerHolder();
-               impl_holder.held = new EcdsaChannelSigner(new LDKEcdsaChannelSignerImpl(arg, impl_holder), ChannelSigner.new_impl(ChannelSigner_impl, pubkeys).bindings_instance, pubkeys);
-               return impl_holder.held;
-       }
+               LDKEcdsaChannelSignerImpl impl = new LDKEcdsaChannelSignerImpl(arg, impl_holder);
+               ChannelSigner channelSigner = ChannelSigner.new_impl(channelSigner_impl, pubkeys);
+               long[] ptr_idx = bindings.LDKEcdsaChannelSigner_new(impl, channelSigner.instance_idx, pubkeys == null ? 0 : pubkeys.clone_ptr());
 
-       /**
-        * Gets the underlying ChannelSigner.
-        */
-       public ChannelSigner get_channel_signer() {
-               ChannelSigner res = new ChannelSigner(null, bindings.LDKEcdsaChannelSigner_get_ChannelSigner(this.ptr));
-               this.ptrs_to.AddLast(res);
-               return res;
+               impl_holder.held = new EcdsaChannelSigner(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
+               impl_holder.held.ptrs_to.AddLast(channelSigner);
+               return impl_holder.held;
        }
 
        /**
@@ -264,13 +270,13 @@ public class EcdsaChannelSigner : CommonBase {
         * Note that all the relevant preimages will be provided, but there may also be additional
         * irrelevant or duplicate preimages.
         */
-       public Result_C2Tuple_SignatureCVec_SignatureZZNoneZ 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, preimages != null ? InternalUtils.mapArray(preimages, preimages_conv_8 => InternalUtils.check_arr_len(preimages_conv_8, 32)) : null);
+       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)))));
                GC.KeepAlive(this);
                GC.KeepAlive(commitment_tx);
                GC.KeepAlive(preimages);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_SignatureCVec_SignatureZZNoneZ ret_hu_conv = Result_C2Tuple_SignatureCVec_SignatureZZNoneZ.constr_from_ptr(ret);
+               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;
        }
@@ -282,7 +288,7 @@ public class EcdsaChannelSigner : CommonBase {
         * 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.check_arr_len(secret, 32));
+               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);
@@ -292,28 +298,22 @@ public class EcdsaChannelSigner : CommonBase {
        }
 
        /**
-        * Creates a signature for a holder's commitment transaction and its claiming HTLC transactions.
+        * Creates a signature for a holder's commitment transaction.
         * 
         * This will be called
         * - with a non-revoked `commitment_tx`.
         * - with the latest `commitment_tx` when we initiate a force-close.
-        * - with the previous `commitment_tx`, just to get claiming HTLC
-        * signatures, if we are reacting to a [`ChannelMonitor`]
-        * [replica](https://github.com/lightningdevkit/rust-lightning/blob/main/GLOSSARY.md#monitor-replicas)
-        * that decided to broadcast before it had been updated to the latest `commitment_tx`.
         * 
         * This may be called multiple times for the same transaction.
         * 
         * An external signer implementation should check that the commitment has not been revoked.
-        * 
-        * [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor
         */
-       public Result_C2Tuple_SignatureCVec_SignatureZZNoneZ sign_holder_commitment_and_htlcs(org.ldk.structs.HolderCommitmentTransaction commitment_tx) {
-               long ret = bindings.EcdsaChannelSigner_sign_holder_commitment_and_htlcs(this.ptr, commitment_tx == null ? 0 : commitment_tx.ptr);
+       public Result_ECDSASignatureNoneZ sign_holder_commitment(org.ldk.structs.HolderCommitmentTransaction commitment_tx) {
+               long ret = bindings.EcdsaChannelSigner_sign_holder_commitment(this.ptr, commitment_tx == null ? 0 : commitment_tx.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(commitment_tx);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_SignatureCVec_SignatureZZNoneZ ret_hu_conv = Result_C2Tuple_SignatureCVec_SignatureZZNoneZ.constr_from_ptr(ret);
+               Result_ECDSASignatureNoneZ ret_hu_conv = Result_ECDSASignatureNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(commitment_tx); };
                return ret_hu_conv;
        }
@@ -334,15 +334,15 @@ public class EcdsaChannelSigner : CommonBase {
         * not allow the spending of any funds by itself (you need our holder `revocation_secret` to do
         * so).
         */
-       public Result_SignatureNoneZ sign_justice_revoked_output(byte[] justice_tx, long input, long amount, byte[] per_commitment_key) {
-               long ret = bindings.EcdsaChannelSigner_sign_justice_revoked_output(this.ptr, justice_tx, input, amount, InternalUtils.check_arr_len(per_commitment_key, 32));
+       public Result_ECDSASignatureNoneZ sign_justice_revoked_output(byte[] justice_tx, long input, long amount, byte[] per_commitment_key) {
+               long ret = bindings.EcdsaChannelSigner_sign_justice_revoked_output(this.ptr, InternalUtils.encodeUint8Array(justice_tx), input, amount, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_key, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(justice_tx);
                GC.KeepAlive(input);
                GC.KeepAlive(amount);
                GC.KeepAlive(per_commitment_key);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_SignatureNoneZ ret_hu_conv = Result_SignatureNoneZ.constr_from_ptr(ret);
+               Result_ECDSASignatureNoneZ ret_hu_conv = Result_ECDSASignatureNoneZ.constr_from_ptr(ret);
                return ret_hu_conv;
        }
 
@@ -366,8 +366,8 @@ public class EcdsaChannelSigner : CommonBase {
         * `htlc` holds HTLC elements (hash, timelock), thus changing the format of the witness script
         * (which is committed to in the BIP 143 signatures).
         */
-       public Result_SignatureNoneZ sign_justice_revoked_htlc(byte[] justice_tx, long input, long amount, byte[] per_commitment_key, org.ldk.structs.HTLCOutputInCommitment htlc) {
-               long ret = bindings.EcdsaChannelSigner_sign_justice_revoked_htlc(this.ptr, justice_tx, input, amount, InternalUtils.check_arr_len(per_commitment_key, 32), htlc == null ? 0 : htlc.ptr);
+       public Result_ECDSASignatureNoneZ sign_justice_revoked_htlc(byte[] justice_tx, long input, long amount, byte[] per_commitment_key, org.ldk.structs.HTLCOutputInCommitment htlc) {
+               long ret = bindings.EcdsaChannelSigner_sign_justice_revoked_htlc(this.ptr, InternalUtils.encodeUint8Array(justice_tx), input, amount, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_key, 32)), htlc == null ? 0 : htlc.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(justice_tx);
                GC.KeepAlive(input);
@@ -375,7 +375,7 @@ public class EcdsaChannelSigner : CommonBase {
                GC.KeepAlive(per_commitment_key);
                GC.KeepAlive(htlc);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_SignatureNoneZ ret_hu_conv = Result_SignatureNoneZ.constr_from_ptr(ret);
+               Result_ECDSASignatureNoneZ ret_hu_conv = Result_ECDSASignatureNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(htlc); };
                return ret_hu_conv;
        }
@@ -383,20 +383,23 @@ public class EcdsaChannelSigner : CommonBase {
        /**
         * Computes the signature for a commitment transaction's HTLC output used as an input within
         * `htlc_tx`, which spends the commitment transaction at index `input`. The signature returned
-        * must be be computed using [`EcdsaSighashType::All`]. Note that this should only be used to
-        * sign HTLC transactions from channels supporting anchor outputs after all additional
-        * inputs/outputs have been added to the transaction.
+        * must be be computed using [`EcdsaSighashType::All`].
+        * 
+        * Note that this may be called for HTLCs in the penultimate commitment transaction if a
+        * [`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
+        * [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor
         */
-       public Result_SignatureNoneZ sign_holder_htlc_transaction(byte[] htlc_tx, long input, org.ldk.structs.HTLCDescriptor htlc_descriptor) {
-               long ret = bindings.EcdsaChannelSigner_sign_holder_htlc_transaction(this.ptr, htlc_tx, input, htlc_descriptor == null ? 0 : htlc_descriptor.ptr);
+       public Result_ECDSASignatureNoneZ sign_holder_htlc_transaction(byte[] htlc_tx, long input, org.ldk.structs.HTLCDescriptor htlc_descriptor) {
+               long ret = bindings.EcdsaChannelSigner_sign_holder_htlc_transaction(this.ptr, InternalUtils.encodeUint8Array(htlc_tx), input, htlc_descriptor == null ? 0 : htlc_descriptor.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(htlc_tx);
                GC.KeepAlive(input);
                GC.KeepAlive(htlc_descriptor);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_SignatureNoneZ ret_hu_conv = Result_SignatureNoneZ.constr_from_ptr(ret);
+               Result_ECDSASignatureNoneZ ret_hu_conv = Result_ECDSASignatureNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(htlc_descriptor); };
                return ret_hu_conv;
        }
@@ -420,8 +423,8 @@ public class EcdsaChannelSigner : CommonBase {
         * channel state keys, which are then included in the witness script and committed to in the
         * BIP 143 signature.
         */
-       public Result_SignatureNoneZ sign_counterparty_htlc_transaction(byte[] htlc_tx, long input, long amount, byte[] per_commitment_point, org.ldk.structs.HTLCOutputInCommitment htlc) {
-               long ret = bindings.EcdsaChannelSigner_sign_counterparty_htlc_transaction(this.ptr, htlc_tx, input, amount, InternalUtils.check_arr_len(per_commitment_point, 33), htlc == null ? 0 : htlc.ptr);
+       public Result_ECDSASignatureNoneZ sign_counterparty_htlc_transaction(byte[] htlc_tx, long input, long amount, byte[] per_commitment_point, org.ldk.structs.HTLCOutputInCommitment htlc) {
+               long ret = bindings.EcdsaChannelSigner_sign_counterparty_htlc_transaction(this.ptr, InternalUtils.encodeUint8Array(htlc_tx), input, amount, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_point, 33)), htlc == null ? 0 : htlc.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(htlc_tx);
                GC.KeepAlive(input);
@@ -429,7 +432,7 @@ public class EcdsaChannelSigner : CommonBase {
                GC.KeepAlive(per_commitment_point);
                GC.KeepAlive(htlc);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_SignatureNoneZ ret_hu_conv = Result_SignatureNoneZ.constr_from_ptr(ret);
+               Result_ECDSASignatureNoneZ ret_hu_conv = Result_ECDSASignatureNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(htlc); };
                return ret_hu_conv;
        }
@@ -440,12 +443,12 @@ public class EcdsaChannelSigner : CommonBase {
         * Note that, due to rounding, there may be one \"missing\" satoshi, and either party may have
         * chosen to forgo their output as dust.
         */
-       public Result_SignatureNoneZ sign_closing_transaction(org.ldk.structs.ClosingTransaction closing_tx) {
+       public Result_ECDSASignatureNoneZ sign_closing_transaction(org.ldk.structs.ClosingTransaction closing_tx) {
                long ret = bindings.EcdsaChannelSigner_sign_closing_transaction(this.ptr, closing_tx == null ? 0 : closing_tx.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(closing_tx);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_SignatureNoneZ ret_hu_conv = Result_SignatureNoneZ.constr_from_ptr(ret);
+               Result_ECDSASignatureNoneZ ret_hu_conv = Result_ECDSASignatureNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(closing_tx); };
                return ret_hu_conv;
        }
@@ -454,13 +457,13 @@ public class EcdsaChannelSigner : CommonBase {
         * Computes the signature for a commitment transaction's anchor output used as an
         * input within `anchor_tx`, which spends the commitment transaction, at index `input`.
         */
-       public Result_SignatureNoneZ sign_holder_anchor_input(byte[] anchor_tx, long input) {
-               long ret = bindings.EcdsaChannelSigner_sign_holder_anchor_input(this.ptr, anchor_tx, input);
+       public Result_ECDSASignatureNoneZ sign_holder_anchor_input(byte[] anchor_tx, long input) {
+               long ret = bindings.EcdsaChannelSigner_sign_holder_anchor_input(this.ptr, InternalUtils.encodeUint8Array(anchor_tx), input);
                GC.KeepAlive(this);
                GC.KeepAlive(anchor_tx);
                GC.KeepAlive(input);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_SignatureNoneZ ret_hu_conv = Result_SignatureNoneZ.constr_from_ptr(ret);
+               Result_ECDSASignatureNoneZ ret_hu_conv = Result_ECDSASignatureNoneZ.constr_from_ptr(ret);
                return ret_hu_conv;
        }
 
@@ -475,12 +478,12 @@ public class EcdsaChannelSigner : CommonBase {
         * our counterparty may (though likely will not) close the channel on us for violating the
         * protocol.
         */
-       public Result_SignatureNoneZ sign_channel_announcement_with_funding_key(org.ldk.structs.UnsignedChannelAnnouncement msg) {
+       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);
                GC.KeepAlive(this);
                GC.KeepAlive(msg);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_SignatureNoneZ ret_hu_conv = Result_SignatureNoneZ.constr_from_ptr(ret);
+               Result_ECDSASignatureNoneZ ret_hu_conv = Result_ECDSASignatureNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(msg); };
                return ret_hu_conv;
        }
index 5a9cecf5bc03f013bb5a43dd7a8f564827ad0786..f400924edd2dda1fc204f51b74b1ac681fb5da8b 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,52 +6,63 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of EntropySource */
+public interface EntropySourceInterface {
+       /**Gets a unique, cryptographically-secure, random 32-byte value. This method must return a
+        * different value each time it is called.
+        */
+       byte[] get_secure_random_bytes();
+}
+
 /**
  * A trait that describes a source of entropy.
  */
 public class EntropySource : CommonBase {
-       internal readonly bindings.LDKEntropySource bindings_instance;
+       internal bindings.LDKEntropySource bindings_instance;
+       internal long instance_idx;
+
        internal EntropySource(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private EntropySource(bindings.LDKEntropySource arg) : base(bindings.LDKEntropySource_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~EntropySource() {
                if (ptr != 0) { bindings.EntropySource_free(ptr); }
        }
 
-       public interface EntropySourceInterface {
-               /**
-                * Gets a unique, cryptographically-secure, random 32-byte value. This method must return a
-                * different value each time it is called.
-                */
-               byte[] get_secure_random_bytes();
-       }
        private class LDKEntropySourceHolder { internal EntropySource held; }
        private class LDKEntropySourceImpl : bindings.LDKEntropySource {
                internal LDKEntropySourceImpl(EntropySourceInterface arg, LDKEntropySourceHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private EntropySourceInterface arg;
                private LDKEntropySourceHolder impl_holder;
-               public byte[] get_secure_random_bytes() {
+               public long get_secure_random_bytes() {
                        byte[] ret = arg.get_secure_random_bytes();
                                GC.KeepAlive(arg);
-                       byte[] result = InternalUtils.check_arr_len(ret, 32);
+                       long result = InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(ret, 32));
                        return result;
                }
        }
+
+       /** Creates a new instance of EntropySource from a given implementation */
        public static EntropySource new_impl(EntropySourceInterface arg) {
                LDKEntropySourceHolder impl_holder = new LDKEntropySourceHolder();
-               impl_holder.held = new EntropySource(new LDKEntropySourceImpl(arg, impl_holder));
+               LDKEntropySourceImpl impl = new LDKEntropySourceImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKEntropySource_new(impl);
+
+               impl_holder.held = new EntropySource(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Gets a unique, cryptographically-secure, random 32-byte value. This method must return a
         * different value each time it is called.
         */
        public byte[] get_secure_random_bytes() {
-               byte[] ret = bindings.EntropySource_get_secure_random_bytes(this.ptr);
+               long ret = bindings.EntropySource_get_secure_random_bytes(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index 8ddb6965153ac185f9c26fd06171c988ee605897..9a4135a76e6057dd4384925ddb3df81fcc6090ef 100644 (file)
@@ -24,9 +24,11 @@ public class ErrorMessage : CommonBase {
         * with the sending peer should be closed.
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.ErrorMessage_get_channel_id(this.ptr);
+               long ret = bindings.ErrorMessage_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -36,7 +38,7 @@ public class ErrorMessage : CommonBase {
         * with the sending peer should be closed.
         */
        public void set_channel_id(byte[] val) {
-               bindings.ErrorMessage_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.ErrorMessage_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -49,9 +51,11 @@ public class ErrorMessage : CommonBase {
         * the terminal emulator or the logging subsystem.
         */
        public string get_data() {
-               string ret = bindings.ErrorMessage_get_data(this.ptr);
+               long ret = bindings.ErrorMessage_get_data(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
        }
 
        /**
@@ -62,7 +66,7 @@ public class ErrorMessage : CommonBase {
         * the terminal emulator or the logging subsystem.
         */
        public void set_data(string val) {
-               bindings.ErrorMessage_set_data(this.ptr, val);
+               bindings.ErrorMessage_set_data(this.ptr, InternalUtils.encodeString(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -71,7 +75,7 @@ public class ErrorMessage : CommonBase {
         * Constructs a new ErrorMessage given each field
         */
        public static ErrorMessage of(byte[] channel_id_arg, string data_arg) {
-               long ret = bindings.ErrorMessage_new(InternalUtils.check_arr_len(channel_id_arg, 32), data_arg);
+               long ret = bindings.ErrorMessage_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), InternalUtils.encodeString(data_arg));
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(data_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -119,16 +123,18 @@ public class ErrorMessage : CommonBase {
         * Serialize the ErrorMessage object into a byte array which can be read by ErrorMessage_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ErrorMessage_write(this.ptr);
+               long ret = bindings.ErrorMessage_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ErrorMessage from a byte array, created by ErrorMessage_write
         */
        public static Result_ErrorMessageDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ErrorMessage_read(ser);
+               long ret = bindings.ErrorMessage_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ErrorMessageDecodeErrorZ ret_hu_conv = Result_ErrorMessageDecodeErrorZ.constr_from_ptr(ret);
index bf9bb5202fa461431476bc7a850aa3003a74bfbc..805b57eb28d477897cd5256d06afcc657f11b00f 100644 (file)
@@ -24,23 +24,24 @@ 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_PaymentSent(ptr);
-                       case 4: return new Event_PaymentFailed(ptr);
-                       case 5: return new Event_PaymentPathSuccessful(ptr);
-                       case 6: return new Event_PaymentPathFailed(ptr);
-                       case 7: return new Event_ProbeSuccessful(ptr);
-                       case 8: return new Event_ProbeFailed(ptr);
-                       case 9: return new Event_PendingHTLCsForwardable(ptr);
-                       case 10: return new Event_HTLCIntercepted(ptr);
-                       case 11: return new Event_SpendableOutputs(ptr);
-                       case 12: return new Event_PaymentForwarded(ptr);
-                       case 13: return new Event_ChannelPending(ptr);
-                       case 14: return new Event_ChannelReady(ptr);
-                       case 15: return new Event_ChannelClosed(ptr);
-                       case 16: return new Event_DiscardFunding(ptr);
-                       case 17: return new Event_OpenChannelRequest(ptr);
-                       case 18: return new Event_HTLCHandlingFailed(ptr);
-                       case 19: return new Event_BumpTransaction(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);
                        default:
                                throw new ArgumentException("Impossible enum variant");
                }
@@ -71,19 +72,29 @@ public class Event : CommonBase {
                 */
                public byte[] output_script;
                /**
-                * The `user_channel_id` value passed in to [`ChannelManager::create_channel`], or a
-                * random value for an inbound channel. This may be zero for objects serialized with LDK
-                * versions prior to 0.0.113.
+                * The `user_channel_id` value passed in to [`ChannelManager::create_channel`] for outbound
+                * channels, or to [`ChannelManager::accept_inbound_channel`] for inbound channels if
+                * [`UserConfig::manually_accept_inbound_channels`] config flag is set to true. Otherwise
+                * `user_channel_id` will be randomized for an inbound channel.  This may be zero for objects
+                * serialized with LDK versions prior to 0.0.113.
                 * 
                 * [`ChannelManager::create_channel`]: crate::ln::channelmanager::ChannelManager::create_channel
+                * [`ChannelManager::accept_inbound_channel`]: crate::ln::channelmanager::ChannelManager::accept_inbound_channel
+                * [`UserConfig::manually_accept_inbound_channels`]: crate::util::config::UserConfig::manually_accept_inbound_channels
                 */
                public UInt128 user_channel_id;
                internal Event_FundingGenerationReady(long ptr) : base(null, ptr) {
-                       this.temporary_channel_id = bindings.LDKEvent_FundingGenerationReady_get_temporary_channel_id(ptr);
-                       this.counterparty_node_id = bindings.LDKEvent_FundingGenerationReady_get_counterparty_node_id(ptr);
+                       long temporary_channel_id = bindings.LDKEvent_FundingGenerationReady_get_temporary_channel_id(ptr);
+                       byte[] temporary_channel_id_conv = InternalUtils.decodeUint8Array(temporary_channel_id);
+                       this.temporary_channel_id = temporary_channel_id_conv;
+                       long counterparty_node_id = bindings.LDKEvent_FundingGenerationReady_get_counterparty_node_id(ptr);
+                       byte[] counterparty_node_id_conv = InternalUtils.decodeUint8Array(counterparty_node_id);
+                       this.counterparty_node_id = counterparty_node_id_conv;
                        this.channel_value_satoshis = bindings.LDKEvent_FundingGenerationReady_get_channel_value_satoshis(ptr);
-                       this.output_script = bindings.LDKEvent_FundingGenerationReady_get_output_script(ptr);
-                       byte[] user_channel_id = bindings.LDKEvent_FundingGenerationReady_get_user_channel_id(ptr);
+                       long output_script = bindings.LDKEvent_FundingGenerationReady_get_output_script(ptr);
+                       byte[] output_script_conv = InternalUtils.decodeUint8Array(output_script);
+                       this.output_script = output_script_conv;
+                       long user_channel_id = bindings.LDKEvent_FundingGenerationReady_get_user_channel_id(ptr);
                        org.ldk.util.UInt128 user_channel_id_conv = new org.ldk.util.UInt128(user_channel_id);
                        this.user_channel_id = user_channel_id_conv;
                }
@@ -145,14 +156,12 @@ public class Event : CommonBase {
                public PaymentPurpose purpose;
                /**
                 * The `channel_id` indicating over which channel we received the payment.
-                * 
-                * Note that this (or a relevant inner pointer) may be NULL or all-0s to represent None
                 */
-               public byte[] via_channel_id;
+               public Option_ThirtyTwoBytesZ via_channel_id;
                /**
                 * The `user_channel_id` indicating over which channel we received the payment.
                 */
-               public Option_u128Z via_user_channel_id;
+               public Option_U128Z via_user_channel_id;
                /**
                 * The block height at which this payment will be failed back and will no longer be
                 * eligible for claiming.
@@ -164,8 +173,12 @@ public class Event : CommonBase {
                 */
                public Option_u32Z claim_deadline;
                internal Event_PaymentClaimable(long ptr) : base(null, ptr) {
-                       this.receiver_node_id = bindings.LDKEvent_PaymentClaimable_get_receiver_node_id(ptr);
-                       this.payment_hash = bindings.LDKEvent_PaymentClaimable_get_payment_hash(ptr);
+                       long receiver_node_id = bindings.LDKEvent_PaymentClaimable_get_receiver_node_id(ptr);
+                       byte[] receiver_node_id_conv = InternalUtils.decodeUint8Array(receiver_node_id);
+                       this.receiver_node_id = receiver_node_id_conv;
+                       long payment_hash = bindings.LDKEvent_PaymentClaimable_get_payment_hash(ptr);
+                       byte[] payment_hash_conv = InternalUtils.decodeUint8Array(payment_hash);
+                       this.payment_hash = payment_hash_conv;
                        long onion_fields = bindings.LDKEvent_PaymentClaimable_get_onion_fields(ptr);
                        org.ldk.structs.RecipientOnionFields onion_fields_hu_conv = null; if (onion_fields < 0 || onion_fields > 4096) { onion_fields_hu_conv = new org.ldk.structs.RecipientOnionFields(null, onion_fields); }
                        if (onion_fields_hu_conv != null) { onion_fields_hu_conv.ptrs_to.AddLast(this); };
@@ -176,9 +189,12 @@ public class Event : CommonBase {
                        org.ldk.structs.PaymentPurpose purpose_hu_conv = org.ldk.structs.PaymentPurpose.constr_from_ptr(purpose);
                        if (purpose_hu_conv != null) { purpose_hu_conv.ptrs_to.AddLast(this); };
                        this.purpose = purpose_hu_conv;
-                       this.via_channel_id = bindings.LDKEvent_PaymentClaimable_get_via_channel_id(ptr);
+                       long via_channel_id = bindings.LDKEvent_PaymentClaimable_get_via_channel_id(ptr);
+                       org.ldk.structs.Option_ThirtyTwoBytesZ via_channel_id_hu_conv = org.ldk.structs.Option_ThirtyTwoBytesZ.constr_from_ptr(via_channel_id);
+                       if (via_channel_id_hu_conv != null) { via_channel_id_hu_conv.ptrs_to.AddLast(this); };
+                       this.via_channel_id = via_channel_id_hu_conv;
                        long via_user_channel_id = bindings.LDKEvent_PaymentClaimable_get_via_user_channel_id(ptr);
-                       org.ldk.structs.Option_u128Z via_user_channel_id_hu_conv = org.ldk.structs.Option_u128Z.constr_from_ptr(via_user_channel_id);
+                       org.ldk.structs.Option_U128Z via_user_channel_id_hu_conv = org.ldk.structs.Option_U128Z.constr_from_ptr(via_user_channel_id);
                        if (via_user_channel_id_hu_conv != null) { via_user_channel_id_hu_conv.ptrs_to.AddLast(this); };
                        this.via_user_channel_id = via_user_channel_id_hu_conv;
                        long claim_deadline = bindings.LDKEvent_PaymentClaimable_get_claim_deadline(ptr);
@@ -215,14 +231,55 @@ public class Event : CommonBase {
                 * spontaneous payment.
                 */
                public PaymentPurpose purpose;
+               /**
+                * The HTLCs that comprise the claimed payment. This will be empty for events serialized prior
+                * to LDK version 0.0.117.
+                */
+               public ClaimedHTLC[] htlcs;
+               /**
+                * The sender-intended sum total of all the MPP parts. This will be `None` for events
+                * serialized prior to LDK version 0.0.117.
+                */
+               public Option_u64Z sender_intended_total_msat;
                internal Event_PaymentClaimed(long ptr) : base(null, ptr) {
-                       this.receiver_node_id = bindings.LDKEvent_PaymentClaimed_get_receiver_node_id(ptr);
-                       this.payment_hash = bindings.LDKEvent_PaymentClaimed_get_payment_hash(ptr);
+                       long receiver_node_id = bindings.LDKEvent_PaymentClaimed_get_receiver_node_id(ptr);
+                       byte[] receiver_node_id_conv = InternalUtils.decodeUint8Array(receiver_node_id);
+                       this.receiver_node_id = receiver_node_id_conv;
+                       long payment_hash = bindings.LDKEvent_PaymentClaimed_get_payment_hash(ptr);
+                       byte[] payment_hash_conv = InternalUtils.decodeUint8Array(payment_hash);
+                       this.payment_hash = payment_hash_conv;
                        this.amount_msat = bindings.LDKEvent_PaymentClaimed_get_amount_msat(ptr);
                        long purpose = bindings.LDKEvent_PaymentClaimed_get_purpose(ptr);
                        org.ldk.structs.PaymentPurpose purpose_hu_conv = org.ldk.structs.PaymentPurpose.constr_from_ptr(purpose);
                        if (purpose_hu_conv != null) { purpose_hu_conv.ptrs_to.AddLast(this); };
                        this.purpose = purpose_hu_conv;
+                       long htlcs = bindings.LDKEvent_PaymentClaimed_get_htlcs(ptr);
+                       int htlcs_conv_13_len = InternalUtils.getArrayLength(htlcs);
+                       ClaimedHTLC[] htlcs_conv_13_arr = new ClaimedHTLC[htlcs_conv_13_len];
+                       for (int n = 0; n < htlcs_conv_13_len; n++) {
+                               long htlcs_conv_13 = InternalUtils.getU64ArrayElem(htlcs, n);
+                               org.ldk.structs.ClaimedHTLC htlcs_conv_13_hu_conv = null; if (htlcs_conv_13 < 0 || htlcs_conv_13 > 4096) { htlcs_conv_13_hu_conv = new org.ldk.structs.ClaimedHTLC(null, htlcs_conv_13); }
+                               if (htlcs_conv_13_hu_conv != null) { htlcs_conv_13_hu_conv.ptrs_to.AddLast(this); };
+                               htlcs_conv_13_arr[n] = htlcs_conv_13_hu_conv;
+                       }
+                       bindings.free_buffer(htlcs);
+                       this.htlcs = htlcs_conv_13_arr;
+                       long sender_intended_total_msat = bindings.LDKEvent_PaymentClaimed_get_sender_intended_total_msat(ptr);
+                       org.ldk.structs.Option_u64Z sender_intended_total_msat_hu_conv = org.ldk.structs.Option_u64Z.constr_from_ptr(sender_intended_total_msat);
+                       if (sender_intended_total_msat_hu_conv != null) { sender_intended_total_msat_hu_conv.ptrs_to.AddLast(this); };
+                       this.sender_intended_total_msat = sender_intended_total_msat_hu_conv;
+               }
+       }
+       /** A Event of type InvoiceRequestFailed */
+       public class Event_InvoiceRequestFailed : Event {
+               /**
+                * The `payment_id` to have been associated with payment for the requested invoice.
+                */
+               public byte[] payment_id;
+               internal Event_InvoiceRequestFailed(long ptr) : base(null, ptr) {
+                       long payment_id = bindings.LDKEvent_InvoiceRequestFailed_get_payment_id(ptr);
+                       byte[] payment_id_conv = InternalUtils.decodeUint8Array(payment_id);
+                       this.payment_id = payment_id_conv;
                }
        }
        /** A Event of type PaymentSent */
@@ -232,7 +289,7 @@ public class Event : CommonBase {
                 * 
                 * [`ChannelManager::send_payment`]: crate::ln::channelmanager::ChannelManager::send_payment
                 */
-               public Option_PaymentIdZ payment_id;
+               public Option_ThirtyTwoBytesZ payment_id;
                /**
                 * The preimage to the hash given to ChannelManager::send_payment.
                 * Note that this serves as a payment receipt, if you wish to have such a thing, you must
@@ -259,11 +316,15 @@ public class Event : CommonBase {
                public Option_u64Z fee_paid_msat;
                internal Event_PaymentSent(long ptr) : base(null, ptr) {
                        long payment_id = bindings.LDKEvent_PaymentSent_get_payment_id(ptr);
-                       org.ldk.structs.Option_PaymentIdZ payment_id_hu_conv = org.ldk.structs.Option_PaymentIdZ.constr_from_ptr(payment_id);
+                       org.ldk.structs.Option_ThirtyTwoBytesZ payment_id_hu_conv = org.ldk.structs.Option_ThirtyTwoBytesZ.constr_from_ptr(payment_id);
                        if (payment_id_hu_conv != null) { payment_id_hu_conv.ptrs_to.AddLast(this); };
                        this.payment_id = payment_id_hu_conv;
-                       this.payment_preimage = bindings.LDKEvent_PaymentSent_get_payment_preimage(ptr);
-                       this.payment_hash = bindings.LDKEvent_PaymentSent_get_payment_hash(ptr);
+                       long payment_preimage = bindings.LDKEvent_PaymentSent_get_payment_preimage(ptr);
+                       byte[] payment_preimage_conv = InternalUtils.decodeUint8Array(payment_preimage);
+                       this.payment_preimage = payment_preimage_conv;
+                       long payment_hash = bindings.LDKEvent_PaymentSent_get_payment_hash(ptr);
+                       byte[] payment_hash_conv = InternalUtils.decodeUint8Array(payment_hash);
+                       this.payment_hash = payment_hash_conv;
                        long fee_paid_msat = bindings.LDKEvent_PaymentSent_get_fee_paid_msat(ptr);
                        org.ldk.structs.Option_u64Z fee_paid_msat_hu_conv = org.ldk.structs.Option_u64Z.constr_from_ptr(fee_paid_msat);
                        if (fee_paid_msat_hu_conv != null) { fee_paid_msat_hu_conv.ptrs_to.AddLast(this); };
@@ -290,8 +351,12 @@ public class Event : CommonBase {
                 */
                public Option_PaymentFailureReasonZ reason;
                internal Event_PaymentFailed(long ptr) : base(null, ptr) {
-                       this.payment_id = bindings.LDKEvent_PaymentFailed_get_payment_id(ptr);
-                       this.payment_hash = bindings.LDKEvent_PaymentFailed_get_payment_hash(ptr);
+                       long payment_id = bindings.LDKEvent_PaymentFailed_get_payment_id(ptr);
+                       byte[] payment_id_conv = InternalUtils.decodeUint8Array(payment_id);
+                       this.payment_id = payment_id_conv;
+                       long payment_hash = bindings.LDKEvent_PaymentFailed_get_payment_hash(ptr);
+                       byte[] payment_hash_conv = InternalUtils.decodeUint8Array(payment_hash);
+                       this.payment_hash = payment_hash_conv;
                        long reason = bindings.LDKEvent_PaymentFailed_get_reason(ptr);
                        org.ldk.structs.Option_PaymentFailureReasonZ reason_hu_conv = org.ldk.structs.Option_PaymentFailureReasonZ.constr_from_ptr(reason);
                        if (reason_hu_conv != null) { reason_hu_conv.ptrs_to.AddLast(this); };
@@ -313,7 +378,7 @@ public class Event : CommonBase {
                 * 
                 * [`ChannelManager::send_payment`]: crate::ln::channelmanager::ChannelManager::send_payment
                 */
-               public Option_PaymentHashZ payment_hash;
+               public Option_ThirtyTwoBytesZ payment_hash;
                /**
                 * The payment path that was successful.
                 * 
@@ -321,9 +386,11 @@ public class Event : CommonBase {
                 */
                public Path path;
                internal Event_PaymentPathSuccessful(long ptr) : base(null, ptr) {
-                       this.payment_id = bindings.LDKEvent_PaymentPathSuccessful_get_payment_id(ptr);
+                       long payment_id = bindings.LDKEvent_PaymentPathSuccessful_get_payment_id(ptr);
+                       byte[] payment_id_conv = InternalUtils.decodeUint8Array(payment_id);
+                       this.payment_id = payment_id_conv;
                        long payment_hash = bindings.LDKEvent_PaymentPathSuccessful_get_payment_hash(ptr);
-                       org.ldk.structs.Option_PaymentHashZ payment_hash_hu_conv = org.ldk.structs.Option_PaymentHashZ.constr_from_ptr(payment_hash);
+                       org.ldk.structs.Option_ThirtyTwoBytesZ payment_hash_hu_conv = org.ldk.structs.Option_ThirtyTwoBytesZ.constr_from_ptr(payment_hash);
                        if (payment_hash_hu_conv != null) { payment_hash_hu_conv.ptrs_to.AddLast(this); };
                        this.payment_hash = payment_hash_hu_conv;
                        long path = bindings.LDKEvent_PaymentPathSuccessful_get_path(ptr);
@@ -342,7 +409,7 @@ public class Event : CommonBase {
                 * [`ChannelManager::send_payment`]: crate::ln::channelmanager::ChannelManager::send_payment
                 * [`ChannelManager::abandon_payment`]: crate::ln::channelmanager::ChannelManager::abandon_payment
                 */
-               public Option_PaymentIdZ payment_id;
+               public Option_ThirtyTwoBytesZ payment_id;
                /**
                 * The hash that was given to [`ChannelManager::send_payment`].
                 * 
@@ -379,10 +446,12 @@ public class Event : CommonBase {
                public Option_u64Z short_channel_id;
                internal Event_PaymentPathFailed(long ptr) : base(null, ptr) {
                        long payment_id = bindings.LDKEvent_PaymentPathFailed_get_payment_id(ptr);
-                       org.ldk.structs.Option_PaymentIdZ payment_id_hu_conv = org.ldk.structs.Option_PaymentIdZ.constr_from_ptr(payment_id);
+                       org.ldk.structs.Option_ThirtyTwoBytesZ payment_id_hu_conv = org.ldk.structs.Option_ThirtyTwoBytesZ.constr_from_ptr(payment_id);
                        if (payment_id_hu_conv != null) { payment_id_hu_conv.ptrs_to.AddLast(this); };
                        this.payment_id = payment_id_hu_conv;
-                       this.payment_hash = bindings.LDKEvent_PaymentPathFailed_get_payment_hash(ptr);
+                       long payment_hash = bindings.LDKEvent_PaymentPathFailed_get_payment_hash(ptr);
+                       byte[] payment_hash_conv = InternalUtils.decodeUint8Array(payment_hash);
+                       this.payment_hash = payment_hash_conv;
                        this.payment_failed_permanently = bindings.LDKEvent_PaymentPathFailed_get_payment_failed_permanently(ptr);
                        long failure = bindings.LDKEvent_PaymentPathFailed_get_failure(ptr);
                        org.ldk.structs.PathFailure failure_hu_conv = org.ldk.structs.PathFailure.constr_from_ptr(failure);
@@ -417,8 +486,12 @@ public class Event : CommonBase {
                 */
                public Path path;
                internal Event_ProbeSuccessful(long ptr) : base(null, ptr) {
-                       this.payment_id = bindings.LDKEvent_ProbeSuccessful_get_payment_id(ptr);
-                       this.payment_hash = bindings.LDKEvent_ProbeSuccessful_get_payment_hash(ptr);
+                       long payment_id = bindings.LDKEvent_ProbeSuccessful_get_payment_id(ptr);
+                       byte[] payment_id_conv = InternalUtils.decodeUint8Array(payment_id);
+                       this.payment_id = payment_id_conv;
+                       long payment_hash = bindings.LDKEvent_ProbeSuccessful_get_payment_hash(ptr);
+                       byte[] payment_hash_conv = InternalUtils.decodeUint8Array(payment_hash);
+                       this.payment_hash = payment_hash_conv;
                        long path = bindings.LDKEvent_ProbeSuccessful_get_path(ptr);
                        org.ldk.structs.Path path_hu_conv = null; if (path < 0 || path > 4096) { path_hu_conv = new org.ldk.structs.Path(null, path); }
                        if (path_hu_conv != null) { path_hu_conv.ptrs_to.AddLast(this); };
@@ -452,8 +525,12 @@ public class Event : CommonBase {
                 */
                public Option_u64Z short_channel_id;
                internal Event_ProbeFailed(long ptr) : base(null, ptr) {
-                       this.payment_id = bindings.LDKEvent_ProbeFailed_get_payment_id(ptr);
-                       this.payment_hash = bindings.LDKEvent_ProbeFailed_get_payment_hash(ptr);
+                       long payment_id = bindings.LDKEvent_ProbeFailed_get_payment_id(ptr);
+                       byte[] payment_id_conv = InternalUtils.decodeUint8Array(payment_id);
+                       this.payment_id = payment_id_conv;
+                       long payment_hash = bindings.LDKEvent_ProbeFailed_get_payment_hash(ptr);
+                       byte[] payment_hash_conv = InternalUtils.decodeUint8Array(payment_hash);
+                       this.payment_hash = payment_hash_conv;
                        long path = bindings.LDKEvent_ProbeFailed_get_path(ptr);
                        org.ldk.structs.Path path_hu_conv = null; if (path < 0 || path > 4096) { path_hu_conv = new org.ldk.structs.Path(null, path); }
                        if (path_hu_conv != null) { path_hu_conv.ptrs_to.AddLast(this); };
@@ -509,9 +586,13 @@ public class Event : CommonBase {
                 */
                public long expected_outbound_amount_msat;
                internal Event_HTLCIntercepted(long ptr) : base(null, ptr) {
-                       this.intercept_id = bindings.LDKEvent_HTLCIntercepted_get_intercept_id(ptr);
+                       long intercept_id = bindings.LDKEvent_HTLCIntercepted_get_intercept_id(ptr);
+                       byte[] intercept_id_conv = InternalUtils.decodeUint8Array(intercept_id);
+                       this.intercept_id = intercept_id_conv;
                        this.requested_next_hop_scid = bindings.LDKEvent_HTLCIntercepted_get_requested_next_hop_scid(ptr);
-                       this.payment_hash = bindings.LDKEvent_HTLCIntercepted_get_payment_hash(ptr);
+                       long payment_hash = bindings.LDKEvent_HTLCIntercepted_get_payment_hash(ptr);
+                       byte[] payment_hash_conv = InternalUtils.decodeUint8Array(payment_hash);
+                       this.payment_hash = payment_hash_conv;
                        this.inbound_amount_msat = bindings.LDKEvent_HTLCIntercepted_get_inbound_amount_msat(ptr);
                        this.expected_outbound_amount_msat = bindings.LDKEvent_HTLCIntercepted_get_expected_outbound_amount_msat(ptr);
                }
@@ -522,17 +603,28 @@ public class Event : CommonBase {
                 * The outputs which you should store as spendable by you.
                 */
                public SpendableOutputDescriptor[] outputs;
+               /**
+                * The `channel_id` indicating which channel the spendable outputs belong to.
+                * 
+                * This will always be `Some` for events generated by LDK versions 0.0.117 and above.
+                */
+               public Option_ThirtyTwoBytesZ channel_id;
                internal Event_SpendableOutputs(long ptr) : base(null, ptr) {
-                       long[] outputs = bindings.LDKEvent_SpendableOutputs_get_outputs(ptr);
-                       int outputs_conv_27_len = outputs.Length;
+                       long outputs = bindings.LDKEvent_SpendableOutputs_get_outputs(ptr);
+                       int outputs_conv_27_len = InternalUtils.getArrayLength(outputs);
                        SpendableOutputDescriptor[] outputs_conv_27_arr = new SpendableOutputDescriptor[outputs_conv_27_len];
                        for (int b = 0; b < outputs_conv_27_len; b++) {
-                               long outputs_conv_27 = outputs[b];
+                               long outputs_conv_27 = InternalUtils.getU64ArrayElem(outputs, b);
                                org.ldk.structs.SpendableOutputDescriptor outputs_conv_27_hu_conv = org.ldk.structs.SpendableOutputDescriptor.constr_from_ptr(outputs_conv_27);
                                if (outputs_conv_27_hu_conv != null) { outputs_conv_27_hu_conv.ptrs_to.AddLast(this); };
                                outputs_conv_27_arr[b] = outputs_conv_27_hu_conv;
                        }
+                       bindings.free_buffer(outputs);
                        this.outputs = outputs_conv_27_arr;
+                       long channel_id = bindings.LDKEvent_SpendableOutputs_get_channel_id(ptr);
+                       org.ldk.structs.Option_ThirtyTwoBytesZ channel_id_hu_conv = org.ldk.structs.Option_ThirtyTwoBytesZ.constr_from_ptr(channel_id);
+                       if (channel_id_hu_conv != null) { channel_id_hu_conv.ptrs_to.AddLast(this); };
+                       this.channel_id = channel_id_hu_conv;
                }
        }
        /** A Event of type PaymentForwarded */
@@ -540,17 +632,13 @@ public class Event : CommonBase {
                /**
                 * The incoming channel between the previous node and us. This is only `None` for events
                 * generated or serialized by versions prior to 0.0.107.
-                * 
-                * Note that this (or a relevant inner pointer) may be NULL or all-0s to represent None
                 */
-               public byte[] prev_channel_id;
+               public Option_ThirtyTwoBytesZ prev_channel_id;
                /**
                 * The outgoing channel between the next node and us. This is only `None` for events
                 * generated or serialized by versions prior to 0.0.107.
-                * 
-                * Note that this (or a relevant inner pointer) may be NULL or all-0s to represent None
                 */
-               public byte[] next_channel_id;
+               public Option_ThirtyTwoBytesZ next_channel_id;
                /**
                 * The fee, in milli-satoshis, which was earned as a result of the payment.
                 * 
@@ -579,8 +667,14 @@ public class Event : CommonBase {
                 */
                public Option_u64Z outbound_amount_forwarded_msat;
                internal Event_PaymentForwarded(long ptr) : base(null, ptr) {
-                       this.prev_channel_id = bindings.LDKEvent_PaymentForwarded_get_prev_channel_id(ptr);
-                       this.next_channel_id = bindings.LDKEvent_PaymentForwarded_get_next_channel_id(ptr);
+                       long prev_channel_id = bindings.LDKEvent_PaymentForwarded_get_prev_channel_id(ptr);
+                       org.ldk.structs.Option_ThirtyTwoBytesZ prev_channel_id_hu_conv = org.ldk.structs.Option_ThirtyTwoBytesZ.constr_from_ptr(prev_channel_id);
+                       if (prev_channel_id_hu_conv != null) { prev_channel_id_hu_conv.ptrs_to.AddLast(this); };
+                       this.prev_channel_id = prev_channel_id_hu_conv;
+                       long next_channel_id = bindings.LDKEvent_PaymentForwarded_get_next_channel_id(ptr);
+                       org.ldk.structs.Option_ThirtyTwoBytesZ next_channel_id_hu_conv = org.ldk.structs.Option_ThirtyTwoBytesZ.constr_from_ptr(next_channel_id);
+                       if (next_channel_id_hu_conv != null) { next_channel_id_hu_conv.ptrs_to.AddLast(this); };
+                       this.next_channel_id = next_channel_id_hu_conv;
                        long fee_earned_msat = bindings.LDKEvent_PaymentForwarded_get_fee_earned_msat(ptr);
                        org.ldk.structs.Option_u64Z fee_earned_msat_hu_conv = org.ldk.structs.Option_u64Z.constr_from_ptr(fee_earned_msat);
                        if (fee_earned_msat_hu_conv != null) { fee_earned_msat_hu_conv.ptrs_to.AddLast(this); };
@@ -613,10 +707,8 @@ public class Event : CommonBase {
                 * The `temporary_channel_id` this channel used to be known by during channel establishment.
                 * 
                 * Will be `None` for channels created prior to LDK version 0.0.115.
-                * 
-                * Note that this (or a relevant inner pointer) may be NULL or all-0s to represent None
                 */
-               public byte[] former_temporary_channel_id;
+               public Option_ThirtyTwoBytesZ former_temporary_channel_id;
                /**
                 * The `node_id` of the channel counterparty.
                 */
@@ -626,12 +718,19 @@ public class Event : CommonBase {
                 */
                public OutPoint funding_txo;
                internal Event_ChannelPending(long ptr) : base(null, ptr) {
-                       this.channel_id = bindings.LDKEvent_ChannelPending_get_channel_id(ptr);
-                       byte[] user_channel_id = bindings.LDKEvent_ChannelPending_get_user_channel_id(ptr);
+                       long channel_id = bindings.LDKEvent_ChannelPending_get_channel_id(ptr);
+                       byte[] channel_id_conv = InternalUtils.decodeUint8Array(channel_id);
+                       this.channel_id = channel_id_conv;
+                       long user_channel_id = bindings.LDKEvent_ChannelPending_get_user_channel_id(ptr);
                        org.ldk.util.UInt128 user_channel_id_conv = new org.ldk.util.UInt128(user_channel_id);
                        this.user_channel_id = user_channel_id_conv;
-                       this.former_temporary_channel_id = bindings.LDKEvent_ChannelPending_get_former_temporary_channel_id(ptr);
-                       this.counterparty_node_id = bindings.LDKEvent_ChannelPending_get_counterparty_node_id(ptr);
+                       long former_temporary_channel_id = bindings.LDKEvent_ChannelPending_get_former_temporary_channel_id(ptr);
+                       org.ldk.structs.Option_ThirtyTwoBytesZ former_temporary_channel_id_hu_conv = org.ldk.structs.Option_ThirtyTwoBytesZ.constr_from_ptr(former_temporary_channel_id);
+                       if (former_temporary_channel_id_hu_conv != null) { former_temporary_channel_id_hu_conv.ptrs_to.AddLast(this); };
+                       this.former_temporary_channel_id = former_temporary_channel_id_hu_conv;
+                       long counterparty_node_id = bindings.LDKEvent_ChannelPending_get_counterparty_node_id(ptr);
+                       byte[] counterparty_node_id_conv = InternalUtils.decodeUint8Array(counterparty_node_id);
+                       this.counterparty_node_id = counterparty_node_id_conv;
                        long funding_txo = bindings.LDKEvent_ChannelPending_get_funding_txo(ptr);
                        org.ldk.structs.OutPoint funding_txo_hu_conv = null; if (funding_txo < 0 || funding_txo > 4096) { funding_txo_hu_conv = new org.ldk.structs.OutPoint(null, funding_txo); }
                        if (funding_txo_hu_conv != null) { funding_txo_hu_conv.ptrs_to.AddLast(this); };
@@ -664,11 +763,15 @@ public class Event : CommonBase {
                 */
                public ChannelTypeFeatures channel_type;
                internal Event_ChannelReady(long ptr) : base(null, ptr) {
-                       this.channel_id = bindings.LDKEvent_ChannelReady_get_channel_id(ptr);
-                       byte[] user_channel_id = bindings.LDKEvent_ChannelReady_get_user_channel_id(ptr);
+                       long channel_id = bindings.LDKEvent_ChannelReady_get_channel_id(ptr);
+                       byte[] channel_id_conv = InternalUtils.decodeUint8Array(channel_id);
+                       this.channel_id = channel_id_conv;
+                       long user_channel_id = bindings.LDKEvent_ChannelReady_get_user_channel_id(ptr);
                        org.ldk.util.UInt128 user_channel_id_conv = new org.ldk.util.UInt128(user_channel_id);
                        this.user_channel_id = user_channel_id_conv;
-                       this.counterparty_node_id = bindings.LDKEvent_ChannelReady_get_counterparty_node_id(ptr);
+                       long counterparty_node_id = bindings.LDKEvent_ChannelReady_get_counterparty_node_id(ptr);
+                       byte[] counterparty_node_id_conv = InternalUtils.decodeUint8Array(counterparty_node_id);
+                       this.counterparty_node_id = counterparty_node_id_conv;
                        long channel_type = bindings.LDKEvent_ChannelReady_get_channel_type(ptr);
                        org.ldk.structs.ChannelTypeFeatures channel_type_hu_conv = null; if (channel_type < 0 || channel_type > 4096) { channel_type_hu_conv = new org.ldk.structs.ChannelTypeFeatures(null, channel_type); }
                        if (channel_type_hu_conv != null) { channel_type_hu_conv.ptrs_to.AddLast(this); };
@@ -699,15 +802,38 @@ public class Event : CommonBase {
                 * The reason the channel was closed.
                 */
                public ClosureReason reason;
+               /**
+                * Counterparty in the closed channel.
+                * 
+                * This field will be `None` for objects serialized prior to LDK 0.0.117.
+                * 
+                * Note that this (or a relevant inner pointer) may be NULL or all-0s to represent None
+                */
+               public byte[] counterparty_node_id;
+               /**
+                * Channel capacity of the closing channel (sats).
+                * 
+                * This field will be `None` for objects serialized prior to LDK 0.0.117.
+                */
+               public Option_u64Z channel_capacity_sats;
                internal Event_ChannelClosed(long ptr) : base(null, ptr) {
-                       this.channel_id = bindings.LDKEvent_ChannelClosed_get_channel_id(ptr);
-                       byte[] user_channel_id = bindings.LDKEvent_ChannelClosed_get_user_channel_id(ptr);
+                       long channel_id = bindings.LDKEvent_ChannelClosed_get_channel_id(ptr);
+                       byte[] channel_id_conv = InternalUtils.decodeUint8Array(channel_id);
+                       this.channel_id = channel_id_conv;
+                       long user_channel_id = bindings.LDKEvent_ChannelClosed_get_user_channel_id(ptr);
                        org.ldk.util.UInt128 user_channel_id_conv = new org.ldk.util.UInt128(user_channel_id);
                        this.user_channel_id = user_channel_id_conv;
                        long reason = bindings.LDKEvent_ChannelClosed_get_reason(ptr);
                        org.ldk.structs.ClosureReason reason_hu_conv = org.ldk.structs.ClosureReason.constr_from_ptr(reason);
                        if (reason_hu_conv != null) { reason_hu_conv.ptrs_to.AddLast(this); };
                        this.reason = reason_hu_conv;
+                       long counterparty_node_id = bindings.LDKEvent_ChannelClosed_get_counterparty_node_id(ptr);
+                       byte[] counterparty_node_id_conv = InternalUtils.decodeUint8Array(counterparty_node_id);
+                       this.counterparty_node_id = counterparty_node_id_conv;
+                       long channel_capacity_sats = bindings.LDKEvent_ChannelClosed_get_channel_capacity_sats(ptr);
+                       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;
                }
        }
        /** A Event of type DiscardFunding */
@@ -721,8 +847,12 @@ public class Event : CommonBase {
                 */
                public byte[] transaction;
                internal Event_DiscardFunding(long ptr) : base(null, ptr) {
-                       this.channel_id = bindings.LDKEvent_DiscardFunding_get_channel_id(ptr);
-                       this.transaction = bindings.LDKEvent_DiscardFunding_get_transaction(ptr);
+                       long channel_id = bindings.LDKEvent_DiscardFunding_get_channel_id(ptr);
+                       byte[] channel_id_conv = InternalUtils.decodeUint8Array(channel_id);
+                       this.channel_id = channel_id_conv;
+                       long transaction = bindings.LDKEvent_DiscardFunding_get_transaction(ptr);
+                       byte[] transaction_conv = InternalUtils.decodeUint8Array(transaction);
+                       this.transaction = transaction_conv;
                }
        }
        /** A Event of type OpenChannelRequest */
@@ -777,8 +907,12 @@ public class Event : CommonBase {
                 */
                public ChannelTypeFeatures channel_type;
                internal Event_OpenChannelRequest(long ptr) : base(null, ptr) {
-                       this.temporary_channel_id = bindings.LDKEvent_OpenChannelRequest_get_temporary_channel_id(ptr);
-                       this.counterparty_node_id = bindings.LDKEvent_OpenChannelRequest_get_counterparty_node_id(ptr);
+                       long temporary_channel_id = bindings.LDKEvent_OpenChannelRequest_get_temporary_channel_id(ptr);
+                       byte[] temporary_channel_id_conv = InternalUtils.decodeUint8Array(temporary_channel_id);
+                       this.temporary_channel_id = temporary_channel_id_conv;
+                       long counterparty_node_id = bindings.LDKEvent_OpenChannelRequest_get_counterparty_node_id(ptr);
+                       byte[] counterparty_node_id_conv = InternalUtils.decodeUint8Array(counterparty_node_id);
+                       this.counterparty_node_id = counterparty_node_id_conv;
                        this.funding_satoshis = bindings.LDKEvent_OpenChannelRequest_get_funding_satoshis(ptr);
                        this.push_msat = bindings.LDKEvent_OpenChannelRequest_get_push_msat(ptr);
                        long channel_type = bindings.LDKEvent_OpenChannelRequest_get_channel_type(ptr);
@@ -798,7 +932,9 @@ public class Event : CommonBase {
                 */
                public HTLCDestination failed_next_destination;
                internal Event_HTLCHandlingFailed(long ptr) : base(null, ptr) {
-                       this.prev_channel_id = bindings.LDKEvent_HTLCHandlingFailed_get_prev_channel_id(ptr);
+                       long prev_channel_id = bindings.LDKEvent_HTLCHandlingFailed_get_prev_channel_id(ptr);
+                       byte[] prev_channel_id_conv = InternalUtils.decodeUint8Array(prev_channel_id);
+                       this.prev_channel_id = prev_channel_id_conv;
                        long failed_next_destination = bindings.LDKEvent_HTLCHandlingFailed_get_failed_next_destination(ptr);
                        org.ldk.structs.HTLCDestination failed_next_destination_hu_conv = org.ldk.structs.HTLCDestination.constr_from_ptr(failed_next_destination);
                        if (failed_next_destination_hu_conv != null) { failed_next_destination_hu_conv.ptrs_to.AddLast(this); };
@@ -837,7 +973,7 @@ public class Event : CommonBase {
         * Utility method to constructs a new FundingGenerationReady-variant Event
         */
        public static Event funding_generation_ready(byte[] temporary_channel_id, byte[] counterparty_node_id, long channel_value_satoshis, byte[] output_script, org.ldk.util.UInt128 user_channel_id) {
-               long ret = bindings.Event_funding_generation_ready(InternalUtils.check_arr_len(temporary_channel_id, 32), InternalUtils.check_arr_len(counterparty_node_id, 33), channel_value_satoshis, output_script, user_channel_id.getLEBytes());
+               long ret = bindings.Event_funding_generation_ready(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(temporary_channel_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_node_id, 33)), channel_value_satoshis, InternalUtils.encodeUint8Array(output_script), InternalUtils.encodeUint8Array(user_channel_id.getLEBytes()));
                GC.KeepAlive(temporary_channel_id);
                GC.KeepAlive(counterparty_node_id);
                GC.KeepAlive(channel_value_satoshis);
@@ -852,8 +988,8 @@ public class Event : CommonBase {
        /**
         * Utility method to constructs a new PaymentClaimable-variant Event
         */
-       public static Event payment_claimable(byte[] receiver_node_id, byte[] payment_hash, org.ldk.structs.RecipientOnionFields onion_fields, long amount_msat, long counterparty_skimmed_fee_msat, org.ldk.structs.PaymentPurpose purpose, byte[] via_channel_id, org.ldk.structs.Option_u128Z via_user_channel_id, org.ldk.structs.Option_u32Z claim_deadline) {
-               long ret = bindings.Event_payment_claimable(InternalUtils.check_arr_len(receiver_node_id, 33), InternalUtils.check_arr_len(payment_hash, 32), onion_fields == null ? 0 : onion_fields.ptr, amount_msat, counterparty_skimmed_fee_msat, purpose.ptr, InternalUtils.check_arr_len(via_channel_id, 32), via_user_channel_id.ptr, claim_deadline.ptr);
+       public static Event payment_claimable(byte[] receiver_node_id, byte[] payment_hash, org.ldk.structs.RecipientOnionFields onion_fields, long amount_msat, long counterparty_skimmed_fee_msat, org.ldk.structs.PaymentPurpose purpose, org.ldk.structs.Option_ThirtyTwoBytesZ via_channel_id, org.ldk.structs.Option_U128Z via_user_channel_id, org.ldk.structs.Option_u32Z claim_deadline) {
+               long ret = bindings.Event_payment_claimable(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(receiver_node_id, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), onion_fields == null ? 0 : onion_fields.ptr, amount_msat, counterparty_skimmed_fee_msat, purpose.ptr, via_channel_id.ptr, via_user_channel_id.ptr, claim_deadline.ptr);
                GC.KeepAlive(receiver_node_id);
                GC.KeepAlive(payment_hash);
                GC.KeepAlive(onion_fields);
@@ -868,6 +1004,7 @@ public class Event : 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(onion_fields); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(purpose); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(via_channel_id); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(via_user_channel_id); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(claim_deadline); };
                return ret_hu_conv;
@@ -876,24 +1013,40 @@ public class Event : CommonBase {
        /**
         * Utility method to constructs a new PaymentClaimed-variant Event
         */
-       public static Event payment_claimed(byte[] receiver_node_id, byte[] payment_hash, long amount_msat, org.ldk.structs.PaymentPurpose purpose) {
-               long ret = bindings.Event_payment_claimed(InternalUtils.check_arr_len(receiver_node_id, 33), InternalUtils.check_arr_len(payment_hash, 32), amount_msat, purpose.ptr);
+       public static Event payment_claimed(byte[] receiver_node_id, byte[] payment_hash, long amount_msat, org.ldk.structs.PaymentPurpose purpose, ClaimedHTLC[] htlcs, org.ldk.structs.Option_u64Z sender_intended_total_msat) {
+               long ret = bindings.Event_payment_claimed(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(receiver_node_id, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), amount_msat, purpose.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(htlcs, htlcs_conv_13 => htlcs_conv_13 == null ? 0 : htlcs_conv_13.ptr)), sender_intended_total_msat.ptr);
                GC.KeepAlive(receiver_node_id);
                GC.KeepAlive(payment_hash);
                GC.KeepAlive(amount_msat);
                GC.KeepAlive(purpose);
+               GC.KeepAlive(htlcs);
+               GC.KeepAlive(sender_intended_total_msat);
                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(purpose); };
+               foreach (ClaimedHTLC htlcs_conv_13 in htlcs) { if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(htlcs_conv_13); }; };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(sender_intended_total_msat); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Utility method to constructs a new InvoiceRequestFailed-variant Event
+        */
+       public static Event invoice_request_failed(byte[] payment_id) {
+               long ret = bindings.Event_invoice_request_failed(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)));
+               GC.KeepAlive(payment_id);
+               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); };
                return ret_hu_conv;
        }
 
        /**
         * Utility method to constructs a new PaymentSent-variant Event
         */
-       public static Event payment_sent(org.ldk.structs.Option_PaymentIdZ payment_id, byte[] payment_preimage, byte[] payment_hash, org.ldk.structs.Option_u64Z fee_paid_msat) {
-               long ret = bindings.Event_payment_sent(payment_id.ptr, InternalUtils.check_arr_len(payment_preimage, 32), InternalUtils.check_arr_len(payment_hash, 32), fee_paid_msat.ptr);
+       public static Event payment_sent(org.ldk.structs.Option_ThirtyTwoBytesZ payment_id, byte[] payment_preimage, byte[] payment_hash, org.ldk.structs.Option_u64Z fee_paid_msat) {
+               long ret = bindings.Event_payment_sent(payment_id.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_preimage, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), fee_paid_msat.ptr);
                GC.KeepAlive(payment_id);
                GC.KeepAlive(payment_preimage);
                GC.KeepAlive(payment_hash);
@@ -910,7 +1063,7 @@ public class Event : CommonBase {
         * Utility method to constructs a new PaymentFailed-variant Event
         */
        public static Event payment_failed(byte[] payment_id, byte[] payment_hash, org.ldk.structs.Option_PaymentFailureReasonZ reason) {
-               long ret = bindings.Event_payment_failed(InternalUtils.check_arr_len(payment_id, 32), InternalUtils.check_arr_len(payment_hash, 32), reason.ptr);
+               long ret = bindings.Event_payment_failed(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), reason.ptr);
                GC.KeepAlive(payment_id);
                GC.KeepAlive(payment_hash);
                GC.KeepAlive(reason);
@@ -924,8 +1077,8 @@ public class Event : CommonBase {
        /**
         * Utility method to constructs a new PaymentPathSuccessful-variant Event
         */
-       public static Event payment_path_successful(byte[] payment_id, org.ldk.structs.Option_PaymentHashZ payment_hash, org.ldk.structs.Path path) {
-               long ret = bindings.Event_payment_path_successful(InternalUtils.check_arr_len(payment_id, 32), payment_hash.ptr, path == null ? 0 : path.ptr);
+       public static Event payment_path_successful(byte[] payment_id, org.ldk.structs.Option_ThirtyTwoBytesZ payment_hash, org.ldk.structs.Path path) {
+               long ret = bindings.Event_payment_path_successful(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)), payment_hash.ptr, path == null ? 0 : path.ptr);
                GC.KeepAlive(payment_id);
                GC.KeepAlive(payment_hash);
                GC.KeepAlive(path);
@@ -940,8 +1093,8 @@ public class Event : CommonBase {
        /**
         * Utility method to constructs a new PaymentPathFailed-variant Event
         */
-       public static Event payment_path_failed(org.ldk.structs.Option_PaymentIdZ payment_id, byte[] payment_hash, bool payment_failed_permanently, org.ldk.structs.PathFailure failure, org.ldk.structs.Path path, org.ldk.structs.Option_u64Z short_channel_id) {
-               long ret = bindings.Event_payment_path_failed(payment_id.ptr, InternalUtils.check_arr_len(payment_hash, 32), payment_failed_permanently, failure.ptr, path == null ? 0 : path.ptr, short_channel_id.ptr);
+       public static Event payment_path_failed(org.ldk.structs.Option_ThirtyTwoBytesZ payment_id, byte[] payment_hash, bool payment_failed_permanently, org.ldk.structs.PathFailure failure, org.ldk.structs.Path path, org.ldk.structs.Option_u64Z short_channel_id) {
+               long ret = bindings.Event_payment_path_failed(payment_id.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), payment_failed_permanently, failure.ptr, path == null ? 0 : path.ptr, short_channel_id.ptr);
                GC.KeepAlive(payment_id);
                GC.KeepAlive(payment_hash);
                GC.KeepAlive(payment_failed_permanently);
@@ -962,7 +1115,7 @@ public class Event : CommonBase {
         * Utility method to constructs a new ProbeSuccessful-variant Event
         */
        public static Event probe_successful(byte[] payment_id, byte[] payment_hash, org.ldk.structs.Path path) {
-               long ret = bindings.Event_probe_successful(InternalUtils.check_arr_len(payment_id, 32), InternalUtils.check_arr_len(payment_hash, 32), path == null ? 0 : path.ptr);
+               long ret = bindings.Event_probe_successful(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), path == null ? 0 : path.ptr);
                GC.KeepAlive(payment_id);
                GC.KeepAlive(payment_hash);
                GC.KeepAlive(path);
@@ -977,7 +1130,7 @@ public class Event : CommonBase {
         * Utility method to constructs a new ProbeFailed-variant Event
         */
        public static Event probe_failed(byte[] payment_id, byte[] payment_hash, org.ldk.structs.Path path, org.ldk.structs.Option_u64Z short_channel_id) {
-               long ret = bindings.Event_probe_failed(InternalUtils.check_arr_len(payment_id, 32), InternalUtils.check_arr_len(payment_hash, 32), path == null ? 0 : path.ptr, short_channel_id.ptr);
+               long ret = bindings.Event_probe_failed(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), path == null ? 0 : path.ptr, short_channel_id.ptr);
                GC.KeepAlive(payment_id);
                GC.KeepAlive(payment_hash);
                GC.KeepAlive(path);
@@ -1006,7 +1159,7 @@ public class Event : CommonBase {
         * Utility method to constructs a new HTLCIntercepted-variant Event
         */
        public static Event htlcintercepted(byte[] intercept_id, long requested_next_hop_scid, byte[] payment_hash, long inbound_amount_msat, long expected_outbound_amount_msat) {
-               long ret = bindings.Event_htlcintercepted(InternalUtils.check_arr_len(intercept_id, 32), requested_next_hop_scid, InternalUtils.check_arr_len(payment_hash, 32), inbound_amount_msat, expected_outbound_amount_msat);
+               long ret = bindings.Event_htlcintercepted(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(intercept_id, 32)), requested_next_hop_scid, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), inbound_amount_msat, expected_outbound_amount_msat);
                GC.KeepAlive(intercept_id);
                GC.KeepAlive(requested_next_hop_scid);
                GC.KeepAlive(payment_hash);
@@ -1021,21 +1174,23 @@ public class Event : CommonBase {
        /**
         * Utility method to constructs a new SpendableOutputs-variant Event
         */
-       public static Event spendable_outputs(SpendableOutputDescriptor[] outputs) {
-               long ret = bindings.Event_spendable_outputs(outputs != null ? InternalUtils.mapArray(outputs, outputs_conv_27 => outputs_conv_27.ptr) : null);
+       public static Event spendable_outputs(SpendableOutputDescriptor[] outputs, org.ldk.structs.Option_ThirtyTwoBytesZ channel_id) {
+               long ret = bindings.Event_spendable_outputs(InternalUtils.encodeUint64Array(InternalUtils.mapArray(outputs, outputs_conv_27 => outputs_conv_27.ptr)), channel_id.ptr);
                GC.KeepAlive(outputs);
+               GC.KeepAlive(channel_id);
                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 (SpendableOutputDescriptor outputs_conv_27 in outputs) { if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(outputs_conv_27); }; };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(channel_id); };
                return ret_hu_conv;
        }
 
        /**
         * Utility method to constructs a new PaymentForwarded-variant Event
         */
-       public static Event payment_forwarded(byte[] prev_channel_id, byte[] next_channel_id, org.ldk.structs.Option_u64Z fee_earned_msat, bool claim_from_onchain_tx, org.ldk.structs.Option_u64Z outbound_amount_forwarded_msat) {
-               long ret = bindings.Event_payment_forwarded(InternalUtils.check_arr_len(prev_channel_id, 32), InternalUtils.check_arr_len(next_channel_id, 32), fee_earned_msat.ptr, claim_from_onchain_tx, outbound_amount_forwarded_msat.ptr);
+       public static Event payment_forwarded(org.ldk.structs.Option_ThirtyTwoBytesZ prev_channel_id, org.ldk.structs.Option_ThirtyTwoBytesZ next_channel_id, org.ldk.structs.Option_u64Z fee_earned_msat, bool claim_from_onchain_tx, org.ldk.structs.Option_u64Z outbound_amount_forwarded_msat) {
+               long ret = bindings.Event_payment_forwarded(prev_channel_id.ptr, next_channel_id.ptr, fee_earned_msat.ptr, claim_from_onchain_tx, outbound_amount_forwarded_msat.ptr);
                GC.KeepAlive(prev_channel_id);
                GC.KeepAlive(next_channel_id);
                GC.KeepAlive(fee_earned_msat);
@@ -1044,6 +1199,8 @@ public class Event : CommonBase {
                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(prev_channel_id); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(next_channel_id); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(fee_earned_msat); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(outbound_amount_forwarded_msat); };
                return ret_hu_conv;
@@ -1052,8 +1209,8 @@ public class Event : CommonBase {
        /**
         * Utility method to constructs a new ChannelPending-variant Event
         */
-       public static Event channel_pending(byte[] channel_id, org.ldk.util.UInt128 user_channel_id, byte[] former_temporary_channel_id, byte[] counterparty_node_id, org.ldk.structs.OutPoint funding_txo) {
-               long ret = bindings.Event_channel_pending(InternalUtils.check_arr_len(channel_id, 32), user_channel_id.getLEBytes(), InternalUtils.check_arr_len(former_temporary_channel_id, 32), InternalUtils.check_arr_len(counterparty_node_id, 33), funding_txo == null ? 0 : funding_txo.ptr);
+       public static Event channel_pending(byte[] channel_id, org.ldk.util.UInt128 user_channel_id, org.ldk.structs.Option_ThirtyTwoBytesZ former_temporary_channel_id, byte[] counterparty_node_id, org.ldk.structs.OutPoint funding_txo) {
+               long ret = bindings.Event_channel_pending(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id, 32)), InternalUtils.encodeUint8Array(user_channel_id.getLEBytes()), former_temporary_channel_id.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_node_id, 33)), funding_txo == null ? 0 : funding_txo.ptr);
                GC.KeepAlive(channel_id);
                GC.KeepAlive(user_channel_id);
                GC.KeepAlive(former_temporary_channel_id);
@@ -1062,6 +1219,7 @@ public class Event : CommonBase {
                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(former_temporary_channel_id); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(funding_txo); };
                return ret_hu_conv;
        }
@@ -1070,7 +1228,7 @@ public class Event : CommonBase {
         * Utility method to constructs a new ChannelReady-variant Event
         */
        public static Event channel_ready(byte[] channel_id, org.ldk.util.UInt128 user_channel_id, byte[] counterparty_node_id, org.ldk.structs.ChannelTypeFeatures channel_type) {
-               long ret = bindings.Event_channel_ready(InternalUtils.check_arr_len(channel_id, 32), user_channel_id.getLEBytes(), InternalUtils.check_arr_len(counterparty_node_id, 33), channel_type == null ? 0 : channel_type.ptr);
+               long ret = bindings.Event_channel_ready(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id, 32)), InternalUtils.encodeUint8Array(user_channel_id.getLEBytes()), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_node_id, 33)), channel_type == null ? 0 : channel_type.ptr);
                GC.KeepAlive(channel_id);
                GC.KeepAlive(user_channel_id);
                GC.KeepAlive(counterparty_node_id);
@@ -1085,15 +1243,18 @@ 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) {
-               long ret = bindings.Event_channel_closed(InternalUtils.check_arr_len(channel_id, 32), user_channel_id.getLEBytes(), reason.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) {
+               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);
                GC.KeepAlive(channel_id);
                GC.KeepAlive(user_channel_id);
                GC.KeepAlive(reason);
+               GC.KeepAlive(counterparty_node_id);
+               GC.KeepAlive(channel_capacity_sats);
                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); };
                return ret_hu_conv;
        }
 
@@ -1101,7 +1262,7 @@ public class Event : CommonBase {
         * Utility method to constructs a new DiscardFunding-variant Event
         */
        public static Event discard_funding(byte[] channel_id, byte[] transaction) {
-               long ret = bindings.Event_discard_funding(InternalUtils.check_arr_len(channel_id, 32), transaction);
+               long ret = bindings.Event_discard_funding(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id, 32)), InternalUtils.encodeUint8Array(transaction));
                GC.KeepAlive(channel_id);
                GC.KeepAlive(transaction);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -1114,7 +1275,7 @@ public class Event : CommonBase {
         * Utility method to constructs a new OpenChannelRequest-variant Event
         */
        public static Event open_channel_request(byte[] temporary_channel_id, byte[] counterparty_node_id, long funding_satoshis, long push_msat, org.ldk.structs.ChannelTypeFeatures channel_type) {
-               long ret = bindings.Event_open_channel_request(InternalUtils.check_arr_len(temporary_channel_id, 32), InternalUtils.check_arr_len(counterparty_node_id, 33), funding_satoshis, push_msat, channel_type == null ? 0 : channel_type.ptr);
+               long ret = bindings.Event_open_channel_request(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(temporary_channel_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_node_id, 33)), funding_satoshis, push_msat, channel_type == null ? 0 : channel_type.ptr);
                GC.KeepAlive(temporary_channel_id);
                GC.KeepAlive(counterparty_node_id);
                GC.KeepAlive(funding_satoshis);
@@ -1131,7 +1292,7 @@ public class Event : CommonBase {
         * Utility method to constructs a new HTLCHandlingFailed-variant Event
         */
        public static Event htlchandling_failed(byte[] prev_channel_id, org.ldk.structs.HTLCDestination failed_next_destination) {
-               long ret = bindings.Event_htlchandling_failed(InternalUtils.check_arr_len(prev_channel_id, 32), failed_next_destination.ptr);
+               long ret = bindings.Event_htlchandling_failed(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(prev_channel_id, 32)), failed_next_destination.ptr);
                GC.KeepAlive(prev_channel_id);
                GC.KeepAlive(failed_next_destination);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -1173,9 +1334,11 @@ public class Event : CommonBase {
         * Serialize the Event object into a byte array which can be read by Event_read
         */
        public byte[] write() {
-               byte[] ret = bindings.Event_write(this.ptr);
+               long ret = bindings.Event_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index 7a637f04f4347324a9b54599549ffd0a962256a7..718935df0f86e6ec49bf9a0c00fbe1baa5322333 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,6 +6,17 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of EventHandler */
+public interface EventHandlerInterface {
+       /**Handles the given [`Event`].
+        * 
+        * See [`EventsProvider`] for details that must be considered when implementing this method.
+        */
+       void handle_event(Event _event);
+}
+
 /**
  * A trait implemented for objects handling events from [`EventsProvider`].
  * 
@@ -13,24 +25,14 @@ namespace org { namespace ldk { namespace structs {
  * core::future::Future, H: Fn(Event) -> F`.
  */
 public class EventHandler : CommonBase {
-       internal readonly bindings.LDKEventHandler bindings_instance;
+       internal bindings.LDKEventHandler bindings_instance;
+       internal long instance_idx;
+
        internal EventHandler(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private EventHandler(bindings.LDKEventHandler arg) : base(bindings.LDKEventHandler_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~EventHandler() {
                if (ptr != 0) { bindings.EventHandler_free(ptr); }
        }
 
-       public interface EventHandlerInterface {
-               /**
-                * Handles the given [`Event`].
-                * 
-                * See [`EventsProvider`] for details that must be considered when implementing this method.
-                */
-               void handle_event(Event _event);
-       }
        private class LDKEventHandlerHolder { internal EventHandler held; }
        private class LDKEventHandlerImpl : bindings.LDKEventHandler {
                internal LDKEventHandlerImpl(EventHandlerInterface arg, LDKEventHandlerHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
@@ -43,11 +45,19 @@ public class EventHandler : CommonBase {
                                GC.KeepAlive(arg);
                }
        }
+
+       /** Creates a new instance of EventHandler from a given implementation */
        public static EventHandler new_impl(EventHandlerInterface arg) {
                LDKEventHandlerHolder impl_holder = new LDKEventHandlerHolder();
-               impl_holder.held = new EventHandler(new LDKEventHandlerImpl(arg, impl_holder));
+               LDKEventHandlerImpl impl = new LDKEventHandlerImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKEventHandler_new(impl);
+
+               impl_holder.held = new EventHandler(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Handles the given [`Event`].
         * 
index 5523dc8088c84181d10c1d376e4032cce97dbd4d..cc42c27d4d399752ce5785b738e476de056c001f 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,6 +6,17 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of EventsProvider */
+public interface EventsProviderInterface {
+       /**Processes any events generated since the last call using the given event handler.
+        * 
+        * See the trait-level documentation for requirements.
+        */
+       void process_pending_events(EventHandler handler);
+}
+
 /**
  * A trait indicating an object may generate events.
  * 
@@ -44,24 +56,14 @@ namespace org { namespace ldk { namespace structs {
  * [`ChainMonitor::process_pending_events_async`]: crate::chain::chainmonitor::ChainMonitor::process_pending_events_async
  */
 public class EventsProvider : CommonBase {
-       internal readonly bindings.LDKEventsProvider bindings_instance;
+       internal bindings.LDKEventsProvider bindings_instance;
+       internal long instance_idx;
+
        internal EventsProvider(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private EventsProvider(bindings.LDKEventsProvider arg) : base(bindings.LDKEventsProvider_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~EventsProvider() {
                if (ptr != 0) { bindings.EventsProvider_free(ptr); }
        }
 
-       public interface EventsProviderInterface {
-               /**
-                * Processes any events generated since the last call using the given event handler.
-                * 
-                * See the trait-level documentation for requirements.
-                */
-               void process_pending_events(EventHandler _handler);
-       }
        private class LDKEventsProviderHolder { internal EventsProvider held; }
        private class LDKEventsProviderImpl : bindings.LDKEventsProvider {
                internal LDKEventsProviderImpl(EventsProviderInterface arg, LDKEventsProviderHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
@@ -74,11 +76,19 @@ public class EventsProvider : CommonBase {
                                GC.KeepAlive(arg);
                }
        }
+
+       /** Creates a new instance of EventsProvider from a given implementation */
        public static EventsProvider new_impl(EventsProviderInterface arg) {
                LDKEventsProviderHolder impl_holder = new LDKEventsProviderHolder();
-               impl_holder.held = new EventsProvider(new LDKEventsProviderImpl(arg, impl_holder));
+               LDKEventsProviderImpl impl = new LDKEventsProviderImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKEventsProvider_new(impl);
+
+               impl_holder.held = new EventsProvider(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Processes any events generated since the last call using the given event handler.
         * 
index 510077b19504b6e7a3c4c3738307716254d1f7c3..1d6c21c7bb50cc229f9e3cff812a797c4cd2c9aa 100644 (file)
@@ -24,7 +24,7 @@ public class ExpandedKey : CommonBase {
         * It is recommended to cache this value and not regenerate it for each new inbound payment.
         */
        public static ExpandedKey of(byte[] key_material) {
-               long ret = bindings.ExpandedKey_new(InternalUtils.check_arr_len(key_material, 32));
+               long ret = bindings.ExpandedKey_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(key_material, 32)));
                GC.KeepAlive(key_material);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.ExpandedKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ExpandedKey(null, ret); }
diff --git a/c_sharp/src/org/ldk/structs/FailureCode.cs b/c_sharp/src/org/ldk/structs/FailureCode.cs
new file mode 100644 (file)
index 0000000..9b5d88b
--- /dev/null
@@ -0,0 +1,122 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+/**
+ * This enum is used to specify which error data to send to peers when failing back an HTLC
+ * using [`ChannelManager::fail_htlc_backwards_with_reason`].
+ * 
+ * For more info on failure codes, see <https://github.com/lightning/bolts/blob/master/04-onion-routing.md#failure-messages>.
+ */
+public class FailureCode : CommonBase {
+       protected FailureCode(object _dummy, long ptr) : base(ptr) { }
+       ~FailureCode() {
+               if (ptr != 0) { bindings.FailureCode_free(ptr); }
+       }
+
+       internal static FailureCode constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKFailureCode_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new FailureCode_TemporaryNodeFailure(ptr);
+                       case 1: return new FailureCode_RequiredNodeFeatureMissing(ptr);
+                       case 2: return new FailureCode_IncorrectOrUnknownPaymentDetails(ptr);
+                       case 3: return new FailureCode_InvalidOnionPayload(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A FailureCode of type TemporaryNodeFailure */
+       public class FailureCode_TemporaryNodeFailure : FailureCode {
+               internal FailureCode_TemporaryNodeFailure(long ptr) : base(null, ptr) {
+               }
+       }
+       /** A FailureCode of type RequiredNodeFeatureMissing */
+       public class FailureCode_RequiredNodeFeatureMissing : FailureCode {
+               internal FailureCode_RequiredNodeFeatureMissing(long ptr) : base(null, ptr) {
+               }
+       }
+       /** A FailureCode of type IncorrectOrUnknownPaymentDetails */
+       public class FailureCode_IncorrectOrUnknownPaymentDetails : FailureCode {
+               internal FailureCode_IncorrectOrUnknownPaymentDetails(long ptr) : base(null, ptr) {
+               }
+       }
+       /** A FailureCode of type InvalidOnionPayload */
+       public class FailureCode_InvalidOnionPayload : FailureCode {
+               public Option_C2Tuple_u64u16ZZ invalid_onion_payload;
+               internal FailureCode_InvalidOnionPayload(long ptr) : base(null, ptr) {
+                       long invalid_onion_payload = bindings.LDKFailureCode_InvalidOnionPayload_get_invalid_onion_payload(ptr);
+                       org.ldk.structs.Option_C2Tuple_u64u16ZZ invalid_onion_payload_hu_conv = org.ldk.structs.Option_C2Tuple_u64u16ZZ.constr_from_ptr(invalid_onion_payload);
+                       if (invalid_onion_payload_hu_conv != null) { invalid_onion_payload_hu_conv.ptrs_to.AddLast(this); };
+                       this.invalid_onion_payload = invalid_onion_payload_hu_conv;
+               }
+       }
+       internal long clone_ptr() {
+               long ret = bindings.FailureCode_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the FailureCode
+        */
+       public FailureCode clone() {
+               long ret = bindings.FailureCode_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.FailureCode ret_hu_conv = org.ldk.structs.FailureCode.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 TemporaryNodeFailure-variant FailureCode
+        */
+       public static FailureCode temporary_node_failure() {
+               long ret = bindings.FailureCode_temporary_node_failure();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.FailureCode ret_hu_conv = org.ldk.structs.FailureCode.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 RequiredNodeFeatureMissing-variant FailureCode
+        */
+       public static FailureCode required_node_feature_missing() {
+               long ret = bindings.FailureCode_required_node_feature_missing();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.FailureCode ret_hu_conv = org.ldk.structs.FailureCode.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 IncorrectOrUnknownPaymentDetails-variant FailureCode
+        */
+       public static FailureCode incorrect_or_unknown_payment_details() {
+               long ret = bindings.FailureCode_incorrect_or_unknown_payment_details();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.FailureCode ret_hu_conv = org.ldk.structs.FailureCode.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 InvalidOnionPayload-variant FailureCode
+        */
+       public static FailureCode invalid_onion_payload(org.ldk.structs.Option_C2Tuple_u64u16ZZ a) {
+               long ret = bindings.FailureCode_invalid_onion_payload(a.ptr);
+               GC.KeepAlive(a);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.FailureCode ret_hu_conv = org.ldk.structs.FailureCode.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;
+       }
+
+}
+} } }
index 13eee12860718ad15a1c843dd498ec95a8d1a38b..0fc469f39225dd80d6260555e3ed8430b36c58e6 100644 (file)
@@ -33,21 +33,27 @@ public class Fallback : CommonBase {
                        byte version = bindings.LDKFallback_SegWitProgram_get_version(ptr);
                        WitnessVersion version_conv = new WitnessVersion(version);
                        this.version = version_conv;
-                       this.program = bindings.LDKFallback_SegWitProgram_get_program(ptr);
+                       long program = bindings.LDKFallback_SegWitProgram_get_program(ptr);
+                       byte[] program_conv = InternalUtils.decodeUint8Array(program);
+                       this.program = program_conv;
                }
        }
        /** A Fallback of type PubKeyHash */
        public class Fallback_PubKeyHash : Fallback {
                public byte[] pub_key_hash;
                internal Fallback_PubKeyHash(long ptr) : base(null, ptr) {
-                       this.pub_key_hash = bindings.LDKFallback_PubKeyHash_get_pub_key_hash(ptr);
+                       long pub_key_hash = bindings.LDKFallback_PubKeyHash_get_pub_key_hash(ptr);
+                       byte[] pub_key_hash_conv = InternalUtils.decodeUint8Array(pub_key_hash);
+                       this.pub_key_hash = pub_key_hash_conv;
                }
        }
        /** A Fallback of type ScriptHash */
        public class Fallback_ScriptHash : Fallback {
                public byte[] script_hash;
                internal Fallback_ScriptHash(long ptr) : base(null, ptr) {
-                       this.script_hash = bindings.LDKFallback_ScriptHash_get_script_hash(ptr);
+                       long script_hash = bindings.LDKFallback_ScriptHash_get_script_hash(ptr);
+                       byte[] script_hash_conv = InternalUtils.decodeUint8Array(script_hash);
+                       this.script_hash = script_hash_conv;
                }
        }
        internal long clone_ptr() {
@@ -72,7 +78,7 @@ public class Fallback : CommonBase {
         * Utility method to constructs a new SegWitProgram-variant Fallback
         */
        public static Fallback seg_wit_program(org.ldk.util.WitnessVersion version, byte[] program) {
-               long ret = bindings.Fallback_seg_wit_program(version.getVal(), program);
+               long ret = bindings.Fallback_seg_wit_program(version.getVal(), InternalUtils.encodeUint8Array(program));
                GC.KeepAlive(version);
                GC.KeepAlive(program);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -85,7 +91,7 @@ public class Fallback : CommonBase {
         * Utility method to constructs a new PubKeyHash-variant Fallback
         */
        public static Fallback pub_key_hash(byte[] a) {
-               long ret = bindings.Fallback_pub_key_hash(InternalUtils.check_arr_len(a, 20));
+               long ret = bindings.Fallback_pub_key_hash(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 20)));
                GC.KeepAlive(a);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.Fallback ret_hu_conv = org.ldk.structs.Fallback.constr_from_ptr(ret);
@@ -97,7 +103,7 @@ public class Fallback : CommonBase {
         * Utility method to constructs a new ScriptHash-variant Fallback
         */
        public static Fallback script_hash(byte[] a) {
-               long ret = bindings.Fallback_script_hash(InternalUtils.check_arr_len(a, 20));
+               long ret = bindings.Fallback_script_hash(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 20)));
                GC.KeepAlive(a);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.Fallback ret_hu_conv = org.ldk.structs.Fallback.constr_from_ptr(ret);
index fedc8cb2208e2b7b77b0f728f10f5dc904da1474..964cf0021f086937648e26dfb59d9dec40d44c36 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,6 +6,22 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of FeeEstimator */
+public interface FeeEstimatorInterface {
+       /**Gets estimated satoshis of fee required per 1000 Weight-Units.
+        * 
+        * LDK will wrap this method and ensure that the value returned is no smaller than 253
+        * (ie 1 satoshi-per-byte rounded up to ensure later round-downs don't put us below 1 satoshi-per-byte).
+        * 
+        * The following unit conversions can be used to convert to sats/KW:
+        * satoshis-per-byte * 250
+        * satoshis-per-kbyte / 4
+        */
+       int get_est_sat_per_1000_weight(ConfirmationTarget confirmation_target);
+}
+
 /**
  * A trait which should be implemented to provide feerate information on a number of time
  * horizons.
@@ -18,29 +35,14 @@ namespace org { namespace ldk { namespace structs {
  * called from inside the library in response to chain events, P2P events, or timer events).
  */
 public class FeeEstimator : CommonBase {
-       internal readonly bindings.LDKFeeEstimator bindings_instance;
+       internal bindings.LDKFeeEstimator bindings_instance;
+       internal long instance_idx;
+
        internal FeeEstimator(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private FeeEstimator(bindings.LDKFeeEstimator arg) : base(bindings.LDKFeeEstimator_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~FeeEstimator() {
                if (ptr != 0) { bindings.FeeEstimator_free(ptr); }
        }
 
-       public interface FeeEstimatorInterface {
-               /**
-                * Gets estimated satoshis of fee required per 1000 Weight-Units.
-                * 
-                * LDK will wrap this method and ensure that the value returned is no smaller than 253
-                * (ie 1 satoshi-per-byte rounded up to ensure later round-downs don't put us below 1 satoshi-per-byte).
-                * 
-                * The following unit conversions can be used to convert to sats/KW:
-                * satoshis-per-byte * 250
-                * satoshis-per-kbyte / 4
-                */
-               int get_est_sat_per_1000_weight(ConfirmationTarget _confirmation_target);
-       }
        private class LDKFeeEstimatorHolder { internal FeeEstimator held; }
        private class LDKFeeEstimatorImpl : bindings.LDKFeeEstimator {
                internal LDKFeeEstimatorImpl(FeeEstimatorInterface arg, LDKFeeEstimatorHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
@@ -52,11 +54,19 @@ public class FeeEstimator : CommonBase {
                        return ret;
                }
        }
+
+       /** Creates a new instance of FeeEstimator from a given implementation */
        public static FeeEstimator new_impl(FeeEstimatorInterface arg) {
                LDKFeeEstimatorHolder impl_holder = new LDKFeeEstimatorHolder();
-               impl_holder.held = new FeeEstimator(new LDKFeeEstimatorImpl(arg, impl_holder));
+               LDKFeeEstimatorImpl impl = new LDKFeeEstimatorImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKFeeEstimator_new(impl);
+
+               impl_holder.held = new FeeEstimator(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Gets estimated satoshis of fee required per 1000 Weight-Units.
         * 
diff --git a/c_sharp/src/org/ldk/structs/FilesystemPersister.cs b/c_sharp/src/org/ldk/structs/FilesystemPersister.cs
deleted file mode 100644 (file)
index 336faf5..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-
-/**
- * FilesystemPersister persists channel data on disk, where each channel's
- * data is stored in a file named after its funding outpoint.
- * 
- * Warning: this module does the best it can with calls to persist data, but it
- * can only guarantee that the data is passed to the drive. It is up to the
- * drive manufacturers to do the actual persistence properly, which they often
- * don't (especially on consumer-grade hardware). Therefore, it is up to the
- * user to validate their entire storage stack, to ensure the writes are
- * persistent.
- * Corollary: especially when dealing with larger amounts of money, it is best
- * practice to have multiple channel data backups and not rely only on one
- * FilesystemPersister.
- */
-public class FilesystemPersister : CommonBase {
-       internal FilesystemPersister(object _dummy, long ptr) : base(ptr) { }
-       ~FilesystemPersister() {
-               if (ptr != 0) { bindings.FilesystemPersister_free(ptr); }
-       }
-
-       /**
-        * Initialize a new FilesystemPersister and set the path to the individual channels'
-        * files.
-        */
-       public static FilesystemPersister of(string path_to_channel_data) {
-               long ret = bindings.FilesystemPersister_new(path_to_channel_data);
-               GC.KeepAlive(path_to_channel_data);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.FilesystemPersister ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.FilesystemPersister(null, ret); }
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Get the directory which was provided when this persister was initialized.
-        */
-       public string get_data_dir() {
-               string ret = bindings.FilesystemPersister_get_data_dir(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Read `ChannelMonitor`s from disk.
-        */
-       public Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ read_channelmonitors(org.ldk.structs.EntropySource entropy_source, org.ldk.structs.SignerProvider signer_provider) {
-               long ret = bindings.FilesystemPersister_read_channelmonitors(this.ptr, entropy_source.ptr, signer_provider.ptr);
-               GC.KeepAlive(this);
-               GC.KeepAlive(entropy_source);
-               GC.KeepAlive(signer_provider);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ ret_hu_conv = Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ.constr_from_ptr(ret);
-               if (this != null) { this.ptrs_to.AddLast(entropy_source); };
-               if (this != null) { this.ptrs_to.AddLast(signer_provider); };
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/FilesystemStore.cs b/c_sharp/src/org/ldk/structs/FilesystemStore.cs
new file mode 100644 (file)
index 0000000..d86841a
--- /dev/null
@@ -0,0 +1,55 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A [`KVStore`] implementation that writes to and reads from the file system.
+ */
+public class FilesystemStore : CommonBase {
+       internal FilesystemStore(object _dummy, long ptr) : base(ptr) { }
+       ~FilesystemStore() {
+               if (ptr != 0) { bindings.FilesystemStore_free(ptr); }
+       }
+
+       /**
+        * Constructs a new [`FilesystemStore`].
+        */
+       public static FilesystemStore of(string data_dir) {
+               long ret = bindings.FilesystemStore_new(InternalUtils.encodeString(data_dir));
+               GC.KeepAlive(data_dir);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.FilesystemStore ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.FilesystemStore(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Returns the data directory.
+        */
+       public string get_data_dir() {
+               long ret = bindings.FilesystemStore_get_data_dir(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Constructs a new KVStore which calls the relevant methods on this_arg.
+        * This copies the `inner` pointer in this_arg and thus the returned KVStore must be freed before this_arg is
+        */
+       public KVStore as_KVStore() {
+               long ret = bindings.FilesystemStore_as_KVStore(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               KVStore ret_hu_conv = new KVStore(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 239fb060f97cfc10de9cc97916a3eda8c09e678b..32fb570e1abeb195ae3a23427350203d25908834 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,6 +6,24 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of Filter */
+public interface FilterInterface {
+       /**Registers interest in a transaction with `txid` and having an output with `script_pubkey` as
+        * a spending condition.
+        */
+       void register_tx(byte[] txid, byte[] script_pubkey);
+       /**Registers interest in spends of a transaction output.
+        * 
+        * Note that this method might be called during processing of a new block. You therefore need
+        * to ensure that also dependent output spents within an already connected block are correctly
+        * handled, e.g., by re-scanning the block in question whenever new outputs have been
+        * registered mid-processing.
+        */
+       void register_output(WatchedOutput output);
+}
+
 /**
  * The `Filter` trait defines behavior for indicating chain activity of interest pertaining to
  * channels.
@@ -28,39 +47,23 @@ namespace org { namespace ldk { namespace structs {
  * [BIP 158]: https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki
  */
 public class Filter : CommonBase {
-       internal readonly bindings.LDKFilter bindings_instance;
+       internal bindings.LDKFilter bindings_instance;
+       internal long instance_idx;
+
        internal Filter(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private Filter(bindings.LDKFilter arg) : base(bindings.LDKFilter_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~Filter() {
                if (ptr != 0) { bindings.Filter_free(ptr); }
        }
 
-       public interface FilterInterface {
-               /**
-                * Registers interest in a transaction with `txid` and having an output with `script_pubkey` as
-                * a spending condition.
-                */
-               void register_tx(byte[] _txid, byte[] _script_pubkey);
-               /**
-                * Registers interest in spends of a transaction output.
-                * 
-                * Note that this method might be called during processing of a new block. You therefore need
-                * to ensure that also dependent output spents within an already connected block are correctly
-                * handled, e.g., by re-scanning the block in question whenever new outputs have been
-                * registered mid-processing.
-                */
-               void register_output(WatchedOutput _output);
-       }
        private class LDKFilterHolder { internal Filter held; }
        private class LDKFilterImpl : bindings.LDKFilter {
                internal LDKFilterImpl(FilterInterface arg, LDKFilterHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private FilterInterface arg;
                private LDKFilterHolder impl_holder;
-               public void register_tx(byte[] _txid, byte[] _script_pubkey) {
-                       arg.register_tx(_txid, _script_pubkey);
+               public void register_tx(long _txid, long _script_pubkey) {
+                       byte[] _txid_conv = InternalUtils.decodeUint8Array(_txid);
+                       byte[] _script_pubkey_conv = InternalUtils.decodeUint8Array(_script_pubkey);
+                       arg.register_tx(_txid_conv, _script_pubkey_conv);
                                GC.KeepAlive(arg);
                }
                public void register_output(long _output) {
@@ -70,17 +73,25 @@ public class Filter : CommonBase {
                                GC.KeepAlive(arg);
                }
        }
+
+       /** Creates a new instance of Filter from a given implementation */
        public static Filter new_impl(FilterInterface arg) {
                LDKFilterHolder impl_holder = new LDKFilterHolder();
-               impl_holder.held = new Filter(new LDKFilterImpl(arg, impl_holder));
+               LDKFilterImpl impl = new LDKFilterImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKFilter_new(impl);
+
+               impl_holder.held = new Filter(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Registers interest in a transaction with `txid` and having an output with `script_pubkey` as
         * a spending condition.
         */
        public void register_tx(byte[] txid, byte[] script_pubkey) {
-               bindings.Filter_register_tx(this.ptr, InternalUtils.check_arr_len(txid, 32), script_pubkey);
+               bindings.Filter_register_tx(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(txid, 32)), InternalUtils.encodeUint8Array(script_pubkey));
                GC.KeepAlive(this);
                GC.KeepAlive(txid);
                GC.KeepAlive(script_pubkey);
index 1f28b22f2859622ac6f91cd1b8f246c4755937b2..000dccb8300f4db304bb57f38dc82f82a1d4336d 100644 (file)
@@ -7,7 +7,7 @@ namespace org { namespace ldk { namespace structs {
 
 
 /**
- * [`Score`] implementation that uses a fixed penalty.
+ * [`ScoreLookUp`] implementation that uses a fixed penalty.
  */
 public class FixedPenaltyScorer : CommonBase {
        internal FixedPenaltyScorer(object _dummy, long ptr) : base(ptr) { }
@@ -46,14 +46,27 @@ public class FixedPenaltyScorer : CommonBase {
        }
 
        /**
-        * Constructs a new Score which calls the relevant methods on this_arg.
-        * This copies the `inner` pointer in this_arg and thus the returned Score must be freed before this_arg is
+        * Constructs a new ScoreLookUp which calls the relevant methods on this_arg.
+        * This copies the `inner` pointer in this_arg and thus the returned ScoreLookUp must be freed before this_arg is
         */
-       public Score as_Score() {
-               long ret = bindings.FixedPenaltyScorer_as_Score(this.ptr);
+       public ScoreLookUp as_ScoreLookUp() {
+               long ret = bindings.FixedPenaltyScorer_as_ScoreLookUp(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Score ret_hu_conv = new Score(null, ret);
+               ScoreLookUp ret_hu_conv = new ScoreLookUp(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new ScoreUpdate which calls the relevant methods on this_arg.
+        * This copies the `inner` pointer in this_arg and thus the returned ScoreUpdate must be freed before this_arg is
+        */
+       public ScoreUpdate as_ScoreUpdate() {
+               long ret = bindings.FixedPenaltyScorer_as_ScoreUpdate(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               ScoreUpdate ret_hu_conv = new ScoreUpdate(null, ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
                return ret_hu_conv;
        }
@@ -62,16 +75,18 @@ public class FixedPenaltyScorer : CommonBase {
         * Serialize the FixedPenaltyScorer object into a byte array which can be read by FixedPenaltyScorer_read
         */
        public byte[] write() {
-               byte[] ret = bindings.FixedPenaltyScorer_write(this.ptr);
+               long ret = bindings.FixedPenaltyScorer_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a FixedPenaltyScorer from a byte array, created by FixedPenaltyScorer_write
         */
        public static Result_FixedPenaltyScorerDecodeErrorZ read(byte[] ser, long arg) {
-               long ret = bindings.FixedPenaltyScorer_read(ser, arg);
+               long ret = bindings.FixedPenaltyScorer_read(InternalUtils.encodeUint8Array(ser), arg);
                GC.KeepAlive(ser);
                GC.KeepAlive(arg);
                if (ret >= 0 && ret <= 4096) { return null; }
diff --git a/c_sharp/src/org/ldk/structs/ForwardNode.cs b/c_sharp/src/org/ldk/structs/ForwardNode.cs
new file mode 100644 (file)
index 0000000..6860009
--- /dev/null
@@ -0,0 +1,114 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * An intermediate node, its outbound channel, and relay parameters.
+ */
+public class ForwardNode : CommonBase {
+       internal ForwardNode(object _dummy, long ptr) : base(ptr) { }
+       ~ForwardNode() {
+               if (ptr != 0) { bindings.ForwardNode_free(ptr); }
+       }
+
+       /**
+        * The TLVs for this node's [`BlindedHop`], where the fee parameters contained within are also
+        * used for [`BlindedPayInfo`] construction.
+        */
+       public ForwardTlvs get_tlvs() {
+               long ret = bindings.ForwardNode_get_tlvs(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ForwardTlvs ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ForwardTlvs(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The TLVs for this node's [`BlindedHop`], where the fee parameters contained within are also
+        * used for [`BlindedPayInfo`] construction.
+        */
+       public void set_tlvs(org.ldk.structs.ForwardTlvs val) {
+               bindings.ForwardNode_set_tlvs(this.ptr, val == null ? 0 : val.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
+       }
+
+       /**
+        * This node's pubkey.
+        */
+       public byte[] get_node_id() {
+               long ret = bindings.ForwardNode_get_node_id(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * This node's pubkey.
+        */
+       public void set_node_id(byte[] val) {
+               bindings.ForwardNode_set_node_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The maximum value, in msat, that may be accepted by this node.
+        */
+       public long get_htlc_maximum_msat() {
+               long ret = bindings.ForwardNode_get_htlc_maximum_msat(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * The maximum value, in msat, that may be accepted by this node.
+        */
+       public void set_htlc_maximum_msat(long val) {
+               bindings.ForwardNode_set_htlc_maximum_msat(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new ForwardNode given each field
+        */
+       public static ForwardNode of(org.ldk.structs.ForwardTlvs tlvs_arg, byte[] node_id_arg, long htlc_maximum_msat_arg) {
+               long ret = bindings.ForwardNode_new(tlvs_arg == null ? 0 : tlvs_arg.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id_arg, 33)), htlc_maximum_msat_arg);
+               GC.KeepAlive(tlvs_arg);
+               GC.KeepAlive(node_id_arg);
+               GC.KeepAlive(htlc_maximum_msat_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ForwardNode ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ForwardNode(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(tlvs_arg); };
+               return ret_hu_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.ForwardNode_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the ForwardNode
+        */
+       public ForwardNode clone() {
+               long ret = bindings.ForwardNode_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ForwardNode ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ForwardNode(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/ForwardTlvs.cs b/c_sharp/src/org/ldk/structs/ForwardTlvs.cs
new file mode 100644 (file)
index 0000000..fb66299
--- /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 {
+
+
+/**
+ * Data to construct a [`BlindedHop`] for forwarding a payment.
+ */
+public class ForwardTlvs : CommonBase {
+       internal ForwardTlvs(object _dummy, long ptr) : base(ptr) { }
+       ~ForwardTlvs() {
+               if (ptr != 0) { bindings.ForwardTlvs_free(ptr); }
+       }
+
+       /**
+        * The short channel id this payment should be forwarded out over.
+        */
+       public long get_short_channel_id() {
+               long ret = bindings.ForwardTlvs_get_short_channel_id(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * The short channel id this payment should be forwarded out over.
+        */
+       public void set_short_channel_id(long val) {
+               bindings.ForwardTlvs_set_short_channel_id(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Payment parameters for relaying over [`Self::short_channel_id`].
+        */
+       public PaymentRelay get_payment_relay() {
+               long ret = bindings.ForwardTlvs_get_payment_relay(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PaymentRelay ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PaymentRelay(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Payment parameters for relaying over [`Self::short_channel_id`].
+        */
+       public void set_payment_relay(org.ldk.structs.PaymentRelay val) {
+               bindings.ForwardTlvs_set_payment_relay(this.ptr, val == null ? 0 : val.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
+       }
+
+       /**
+        * Payment constraints for relaying over [`Self::short_channel_id`].
+        */
+       public PaymentConstraints get_payment_constraints() {
+               long ret = bindings.ForwardTlvs_get_payment_constraints(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PaymentConstraints ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PaymentConstraints(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Payment constraints for relaying over [`Self::short_channel_id`].
+        */
+       public void set_payment_constraints(org.ldk.structs.PaymentConstraints val) {
+               bindings.ForwardTlvs_set_payment_constraints(this.ptr, val == null ? 0 : val.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
+       }
+
+       /**
+        * Supported and required features when relaying a payment onion containing this object's
+        * corresponding [`BlindedHop::encrypted_payload`].
+        * 
+        * [`BlindedHop::encrypted_payload`]: crate::blinded_path::BlindedHop::encrypted_payload
+        */
+       public BlindedHopFeatures get_features() {
+               long ret = bindings.ForwardTlvs_get_features(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.BlindedHopFeatures ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.BlindedHopFeatures(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Supported and required features when relaying a payment onion containing this object's
+        * corresponding [`BlindedHop::encrypted_payload`].
+        * 
+        * [`BlindedHop::encrypted_payload`]: crate::blinded_path::BlindedHop::encrypted_payload
+        */
+       public void set_features(org.ldk.structs.BlindedHopFeatures val) {
+               bindings.ForwardTlvs_set_features(this.ptr, val == null ? 0 : val.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
+       }
+
+       /**
+        * Constructs a new ForwardTlvs given each field
+        */
+       public static ForwardTlvs of(long short_channel_id_arg, org.ldk.structs.PaymentRelay payment_relay_arg, org.ldk.structs.PaymentConstraints payment_constraints_arg, org.ldk.structs.BlindedHopFeatures features_arg) {
+               long ret = bindings.ForwardTlvs_new(short_channel_id_arg, payment_relay_arg == null ? 0 : payment_relay_arg.ptr, payment_constraints_arg == null ? 0 : payment_constraints_arg.ptr, features_arg == null ? 0 : features_arg.ptr);
+               GC.KeepAlive(short_channel_id_arg);
+               GC.KeepAlive(payment_relay_arg);
+               GC.KeepAlive(payment_constraints_arg);
+               GC.KeepAlive(features_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ForwardTlvs ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ForwardTlvs(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(payment_relay_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(payment_constraints_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(features_arg); };
+               return ret_hu_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.ForwardTlvs_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the ForwardTlvs
+        */
+       public ForwardTlvs clone() {
+               long ret = bindings.ForwardTlvs_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ForwardTlvs ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ForwardTlvs(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Serialize the ForwardTlvs object into a byte array which can be read by ForwardTlvs_read
+        */
+       public byte[] write() {
+               long ret = bindings.ForwardTlvs_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+}
+} } }
index 37be957b49b153fc31da0a0d284aab3b2d81c2f0..1166194df6809a267e8cc08edeab4d1f106cb9b9 100644 (file)
@@ -23,16 +23,18 @@ public class FundingCreated : CommonBase {
         * A temporary channel ID, until the funding is established
         */
        public byte[] get_temporary_channel_id() {
-               byte[] ret = bindings.FundingCreated_get_temporary_channel_id(this.ptr);
+               long ret = bindings.FundingCreated_get_temporary_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * A temporary channel ID, until the funding is established
         */
        public void set_temporary_channel_id(byte[] val) {
-               bindings.FundingCreated_set_temporary_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.FundingCreated_set_temporary_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -41,16 +43,18 @@ public class FundingCreated : CommonBase {
         * The funding transaction ID
         */
        public byte[] get_funding_txid() {
-               byte[] ret = bindings.FundingCreated_get_funding_txid(this.ptr);
+               long ret = bindings.FundingCreated_get_funding_txid(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The funding transaction ID
         */
        public void set_funding_txid(byte[] val) {
-               bindings.FundingCreated_set_funding_txid(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.FundingCreated_set_funding_txid(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -77,16 +81,18 @@ public class FundingCreated : CommonBase {
         * The signature of the channel initiator (funder) on the initial commitment transaction
         */
        public byte[] get_signature() {
-               byte[] ret = bindings.FundingCreated_get_signature(this.ptr);
+               long ret = bindings.FundingCreated_get_signature(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The signature of the channel initiator (funder) on the initial commitment transaction
         */
        public void set_signature(byte[] val) {
-               bindings.FundingCreated_set_signature(this.ptr, InternalUtils.check_arr_len(val, 64));
+               bindings.FundingCreated_set_signature(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 64)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -95,7 +101,7 @@ public class FundingCreated : CommonBase {
         * Constructs a new FundingCreated given each field
         */
        public static FundingCreated of(byte[] temporary_channel_id_arg, byte[] funding_txid_arg, short funding_output_index_arg, byte[] signature_arg) {
-               long ret = bindings.FundingCreated_new(InternalUtils.check_arr_len(temporary_channel_id_arg, 32), InternalUtils.check_arr_len(funding_txid_arg, 32), funding_output_index_arg, InternalUtils.check_arr_len(signature_arg, 64));
+               long ret = bindings.FundingCreated_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(temporary_channel_id_arg, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(funding_txid_arg, 32)), funding_output_index_arg, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(signature_arg, 64)));
                GC.KeepAlive(temporary_channel_id_arg);
                GC.KeepAlive(funding_txid_arg);
                GC.KeepAlive(funding_output_index_arg);
@@ -145,16 +151,18 @@ public class FundingCreated : CommonBase {
         * Serialize the FundingCreated object into a byte array which can be read by FundingCreated_read
         */
        public byte[] write() {
-               byte[] ret = bindings.FundingCreated_write(this.ptr);
+               long ret = bindings.FundingCreated_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a FundingCreated from a byte array, created by FundingCreated_write
         */
        public static Result_FundingCreatedDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.FundingCreated_read(ser);
+               long ret = bindings.FundingCreated_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_FundingCreatedDecodeErrorZ ret_hu_conv = Result_FundingCreatedDecodeErrorZ.constr_from_ptr(ret);
index df6fb25e8d4b73f3aa2e49700d83ab499ed6dc81..e10f01ff17842bc9e7f6bc0602e95e51c3cd5e7a 100644 (file)
@@ -23,16 +23,18 @@ public class FundingSigned : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.FundingSigned_get_channel_id(this.ptr);
+               long ret = bindings.FundingSigned_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.FundingSigned_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.FundingSigned_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -41,16 +43,18 @@ public class FundingSigned : CommonBase {
         * The signature of the channel acceptor (fundee) on the initial commitment transaction
         */
        public byte[] get_signature() {
-               byte[] ret = bindings.FundingSigned_get_signature(this.ptr);
+               long ret = bindings.FundingSigned_get_signature(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The signature of the channel acceptor (fundee) on the initial commitment transaction
         */
        public void set_signature(byte[] val) {
-               bindings.FundingSigned_set_signature(this.ptr, InternalUtils.check_arr_len(val, 64));
+               bindings.FundingSigned_set_signature(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 64)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -59,7 +63,7 @@ public class FundingSigned : CommonBase {
         * Constructs a new FundingSigned given each field
         */
        public static FundingSigned of(byte[] channel_id_arg, byte[] signature_arg) {
-               long ret = bindings.FundingSigned_new(InternalUtils.check_arr_len(channel_id_arg, 32), InternalUtils.check_arr_len(signature_arg, 64));
+               long ret = bindings.FundingSigned_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(signature_arg, 64)));
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(signature_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -107,16 +111,18 @@ public class FundingSigned : CommonBase {
         * Serialize the FundingSigned object into a byte array which can be read by FundingSigned_read
         */
        public byte[] write() {
-               byte[] ret = bindings.FundingSigned_write(this.ptr);
+               long ret = bindings.FundingSigned_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a FundingSigned from a byte array, created by FundingSigned_write
         */
        public static Result_FundingSignedDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.FundingSigned_read(ser);
+               long ret = bindings.FundingSigned_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_FundingSignedDecodeErrorZ ret_hu_conv = Result_FundingSignedDecodeErrorZ.constr_from_ptr(ret);
index 73c4d7b0564173a585bddc8fc9727ce800c83a18..793877a742b15aa58b7b52909dc176815d64f480 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,6 +6,15 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of FutureCallback */
+public interface FutureCallbackInterface {
+       /**The method which is called.
+        */
+       void call();
+}
+
 /**
  * A callback which is called when a [`Future`] completes.
  * 
@@ -16,22 +26,14 @@ namespace org { namespace ldk { namespace structs {
  * futures when they receive a wake, rather than immediately executing them.
  */
 public class FutureCallback : CommonBase {
-       internal readonly bindings.LDKFutureCallback bindings_instance;
+       internal bindings.LDKFutureCallback bindings_instance;
+       internal long instance_idx;
+
        internal FutureCallback(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private FutureCallback(bindings.LDKFutureCallback arg) : base(bindings.LDKFutureCallback_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~FutureCallback() {
                if (ptr != 0) { bindings.FutureCallback_free(ptr); }
        }
 
-       public interface FutureCallbackInterface {
-               /**
-                * The method which is called.
-                */
-               void call();
-       }
        private class LDKFutureCallbackHolder { internal FutureCallback held; }
        private class LDKFutureCallbackImpl : bindings.LDKFutureCallback {
                internal LDKFutureCallbackImpl(FutureCallbackInterface arg, LDKFutureCallbackHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
@@ -42,11 +44,19 @@ public class FutureCallback : CommonBase {
                                GC.KeepAlive(arg);
                }
        }
+
+       /** Creates a new instance of FutureCallback from a given implementation */
        public static FutureCallback new_impl(FutureCallbackInterface arg) {
                LDKFutureCallbackHolder impl_holder = new LDKFutureCallbackHolder();
-               impl_holder.held = new FutureCallback(new LDKFutureCallbackImpl(arg, impl_holder));
+               LDKFutureCallbackImpl impl = new LDKFutureCallbackImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKFutureCallback_new(impl);
+
+               impl_holder.held = new FutureCallback(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * The method which is called.
         */
index 233642d6bd64bbf53168fb131a50cd79858f843d..e210877fabcfd879211668a2d6584ae987235624 100644 (file)
@@ -23,16 +23,18 @@ public class GossipTimestampFilter : CommonBase {
         * The genesis hash of the blockchain for channel and node information
         */
        public byte[] get_chain_hash() {
-               byte[] ret = bindings.GossipTimestampFilter_get_chain_hash(this.ptr);
+               long ret = bindings.GossipTimestampFilter_get_chain_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The genesis hash of the blockchain for channel and node information
         */
        public void set_chain_hash(byte[] val) {
-               bindings.GossipTimestampFilter_set_chain_hash(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.GossipTimestampFilter_set_chain_hash(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -77,7 +79,7 @@ public class GossipTimestampFilter : CommonBase {
         * Constructs a new GossipTimestampFilter given each field
         */
        public static GossipTimestampFilter of(byte[] chain_hash_arg, int first_timestamp_arg, int timestamp_range_arg) {
-               long ret = bindings.GossipTimestampFilter_new(InternalUtils.check_arr_len(chain_hash_arg, 32), first_timestamp_arg, timestamp_range_arg);
+               long ret = bindings.GossipTimestampFilter_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(chain_hash_arg, 32)), first_timestamp_arg, timestamp_range_arg);
                GC.KeepAlive(chain_hash_arg);
                GC.KeepAlive(first_timestamp_arg);
                GC.KeepAlive(timestamp_range_arg);
@@ -126,16 +128,18 @@ public class GossipTimestampFilter : CommonBase {
         * Serialize the GossipTimestampFilter object into a byte array which can be read by GossipTimestampFilter_read
         */
        public byte[] write() {
-               byte[] ret = bindings.GossipTimestampFilter_write(this.ptr);
+               long ret = bindings.GossipTimestampFilter_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a GossipTimestampFilter from a byte array, created by GossipTimestampFilter_write
         */
        public static Result_GossipTimestampFilterDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.GossipTimestampFilter_read(ser);
+               long ret = bindings.GossipTimestampFilter_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_GossipTimestampFilterDecodeErrorZ ret_hu_conv = Result_GossipTimestampFilterDecodeErrorZ.constr_from_ptr(ret);
index 92c2d6299069eba2a023cbb0562ca1318fec2524..9abae7ca735b095191409715123b556acb2e3e15 100644 (file)
@@ -63,9 +63,11 @@ public class HTLCDescriptor : CommonBase {
         * See <https://github.com/lightning/bolts/blob/master/03-transactions.md#keys> for more info.
         */
        public byte[] get_per_commitment_point() {
-               byte[] ret = bindings.HTLCDescriptor_get_per_commitment_point(this.ptr);
+               long ret = bindings.HTLCDescriptor_get_per_commitment_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -76,7 +78,29 @@ public class HTLCDescriptor : CommonBase {
         * See <https://github.com/lightning/bolts/blob/master/03-transactions.md#keys> for more info.
         */
        public void set_per_commitment_point(byte[] val) {
-               bindings.HTLCDescriptor_set_per_commitment_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.HTLCDescriptor_set_per_commitment_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The feerate to use on the HTLC claiming transaction. This is always `0` for HTLCs
+        * originating from a channel supporting anchor outputs, otherwise it is the channel's
+        * negotiated feerate at the time the commitment transaction was built.
+        */
+       public int get_feerate_per_kw() {
+               int ret = bindings.HTLCDescriptor_get_feerate_per_kw(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * The feerate to use on the HTLC claiming transaction. This is always `0` for HTLCs
+        * originating from a channel supporting anchor outputs, otherwise it is the channel's
+        * negotiated feerate at the time the commitment transaction was built.
+        */
+       public void set_feerate_per_kw(int val) {
+               bindings.HTLCDescriptor_set_feerate_per_kw(this.ptr, val);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -107,11 +131,11 @@ public class HTLCDescriptor : CommonBase {
         * The preimage, if `Some`, to claim the HTLC output with. If `None`, the timeout path must be
         * taken.
         */
-       public Option_PaymentPreimageZ get_preimage() {
+       public Option_ThirtyTwoBytesZ get_preimage() {
                long ret = bindings.HTLCDescriptor_get_preimage(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PaymentPreimageZ ret_hu_conv = org.ldk.structs.Option_PaymentPreimageZ.constr_from_ptr(ret);
+               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;
        }
@@ -120,7 +144,7 @@ public class HTLCDescriptor : CommonBase {
         * The preimage, if `Some`, to claim the HTLC output with. If `None`, the timeout path must be
         * taken.
         */
-       public void set_preimage(org.ldk.structs.Option_PaymentPreimageZ val) {
+       public void set_preimage(org.ldk.structs.Option_ThirtyTwoBytesZ val) {
                bindings.HTLCDescriptor_set_preimage(this.ptr, val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
@@ -131,16 +155,18 @@ public class HTLCDescriptor : CommonBase {
         * The counterparty's signature required to spend the HTLC output.
         */
        public byte[] get_counterparty_sig() {
-               byte[] ret = bindings.HTLCDescriptor_get_counterparty_sig(this.ptr);
+               long ret = bindings.HTLCDescriptor_get_counterparty_sig(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The counterparty's signature required to spend the HTLC output.
         */
        public void set_counterparty_sig(byte[] val) {
-               bindings.HTLCDescriptor_set_counterparty_sig(this.ptr, InternalUtils.check_arr_len(val, 64));
+               bindings.HTLCDescriptor_set_counterparty_sig(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 64)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -180,6 +206,28 @@ public class HTLCDescriptor : CommonBase {
                if (!(o is HTLCDescriptor)) return false;
                return this.eq((HTLCDescriptor)o);
        }
+       /**
+        * Serialize the HTLCDescriptor object into a byte array which can be read by HTLCDescriptor_read
+        */
+       public byte[] write() {
+               long ret = bindings.HTLCDescriptor_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a HTLCDescriptor from a byte array, created by HTLCDescriptor_write
+        */
+       public static Result_HTLCDescriptorDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.HTLCDescriptor_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_HTLCDescriptorDecodeErrorZ ret_hu_conv = Result_HTLCDescriptorDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
        /**
         * Returns the outpoint of the HTLC output in the commitment transaction. This is the outpoint
         * being spent by the HTLC input in the HTLC transaction.
@@ -233,9 +281,11 @@ public class HTLCDescriptor : CommonBase {
         * Returns the witness script of the HTLC output in the commitment transaction.
         */
        public byte[] witness_script() {
-               byte[] ret = bindings.HTLCDescriptor_witness_script(this.ptr);
+               long ret = bindings.HTLCDescriptor_witness_script(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -243,11 +293,13 @@ public class HTLCDescriptor : CommonBase {
         * transaction.
         */
        public byte[] tx_input_witness(byte[] signature, byte[] witness_script) {
-               byte[] ret = bindings.HTLCDescriptor_tx_input_witness(this.ptr, InternalUtils.check_arr_len(signature, 64), witness_script);
+               long ret = bindings.HTLCDescriptor_tx_input_witness(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(signature, 64)), InternalUtils.encodeUint8Array(witness_script));
                GC.KeepAlive(this);
                GC.KeepAlive(signature);
                GC.KeepAlive(witness_script);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
index b5313735af5a7b3348ac2e7f592c11d2e953cd2e..c8ebe79d795507fbb4b0c32ecd12c4be3be71a7b 100644 (file)
@@ -41,8 +41,12 @@ public class HTLCDestination : CommonBase {
                 */
                public byte[] channel_id;
                internal HTLCDestination_NextHopChannel(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKHTLCDestination_NextHopChannel_get_node_id(ptr);
-                       this.channel_id = bindings.LDKHTLCDestination_NextHopChannel_get_channel_id(ptr);
+                       long node_id = bindings.LDKHTLCDestination_NextHopChannel_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
+                       long channel_id = bindings.LDKHTLCDestination_NextHopChannel_get_channel_id(ptr);
+                       byte[] channel_id_conv = InternalUtils.decodeUint8Array(channel_id);
+                       this.channel_id = channel_id_conv;
                }
        }
        /** A HTLCDestination of type UnknownNextHop */
@@ -72,7 +76,9 @@ public class HTLCDestination : CommonBase {
                 */
                public byte[] payment_hash;
                internal HTLCDestination_FailedPayment(long ptr) : base(null, ptr) {
-                       this.payment_hash = bindings.LDKHTLCDestination_FailedPayment_get_payment_hash(ptr);
+                       long payment_hash = bindings.LDKHTLCDestination_FailedPayment_get_payment_hash(ptr);
+                       byte[] payment_hash_conv = InternalUtils.decodeUint8Array(payment_hash);
+                       this.payment_hash = payment_hash_conv;
                }
        }
        internal long clone_ptr() {
@@ -97,7 +103,7 @@ public class HTLCDestination : CommonBase {
         * Utility method to constructs a new NextHopChannel-variant HTLCDestination
         */
        public static HTLCDestination next_hop_channel(byte[] node_id, byte[] channel_id) {
-               long ret = bindings.HTLCDestination_next_hop_channel(InternalUtils.check_arr_len(node_id, 33), InternalUtils.check_arr_len(channel_id, 32));
+               long ret = bindings.HTLCDestination_next_hop_channel(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id, 32)));
                GC.KeepAlive(node_id);
                GC.KeepAlive(channel_id);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -134,7 +140,7 @@ public class HTLCDestination : CommonBase {
         * Utility method to constructs a new FailedPayment-variant HTLCDestination
         */
        public static HTLCDestination failed_payment(byte[] payment_hash) {
-               long ret = bindings.HTLCDestination_failed_payment(InternalUtils.check_arr_len(payment_hash, 32));
+               long ret = bindings.HTLCDestination_failed_payment(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)));
                GC.KeepAlive(payment_hash);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.HTLCDestination ret_hu_conv = org.ldk.structs.HTLCDestination.constr_from_ptr(ret);
@@ -161,9 +167,11 @@ public class HTLCDestination : CommonBase {
         * Serialize the HTLCDestination object into a byte array which can be read by HTLCDestination_read
         */
        public byte[] write() {
-               byte[] ret = bindings.HTLCDestination_write(this.ptr);
+               long ret = bindings.HTLCDestination_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index 6a97cf9f200ada6d5033d1c46fe566d23e322d93..4e64beeeabae9a56c6357c409ca9b0d9c0fd9448 100644 (file)
@@ -81,16 +81,18 @@ public class HTLCOutputInCommitment : CommonBase {
         * The hash of the preimage which unlocks this HTLC.
         */
        public byte[] get_payment_hash() {
-               byte[] ret = bindings.HTLCOutputInCommitment_get_payment_hash(this.ptr);
+               long ret = bindings.HTLCOutputInCommitment_get_payment_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The hash of the preimage which unlocks this HTLC.
         */
        public void set_payment_hash(byte[] val) {
-               bindings.HTLCOutputInCommitment_set_payment_hash(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.HTLCOutputInCommitment_set_payment_hash(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -125,7 +127,7 @@ public class HTLCOutputInCommitment : CommonBase {
         * Constructs a new HTLCOutputInCommitment given each field
         */
        public static HTLCOutputInCommitment of(bool offered_arg, long amount_msat_arg, int cltv_expiry_arg, byte[] payment_hash_arg, org.ldk.structs.Option_u32Z transaction_output_index_arg) {
-               long ret = bindings.HTLCOutputInCommitment_new(offered_arg, amount_msat_arg, cltv_expiry_arg, InternalUtils.check_arr_len(payment_hash_arg, 32), transaction_output_index_arg.ptr);
+               long ret = bindings.HTLCOutputInCommitment_new(offered_arg, amount_msat_arg, cltv_expiry_arg, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash_arg, 32)), transaction_output_index_arg.ptr);
                GC.KeepAlive(offered_arg);
                GC.KeepAlive(amount_msat_arg);
                GC.KeepAlive(cltv_expiry_arg);
@@ -177,16 +179,18 @@ public class HTLCOutputInCommitment : CommonBase {
         * Serialize the HTLCOutputInCommitment object into a byte array which can be read by HTLCOutputInCommitment_read
         */
        public byte[] write() {
-               byte[] ret = bindings.HTLCOutputInCommitment_write(this.ptr);
+               long ret = bindings.HTLCOutputInCommitment_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a HTLCOutputInCommitment from a byte array, created by HTLCOutputInCommitment_write
         */
        public static Result_HTLCOutputInCommitmentDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.HTLCOutputInCommitment_read(ser);
+               long ret = bindings.HTLCOutputInCommitment_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_HTLCOutputInCommitmentDecodeErrorZ ret_hu_conv = Result_HTLCOutputInCommitmentDecodeErrorZ.constr_from_ptr(ret);
index 4e19772915096bf53daf263fa09e69aa995f267a..74bb98cec57239a495060e486b631e82bd4701fe 100644 (file)
@@ -56,16 +56,18 @@ public class HTLCUpdate : CommonBase {
         * Serialize the HTLCUpdate object into a byte array which can be read by HTLCUpdate_read
         */
        public byte[] write() {
-               byte[] ret = bindings.HTLCUpdate_write(this.ptr);
+               long ret = bindings.HTLCUpdate_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a HTLCUpdate from a byte array, created by HTLCUpdate_write
         */
        public static Result_HTLCUpdateDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.HTLCUpdate_read(ser);
+               long ret = bindings.HTLCUpdate_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_HTLCUpdateDecodeErrorZ ret_hu_conv = Result_HTLCUpdateDecodeErrorZ.constr_from_ptr(ret);
index e77584f828262c9012fd50d91ba9d3590096a4bc..c8da499c37d6da33d307765a308c831b6f98a04f 100644 (file)
@@ -21,16 +21,18 @@ public class HolderCommitmentTransaction : CommonBase {
         * Our counterparty's signature for the transaction
         */
        public byte[] get_counterparty_sig() {
-               byte[] ret = bindings.HolderCommitmentTransaction_get_counterparty_sig(this.ptr);
+               long ret = bindings.HolderCommitmentTransaction_get_counterparty_sig(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Our counterparty's signature for the transaction
         */
        public void set_counterparty_sig(byte[] val) {
-               bindings.HolderCommitmentTransaction_set_counterparty_sig(this.ptr, InternalUtils.check_arr_len(val, 64));
+               bindings.HolderCommitmentTransaction_set_counterparty_sig(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 64)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -41,16 +43,25 @@ public class HolderCommitmentTransaction : CommonBase {
         * Returns a copy of the field.
         */
        public byte[][] get_counterparty_htlc_sigs() {
-               byte[][] ret = bindings.HolderCommitmentTransaction_get_counterparty_htlc_sigs(this.ptr);
+               long ret = bindings.HolderCommitmentTransaction_get_counterparty_htlc_sigs(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_8_len = InternalUtils.getArrayLength(ret);
+               byte[][] ret_conv_8_arr = new byte[ret_conv_8_len][];
+               for (int i = 0; i < ret_conv_8_len; i++) {
+                       long ret_conv_8 = InternalUtils.getU64ArrayElem(ret, i);
+                       byte[] ret_conv_8_conv = InternalUtils.decodeUint8Array(ret_conv_8);
+                       ret_conv_8_arr[i] = ret_conv_8_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_8_arr;
        }
 
        /**
         * All non-dust counterparty HTLC signatures, in the order they appear in the transaction
         */
        public void set_counterparty_htlc_sigs(byte[][] val) {
-               bindings.HolderCommitmentTransaction_set_counterparty_htlc_sigs(this.ptr, val != null ? InternalUtils.mapArray(val, val_conv_8 => InternalUtils.check_arr_len(val_conv_8, 64)) : null);
+               bindings.HolderCommitmentTransaction_set_counterparty_htlc_sigs(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(val, val_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val_conv_8, 64)))));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -77,16 +88,18 @@ public class HolderCommitmentTransaction : CommonBase {
         * Serialize the HolderCommitmentTransaction object into a byte array which can be read by HolderCommitmentTransaction_read
         */
        public byte[] write() {
-               byte[] ret = bindings.HolderCommitmentTransaction_write(this.ptr);
+               long ret = bindings.HolderCommitmentTransaction_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a HolderCommitmentTransaction from a byte array, created by HolderCommitmentTransaction_write
         */
        public static Result_HolderCommitmentTransactionDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.HolderCommitmentTransaction_read(ser);
+               long ret = bindings.HolderCommitmentTransaction_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_HolderCommitmentTransactionDecodeErrorZ ret_hu_conv = Result_HolderCommitmentTransactionDecodeErrorZ.constr_from_ptr(ret);
@@ -98,7 +111,7 @@ public class HolderCommitmentTransaction : CommonBase {
         * The funding keys are used to figure out which signature should go first when building the transaction for broadcast.
         */
        public static HolderCommitmentTransaction of(org.ldk.structs.CommitmentTransaction commitment_tx, byte[] counterparty_sig, byte[][] counterparty_htlc_sigs, byte[] holder_funding_key, byte[] counterparty_funding_key) {
-               long ret = bindings.HolderCommitmentTransaction_new(commitment_tx == null ? 0 : commitment_tx.ptr, InternalUtils.check_arr_len(counterparty_sig, 64), counterparty_htlc_sigs != null ? InternalUtils.mapArray(counterparty_htlc_sigs, counterparty_htlc_sigs_conv_8 => InternalUtils.check_arr_len(counterparty_htlc_sigs_conv_8, 64)) : null, InternalUtils.check_arr_len(holder_funding_key, 33), InternalUtils.check_arr_len(counterparty_funding_key, 33));
+               long ret = bindings.HolderCommitmentTransaction_new(commitment_tx == null ? 0 : commitment_tx.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_sig, 64)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(counterparty_htlc_sigs, counterparty_htlc_sigs_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_htlc_sigs_conv_8, 64)))), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(holder_funding_key, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_funding_key, 33)));
                GC.KeepAlive(commitment_tx);
                GC.KeepAlive(counterparty_sig);
                GC.KeepAlive(counterparty_htlc_sigs);
index 098c217fcffb38d61bb6625e62e5369bc0562dde..2e3e071f753e4132398853d1e35fdda5628e77a0 100644 (file)
@@ -69,16 +69,18 @@ public class Hostname : CommonBase {
         * Serialize the Hostname object into a byte array which can be read by Hostname_read
         */
        public byte[] write() {
-               byte[] ret = bindings.Hostname_write(this.ptr);
+               long ret = bindings.Hostname_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a Hostname from a byte array, created by Hostname_write
         */
        public static Result_HostnameDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.Hostname_read(ser);
+               long ret = bindings.Hostname_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_HostnameDecodeErrorZ ret_hu_conv = Result_HostnameDecodeErrorZ.constr_from_ptr(ret);
index 070d25acd159f48ecdcc7ed073ee4fe67ef9890c..6046c7dcf8e2f4d68cf19d187cdfa41f09f9c8eb 100644 (file)
@@ -53,19 +53,6 @@ public class IgnoringMessageHandler : CommonBase {
                return ret_hu_conv;
        }
 
-       /**
-        * Constructs a new OnionMessageProvider which calls the relevant methods on this_arg.
-        * This copies the `inner` pointer in this_arg and thus the returned OnionMessageProvider must be freed before this_arg is
-        */
-       public OnionMessageProvider as_OnionMessageProvider() {
-               long ret = bindings.IgnoringMessageHandler_as_OnionMessageProvider(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               OnionMessageProvider ret_hu_conv = new OnionMessageProvider(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
        /**
         * Constructs a new OnionMessageHandler which calls the relevant methods on this_arg.
         * This copies the `inner` pointer in this_arg and thus the returned OnionMessageHandler must be freed before this_arg is
index ef9bb6f680dc783573c74e987fc7d4be283578d7..6a805b28c204734a2159db418bba86ae9c0ff07e 100644 (file)
@@ -49,7 +49,7 @@ public class InFlightHtlcs : CommonBase {
         * Takes in a path with payer's node id and adds the path's details to `InFlightHtlcs`.
         */
        public void process_path(org.ldk.structs.Path path, byte[] payer_node_id) {
-               bindings.InFlightHtlcs_process_path(this.ptr, path == null ? 0 : path.ptr, InternalUtils.check_arr_len(payer_node_id, 33));
+               bindings.InFlightHtlcs_process_path(this.ptr, path == null ? 0 : path.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payer_node_id, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(path);
                GC.KeepAlive(payer_node_id);
@@ -93,16 +93,18 @@ public class InFlightHtlcs : CommonBase {
         * Serialize the InFlightHtlcs object into a byte array which can be read by InFlightHtlcs_read
         */
        public byte[] write() {
-               byte[] ret = bindings.InFlightHtlcs_write(this.ptr);
+               long ret = bindings.InFlightHtlcs_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a InFlightHtlcs from a byte array, created by InFlightHtlcs_write
         */
        public static Result_InFlightHtlcsDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.InFlightHtlcs_read(ser);
+               long ret = bindings.InFlightHtlcs_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_InFlightHtlcsDecodeErrorZ ret_hu_conv = Result_InFlightHtlcsDecodeErrorZ.constr_from_ptr(ret);
index bf18391a74429e5038e0df96c3234ac119d12716..d0c6655ad270df55dfa560848a9ac8ab24851afc 100644 (file)
@@ -23,9 +23,11 @@ public class InMemorySigner : CommonBase {
         * holder's anchor output in a commitment transaction, if one is present.
         */
        public byte[] get_funding_key() {
-               byte[] ret = bindings.InMemorySigner_get_funding_key(this.ptr);
+               long ret = bindings.InMemorySigner_get_funding_key(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -33,7 +35,7 @@ public class InMemorySigner : CommonBase {
         * holder's anchor output in a commitment transaction, if one is present.
         */
        public void set_funding_key(byte[] val) {
-               bindings.InMemorySigner_set_funding_key(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.InMemorySigner_set_funding_key(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -42,16 +44,18 @@ public class InMemorySigner : CommonBase {
         * Holder secret key for blinded revocation pubkey.
         */
        public byte[] get_revocation_base_key() {
-               byte[] ret = bindings.InMemorySigner_get_revocation_base_key(this.ptr);
+               long ret = bindings.InMemorySigner_get_revocation_base_key(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Holder secret key for blinded revocation pubkey.
         */
        public void set_revocation_base_key(byte[] val) {
-               bindings.InMemorySigner_set_revocation_base_key(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.InMemorySigner_set_revocation_base_key(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -60,16 +64,18 @@ public class InMemorySigner : CommonBase {
         * Holder secret key used for our balance in counterparty-broadcasted commitment transactions.
         */
        public byte[] get_payment_key() {
-               byte[] ret = bindings.InMemorySigner_get_payment_key(this.ptr);
+               long ret = bindings.InMemorySigner_get_payment_key(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Holder secret key used for our balance in counterparty-broadcasted commitment transactions.
         */
        public void set_payment_key(byte[] val) {
-               bindings.InMemorySigner_set_payment_key(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.InMemorySigner_set_payment_key(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -78,16 +84,18 @@ public class InMemorySigner : CommonBase {
         * Holder secret key used in an HTLC transaction.
         */
        public byte[] get_delayed_payment_base_key() {
-               byte[] ret = bindings.InMemorySigner_get_delayed_payment_base_key(this.ptr);
+               long ret = bindings.InMemorySigner_get_delayed_payment_base_key(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Holder secret key used in an HTLC transaction.
         */
        public void set_delayed_payment_base_key(byte[] val) {
-               bindings.InMemorySigner_set_delayed_payment_base_key(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.InMemorySigner_set_delayed_payment_base_key(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -96,16 +104,18 @@ public class InMemorySigner : CommonBase {
         * Holder HTLC secret key used in commitment transaction HTLC outputs.
         */
        public byte[] get_htlc_base_key() {
-               byte[] ret = bindings.InMemorySigner_get_htlc_base_key(this.ptr);
+               long ret = bindings.InMemorySigner_get_htlc_base_key(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Holder HTLC secret key used in commitment transaction HTLC outputs.
         */
        public void set_htlc_base_key(byte[] val) {
-               bindings.InMemorySigner_set_htlc_base_key(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.InMemorySigner_set_htlc_base_key(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -114,16 +124,18 @@ public class InMemorySigner : CommonBase {
         * Commitment seed.
         */
        public byte[] get_commitment_seed() {
-               byte[] ret = bindings.InMemorySigner_get_commitment_seed(this.ptr);
+               long ret = bindings.InMemorySigner_get_commitment_seed(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Commitment seed.
         */
        public void set_commitment_seed(byte[] val) {
-               bindings.InMemorySigner_set_commitment_seed(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.InMemorySigner_set_commitment_seed(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -150,7 +162,7 @@ public class InMemorySigner : CommonBase {
         * Creates a new [`InMemorySigner`].
         */
        public static InMemorySigner of(byte[] funding_key, byte[] revocation_base_key, byte[] payment_key, byte[] delayed_payment_base_key, byte[] htlc_base_key, byte[] commitment_seed, long channel_value_satoshis, byte[] channel_keys_id, byte[] rand_bytes_unique_start) {
-               long ret = bindings.InMemorySigner_new(InternalUtils.check_arr_len(funding_key, 32), InternalUtils.check_arr_len(revocation_base_key, 32), InternalUtils.check_arr_len(payment_key, 32), InternalUtils.check_arr_len(delayed_payment_base_key, 32), InternalUtils.check_arr_len(htlc_base_key, 32), InternalUtils.check_arr_len(commitment_seed, 32), channel_value_satoshis, InternalUtils.check_arr_len(channel_keys_id, 32), InternalUtils.check_arr_len(rand_bytes_unique_start, 32));
+               long ret = bindings.InMemorySigner_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(funding_key, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(revocation_base_key, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_key, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(delayed_payment_base_key, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(htlc_base_key, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(commitment_seed, 32)), channel_value_satoshis, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_keys_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(rand_bytes_unique_start, 32)));
                GC.KeepAlive(funding_key);
                GC.KeepAlive(revocation_base_key);
                GC.KeepAlive(payment_key);
@@ -169,7 +181,10 @@ public class InMemorySigner : CommonBase {
        /**
         * Returns the counterparty's pubkeys.
         * 
-        * Will panic if [`ChannelSigner::provide_channel_parameters`] has not been called before.
+        * Will return `None` if [`ChannelSigner::provide_channel_parameters`] has not been called.
+        * In general, this is safe to `unwrap` only in [`ChannelSigner`] implementation.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public ChannelPublicKeys counterparty_pubkeys() {
                long ret = bindings.InMemorySigner_counterparty_pubkeys(this.ptr);
@@ -185,12 +200,16 @@ public class InMemorySigner : CommonBase {
         * transactions, i.e., the amount of time that we have to wait to recover our funds if we
         * broadcast a transaction.
         * 
-        * Will panic if [`ChannelSigner::provide_channel_parameters`] has not been called before.
+        * Will return `None` if [`ChannelSigner::provide_channel_parameters`] has not been called.
+        * In general, this is safe to `unwrap` only in [`ChannelSigner`] implementation.
         */
-       public short counterparty_selected_contest_delay() {
-               short ret = bindings.InMemorySigner_counterparty_selected_contest_delay(this.ptr);
+       public Option_u16Z counterparty_selected_contest_delay() {
+               long ret = bindings.InMemorySigner_counterparty_selected_contest_delay(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_u16Z ret_hu_conv = org.ldk.structs.Option_u16Z.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
        }
 
        /**
@@ -198,29 +217,40 @@ public class InMemorySigner : CommonBase {
         * by our counterparty, i.e., the amount of time that they have to wait to recover their funds
         * if they broadcast a transaction.
         * 
-        * Will panic if [`ChannelSigner::provide_channel_parameters`] has not been called before.
+        * Will return `None` if [`ChannelSigner::provide_channel_parameters`] has not been called.
+        * In general, this is safe to `unwrap` only in [`ChannelSigner`] implementation.
         */
-       public short holder_selected_contest_delay() {
-               short ret = bindings.InMemorySigner_holder_selected_contest_delay(this.ptr);
+       public Option_u16Z holder_selected_contest_delay() {
+               long ret = bindings.InMemorySigner_holder_selected_contest_delay(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_u16Z ret_hu_conv = org.ldk.structs.Option_u16Z.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
        }
 
        /**
         * Returns whether the holder is the initiator.
         * 
-        * Will panic if [`ChannelSigner::provide_channel_parameters`] has not been called before.
+        * Will return `None` if [`ChannelSigner::provide_channel_parameters`] has not been called.
+        * In general, this is safe to `unwrap` only in [`ChannelSigner`] implementation.
         */
-       public bool is_outbound() {
-               bool ret = bindings.InMemorySigner_is_outbound(this.ptr);
+       public Option_boolZ is_outbound() {
+               long ret = bindings.InMemorySigner_is_outbound(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_boolZ ret_hu_conv = org.ldk.structs.Option_boolZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
        }
 
        /**
         * Funding outpoint
         * 
-        * Will panic if [`ChannelSigner::provide_channel_parameters`] has not been called before.
+        * Will return `None` if [`ChannelSigner::provide_channel_parameters`] has not been called.
+        * In general, this is safe to `unwrap` only in [`ChannelSigner`] implementation.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public OutPoint funding_outpoint() {
                long ret = bindings.InMemorySigner_funding_outpoint(this.ptr);
@@ -235,7 +265,10 @@ public class InMemorySigner : CommonBase {
         * Returns a [`ChannelTransactionParameters`] for this channel, to be used when verifying or
         * building transactions.
         * 
-        * Will panic if [`ChannelSigner::provide_channel_parameters`] has not been called before.
+        * Will return `None` if [`ChannelSigner::provide_channel_parameters`] has not been called.
+        * In general, this is safe to `unwrap` only in [`ChannelSigner`] implementation.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public ChannelTransactionParameters get_channel_parameters() {
                long ret = bindings.InMemorySigner_get_channel_parameters(this.ptr);
@@ -250,7 +283,10 @@ public class InMemorySigner : CommonBase {
         * Returns the channel type features of the channel parameters. Should be helpful for
         * determining a channel's category, i. e. legacy/anchors/taproot/etc.
         * 
-        * Will panic if [`ChannelSigner::provide_channel_parameters`] has not been called before.
+        * Will return `None` if [`ChannelSigner::provide_channel_parameters`] has not been called.
+        * In general, this is safe to `unwrap` only in [`ChannelSigner`] implementation.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public ChannelTypeFeatures channel_type_features() {
                long ret = bindings.InMemorySigner_channel_type_features(this.ptr);
@@ -272,7 +308,7 @@ 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) {
-               long ret = bindings.InMemorySigner_sign_counterparty_payment_input(this.ptr, spend_tx, input_idx, descriptor == null ? 0 : descriptor.ptr);
+               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);
@@ -296,7 +332,7 @@ public class InMemorySigner : CommonBase {
         * [`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) {
-               long ret = bindings.InMemorySigner_sign_dynamic_p2wsh_input(this.ptr, spend_tx, input_idx, descriptor == null ? 0 : descriptor.ptr);
+               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);
@@ -363,16 +399,18 @@ public class InMemorySigner : CommonBase {
         * Serialize the InMemorySigner object into a byte array which can be read by InMemorySigner_read
         */
        public byte[] write() {
-               byte[] ret = bindings.InMemorySigner_write(this.ptr);
+               long ret = bindings.InMemorySigner_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a InMemorySigner from a byte array, created by InMemorySigner_write
         */
        public static Result_InMemorySignerDecodeErrorZ read(byte[] ser, org.ldk.structs.EntropySource arg) {
-               long ret = bindings.InMemorySigner_read(ser, arg.ptr);
+               long ret = bindings.InMemorySigner_read(InternalUtils.encodeUint8Array(ser), arg.ptr);
                GC.KeepAlive(ser);
                GC.KeepAlive(arg);
                if (ret >= 0 && ret <= 4096) { return null; }
index eece3cbeb36e55faf8614c48b046e65ee3883c66..407b3436c21d3c3012920fade33e9d2a45debe26 100644 (file)
@@ -46,11 +46,11 @@ public class Init : CommonBase {
         * 
         * Returns a copy of the field.
         */
-       public Option_CVec_ChainHashZZ get_networks() {
+       public Option_CVec_ThirtyTwoBytesZZ get_networks() {
                long ret = bindings.Init_get_networks(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_CVec_ChainHashZZ ret_hu_conv = org.ldk.structs.Option_CVec_ChainHashZZ.constr_from_ptr(ret);
+               org.ldk.structs.Option_CVec_ThirtyTwoBytesZZ ret_hu_conv = org.ldk.structs.Option_CVec_ThirtyTwoBytesZZ.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
                return ret_hu_conv;
        }
@@ -60,7 +60,7 @@ public class Init : CommonBase {
         * 
         * If there are no common chains, the connection will be closed.
         */
-       public void set_networks(org.ldk.structs.Option_CVec_ChainHashZZ val) {
+       public void set_networks(org.ldk.structs.Option_CVec_ThirtyTwoBytesZZ val) {
                bindings.Init_set_networks(this.ptr, val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
@@ -75,11 +75,11 @@ public class Init : CommonBase {
         * public IPv4 address (NAT) and use that for a [`NodeAnnouncement`] update message containing
         * the new address.
         */
-       public Option_NetAddressZ get_remote_network_address() {
+       public Option_SocketAddressZ get_remote_network_address() {
                long ret = bindings.Init_get_remote_network_address(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_NetAddressZ ret_hu_conv = org.ldk.structs.Option_NetAddressZ.constr_from_ptr(ret);
+               org.ldk.structs.Option_SocketAddressZ ret_hu_conv = org.ldk.structs.Option_SocketAddressZ.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
                return ret_hu_conv;
        }
@@ -92,7 +92,7 @@ public class Init : CommonBase {
         * public IPv4 address (NAT) and use that for a [`NodeAnnouncement`] update message containing
         * the new address.
         */
-       public void set_remote_network_address(org.ldk.structs.Option_NetAddressZ val) {
+       public void set_remote_network_address(org.ldk.structs.Option_SocketAddressZ val) {
                bindings.Init_set_remote_network_address(this.ptr, val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
@@ -102,7 +102,7 @@ public class Init : CommonBase {
        /**
         * Constructs a new Init given each field
         */
-       public static Init of(org.ldk.structs.InitFeatures features_arg, org.ldk.structs.Option_CVec_ChainHashZZ networks_arg, org.ldk.structs.Option_NetAddressZ remote_network_address_arg) {
+       public static Init of(org.ldk.structs.InitFeatures features_arg, org.ldk.structs.Option_CVec_ThirtyTwoBytesZZ networks_arg, org.ldk.structs.Option_SocketAddressZ remote_network_address_arg) {
                long ret = bindings.Init_new(features_arg == null ? 0 : features_arg.ptr, networks_arg.ptr, remote_network_address_arg.ptr);
                GC.KeepAlive(features_arg);
                GC.KeepAlive(networks_arg);
@@ -155,16 +155,18 @@ public class Init : CommonBase {
         * Serialize the Init object into a byte array which can be read by Init_read
         */
        public byte[] write() {
-               byte[] ret = bindings.Init_write(this.ptr);
+               long ret = bindings.Init_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a Init from a byte array, created by Init_write
         */
        public static Result_InitDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.Init_read(ser);
+               long ret = bindings.Init_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_InitDecodeErrorZ ret_hu_conv = Result_InitDecodeErrorZ.constr_from_ptr(ret);
index 9c2d9e13dc778ab49378418d27a4203c8357ba2b..44c97a13c6687756d536311942e7ec54717b5e64 100644 (file)
@@ -82,6 +82,42 @@ public class InitFeatures : CommonBase {
                return ret;
        }
 
+       /**
+        * Sets a required feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Required bits are even. If an odd bit is given, then the corresponding even bit will
+        * be set instead (i.e., `bit - 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_required_feature_bit(long bit) {
+               long ret = bindings.InitFeatures_set_required_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Sets an optional feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Optional bits are odd. If an even bit is given, then the corresponding odd bit will be
+        * set instead (i.e., `bit + 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_optional_feature_bit(long bit) {
+               long ret = bindings.InitFeatures_set_optional_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
        /**
         * Sets a required custom feature bit. Errors if `bit` is outside the custom range as defined
         * by [bLIP 2] or if it is a known `T` feature.
@@ -122,16 +158,18 @@ public class InitFeatures : CommonBase {
         * Serialize the InitFeatures object into a byte array which can be read by InitFeatures_read
         */
        public byte[] write() {
-               byte[] ret = bindings.InitFeatures_write(this.ptr);
+               long ret = bindings.InitFeatures_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a InitFeatures from a byte array, created by InitFeatures_write
         */
        public static Result_InitFeaturesDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.InitFeatures_read(ser);
+               long ret = bindings.InitFeatures_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_InitFeaturesDecodeErrorZ ret_hu_conv = Result_InitFeaturesDecodeErrorZ.constr_from_ptr(ret);
@@ -537,6 +575,40 @@ public class InitFeatures : CommonBase {
                return ret;
        }
 
+       /**
+        * Set this feature as optional.
+        */
+       public void set_taproot_optional() {
+               bindings.InitFeatures_set_taproot_optional(this.ptr);
+               GC.KeepAlive(this);
+       }
+
+       /**
+        * Set this feature as required.
+        */
+       public void set_taproot_required() {
+               bindings.InitFeatures_set_taproot_required(this.ptr);
+               GC.KeepAlive(this);
+       }
+
+       /**
+        * Checks if this feature is supported.
+        */
+       public bool supports_taproot() {
+               bool ret = bindings.InitFeatures_supports_taproot(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Checks if this feature is required.
+        */
+       public bool requires_taproot() {
+               bool ret = bindings.InitFeatures_requires_taproot(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
        /**
         * Set this feature as optional.
         */
index 2df981825d15a1ad98f41ca0b74b7568d9b6e439..1012b6f455d89c7c87a7b3cec4c9cced76dd49d9 100644 (file)
@@ -21,9 +21,11 @@ public class InvalidShutdownScript : CommonBase {
         * [BOLT #2]: https://github.com/lightning/bolts/blob/master/02-peer-protocol.md
         */
        public byte[] get_script() {
-               byte[] ret = bindings.InvalidShutdownScript_get_script(this.ptr);
+               long ret = bindings.InvalidShutdownScript_get_script(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -32,7 +34,7 @@ public class InvalidShutdownScript : CommonBase {
         * [BOLT #2]: https://github.com/lightning/bolts/blob/master/02-peer-protocol.md
         */
        public void set_script(byte[] val) {
-               bindings.InvalidShutdownScript_set_script(this.ptr, val);
+               bindings.InvalidShutdownScript_set_script(this.ptr, InternalUtils.encodeUint8Array(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -41,7 +43,7 @@ public class InvalidShutdownScript : CommonBase {
         * Constructs a new InvalidShutdownScript given each field
         */
        public static InvalidShutdownScript of(byte[] script_arg) {
-               long ret = bindings.InvalidShutdownScript_new(script_arg);
+               long ret = bindings.InvalidShutdownScript_new(InternalUtils.encodeUint8Array(script_arg));
                GC.KeepAlive(script_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.InvalidShutdownScript ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.InvalidShutdownScript(null, ret); }
index 36e7b87d97aa70ddb4df599d4f6b2d787f57e232..d797add872105ccea32d87b19bf8499070dcd607 100644 (file)
@@ -74,6 +74,8 @@ public class InvoiceError : CommonBase {
 
        /**
         * Constructs a new InvoiceError given each field
+        * 
+        * Note that erroneous_field_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public static InvoiceError of(org.ldk.structs.ErroneousField erroneous_field_arg, org.ldk.structs.UntrustedString message_arg) {
                long ret = bindings.InvoiceError_new(erroneous_field_arg == null ? 0 : erroneous_field_arg.ptr, message_arg == null ? 0 : message_arg.ptr);
@@ -105,20 +107,34 @@ public class InvoiceError : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Creates an [`InvoiceError`] with the given message.
+        */
+       public static InvoiceError from_string(string s) {
+               long ret = bindings.InvoiceError_from_string(InternalUtils.encodeString(s));
+               GC.KeepAlive(s);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.InvoiceError ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.InvoiceError(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
        /**
         * Serialize the InvoiceError object into a byte array which can be read by InvoiceError_read
         */
        public byte[] write() {
-               byte[] ret = bindings.InvoiceError_write(this.ptr);
+               long ret = bindings.InvoiceError_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a InvoiceError from a byte array, created by InvoiceError_write
         */
        public static Result_InvoiceErrorDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.InvoiceError_read(ser);
+               long ret = bindings.InvoiceError_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_InvoiceErrorDecodeErrorZ ret_hu_conv = Result_InvoiceErrorDecodeErrorZ.constr_from_ptr(ret);
index 38cc22ff2554efbedcace2c10fde88ed3cfa6df1..edbbb5a679fb8e6e0aa17dbd2f92d67421557668 100644 (file)
@@ -39,25 +39,173 @@ public class InvoiceRequest : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * The chains that may be used when paying a requested invoice (e.g., bitcoin mainnet).
+        * Payments must be denominated in units of the minimal lightning-payable unit (e.g., msats)
+        * for the selected chain.
+        */
+       public byte[][] chains() {
+               long ret = bindings.InvoiceRequest_chains(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_8_len = InternalUtils.getArrayLength(ret);
+               byte[][] ret_conv_8_arr = new byte[ret_conv_8_len][];
+               for (int i = 0; i < ret_conv_8_len; i++) {
+                       long ret_conv_8 = InternalUtils.getU64ArrayElem(ret, i);
+                       byte[] ret_conv_8_conv = InternalUtils.decodeUint8Array(ret_conv_8);
+                       ret_conv_8_arr[i] = ret_conv_8_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_8_arr;
+       }
+
+       /**
+        * Opaque bytes set by the originator. Useful for authentication and validating fields since it
+        * is reflected in `invoice_request` messages along with all the other fields from the `offer`.
+        */
+       public Option_CVec_u8ZZ metadata() {
+               long ret = bindings.InvoiceRequest_metadata(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_CVec_u8ZZ ret_hu_conv = org.ldk.structs.Option_CVec_u8ZZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The minimum amount required for a successful payment of a single item.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public Amount amount() {
+               long ret = bindings.InvoiceRequest_amount(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Amount ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Amount(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * A complete description of the purpose of the payment. Intended to be displayed to the user
+        * but with the caveat that it has not been verified in any way.
+        */
+       public PrintableString description() {
+               long ret = bindings.InvoiceRequest_description(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PrintableString ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PrintableString(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Features pertaining to the offer.
+        */
+       public OfferFeatures offer_features() {
+               long ret = bindings.InvoiceRequest_offer_features(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.OfferFeatures ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.OfferFeatures(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Duration since the Unix epoch when an invoice should no longer be requested.
+        * 
+        * If `None`, the offer does not expire.
+        */
+       public Option_u64Z absolute_expiry() {
+               long ret = bindings.InvoiceRequest_absolute_expiry(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 issuer of the offer, 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.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public PrintableString issuer() {
+               long ret = bindings.InvoiceRequest_issuer(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PrintableString ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PrintableString(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Paths to the recipient originating from publicly reachable nodes. Blinded paths provide
+        * recipient privacy by obfuscating its node id.
+        */
+       public BlindedPath[] paths() {
+               long ret = bindings.InvoiceRequest_paths(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_13_len = InternalUtils.getArrayLength(ret);
+               BlindedPath[] ret_conv_13_arr = new BlindedPath[ret_conv_13_len];
+               for (int n = 0; n < ret_conv_13_len; n++) {
+                       long ret_conv_13 = InternalUtils.getU64ArrayElem(ret, n);
+                       org.ldk.structs.BlindedPath ret_conv_13_hu_conv = null; if (ret_conv_13 < 0 || ret_conv_13 > 4096) { ret_conv_13_hu_conv = new org.ldk.structs.BlindedPath(null, ret_conv_13); }
+                       if (ret_conv_13_hu_conv != null) { ret_conv_13_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_13_arr[n] = ret_conv_13_hu_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_13_arr;
+       }
+
+       /**
+        * The quantity of items supported.
+        */
+       public Quantity supported_quantity() {
+               long ret = bindings.InvoiceRequest_supported_quantity(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Quantity ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Quantity(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The public key used by the recipient to sign invoices.
+        */
+       public byte[] signing_pubkey() {
+               long ret = bindings.InvoiceRequest_signing_pubkey(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
        /**
         * An unpredictable series of bytes, typically containing information about the derivation of
         * [`payer_id`].
         * 
         * [`payer_id`]: Self::payer_id
         */
-       public byte[] metadata() {
-               byte[] ret = bindings.InvoiceRequest_metadata(this.ptr);
+       public byte[] payer_metadata() {
+               long ret = bindings.InvoiceRequest_payer_metadata(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * A chain from [`Offer::chains`] that the offer is valid for.
         */
        public byte[] chain() {
-               byte[] ret = bindings.InvoiceRequest_chain(this.ptr);
+               long ret = bindings.InvoiceRequest_chain(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -78,8 +226,8 @@ public class InvoiceRequest : CommonBase {
        /**
         * Features pertaining to requesting an invoice.
         */
-       public InvoiceRequestFeatures features() {
-               long ret = bindings.InvoiceRequest_features(this.ptr);
+       public InvoiceRequestFeatures invoice_request_features() {
+               long ret = bindings.InvoiceRequest_invoice_request_features(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.InvoiceRequestFeatures ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.InvoiceRequestFeatures(null, ret); }
@@ -103,9 +251,11 @@ public class InvoiceRequest : CommonBase {
         * A possibly transient pubkey used to sign the invoice request.
         */
        public byte[] payer_id() {
-               byte[] ret = bindings.InvoiceRequest_payer_id(this.ptr);
+               long ret = bindings.InvoiceRequest_payer_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -124,19 +274,33 @@ public class InvoiceRequest : CommonBase {
        }
 
        /**
-        * Verifies that the request was for an offer created using the given key. Returns the derived
-        * keys need to sign an [`Bolt12Invoice`] for the request if they could be extracted from the
-        * metadata.
+        * Signature of the invoice request using [`payer_id`].
+        * 
+        * [`payer_id`]: Self::payer_id
+        */
+       public byte[] signature() {
+               long ret = bindings.InvoiceRequest_signature(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Verifies that the request was for an offer created using the given key. Returns the verified
+        * request which contains the derived keys needed to sign a [`Bolt12Invoice`] for the request
+        * if they could be extracted from the metadata.
         * 
         * [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
         */
-       public Result_COption_KeyPairZNoneZ verify(org.ldk.structs.ExpandedKey key) {
+       public Result_VerifiedInvoiceRequestNoneZ verify(org.ldk.structs.ExpandedKey key) {
                long ret = bindings.InvoiceRequest_verify(this.ptr, key == null ? 0 : key.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(key);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_COption_KeyPairZNoneZ ret_hu_conv = Result_COption_KeyPairZNoneZ.constr_from_ptr(ret);
+               Result_VerifiedInvoiceRequestNoneZ ret_hu_conv = Result_VerifiedInvoiceRequestNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(key); };
+               if (this != null) { this.ptrs_to.AddLast(this); };
                return ret_hu_conv;
        }
 
@@ -144,9 +308,11 @@ public class InvoiceRequest : CommonBase {
         * Serialize the InvoiceRequest object into a byte array which can be read by InvoiceRequest_read
         */
        public byte[] write() {
-               byte[] ret = bindings.InvoiceRequest_write(this.ptr);
+               long ret = bindings.InvoiceRequest_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index dfad8e8522c4399de65b69278eec4ebdccb7dcdc..fdbc49e7275209bdbbec39b283d47aa2b1159508 100644 (file)
@@ -82,6 +82,42 @@ public class InvoiceRequestFeatures : CommonBase {
                return ret;
        }
 
+       /**
+        * Sets a required feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Required bits are even. If an odd bit is given, then the corresponding even bit will
+        * be set instead (i.e., `bit - 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_required_feature_bit(long bit) {
+               long ret = bindings.InvoiceRequestFeatures_set_required_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Sets an optional feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Optional bits are odd. If an even bit is given, then the corresponding odd bit will be
+        * set instead (i.e., `bit + 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_optional_feature_bit(long bit) {
+               long ret = bindings.InvoiceRequestFeatures_set_optional_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
        /**
         * Sets a required custom feature bit. Errors if `bit` is outside the custom range as defined
         * by [bLIP 2] or if it is a known `T` feature.
diff --git a/c_sharp/src/org/ldk/structs/KVStore.cs b/c_sharp/src/org/ldk/structs/KVStore.cs
new file mode 100644 (file)
index 0000000..8e33e98
--- /dev/null
@@ -0,0 +1,226 @@
+
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+
+/** An implementation of KVStore */
+public interface KVStoreInterface {
+       /**Returns the data stored for the given `primary_namespace`, `secondary_namespace`, and
+        * `key`.
+        * 
+        * Returns an [`ErrorKind::NotFound`] if the given `key` could not be found in the given
+        * `primary_namespace` and `secondary_namespace`.
+        * 
+        * [`ErrorKind::NotFound`]: io::ErrorKind::NotFound
+        */
+       Result_CVec_u8ZIOErrorZ read(string primary_namespace, string secondary_namespace, string key);
+       /**Persists the given data under the given `key`.
+        * 
+        * Will create the given `primary_namespace` and `secondary_namespace` if not already present
+        * in the store.
+        */
+       Result_NoneIOErrorZ write(string primary_namespace, string secondary_namespace, string key, byte[] buf);
+       /**Removes any data that had previously been persisted under the given `key`.
+        * 
+        * If the `lazy` flag is set to `true`, the backend implementation might choose to lazily
+        * remove the given `key` at some point in time after the method returns, e.g., as part of an
+        * eventual batch deletion of multiple keys. As a consequence, subsequent calls to
+        * [`KVStore::list`] might include the removed key until the changes are actually persisted.
+        * 
+        * Note that while setting the `lazy` flag reduces the I/O burden of multiple subsequent
+        * `remove` calls, it also influences the atomicity guarantees as lazy `remove`s could
+        * potentially get lost on crash after the method returns. Therefore, this flag should only be
+        * set for `remove` operations that can be safely replayed at a later time.
+        * 
+        * Returns successfully if no data will be stored for the given `primary_namespace`,
+        * `secondary_namespace`, and `key`, independently of whether it was present before its
+        * invokation or not.
+        */
+       Result_NoneIOErrorZ remove(string primary_namespace, string secondary_namespace, string key, bool lazy);
+       /**Returns a list of keys that are stored under the given `secondary_namespace` in
+        * `primary_namespace`.
+        * 
+        * Returns the keys in arbitrary order, so users requiring a particular order need to sort the
+        * returned keys. Returns an empty list if `primary_namespace` or `secondary_namespace` is unknown.
+        */
+       Result_CVec_StrZIOErrorZ list(string primary_namespace, string secondary_namespace);
+}
+
+/**
+ * Provides an interface that allows storage and retrieval of persisted values that are associated
+ * with given keys.
+ * 
+ * In order to avoid collisions the key space is segmented based on the given `primary_namespace`s
+ * and `secondary_namespace`s. Implementations of this trait are free to handle them in different
+ * ways, as long as per-namespace key uniqueness is asserted.
+ * 
+ * Keys and namespaces are required to be valid ASCII strings in the range of
+ * [`KVSTORE_NAMESPACE_KEY_ALPHABET`] and no longer than [`KVSTORE_NAMESPACE_KEY_MAX_LEN`]. Empty
+ * primary namespaces and secondary namespaces (`\"\"`) are assumed to be a valid, however, if
+ * `primary_namespace` is empty, `secondary_namespace` is required to be empty, too. This means
+ * that concerns should always be separated by primary namespace first, before secondary
+ * namespaces are used. While the number of primary namespaces will be relatively small and is
+ * determined at compile time, there may be many secondary namespaces per primary namespace. Note
+ * that per-namespace uniqueness needs to also hold for keys *and* namespaces in any given
+ * namespace, i.e., conflicts between keys and equally named
+ * primary namespaces/secondary namespaces must be avoided.
+ * 
+ * Note:** Users migrating custom persistence backends from the pre-v0.0.117 `KVStorePersister`
+ * interface can use a concatenation of `[{primary_namespace}/[{secondary_namespace}/]]{key}` to
+ * recover a `key` compatible with the data model previously assumed by `KVStorePersister::persist`.
+ */
+public class KVStore : CommonBase {
+       internal bindings.LDKKVStore bindings_instance;
+       internal long instance_idx;
+
+       internal KVStore(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
+       ~KVStore() {
+               if (ptr != 0) { bindings.KVStore_free(ptr); }
+       }
+
+       private class LDKKVStoreHolder { internal KVStore held; }
+       private class LDKKVStoreImpl : bindings.LDKKVStore {
+               internal LDKKVStoreImpl(KVStoreInterface arg, LDKKVStoreHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
+               private KVStoreInterface arg;
+               private LDKKVStoreHolder impl_holder;
+               public long read(long _primary_namespace, long _secondary_namespace, long _key) {
+                       string _primary_namespace_conv = InternalUtils.decodeString(_primary_namespace);
+                       string _secondary_namespace_conv = InternalUtils.decodeString(_secondary_namespace);
+                       string _key_conv = InternalUtils.decodeString(_key);
+                       Result_CVec_u8ZIOErrorZ ret = arg.read(_primary_namespace_conv, _secondary_namespace_conv, _key_conv);
+                               GC.KeepAlive(arg);
+                       long result = ret == null ? 0 : ret.clone_ptr();
+                       return result;
+               }
+               public long write(long _primary_namespace, long _secondary_namespace, long _key, long _buf) {
+                       string _primary_namespace_conv = InternalUtils.decodeString(_primary_namespace);
+                       string _secondary_namespace_conv = InternalUtils.decodeString(_secondary_namespace);
+                       string _key_conv = InternalUtils.decodeString(_key);
+                       byte[] _buf_conv = InternalUtils.decodeUint8Array(_buf);
+                       Result_NoneIOErrorZ ret = arg.write(_primary_namespace_conv, _secondary_namespace_conv, _key_conv, _buf_conv);
+                               GC.KeepAlive(arg);
+                       long result = ret == null ? 0 : ret.clone_ptr();
+                       return result;
+               }
+               public long remove(long _primary_namespace, long _secondary_namespace, long _key, bool _lazy) {
+                       string _primary_namespace_conv = InternalUtils.decodeString(_primary_namespace);
+                       string _secondary_namespace_conv = InternalUtils.decodeString(_secondary_namespace);
+                       string _key_conv = InternalUtils.decodeString(_key);
+                       Result_NoneIOErrorZ ret = arg.remove(_primary_namespace_conv, _secondary_namespace_conv, _key_conv, _lazy);
+                               GC.KeepAlive(arg);
+                       long result = ret == null ? 0 : ret.clone_ptr();
+                       return result;
+               }
+               public long list(long _primary_namespace, long _secondary_namespace) {
+                       string _primary_namespace_conv = InternalUtils.decodeString(_primary_namespace);
+                       string _secondary_namespace_conv = InternalUtils.decodeString(_secondary_namespace);
+                       Result_CVec_StrZIOErrorZ ret = arg.list(_primary_namespace_conv, _secondary_namespace_conv);
+                               GC.KeepAlive(arg);
+                       long result = ret == null ? 0 : ret.clone_ptr();
+                       return result;
+               }
+       }
+
+       /** Creates a new instance of KVStore from a given implementation */
+       public static KVStore new_impl(KVStoreInterface arg) {
+               LDKKVStoreHolder impl_holder = new LDKKVStoreHolder();
+               LDKKVStoreImpl impl = new LDKKVStoreImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKKVStore_new(impl);
+
+               impl_holder.held = new KVStore(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
+               return impl_holder.held;
+       }
+
+       /**
+        * Returns the data stored for the given `primary_namespace`, `secondary_namespace`, and
+        * `key`.
+        * 
+        * Returns an [`ErrorKind::NotFound`] if the given `key` could not be found in the given
+        * `primary_namespace` and `secondary_namespace`.
+        * 
+        * [`ErrorKind::NotFound`]: io::ErrorKind::NotFound
+        */
+       public Result_CVec_u8ZIOErrorZ read(string primary_namespace, string secondary_namespace, string key) {
+               long ret = bindings.KVStore_read(this.ptr, InternalUtils.encodeString(primary_namespace), InternalUtils.encodeString(secondary_namespace), InternalUtils.encodeString(key));
+               GC.KeepAlive(this);
+               GC.KeepAlive(primary_namespace);
+               GC.KeepAlive(secondary_namespace);
+               GC.KeepAlive(key);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_u8ZIOErrorZ ret_hu_conv = Result_CVec_u8ZIOErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Persists the given data under the given `key`.
+        * 
+        * Will create the given `primary_namespace` and `secondary_namespace` if not already present
+        * in the store.
+        */
+       public Result_NoneIOErrorZ write(string primary_namespace, string secondary_namespace, string key, byte[] buf) {
+               long ret = bindings.KVStore_write(this.ptr, InternalUtils.encodeString(primary_namespace), InternalUtils.encodeString(secondary_namespace), InternalUtils.encodeString(key), InternalUtils.encodeUint8Array(buf));
+               GC.KeepAlive(this);
+               GC.KeepAlive(primary_namespace);
+               GC.KeepAlive(secondary_namespace);
+               GC.KeepAlive(key);
+               GC.KeepAlive(buf);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneIOErrorZ ret_hu_conv = Result_NoneIOErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Removes any data that had previously been persisted under the given `key`.
+        * 
+        * If the `lazy` flag is set to `true`, the backend implementation might choose to lazily
+        * remove the given `key` at some point in time after the method returns, e.g., as part of an
+        * eventual batch deletion of multiple keys. As a consequence, subsequent calls to
+        * [`KVStore::list`] might include the removed key until the changes are actually persisted.
+        * 
+        * Note that while setting the `lazy` flag reduces the I/O burden of multiple subsequent
+        * `remove` calls, it also influences the atomicity guarantees as lazy `remove`s could
+        * potentially get lost on crash after the method returns. Therefore, this flag should only be
+        * set for `remove` operations that can be safely replayed at a later time.
+        * 
+        * Returns successfully if no data will be stored for the given `primary_namespace`,
+        * `secondary_namespace`, and `key`, independently of whether it was present before its
+        * invokation or not.
+        */
+       public Result_NoneIOErrorZ remove(string primary_namespace, string secondary_namespace, string key, bool lazy) {
+               long ret = bindings.KVStore_remove(this.ptr, InternalUtils.encodeString(primary_namespace), InternalUtils.encodeString(secondary_namespace), InternalUtils.encodeString(key), lazy);
+               GC.KeepAlive(this);
+               GC.KeepAlive(primary_namespace);
+               GC.KeepAlive(secondary_namespace);
+               GC.KeepAlive(key);
+               GC.KeepAlive(lazy);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneIOErrorZ ret_hu_conv = Result_NoneIOErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Returns a list of keys that are stored under the given `secondary_namespace` in
+        * `primary_namespace`.
+        * 
+        * Returns the keys in arbitrary order, so users requiring a particular order need to sort the
+        * returned keys. Returns an empty list if `primary_namespace` or `secondary_namespace` is unknown.
+        */
+       public Result_CVec_StrZIOErrorZ list(string primary_namespace, string secondary_namespace) {
+               long ret = bindings.KVStore_list(this.ptr, InternalUtils.encodeString(primary_namespace), InternalUtils.encodeString(secondary_namespace));
+               GC.KeepAlive(this);
+               GC.KeepAlive(primary_namespace);
+               GC.KeepAlive(secondary_namespace);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_StrZIOErrorZ ret_hu_conv = Result_CVec_StrZIOErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 1edacca57906952c8257693e53976e2be6cac1d0..1b7802854c8c68d8bfa0cfe44bc1f4b087c2579f 100644 (file)
@@ -47,7 +47,7 @@ public class KeysManager : CommonBase {
         * [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor
         */
        public static KeysManager of(byte[] seed, long starting_time_secs, int starting_time_nanos) {
-               long ret = bindings.KeysManager_new(InternalUtils.check_arr_len(seed, 32), starting_time_secs, starting_time_nanos);
+               long ret = bindings.KeysManager_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(seed, 32)), starting_time_secs, starting_time_nanos);
                GC.KeepAlive(seed);
                GC.KeepAlive(starting_time_secs);
                GC.KeepAlive(starting_time_nanos);
@@ -61,16 +61,18 @@ public class KeysManager : CommonBase {
         * Gets the \"node_id\" secret key used to sign gossip announcements, decode onion data, etc.
         */
        public byte[] get_node_secret_key() {
-               byte[] ret = bindings.KeysManager_get_node_secret_key(this.ptr);
+               long ret = bindings.KeysManager_get_node_secret_key(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Derive an old [`WriteableEcdsaChannelSigner`] containing per-channel secrets based on a key derivation parameters.
         */
        public InMemorySigner derive_channel_keys(long channel_value_satoshis, byte[] _params) {
-               long ret = bindings.KeysManager_derive_channel_keys(this.ptr, channel_value_satoshis, InternalUtils.check_arr_len(_params, 32));
+               long ret = bindings.KeysManager_derive_channel_keys(this.ptr, channel_value_satoshis, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(_params, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(channel_value_satoshis);
                GC.KeepAlive(_params);
@@ -90,13 +92,13 @@ public class KeysManager : CommonBase {
         * May panic if the [`SpendableOutputDescriptor`]s were not generated by channels which used
         * this [`KeysManager`] or one of the [`InMemorySigner`] created by this [`KeysManager`].
         */
-       public Result_PartiallySignedTransactionNoneZ sign_spendable_outputs_psbt(SpendableOutputDescriptor[] descriptors, byte[] psbt) {
-               long ret = bindings.KeysManager_sign_spendable_outputs_psbt(this.ptr, descriptors != null ? InternalUtils.mapArray(descriptors, descriptors_conv_27 => descriptors_conv_27.ptr) : null, psbt);
+       public Result_CVec_u8ZNoneZ sign_spendable_outputs_psbt(SpendableOutputDescriptor[] descriptors, byte[] psbt) {
+               long ret = bindings.KeysManager_sign_spendable_outputs_psbt(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(descriptors, descriptors_conv_27 => descriptors_conv_27.ptr)), InternalUtils.encodeUint8Array(psbt));
                GC.KeepAlive(this);
                GC.KeepAlive(descriptors);
                GC.KeepAlive(psbt);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PartiallySignedTransactionNoneZ ret_hu_conv = Result_PartiallySignedTransactionNoneZ.constr_from_ptr(ret);
+               Result_CVec_u8ZNoneZ ret_hu_conv = Result_CVec_u8ZNoneZ.constr_from_ptr(ret);
                foreach (SpendableOutputDescriptor descriptors_conv_27 in descriptors) { if (this != null) { this.ptrs_to.AddLast(descriptors_conv_27); }; };
                return ret_hu_conv;
        }
@@ -120,8 +122,8 @@ public class KeysManager : CommonBase {
         * May panic if the [`SpendableOutputDescriptor`]s were not generated by channels which used
         * this [`KeysManager`] or one of the [`InMemorySigner`] created by this [`KeysManager`].
         */
-       public Result_TransactionNoneZ spend_spendable_outputs(SpendableOutputDescriptor[] descriptors, TxOut[] outputs, byte[] change_destination_script, int feerate_sat_per_1000_weight, org.ldk.structs.Option_PackedLockTimeZ locktime) {
-               long ret = bindings.KeysManager_spend_spendable_outputs(this.ptr, descriptors != null ? InternalUtils.mapArray(descriptors, descriptors_conv_27 => descriptors_conv_27.ptr) : null, outputs != null ? InternalUtils.mapArray(outputs, outputs_conv_7 => outputs_conv_7.ptr) : null, change_destination_script, feerate_sat_per_1000_weight, locktime.ptr);
+       public Result_TransactionNoneZ spend_spendable_outputs(SpendableOutputDescriptor[] descriptors, TxOut[] outputs, byte[] change_destination_script, int feerate_sat_per_1000_weight, org.ldk.structs.Option_u32Z locktime) {
+               long ret = bindings.KeysManager_spend_spendable_outputs(this.ptr, 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(this);
                GC.KeepAlive(descriptors);
                GC.KeepAlive(outputs);
index da6206ed26fc5aabeb5e02124e71cb0f7a30d2db..b06f312fb2f5f54df268f4f06f8fd431eb7f90ce 100644 (file)
@@ -19,16 +19,18 @@ public class LightningError : CommonBase {
         * A human-readable message describing the error
         */
        public string get_err() {
-               string ret = bindings.LightningError_get_err(this.ptr);
+               long ret = bindings.LightningError_get_err(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
        }
 
        /**
         * A human-readable message describing the error
         */
        public void set_err(string val) {
-               bindings.LightningError_set_err(this.ptr, val);
+               bindings.LightningError_set_err(this.ptr, InternalUtils.encodeString(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -59,7 +61,7 @@ public class LightningError : CommonBase {
         * Constructs a new LightningError given each field
         */
        public static LightningError of(string err_arg, org.ldk.structs.ErrorAction action_arg) {
-               long ret = bindings.LightningError_new(err_arg, action_arg.ptr);
+               long ret = bindings.LightningError_new(InternalUtils.encodeString(err_arg), action_arg.ptr);
                GC.KeepAlive(err_arg);
                GC.KeepAlive(action_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
index 44a2652279c2c227f8d56b8dcc256f43be3a8641..fa31f7146fb3764782bffb6f0b712f5b09390aeb 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,6 +6,22 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of Listen */
+public interface ListenInterface {
+       /**Notifies the listener that a block was added at the given height, with the transaction data
+        * possibly filtered.
+        */
+       void filtered_block_connected(byte[] header, TwoTuple_usizeTransactionZ[] txdata, int height);
+       /**Notifies the listener that a block was added at the given height.
+        */
+       void block_connected(byte[] block, int height);
+       /**Notifies the listener that a block was removed at the given height.
+        */
+       void block_disconnected(byte[] header, int height);
+}
+
 /**
  * The `Listen` trait is used to notify when blocks have been connected or disconnected from the
  * chain.
@@ -19,68 +36,63 @@ namespace org { namespace ldk { namespace structs {
  * other similar filtering.
  */
 public class Listen : CommonBase {
-       internal readonly bindings.LDKListen bindings_instance;
+       internal bindings.LDKListen bindings_instance;
+       internal long instance_idx;
+
        internal Listen(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private Listen(bindings.LDKListen arg) : base(bindings.LDKListen_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~Listen() {
                if (ptr != 0) { bindings.Listen_free(ptr); }
        }
 
-       public interface ListenInterface {
-               /**
-                * Notifies the listener that a block was added at the given height, with the transaction data
-                * possibly filtered.
-                */
-               void filtered_block_connected(byte[] _header, TwoTuple_usizeTransactionZ[] _txdata, int _height);
-               /**
-                * Notifies the listener that a block was added at the given height.
-                */
-               void block_connected(byte[] _block, int _height);
-               /**
-                * Notifies the listener that a block was removed at the given height.
-                */
-               void block_disconnected(byte[] _header, int _height);
-       }
        private class LDKListenHolder { internal Listen held; }
        private class LDKListenImpl : bindings.LDKListen {
                internal LDKListenImpl(ListenInterface arg, LDKListenHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private ListenInterface arg;
                private LDKListenHolder impl_holder;
-               public void filtered_block_connected(byte[] _header, long[] _txdata, int _height) {
-                       int _txdata_conv_28_len = _txdata.Length;
+               public void filtered_block_connected(long _header, long _txdata, int _height) {
+                       byte[] _header_conv = InternalUtils.decodeUint8Array(_header);
+                       int _txdata_conv_28_len = InternalUtils.getArrayLength(_txdata);
                        TwoTuple_usizeTransactionZ[] _txdata_conv_28_arr = new TwoTuple_usizeTransactionZ[_txdata_conv_28_len];
                        for (int c = 0; c < _txdata_conv_28_len; c++) {
-                               long _txdata_conv_28 = _txdata[c];
+                               long _txdata_conv_28 = InternalUtils.getU64ArrayElem(_txdata, c);
                                TwoTuple_usizeTransactionZ _txdata_conv_28_hu_conv = new TwoTuple_usizeTransactionZ(null, _txdata_conv_28);
                                if (_txdata_conv_28_hu_conv != null) { _txdata_conv_28_hu_conv.ptrs_to.AddLast(this); };
                                _txdata_conv_28_arr[c] = _txdata_conv_28_hu_conv;
                        }
-                       arg.filtered_block_connected(_header, _txdata_conv_28_arr, _height);
+                       bindings.free_buffer(_txdata);
+                       arg.filtered_block_connected(_header_conv, _txdata_conv_28_arr, _height);
                                GC.KeepAlive(arg);
                }
-               public void block_connected(byte[] _block, int _height) {
-                       arg.block_connected(_block, _height);
+               public void block_connected(long _block, int _height) {
+                       byte[] _block_conv = InternalUtils.decodeUint8Array(_block);
+                       arg.block_connected(_block_conv, _height);
                                GC.KeepAlive(arg);
                }
-               public void block_disconnected(byte[] _header, int _height) {
-                       arg.block_disconnected(_header, _height);
+               public void block_disconnected(long _header, int _height) {
+                       byte[] _header_conv = InternalUtils.decodeUint8Array(_header);
+                       arg.block_disconnected(_header_conv, _height);
                                GC.KeepAlive(arg);
                }
        }
+
+       /** Creates a new instance of Listen from a given implementation */
        public static Listen new_impl(ListenInterface arg) {
                LDKListenHolder impl_holder = new LDKListenHolder();
-               impl_holder.held = new Listen(new LDKListenImpl(arg, impl_holder));
+               LDKListenImpl impl = new LDKListenImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKListen_new(impl);
+
+               impl_holder.held = new Listen(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Notifies the listener that a block was added at the given height, with the transaction data
         * possibly filtered.
         */
        public void filtered_block_connected(byte[] header, TwoTuple_usizeTransactionZ[] txdata, int height) {
-               bindings.Listen_filtered_block_connected(this.ptr, InternalUtils.check_arr_len(header, 80), txdata != null ? InternalUtils.mapArray(txdata, txdata_conv_28 => txdata_conv_28 != null ? txdata_conv_28.ptr : 0) : null, height);
+               bindings.Listen_filtered_block_connected(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(header, 80)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(txdata, txdata_conv_28 => txdata_conv_28 != null ? txdata_conv_28.ptr : 0)), height);
                GC.KeepAlive(this);
                GC.KeepAlive(header);
                GC.KeepAlive(txdata);
@@ -91,7 +103,7 @@ public class Listen : CommonBase {
         * Notifies the listener that a block was added at the given height.
         */
        public void block_connected(byte[] block, int height) {
-               bindings.Listen_block_connected(this.ptr, block, height);
+               bindings.Listen_block_connected(this.ptr, InternalUtils.encodeUint8Array(block), height);
                GC.KeepAlive(this);
                GC.KeepAlive(block);
                GC.KeepAlive(height);
@@ -101,7 +113,7 @@ public class Listen : CommonBase {
         * Notifies the listener that a block was removed at the given height.
         */
        public void block_disconnected(byte[] header, int height) {
-               bindings.Listen_block_disconnected(this.ptr, InternalUtils.check_arr_len(header, 80), height);
+               bindings.Listen_block_disconnected(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(header, 80)), height);
                GC.KeepAlive(this);
                GC.KeepAlive(header);
                GC.KeepAlive(height);
index 5a499b3ccd88bbba1728570febef873b48ceabdf..8b1abf3a2285f89f9a88bf16b28c305bd98a3528 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,59 +6,90 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of LockableScore */
+public interface LockableScoreInterface {
+       /**Returns read locked scorer.
+        */
+       ScoreLookUp read_lock();
+       /**Returns write locked scorer.
+        */
+       ScoreUpdate write_lock();
+}
+
 /**
  * A scorer that is accessed under a lock.
  * 
- * Needed so that calls to [`Score::channel_penalty_msat`] in [`find_route`] can be made while
- * having shared ownership of a scorer but without requiring internal locking in [`Score`]
+ * Needed so that calls to [`ScoreLookUp::channel_penalty_msat`] in [`find_route`] can be made while
+ * having shared ownership of a scorer but without requiring internal locking in [`ScoreUpdate`]
  * implementations. Internal locking would be detrimental to route finding performance and could
- * result in [`Score::channel_penalty_msat`] returning a different value for the same channel.
+ * result in [`ScoreLookUp::channel_penalty_msat`] returning a different value for the same channel.
  * 
  * [`find_route`]: crate::routing::router::find_route
  */
 public class LockableScore : CommonBase {
-       internal readonly bindings.LDKLockableScore bindings_instance;
+       internal bindings.LDKLockableScore bindings_instance;
+       internal long instance_idx;
+
        internal LockableScore(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private LockableScore(bindings.LDKLockableScore arg) : base(bindings.LDKLockableScore_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~LockableScore() {
                if (ptr != 0) { bindings.LockableScore_free(ptr); }
        }
 
-       public interface LockableScoreInterface {
-               /**
-                * Returns the locked scorer.
-                */
-               Score do_lock();
-       }
        private class LDKLockableScoreHolder { internal LockableScore held; }
        private class LDKLockableScoreImpl : bindings.LDKLockableScore {
                internal LDKLockableScoreImpl(LockableScoreInterface arg, LDKLockableScoreHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private LockableScoreInterface arg;
                private LDKLockableScoreHolder impl_holder;
-               public long do_lock() {
-                       Score ret = arg.do_lock();
+               public long read_lock() {
+                       ScoreLookUp ret = arg.read_lock();
+                               GC.KeepAlive(arg);
+                       long result = ret.ptr;
+                       if (impl_holder.held != null) { impl_holder.held.ptrs_to.AddLast(ret); };
+                       return result;
+               }
+               public long write_lock() {
+                       ScoreUpdate ret = arg.write_lock();
                                GC.KeepAlive(arg);
                        long result = ret.ptr;
                        if (impl_holder.held != null) { impl_holder.held.ptrs_to.AddLast(ret); };
                        return result;
                }
        }
+
+       /** Creates a new instance of LockableScore from a given implementation */
        public static LockableScore new_impl(LockableScoreInterface arg) {
                LDKLockableScoreHolder impl_holder = new LDKLockableScoreHolder();
-               impl_holder.held = new LockableScore(new LDKLockableScoreImpl(arg, impl_holder));
+               LDKLockableScoreImpl impl = new LDKLockableScoreImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKLockableScore_new(impl);
+
+               impl_holder.held = new LockableScore(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
+       /**
+        * Returns read locked scorer.
+        */
+       public ScoreLookUp read_lock() {
+               long ret = bindings.LockableScore_read_lock(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               ScoreLookUp ret_hu_conv = new ScoreLookUp(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
        /**
-        * Returns the locked scorer.
+        * Returns write locked scorer.
         */
-       public Score do_lock() {
-               long ret = bindings.LockableScore_lock(this.ptr);
+       public ScoreUpdate write_lock() {
+               long ret = bindings.LockableScore_write_lock(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Score ret_hu_conv = new Score(null, ret);
+               ScoreUpdate ret_hu_conv = new ScoreUpdate(null, ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
                return ret_hu_conv;
        }
index 8c1dd74176d6f4504124496d8e088e680dc5912f..309fa883f852fc295062db6397491dba5f24a4c8 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,26 +6,27 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of Logger */
+public interface LoggerInterface {
+       /**Logs the `Record`
+        */
+       void log(Record record);
+}
+
 /**
  * A trait encapsulating the operations required of a logger
  */
 public class Logger : CommonBase {
-       internal readonly bindings.LDKLogger bindings_instance;
+       internal bindings.LDKLogger bindings_instance;
+       internal long instance_idx;
+
        internal Logger(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private Logger(bindings.LDKLogger arg) : base(bindings.LDKLogger_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~Logger() {
                if (ptr != 0) { bindings.Logger_free(ptr); }
        }
 
-       public interface LoggerInterface {
-               /**
-                * Logs the `Record`
-                */
-               void log(Record _record);
-       }
        private class LDKLoggerHolder { internal Logger held; }
        private class LDKLoggerImpl : bindings.LDKLogger {
                internal LDKLoggerImpl(LoggerInterface arg, LDKLoggerHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
@@ -36,10 +38,18 @@ public class Logger : CommonBase {
                                GC.KeepAlive(arg);
                }
        }
+
+       /** Creates a new instance of Logger from a given implementation */
        public static Logger new_impl(LoggerInterface arg) {
                LDKLoggerHolder impl_holder = new LDKLoggerHolder();
-               impl_holder.held = new Logger(new LDKLoggerImpl(arg, impl_holder));
+               LDKLoggerImpl impl = new LDKLoggerImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKLogger_new(impl);
+
+               impl_holder.held = new Logger(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
 }
 } } }
index 93491a4efc984889880356086deb2e7c1897ce5c..3cc67b3107010e53407606be5a25aafc4032754a 100644 (file)
@@ -100,16 +100,18 @@ public class MaxDustHTLCExposure : CommonBase {
         * Serialize the MaxDustHTLCExposure object into a byte array which can be read by MaxDustHTLCExposure_read
         */
        public byte[] write() {
-               byte[] ret = bindings.MaxDustHTLCExposure_write(this.ptr);
+               long ret = bindings.MaxDustHTLCExposure_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a MaxDustHTLCExposure from a byte array, created by MaxDustHTLCExposure_write
         */
        public static Result_MaxDustHTLCExposureDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.MaxDustHTLCExposure_read(ser);
+               long ret = bindings.MaxDustHTLCExposure_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_MaxDustHTLCExposureDecodeErrorZ ret_hu_conv = Result_MaxDustHTLCExposureDecodeErrorZ.constr_from_ptr(ret);
index c70ec240483b91fec5f30b30eb10d1a75b43e093..c2b1fb974eaa1474b48bd2114c4ed07905518d7b 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,56 +6,68 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of MessageRouter */
+public interface MessageRouterInterface {
+       /**Returns a route for sending an [`OnionMessage`] to the given [`Destination`].
+        */
+       Result_OnionMessagePathNoneZ find_path(byte[] sender, byte[][] peers, Destination destination);
+}
+
 /**
  * A trait defining behavior for routing an [`OnionMessage`].
- * 
- * [`OnionMessage`]: msgs::OnionMessage
  */
 public class MessageRouter : CommonBase {
-       internal readonly bindings.LDKMessageRouter bindings_instance;
+       internal bindings.LDKMessageRouter bindings_instance;
+       internal long instance_idx;
+
        internal MessageRouter(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private MessageRouter(bindings.LDKMessageRouter arg) : base(bindings.LDKMessageRouter_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~MessageRouter() {
                if (ptr != 0) { bindings.MessageRouter_free(ptr); }
        }
 
-       public interface MessageRouterInterface {
-               /**
-                * Returns a route for sending an [`OnionMessage`] to the given [`Destination`].
-                * 
-                * [`OnionMessage`]: msgs::OnionMessage
-                */
-               Result_OnionMessagePathNoneZ find_path(byte[] _sender, byte[][] _peers, Destination _destination);
-       }
        private class LDKMessageRouterHolder { internal MessageRouter held; }
        private class LDKMessageRouterImpl : bindings.LDKMessageRouter {
                internal LDKMessageRouterImpl(MessageRouterInterface arg, LDKMessageRouterHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private MessageRouterInterface arg;
                private LDKMessageRouterHolder impl_holder;
-               public long find_path(byte[] _sender, byte[][] _peers, long _destination) {
+               public long find_path(long _sender, long _peers, long _destination) {
+                       byte[] _sender_conv = InternalUtils.decodeUint8Array(_sender);
+                       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);
                        org.ldk.structs.Destination _destination_hu_conv = org.ldk.structs.Destination.constr_from_ptr(_destination);
                        if (_destination_hu_conv != null) { _destination_hu_conv.ptrs_to.AddLast(this); };
-                       Result_OnionMessagePathNoneZ ret = arg.find_path(_sender, _peers, _destination_hu_conv);
+                       Result_OnionMessagePathNoneZ ret = arg.find_path(_sender_conv, _peers_conv_8_arr, _destination_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
        }
+
+       /** Creates a new instance of MessageRouter from a given implementation */
        public static MessageRouter new_impl(MessageRouterInterface arg) {
                LDKMessageRouterHolder impl_holder = new LDKMessageRouterHolder();
-               impl_holder.held = new MessageRouter(new LDKMessageRouterImpl(arg, impl_holder));
+               LDKMessageRouterImpl impl = new LDKMessageRouterImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKMessageRouter_new(impl);
+
+               impl_holder.held = new MessageRouter(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Returns a route for sending an [`OnionMessage`] to the given [`Destination`].
-        * 
-        * [`OnionMessage`]: msgs::OnionMessage
         */
        public Result_OnionMessagePathNoneZ find_path(byte[] sender, byte[][] peers, org.ldk.structs.Destination destination) {
-               long ret = bindings.MessageRouter_find_path(this.ptr, InternalUtils.check_arr_len(sender, 33), peers != null ? InternalUtils.mapArray(peers, peers_conv_8 => InternalUtils.check_arr_len(peers_conv_8, 33)) : null, destination.ptr);
+               long ret = bindings.MessageRouter_find_path(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(sender, 33)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(peers, peers_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(peers_conv_8, 33)))), destination.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(sender);
                GC.KeepAlive(peers);
index 233e8a1cd9b4d486a1b9f3fbe41ccd5df5a19f87..04f383068f3ffb4d493bdd04178671d867ad77f1 100644 (file)
@@ -67,7 +67,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public AcceptChannel msg;
                internal MessageSendEvent_SendAcceptChannel(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendAcceptChannel_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendAcceptChannel_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendAcceptChannel_get_msg(ptr);
                        org.ldk.structs.AcceptChannel msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.AcceptChannel(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -85,7 +87,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public AcceptChannelV2 msg;
                internal MessageSendEvent_SendAcceptChannelV2(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendAcceptChannelV2_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendAcceptChannelV2_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendAcceptChannelV2_get_msg(ptr);
                        org.ldk.structs.AcceptChannelV2 msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.AcceptChannelV2(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -103,7 +107,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public OpenChannel msg;
                internal MessageSendEvent_SendOpenChannel(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendOpenChannel_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendOpenChannel_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendOpenChannel_get_msg(ptr);
                        org.ldk.structs.OpenChannel msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.OpenChannel(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -121,7 +127,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public OpenChannelV2 msg;
                internal MessageSendEvent_SendOpenChannelV2(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendOpenChannelV2_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendOpenChannelV2_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendOpenChannelV2_get_msg(ptr);
                        org.ldk.structs.OpenChannelV2 msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.OpenChannelV2(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -139,7 +147,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public FundingCreated msg;
                internal MessageSendEvent_SendFundingCreated(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendFundingCreated_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendFundingCreated_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendFundingCreated_get_msg(ptr);
                        org.ldk.structs.FundingCreated msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.FundingCreated(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -157,7 +167,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public FundingSigned msg;
                internal MessageSendEvent_SendFundingSigned(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendFundingSigned_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendFundingSigned_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendFundingSigned_get_msg(ptr);
                        org.ldk.structs.FundingSigned msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.FundingSigned(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -175,7 +187,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public TxAddInput msg;
                internal MessageSendEvent_SendTxAddInput(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendTxAddInput_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendTxAddInput_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendTxAddInput_get_msg(ptr);
                        org.ldk.structs.TxAddInput msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.TxAddInput(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -193,7 +207,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public TxAddOutput msg;
                internal MessageSendEvent_SendTxAddOutput(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendTxAddOutput_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendTxAddOutput_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendTxAddOutput_get_msg(ptr);
                        org.ldk.structs.TxAddOutput msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.TxAddOutput(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -211,7 +227,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public TxRemoveInput msg;
                internal MessageSendEvent_SendTxRemoveInput(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendTxRemoveInput_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendTxRemoveInput_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendTxRemoveInput_get_msg(ptr);
                        org.ldk.structs.TxRemoveInput msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.TxRemoveInput(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -229,7 +247,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public TxRemoveOutput msg;
                internal MessageSendEvent_SendTxRemoveOutput(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendTxRemoveOutput_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendTxRemoveOutput_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendTxRemoveOutput_get_msg(ptr);
                        org.ldk.structs.TxRemoveOutput msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.TxRemoveOutput(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -247,7 +267,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public TxComplete msg;
                internal MessageSendEvent_SendTxComplete(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendTxComplete_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendTxComplete_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendTxComplete_get_msg(ptr);
                        org.ldk.structs.TxComplete msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.TxComplete(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -265,7 +287,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public TxSignatures msg;
                internal MessageSendEvent_SendTxSignatures(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendTxSignatures_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendTxSignatures_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendTxSignatures_get_msg(ptr);
                        org.ldk.structs.TxSignatures msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.TxSignatures(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -283,7 +307,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public TxInitRbf msg;
                internal MessageSendEvent_SendTxInitRbf(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendTxInitRbf_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendTxInitRbf_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendTxInitRbf_get_msg(ptr);
                        org.ldk.structs.TxInitRbf msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.TxInitRbf(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -301,7 +327,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public TxAckRbf msg;
                internal MessageSendEvent_SendTxAckRbf(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendTxAckRbf_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendTxAckRbf_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendTxAckRbf_get_msg(ptr);
                        org.ldk.structs.TxAckRbf msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.TxAckRbf(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -317,11 +345,13 @@ public class MessageSendEvent : CommonBase {
                /**
                 * The message which should be sent.
                 */
-               public TxAddInput msg;
+               public TxAbort msg;
                internal MessageSendEvent_SendTxAbort(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendTxAbort_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendTxAbort_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendTxAbort_get_msg(ptr);
-                       org.ldk.structs.TxAddInput msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.TxAddInput(null, msg); }
+                       org.ldk.structs.TxAbort msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.TxAbort(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
                        this.msg = msg_hu_conv;
                }
@@ -337,7 +367,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public ChannelReady msg;
                internal MessageSendEvent_SendChannelReady(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendChannelReady_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendChannelReady_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendChannelReady_get_msg(ptr);
                        org.ldk.structs.ChannelReady msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.ChannelReady(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -355,7 +387,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public AnnouncementSignatures msg;
                internal MessageSendEvent_SendAnnouncementSignatures(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendAnnouncementSignatures_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendAnnouncementSignatures_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendAnnouncementSignatures_get_msg(ptr);
                        org.ldk.structs.AnnouncementSignatures msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.AnnouncementSignatures(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -373,7 +407,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public CommitmentUpdate updates;
                internal MessageSendEvent_UpdateHTLCs(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_UpdateHTLCs_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_UpdateHTLCs_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long updates = bindings.LDKMessageSendEvent_UpdateHTLCs_get_updates(ptr);
                        org.ldk.structs.CommitmentUpdate updates_hu_conv = null; if (updates < 0 || updates > 4096) { updates_hu_conv = new org.ldk.structs.CommitmentUpdate(null, updates); }
                        if (updates_hu_conv != null) { updates_hu_conv.ptrs_to.AddLast(this); };
@@ -391,7 +427,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public RevokeAndACK msg;
                internal MessageSendEvent_SendRevokeAndACK(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendRevokeAndACK_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendRevokeAndACK_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendRevokeAndACK_get_msg(ptr);
                        org.ldk.structs.RevokeAndACK msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.RevokeAndACK(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -409,7 +447,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public ClosingSigned msg;
                internal MessageSendEvent_SendClosingSigned(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendClosingSigned_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendClosingSigned_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendClosingSigned_get_msg(ptr);
                        org.ldk.structs.ClosingSigned msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.ClosingSigned(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -427,7 +467,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public Shutdown msg;
                internal MessageSendEvent_SendShutdown(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendShutdown_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendShutdown_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendShutdown_get_msg(ptr);
                        org.ldk.structs.Shutdown msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.Shutdown(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -445,7 +487,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public ChannelReestablish msg;
                internal MessageSendEvent_SendChannelReestablish(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendChannelReestablish_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendChannelReestablish_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendChannelReestablish_get_msg(ptr);
                        org.ldk.structs.ChannelReestablish msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.ChannelReestablish(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -467,7 +511,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public ChannelUpdate update_msg;
                internal MessageSendEvent_SendChannelAnnouncement(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendChannelAnnouncement_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendChannelAnnouncement_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendChannelAnnouncement_get_msg(ptr);
                        org.ldk.structs.ChannelAnnouncement msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.ChannelAnnouncement(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -538,7 +584,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public ChannelUpdate msg;
                internal MessageSendEvent_SendChannelUpdate(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendChannelUpdate_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendChannelUpdate_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendChannelUpdate_get_msg(ptr);
                        org.ldk.structs.ChannelUpdate msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.ChannelUpdate(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -556,7 +604,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public ErrorAction action;
                internal MessageSendEvent_HandleError(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_HandleError_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_HandleError_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long action = bindings.LDKMessageSendEvent_HandleError_get_action(ptr);
                        org.ldk.structs.ErrorAction action_hu_conv = org.ldk.structs.ErrorAction.constr_from_ptr(action);
                        if (action_hu_conv != null) { action_hu_conv.ptrs_to.AddLast(this); };
@@ -574,7 +624,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public QueryChannelRange msg;
                internal MessageSendEvent_SendChannelRangeQuery(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendChannelRangeQuery_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendChannelRangeQuery_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendChannelRangeQuery_get_msg(ptr);
                        org.ldk.structs.QueryChannelRange msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.QueryChannelRange(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -592,7 +644,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public QueryShortChannelIds msg;
                internal MessageSendEvent_SendShortIdsQuery(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendShortIdsQuery_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendShortIdsQuery_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendShortIdsQuery_get_msg(ptr);
                        org.ldk.structs.QueryShortChannelIds msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.QueryShortChannelIds(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -610,7 +664,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public ReplyChannelRange msg;
                internal MessageSendEvent_SendReplyChannelRange(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendReplyChannelRange_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendReplyChannelRange_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendReplyChannelRange_get_msg(ptr);
                        org.ldk.structs.ReplyChannelRange msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.ReplyChannelRange(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -628,7 +684,9 @@ public class MessageSendEvent : CommonBase {
                 */
                public GossipTimestampFilter msg;
                internal MessageSendEvent_SendGossipTimestampFilter(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKMessageSendEvent_SendGossipTimestampFilter_get_node_id(ptr);
+                       long node_id = bindings.LDKMessageSendEvent_SendGossipTimestampFilter_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        long msg = bindings.LDKMessageSendEvent_SendGossipTimestampFilter_get_msg(ptr);
                        org.ldk.structs.GossipTimestampFilter msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.GossipTimestampFilter(null, msg); }
                        if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
@@ -657,7 +715,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendAcceptChannel-variant MessageSendEvent
         */
        public static MessageSendEvent send_accept_channel(byte[] node_id, org.ldk.structs.AcceptChannel msg) {
-               long ret = bindings.MessageSendEvent_send_accept_channel(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_accept_channel(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; }
@@ -671,7 +729,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendAcceptChannelV2-variant MessageSendEvent
         */
        public static MessageSendEvent send_accept_channel_v2(byte[] node_id, org.ldk.structs.AcceptChannelV2 msg) {
-               long ret = bindings.MessageSendEvent_send_accept_channel_v2(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_accept_channel_v2(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; }
@@ -685,7 +743,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendOpenChannel-variant MessageSendEvent
         */
        public static MessageSendEvent send_open_channel(byte[] node_id, org.ldk.structs.OpenChannel msg) {
-               long ret = bindings.MessageSendEvent_send_open_channel(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_open_channel(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; }
@@ -699,7 +757,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendOpenChannelV2-variant MessageSendEvent
         */
        public static MessageSendEvent send_open_channel_v2(byte[] node_id, org.ldk.structs.OpenChannelV2 msg) {
-               long ret = bindings.MessageSendEvent_send_open_channel_v2(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_open_channel_v2(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; }
@@ -713,7 +771,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendFundingCreated-variant MessageSendEvent
         */
        public static MessageSendEvent send_funding_created(byte[] node_id, org.ldk.structs.FundingCreated msg) {
-               long ret = bindings.MessageSendEvent_send_funding_created(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_funding_created(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; }
@@ -727,7 +785,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendFundingSigned-variant MessageSendEvent
         */
        public static MessageSendEvent send_funding_signed(byte[] node_id, org.ldk.structs.FundingSigned msg) {
-               long ret = bindings.MessageSendEvent_send_funding_signed(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_funding_signed(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; }
@@ -741,7 +799,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendTxAddInput-variant MessageSendEvent
         */
        public static MessageSendEvent send_tx_add_input(byte[] node_id, org.ldk.structs.TxAddInput msg) {
-               long ret = bindings.MessageSendEvent_send_tx_add_input(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_tx_add_input(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; }
@@ -755,7 +813,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendTxAddOutput-variant MessageSendEvent
         */
        public static MessageSendEvent send_tx_add_output(byte[] node_id, org.ldk.structs.TxAddOutput msg) {
-               long ret = bindings.MessageSendEvent_send_tx_add_output(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_tx_add_output(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; }
@@ -769,7 +827,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendTxRemoveInput-variant MessageSendEvent
         */
        public static MessageSendEvent send_tx_remove_input(byte[] node_id, org.ldk.structs.TxRemoveInput msg) {
-               long ret = bindings.MessageSendEvent_send_tx_remove_input(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_tx_remove_input(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; }
@@ -783,7 +841,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendTxRemoveOutput-variant MessageSendEvent
         */
        public static MessageSendEvent send_tx_remove_output(byte[] node_id, org.ldk.structs.TxRemoveOutput msg) {
-               long ret = bindings.MessageSendEvent_send_tx_remove_output(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_tx_remove_output(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; }
@@ -797,7 +855,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendTxComplete-variant MessageSendEvent
         */
        public static MessageSendEvent send_tx_complete(byte[] node_id, org.ldk.structs.TxComplete msg) {
-               long ret = bindings.MessageSendEvent_send_tx_complete(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_tx_complete(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; }
@@ -811,7 +869,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendTxSignatures-variant MessageSendEvent
         */
        public static MessageSendEvent send_tx_signatures(byte[] node_id, org.ldk.structs.TxSignatures msg) {
-               long ret = bindings.MessageSendEvent_send_tx_signatures(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_tx_signatures(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; }
@@ -825,7 +883,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendTxInitRbf-variant MessageSendEvent
         */
        public static MessageSendEvent send_tx_init_rbf(byte[] node_id, org.ldk.structs.TxInitRbf msg) {
-               long ret = bindings.MessageSendEvent_send_tx_init_rbf(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_tx_init_rbf(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; }
@@ -839,7 +897,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendTxAckRbf-variant MessageSendEvent
         */
        public static MessageSendEvent send_tx_ack_rbf(byte[] node_id, org.ldk.structs.TxAckRbf msg) {
-               long ret = bindings.MessageSendEvent_send_tx_ack_rbf(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_tx_ack_rbf(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; }
@@ -852,8 +910,8 @@ public class MessageSendEvent : CommonBase {
        /**
         * Utility method to constructs a new SendTxAbort-variant MessageSendEvent
         */
-       public static MessageSendEvent send_tx_abort(byte[] node_id, org.ldk.structs.TxAddInput msg) {
-               long ret = bindings.MessageSendEvent_send_tx_abort(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+       public static MessageSendEvent send_tx_abort(byte[] node_id, org.ldk.structs.TxAbort msg) {
+               long ret = bindings.MessageSendEvent_send_tx_abort(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; }
@@ -867,7 +925,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendChannelReady-variant MessageSendEvent
         */
        public static MessageSendEvent send_channel_ready(byte[] node_id, org.ldk.structs.ChannelReady msg) {
-               long ret = bindings.MessageSendEvent_send_channel_ready(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_channel_ready(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; }
@@ -881,7 +939,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendAnnouncementSignatures-variant MessageSendEvent
         */
        public static MessageSendEvent send_announcement_signatures(byte[] node_id, org.ldk.structs.AnnouncementSignatures msg) {
-               long ret = bindings.MessageSendEvent_send_announcement_signatures(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_announcement_signatures(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; }
@@ -895,7 +953,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new UpdateHTLCs-variant MessageSendEvent
         */
        public static MessageSendEvent update_htlcs(byte[] node_id, org.ldk.structs.CommitmentUpdate updates) {
-               long ret = bindings.MessageSendEvent_update_htlcs(InternalUtils.check_arr_len(node_id, 33), updates == null ? 0 : updates.ptr);
+               long ret = bindings.MessageSendEvent_update_htlcs(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id, 33)), updates == null ? 0 : updates.ptr);
                GC.KeepAlive(node_id);
                GC.KeepAlive(updates);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -909,7 +967,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendRevokeAndACK-variant MessageSendEvent
         */
        public static MessageSendEvent send_revoke_and_ack(byte[] node_id, org.ldk.structs.RevokeAndACK msg) {
-               long ret = bindings.MessageSendEvent_send_revoke_and_ack(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_revoke_and_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; }
@@ -923,7 +981,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendClosingSigned-variant MessageSendEvent
         */
        public static MessageSendEvent send_closing_signed(byte[] node_id, org.ldk.structs.ClosingSigned msg) {
-               long ret = bindings.MessageSendEvent_send_closing_signed(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_closing_signed(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; }
@@ -937,7 +995,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendShutdown-variant MessageSendEvent
         */
        public static MessageSendEvent send_shutdown(byte[] node_id, org.ldk.structs.Shutdown msg) {
-               long ret = bindings.MessageSendEvent_send_shutdown(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_shutdown(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; }
@@ -951,7 +1009,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendChannelReestablish-variant MessageSendEvent
         */
        public static MessageSendEvent send_channel_reestablish(byte[] node_id, org.ldk.structs.ChannelReestablish msg) {
-               long ret = bindings.MessageSendEvent_send_channel_reestablish(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_channel_reestablish(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; }
@@ -965,7 +1023,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendChannelAnnouncement-variant MessageSendEvent
         */
        public static MessageSendEvent send_channel_announcement(byte[] node_id, org.ldk.structs.ChannelAnnouncement msg, org.ldk.structs.ChannelUpdate update_msg) {
-               long ret = bindings.MessageSendEvent_send_channel_announcement(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr, update_msg == null ? 0 : update_msg.ptr);
+               long ret = bindings.MessageSendEvent_send_channel_announcement(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id, 33)), msg == null ? 0 : msg.ptr, update_msg == null ? 0 : update_msg.ptr);
                GC.KeepAlive(node_id);
                GC.KeepAlive(msg);
                GC.KeepAlive(update_msg);
@@ -1022,7 +1080,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendChannelUpdate-variant MessageSendEvent
         */
        public static MessageSendEvent send_channel_update(byte[] node_id, org.ldk.structs.ChannelUpdate msg) {
-               long ret = bindings.MessageSendEvent_send_channel_update(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_channel_update(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; }
@@ -1036,7 +1094,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new HandleError-variant MessageSendEvent
         */
        public static MessageSendEvent handle_error(byte[] node_id, org.ldk.structs.ErrorAction action) {
-               long ret = bindings.MessageSendEvent_handle_error(InternalUtils.check_arr_len(node_id, 33), action.ptr);
+               long ret = bindings.MessageSendEvent_handle_error(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id, 33)), action.ptr);
                GC.KeepAlive(node_id);
                GC.KeepAlive(action);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -1050,7 +1108,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendChannelRangeQuery-variant MessageSendEvent
         */
        public static MessageSendEvent send_channel_range_query(byte[] node_id, org.ldk.structs.QueryChannelRange msg) {
-               long ret = bindings.MessageSendEvent_send_channel_range_query(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_channel_range_query(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; }
@@ -1064,7 +1122,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendShortIdsQuery-variant MessageSendEvent
         */
        public static MessageSendEvent send_short_ids_query(byte[] node_id, org.ldk.structs.QueryShortChannelIds msg) {
-               long ret = bindings.MessageSendEvent_send_short_ids_query(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_short_ids_query(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; }
@@ -1078,7 +1136,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendReplyChannelRange-variant MessageSendEvent
         */
        public static MessageSendEvent send_reply_channel_range(byte[] node_id, org.ldk.structs.ReplyChannelRange msg) {
-               long ret = bindings.MessageSendEvent_send_reply_channel_range(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_reply_channel_range(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; }
@@ -1092,7 +1150,7 @@ public class MessageSendEvent : CommonBase {
         * Utility method to constructs a new SendGossipTimestampFilter-variant MessageSendEvent
         */
        public static MessageSendEvent send_gossip_timestamp_filter(byte[] node_id, org.ldk.structs.GossipTimestampFilter msg) {
-               long ret = bindings.MessageSendEvent_send_gossip_timestamp_filter(InternalUtils.check_arr_len(node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.MessageSendEvent_send_gossip_timestamp_filter(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; }
index 18bbdf929320ebcab49739d58b5dc3926fa83038..815a5409d559c8efbfd054c0b83453d0c7d15e67 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,60 +6,71 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of MessageSendEventsProvider */
+public interface MessageSendEventsProviderInterface {
+       /**Gets the list of pending events which were generated by previous actions, clearing the list
+        * in the process.
+        */
+       MessageSendEvent[] get_and_clear_pending_msg_events();
+}
+
 /**
  * A trait indicating an object may generate message send events
  */
 public class MessageSendEventsProvider : CommonBase {
-       internal readonly bindings.LDKMessageSendEventsProvider bindings_instance;
+       internal bindings.LDKMessageSendEventsProvider bindings_instance;
+       internal long instance_idx;
+
        internal MessageSendEventsProvider(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private MessageSendEventsProvider(bindings.LDKMessageSendEventsProvider arg) : base(bindings.LDKMessageSendEventsProvider_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~MessageSendEventsProvider() {
                if (ptr != 0) { bindings.MessageSendEventsProvider_free(ptr); }
        }
 
-       public interface MessageSendEventsProviderInterface {
-               /**
-                * Gets the list of pending events which were generated by previous actions, clearing the list
-                * in the process.
-                */
-               MessageSendEvent[] get_and_clear_pending_msg_events();
-       }
        private class LDKMessageSendEventsProviderHolder { internal MessageSendEventsProvider held; }
        private class LDKMessageSendEventsProviderImpl : bindings.LDKMessageSendEventsProvider {
                internal LDKMessageSendEventsProviderImpl(MessageSendEventsProviderInterface arg, LDKMessageSendEventsProviderHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private MessageSendEventsProviderInterface arg;
                private LDKMessageSendEventsProviderHolder impl_holder;
-               public long[] get_and_clear_pending_msg_events() {
+               public long get_and_clear_pending_msg_events() {
                        MessageSendEvent[] ret = arg.get_and_clear_pending_msg_events();
                                GC.KeepAlive(arg);
-                       long[] result = ret != null ? InternalUtils.mapArray(ret, ret_conv_18 => ret_conv_18 == null ? 0 : ret_conv_18.clone_ptr()) : null;
+                       long result = InternalUtils.encodeUint64Array(InternalUtils.mapArray(ret, ret_conv_18 => ret_conv_18 == null ? 0 : ret_conv_18.clone_ptr()));
                        foreach (MessageSendEvent ret_conv_18 in ret) { if (impl_holder.held != null) { impl_holder.held.ptrs_to.AddLast(ret_conv_18); }; };
                        return result;
                }
        }
+
+       /** Creates a new instance of MessageSendEventsProvider from a given implementation */
        public static MessageSendEventsProvider new_impl(MessageSendEventsProviderInterface arg) {
                LDKMessageSendEventsProviderHolder impl_holder = new LDKMessageSendEventsProviderHolder();
-               impl_holder.held = new MessageSendEventsProvider(new LDKMessageSendEventsProviderImpl(arg, impl_holder));
+               LDKMessageSendEventsProviderImpl impl = new LDKMessageSendEventsProviderImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKMessageSendEventsProvider_new(impl);
+
+               impl_holder.held = new MessageSendEventsProvider(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Gets the list of pending events which were generated by previous actions, clearing the list
         * in the process.
         */
        public MessageSendEvent[] get_and_clear_pending_msg_events() {
-               long[] ret = bindings.MessageSendEventsProvider_get_and_clear_pending_msg_events(this.ptr);
+               long ret = bindings.MessageSendEventsProvider_get_and_clear_pending_msg_events(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_18_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_18_len = InternalUtils.getArrayLength(ret);
                MessageSendEvent[] ret_conv_18_arr = new MessageSendEvent[ret_conv_18_len];
                for (int s = 0; s < ret_conv_18_len; s++) {
-                       long ret_conv_18 = ret[s];
+                       long ret_conv_18 = InternalUtils.getU64ArrayElem(ret, s);
                        org.ldk.structs.MessageSendEvent ret_conv_18_hu_conv = org.ldk.structs.MessageSendEvent.constr_from_ptr(ret_conv_18);
                        if (ret_conv_18_hu_conv != null) { ret_conv_18_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_18_arr[s] = ret_conv_18_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_18_arr;
        }
 
index 9e56078310df354d4da3905fdeb6c0f4856c9bcf..d569d222b8cd93accd044b1336e493551e43e622 100644 (file)
@@ -18,9 +18,8 @@ public class MonitorEvent : CommonBase {
                long raw_ty = bindings.LDKMonitorEvent_ty_from_ptr(ptr);
                switch (raw_ty) {
                        case 0: return new MonitorEvent_HTLCEvent(ptr);
-                       case 1: return new MonitorEvent_CommitmentTxConfirmed(ptr);
+                       case 1: return new MonitorEvent_HolderForceClosed(ptr);
                        case 2: return new MonitorEvent_Completed(ptr);
-                       case 3: return new MonitorEvent_UpdateFailed(ptr);
                        default:
                                throw new ArgumentException("Impossible enum variant");
                }
@@ -36,14 +35,14 @@ public class MonitorEvent : CommonBase {
                        this.htlc_event = htlc_event_hu_conv;
                }
        }
-       /** A MonitorEvent of type CommitmentTxConfirmed */
-       public class MonitorEvent_CommitmentTxConfirmed : MonitorEvent {
-               public OutPoint commitment_tx_confirmed;
-               internal MonitorEvent_CommitmentTxConfirmed(long ptr) : base(null, ptr) {
-                       long commitment_tx_confirmed = bindings.LDKMonitorEvent_CommitmentTxConfirmed_get_commitment_tx_confirmed(ptr);
-                       org.ldk.structs.OutPoint commitment_tx_confirmed_hu_conv = null; if (commitment_tx_confirmed < 0 || commitment_tx_confirmed > 4096) { commitment_tx_confirmed_hu_conv = new org.ldk.structs.OutPoint(null, commitment_tx_confirmed); }
-                       if (commitment_tx_confirmed_hu_conv != null) { commitment_tx_confirmed_hu_conv.ptrs_to.AddLast(this); };
-                       this.commitment_tx_confirmed = commitment_tx_confirmed_hu_conv;
+       /** A MonitorEvent of type HolderForceClosed */
+       public class MonitorEvent_HolderForceClosed : MonitorEvent {
+               public OutPoint holder_force_closed;
+               internal MonitorEvent_HolderForceClosed(long ptr) : base(null, ptr) {
+                       long holder_force_closed = bindings.LDKMonitorEvent_HolderForceClosed_get_holder_force_closed(ptr);
+                       org.ldk.structs.OutPoint holder_force_closed_hu_conv = null; if (holder_force_closed < 0 || holder_force_closed > 4096) { holder_force_closed_hu_conv = new org.ldk.structs.OutPoint(null, holder_force_closed); }
+                       if (holder_force_closed_hu_conv != null) { holder_force_closed_hu_conv.ptrs_to.AddLast(this); };
+                       this.holder_force_closed = holder_force_closed_hu_conv;
                }
        }
        /** A MonitorEvent of type Completed */
@@ -68,16 +67,6 @@ public class MonitorEvent : CommonBase {
                        this.monitor_update_id = bindings.LDKMonitorEvent_Completed_get_monitor_update_id(ptr);
                }
        }
-       /** A MonitorEvent of type UpdateFailed */
-       public class MonitorEvent_UpdateFailed : MonitorEvent {
-               public OutPoint update_failed;
-               internal MonitorEvent_UpdateFailed(long ptr) : base(null, ptr) {
-                       long update_failed = bindings.LDKMonitorEvent_UpdateFailed_get_update_failed(ptr);
-                       org.ldk.structs.OutPoint update_failed_hu_conv = null; if (update_failed < 0 || update_failed > 4096) { update_failed_hu_conv = new org.ldk.structs.OutPoint(null, update_failed); }
-                       if (update_failed_hu_conv != null) { update_failed_hu_conv.ptrs_to.AddLast(this); };
-                       this.update_failed = update_failed_hu_conv;
-               }
-       }
        internal long clone_ptr() {
                long ret = bindings.MonitorEvent_clone_ptr(this.ptr);
                GC.KeepAlive(this);
@@ -110,10 +99,10 @@ public class MonitorEvent : CommonBase {
        }
 
        /**
-        * Utility method to constructs a new CommitmentTxConfirmed-variant MonitorEvent
+        * Utility method to constructs a new HolderForceClosed-variant MonitorEvent
         */
-       public static MonitorEvent commitment_tx_confirmed(org.ldk.structs.OutPoint a) {
-               long ret = bindings.MonitorEvent_commitment_tx_confirmed(a == null ? 0 : a.ptr);
+       public static MonitorEvent holder_force_closed(org.ldk.structs.OutPoint a) {
+               long ret = bindings.MonitorEvent_holder_force_closed(a == null ? 0 : a.ptr);
                GC.KeepAlive(a);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.MonitorEvent ret_hu_conv = org.ldk.structs.MonitorEvent.constr_from_ptr(ret);
@@ -136,19 +125,6 @@ public class MonitorEvent : CommonBase {
                return ret_hu_conv;
        }
 
-       /**
-        * Utility method to constructs a new UpdateFailed-variant MonitorEvent
-        */
-       public static MonitorEvent update_failed(org.ldk.structs.OutPoint a) {
-               long ret = bindings.MonitorEvent_update_failed(a == null ? 0 : a.ptr);
-               GC.KeepAlive(a);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.MonitorEvent ret_hu_conv = org.ldk.structs.MonitorEvent.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 MonitorEvents contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
@@ -168,9 +144,11 @@ public class MonitorEvent : CommonBase {
         * Serialize the MonitorEvent object into a byte array which can be read by MonitorEvent_read
         */
        public byte[] write() {
-               byte[] ret = bindings.MonitorEvent_write(this.ptr);
+               long ret = bindings.MonitorEvent_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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/MonitorUpdatingPersister.cs b/c_sharp/src/org/ldk/structs/MonitorUpdatingPersister.cs
new file mode 100644 (file)
index 0000000..ff9b89d
--- /dev/null
@@ -0,0 +1,216 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * Implements [`Persist`] in a way that writes and reads both [`ChannelMonitor`]s and
+ * [`ChannelMonitorUpdate`]s.
+ * 
+ * # Overview
+ * 
+ * The main benefit this provides over the [`KVStore`]'s [`Persist`] implementation is decreased
+ * I/O bandwidth and storage churn, at the expense of more IOPS (including listing, reading, and
+ * deleting) and complexity. This is because it writes channel monitor differential updates,
+ * whereas the other (default) implementation rewrites the entire monitor on each update. For
+ * routing nodes, updates can happen many times per second to a channel, and monitors can be tens
+ * of megabytes (or more). Updates can be as small as a few hundred bytes.
+ * 
+ * Note that monitors written with `MonitorUpdatingPersister` are _not_ backward-compatible with
+ * the default [`KVStore`]'s [`Persist`] implementation. They have a prepended byte sequence,
+ * [`MONITOR_UPDATING_PERSISTER_PREPEND_SENTINEL`], applied to prevent deserialization with other
+ * persisters. This is because monitors written by this struct _may_ have unapplied updates. In
+ * order to downgrade, you must ensure that all updates are applied to the monitor, and remove the
+ * sentinel bytes.
+ * 
+ * # Storing monitors
+ * 
+ * Monitors are stored by implementing the [`Persist`] trait, which has two functions:
+ * 
+ * - [`Persist::persist_new_channel`], which persists whole [`ChannelMonitor`]s.
+ * - [`Persist::update_persisted_channel`], which persists only a [`ChannelMonitorUpdate`]
+ * 
+ * Whole [`ChannelMonitor`]s are stored in the [`CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE`],
+ * using the familiar encoding of an [`OutPoint`] (for example, `[SOME-64-CHAR-HEX-STRING]_1`).
+ * 
+ * Each [`ChannelMonitorUpdate`] is stored in a dynamic secondary namespace, as follows:
+ * 
+ * - primary namespace: [`CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE`]
+ * - secondary namespace: [the monitor's encoded outpoint name]
+ * 
+ * Under that secondary namespace, each update is stored with a number string, like `21`, which
+ * represents its `update_id` value.
+ * 
+ * For example, consider this channel, named for its transaction ID and index, or [`OutPoint`]:
+ * 
+ * - Transaction ID: `deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef`
+ * - Index: `1`
+ * 
+ * Full channel monitors would be stored at a single key:
+ * 
+ * `[CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE]/deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef_1`
+ * 
+ * Updates would be stored as follows (with `/` delimiting primary_namespace/secondary_namespace/key):
+ * 
+ * ```text
+ * [CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE]/deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef_1/1
+ * [CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE]/deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef_1/2
+ * [CHANNEL_MONITOR_UPDATE_PERSISTENCE_PRIMARY_NAMESPACE]/deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef_1/3
+ * ```
+ * ... and so on.
+ * 
+ * # Reading channel state from storage
+ * 
+ * Channel state can be reconstructed by calling
+ * [`MonitorUpdatingPersister::read_all_channel_monitors_with_updates`]. Alternatively, users can
+ * list channel monitors themselves and load channels individually using
+ * [`MonitorUpdatingPersister::read_channel_monitor_with_updates`].
+ * 
+ * ## EXTREMELY IMPORTANT
+ * 
+ * It is extremely important that your [`KVStore::read`] implementation uses the
+ * [`io::ErrorKind::NotFound`] variant correctly: that is, when a file is not found, and _only_ in
+ * that circumstance (not when there is really a permissions error, for example). This is because
+ * neither channel monitor reading function lists updates. Instead, either reads the monitor, and
+ * using its stored `update_id`, synthesizes update storage keys, and tries them in sequence until
+ * one is not found. All _other_ errors will be bubbled up in the function's [`Result`].
+ * 
+ * # 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
+ * 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`.
+ * 
+ * If you have many stale updates stored (such as after a crash with pending lazy deletes), and
+ * would like to get rid of them, consider using the
+ * [`MonitorUpdatingPersister::cleanup_stale_updates`] function.
+ */
+public class MonitorUpdatingPersister : CommonBase {
+       internal MonitorUpdatingPersister(object _dummy, long ptr) : base(ptr) { }
+       ~MonitorUpdatingPersister() {
+               if (ptr != 0) { bindings.MonitorUpdatingPersister_free(ptr); }
+       }
+
+       /**
+        * Constructs a new [`MonitorUpdatingPersister`].
+        * 
+        * The `maximum_pending_updates` parameter controls how many updates may be stored before a
+        * [`MonitorUpdatingPersister`] consolidates updates by writing a full monitor. Note that
+        * consolidation will frequently occur with fewer updates than what you set here; this number
+        * is merely the maximum that may be stored. When setting this value, consider that for higher
+        * values of `maximum_pending_updates`:
+        * 
+        * - [`MonitorUpdatingPersister`] will tend to write more [`ChannelMonitorUpdate`]s than
+        * [`ChannelMonitor`]s, approaching one [`ChannelMonitor`] write for every
+        * `maximum_pending_updates` [`ChannelMonitorUpdate`]s.
+        * - [`MonitorUpdatingPersister`] will issue deletes differently. Lazy deletes will come in
+        * \"waves\" for each [`ChannelMonitor`] write. A larger `maximum_pending_updates` means bigger,
+        * less frequent \"waves.\"
+        * - [`MonitorUpdatingPersister`] will potentially have more listing to do if you need to run
+        * [`MonitorUpdatingPersister::cleanup_stale_updates`].
+        */
+       public static MonitorUpdatingPersister of(org.ldk.structs.KVStore kv_store, org.ldk.structs.Logger logger, long maximum_pending_updates, org.ldk.structs.EntropySource entropy_source, org.ldk.structs.SignerProvider signer_provider) {
+               long ret = bindings.MonitorUpdatingPersister_new(kv_store.ptr, logger.ptr, maximum_pending_updates, entropy_source.ptr, signer_provider.ptr);
+               GC.KeepAlive(kv_store);
+               GC.KeepAlive(logger);
+               GC.KeepAlive(maximum_pending_updates);
+               GC.KeepAlive(entropy_source);
+               GC.KeepAlive(signer_provider);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.MonitorUpdatingPersister ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.MonitorUpdatingPersister(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(kv_store); };
+               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(signer_provider); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Reads all stored channel monitors, along with any stored updates for them.
+        * 
+        * It is extremely important that your [`KVStore::read`] implementation uses the
+        * [`io::ErrorKind::NotFound`] variant correctly. For more information, please see the
+        * documentation for [`MonitorUpdatingPersister`].
+        */
+       public Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ read_all_channel_monitors_with_updates(org.ldk.structs.BroadcasterInterface broadcaster, org.ldk.structs.FeeEstimator fee_estimator) {
+               long ret = bindings.MonitorUpdatingPersister_read_all_channel_monitors_with_updates(this.ptr, broadcaster.ptr, fee_estimator.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(broadcaster);
+               GC.KeepAlive(fee_estimator);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ ret_hu_conv = Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ.constr_from_ptr(ret);
+               if (this != null) { this.ptrs_to.AddLast(broadcaster); };
+               if (this != null) { this.ptrs_to.AddLast(fee_estimator); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Read a single channel monitor, along with any stored updates for it.
+        * 
+        * It is extremely important that your [`KVStore::read`] implementation uses the
+        * [`io::ErrorKind::NotFound`] variant correctly. For more information, please see the
+        * documentation for [`MonitorUpdatingPersister`].
+        * 
+        * For `monitor_key`, channel storage keys be the channel's transaction ID and index, or
+        * [`OutPoint`], with an underscore `_` between them. For example, given:
+        * 
+        * - Transaction ID: `deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef`
+        * - Index: `1`
+        * 
+        * The correct `monitor_key` would be:
+        * `deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef_1`
+        * 
+        * Loading a large number of monitors will be faster if done in parallel. You can use this
+        * function to accomplish this. Take care to limit the number of parallel readers.
+        */
+       public Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ read_channel_monitor_with_updates(org.ldk.structs.BroadcasterInterface broadcaster, org.ldk.structs.FeeEstimator fee_estimator, string monitor_key) {
+               long ret = bindings.MonitorUpdatingPersister_read_channel_monitor_with_updates(this.ptr, broadcaster.ptr, fee_estimator.ptr, InternalUtils.encodeString(monitor_key));
+               GC.KeepAlive(this);
+               GC.KeepAlive(broadcaster);
+               GC.KeepAlive(fee_estimator);
+               GC.KeepAlive(monitor_key);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ.constr_from_ptr(ret);
+               if (this != null) { this.ptrs_to.AddLast(broadcaster); };
+               if (this != null) { this.ptrs_to.AddLast(fee_estimator); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Cleans up stale updates for all monitors.
+        * 
+        * This function works by first listing all monitors, and then for each of them, listing all
+        * updates. The updates that have an `update_id` less than or equal to than the stored monitor
+        * are deleted. The deletion can either be lazy or non-lazy based on the `lazy` flag; this will
+        * be passed to [`KVStore::remove`].
+        */
+       public Result_NoneIOErrorZ cleanup_stale_updates(bool lazy) {
+               long ret = bindings.MonitorUpdatingPersister_cleanup_stale_updates(this.ptr, lazy);
+               GC.KeepAlive(this);
+               GC.KeepAlive(lazy);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneIOErrorZ ret_hu_conv = Result_NoneIOErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new Persist which calls the relevant methods on this_arg.
+        * This copies the `inner` pointer in this_arg and thus the returned Persist must be freed before this_arg is
+        */
+       public Persist as_Persist() {
+               long ret = bindings.MonitorUpdatingPersister_as_Persist(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Persist ret_hu_conv = new Persist(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index b47681587777ee3886a0d1a4fdd739d21162b0ff..a0256e75c3b9c664ea331f46ddd65f0e1ba82281 100644 (file)
@@ -32,9 +32,11 @@ public class MultiThreadedLockableScore : CommonBase {
         * Serialize the MultiThreadedLockableScore object into a byte array which can be read by MultiThreadedLockableScore_read
         */
        public byte[] write() {
-               byte[] ret = bindings.MultiThreadedLockableScore_write(this.ptr);
+               long ret = bindings.MultiThreadedLockableScore_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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/MultiThreadedScoreLock.cs b/c_sharp/src/org/ldk/structs/MultiThreadedScoreLock.cs
deleted file mode 100644 (file)
index 9e8ee95..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-
-/**
- * A locked `MultiThreadedLockableScore`.
- */
-public class MultiThreadedScoreLock : CommonBase {
-       internal MultiThreadedScoreLock(object _dummy, long ptr) : base(ptr) { }
-       ~MultiThreadedScoreLock() {
-               if (ptr != 0) { bindings.MultiThreadedScoreLock_free(ptr); }
-       }
-
-       /**
-        * Serialize the MultiThreadedScoreLock object into a byte array which can be read by MultiThreadedScoreLock_read
-        */
-       public byte[] write() {
-               byte[] ret = bindings.MultiThreadedScoreLock_write(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Constructs a new Score which calls the relevant methods on this_arg.
-        * This copies the `inner` pointer in this_arg and thus the returned Score must be freed before this_arg is
-        */
-       public Score as_Score() {
-               long ret = bindings.MultiThreadedScoreLock_as_Score(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Score ret_hu_conv = new Score(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/MultiThreadedScoreLockRead.cs b/c_sharp/src/org/ldk/structs/MultiThreadedScoreLockRead.cs
new file mode 100644 (file)
index 0000000..83e5161
--- /dev/null
@@ -0,0 +1,32 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A locked `MultiThreadedLockableScore`.
+ */
+public class MultiThreadedScoreLockRead : CommonBase {
+       internal MultiThreadedScoreLockRead(object _dummy, long ptr) : base(ptr) { }
+       ~MultiThreadedScoreLockRead() {
+               if (ptr != 0) { bindings.MultiThreadedScoreLockRead_free(ptr); }
+       }
+
+       /**
+        * Constructs a new ScoreLookUp which calls the relevant methods on this_arg.
+        * This copies the `inner` pointer in this_arg and thus the returned ScoreLookUp must be freed before this_arg is
+        */
+       public ScoreLookUp as_ScoreLookUp() {
+               long ret = bindings.MultiThreadedScoreLockRead_as_ScoreLookUp(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               ScoreLookUp ret_hu_conv = new ScoreLookUp(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/MultiThreadedScoreLockWrite.cs b/c_sharp/src/org/ldk/structs/MultiThreadedScoreLockWrite.cs
new file mode 100644 (file)
index 0000000..2384d46
--- /dev/null
@@ -0,0 +1,43 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A locked `MultiThreadedLockableScore`.
+ */
+public class MultiThreadedScoreLockWrite : CommonBase {
+       internal MultiThreadedScoreLockWrite(object _dummy, long ptr) : base(ptr) { }
+       ~MultiThreadedScoreLockWrite() {
+               if (ptr != 0) { bindings.MultiThreadedScoreLockWrite_free(ptr); }
+       }
+
+       /**
+        * Serialize the MultiThreadedScoreLockWrite object into a byte array which can be read by MultiThreadedScoreLockWrite_read
+        */
+       public byte[] write() {
+               long ret = bindings.MultiThreadedScoreLockWrite_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Constructs a new ScoreUpdate which calls the relevant methods on this_arg.
+        * This copies the `inner` pointer in this_arg and thus the returned ScoreUpdate must be freed before this_arg is
+        */
+       public ScoreUpdate as_ScoreUpdate() {
+               long ret = bindings.MultiThreadedScoreLockWrite_as_ScoreUpdate(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               ScoreUpdate ret_hu_conv = new ScoreUpdate(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/NetAddress.cs b/c_sharp/src/org/ldk/structs/NetAddress.cs
deleted file mode 100644 (file)
index f4cae02..0000000
+++ /dev/null
@@ -1,231 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * An address which can be used to connect to a remote peer.
- */
-public class NetAddress : CommonBase {
-       protected NetAddress(object _dummy, long ptr) : base(ptr) { }
-       ~NetAddress() {
-               if (ptr != 0) { bindings.NetAddress_free(ptr); }
-       }
-
-       internal static NetAddress constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKNetAddress_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new NetAddress_IPv4(ptr);
-                       case 1: return new NetAddress_IPv6(ptr);
-                       case 2: return new NetAddress_OnionV2(ptr);
-                       case 3: return new NetAddress_OnionV3(ptr);
-                       case 4: return new NetAddress_Hostname(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A NetAddress of type IPv4 */
-       public class NetAddress_IPv4 : NetAddress {
-               /**
-                * The 4-byte IPv4 address
-                */
-               public byte[] addr;
-               /**
-                * The port on which the node is listening
-                */
-               public short port;
-               internal NetAddress_IPv4(long ptr) : base(null, ptr) {
-                       this.addr = bindings.LDKNetAddress_IPv4_get_addr(ptr);
-                       this.port = bindings.LDKNetAddress_IPv4_get_port(ptr);
-               }
-       }
-       /** A NetAddress of type IPv6 */
-       public class NetAddress_IPv6 : NetAddress {
-               /**
-                * The 16-byte IPv6 address
-                */
-               public byte[] addr;
-               /**
-                * The port on which the node is listening
-                */
-               public short port;
-               internal NetAddress_IPv6(long ptr) : base(null, ptr) {
-                       this.addr = bindings.LDKNetAddress_IPv6_get_addr(ptr);
-                       this.port = bindings.LDKNetAddress_IPv6_get_port(ptr);
-               }
-       }
-       /** A NetAddress of type OnionV2 */
-       public class NetAddress_OnionV2 : NetAddress {
-               public byte[] onion_v2;
-               internal NetAddress_OnionV2(long ptr) : base(null, ptr) {
-                       this.onion_v2 = bindings.LDKNetAddress_OnionV2_get_onion_v2(ptr);
-               }
-       }
-       /** A NetAddress of type OnionV3 */
-       public class NetAddress_OnionV3 : NetAddress {
-               /**
-                * The ed25519 long-term public key of the peer
-                */
-               public byte[] ed25519_pubkey;
-               /**
-                * The checksum of the pubkey and version, as included in the onion address
-                */
-               public short checksum;
-               /**
-                * The version byte, as defined by the Tor Onion v3 spec.
-                */
-               public byte version;
-               /**
-                * The port on which the node is listening
-                */
-               public short port;
-               internal NetAddress_OnionV3(long ptr) : base(null, ptr) {
-                       this.ed25519_pubkey = bindings.LDKNetAddress_OnionV3_get_ed25519_pubkey(ptr);
-                       this.checksum = bindings.LDKNetAddress_OnionV3_get_checksum(ptr);
-                       this.version = bindings.LDKNetAddress_OnionV3_get_version(ptr);
-                       this.port = bindings.LDKNetAddress_OnionV3_get_port(ptr);
-               }
-       }
-       /** A NetAddress of type Hostname */
-       public class NetAddress_Hostname : NetAddress {
-               /**
-                * The hostname on which the node is listening.
-                */
-               public Hostname hostname;
-               /**
-                * The port on which the node is listening.
-                */
-               public short port;
-               internal NetAddress_Hostname(long ptr) : base(null, ptr) {
-                       long hostname = bindings.LDKNetAddress_Hostname_get_hostname(ptr);
-                       org.ldk.structs.Hostname hostname_hu_conv = null; if (hostname < 0 || hostname > 4096) { hostname_hu_conv = new org.ldk.structs.Hostname(null, hostname); }
-                       if (hostname_hu_conv != null) { hostname_hu_conv.ptrs_to.AddLast(this); };
-                       this.hostname = hostname_hu_conv;
-                       this.port = bindings.LDKNetAddress_Hostname_get_port(ptr);
-               }
-       }
-       internal long clone_ptr() {
-               long ret = bindings.NetAddress_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a copy of the NetAddress
-        */
-       public NetAddress clone() {
-               long ret = bindings.NetAddress_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.NetAddress ret_hu_conv = org.ldk.structs.NetAddress.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 IPv4-variant NetAddress
-        */
-       public static NetAddress ipv4(byte[] addr, short port) {
-               long ret = bindings.NetAddress_ipv4(InternalUtils.check_arr_len(addr, 4), port);
-               GC.KeepAlive(addr);
-               GC.KeepAlive(port);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.NetAddress ret_hu_conv = org.ldk.structs.NetAddress.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 IPv6-variant NetAddress
-        */
-       public static NetAddress ipv6(byte[] addr, short port) {
-               long ret = bindings.NetAddress_ipv6(InternalUtils.check_arr_len(addr, 16), port);
-               GC.KeepAlive(addr);
-               GC.KeepAlive(port);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.NetAddress ret_hu_conv = org.ldk.structs.NetAddress.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 OnionV2-variant NetAddress
-        */
-       public static NetAddress onion_v2(byte[] a) {
-               long ret = bindings.NetAddress_onion_v2(InternalUtils.check_arr_len(a, 12));
-               GC.KeepAlive(a);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.NetAddress ret_hu_conv = org.ldk.structs.NetAddress.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 OnionV3-variant NetAddress
-        */
-       public static NetAddress onion_v3(byte[] ed25519_pubkey, short checksum, byte version, short port) {
-               long ret = bindings.NetAddress_onion_v3(InternalUtils.check_arr_len(ed25519_pubkey, 32), checksum, version, port);
-               GC.KeepAlive(ed25519_pubkey);
-               GC.KeepAlive(checksum);
-               GC.KeepAlive(version);
-               GC.KeepAlive(port);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.NetAddress ret_hu_conv = org.ldk.structs.NetAddress.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 Hostname-variant NetAddress
-        */
-       public static NetAddress hostname(org.ldk.structs.Hostname hostname, short port) {
-               long ret = bindings.NetAddress_hostname(hostname == null ? 0 : hostname.ptr, port);
-               GC.KeepAlive(hostname);
-               GC.KeepAlive(port);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.NetAddress ret_hu_conv = org.ldk.structs.NetAddress.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(hostname); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Checks if two NetAddresss contain equal inner contents.
-        * This ignores pointers and is_owned flags and looks at the values in fields.
-        */
-       public bool eq(org.ldk.structs.NetAddress b) {
-               bool ret = bindings.NetAddress_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 NetAddress)) return false;
-               return this.eq((NetAddress)o);
-       }
-       /**
-        * Serialize the NetAddress object into a byte array which can be read by NetAddress_read
-        */
-       public byte[] write() {
-               byte[] ret = bindings.NetAddress_write(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Read a NetAddress from a byte array, created by NetAddress_write
-        */
-       public static Result_NetAddressDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.NetAddress_read(ser);
-               GC.KeepAlive(ser);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NetAddressDecodeErrorZ ret_hu_conv = Result_NetAddressDecodeErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
index 22905e657d2d0d66922b441f551bbe48a0fa7d32..d5d098acc8f5bbd2bfb7b41ec62578280e7e1e97 100644 (file)
@@ -17,6 +17,8 @@ public class NetworkGraph : CommonBase {
 
        /**
         * Handles any network updates originating from [`Event`]s.
+        * Note that this will skip applying any [`NetworkUpdate::ChannelUpdateMessage`] to avoid
+        * leaking possibly identifying information of the sender to the public network.
         * 
         * [`Event`]: crate::events::Event
         */
@@ -27,28 +29,32 @@ public class NetworkGraph : CommonBase {
        }
 
        /**
-        * Gets the genesis hash for this network graph.
+        * Gets the chain hash for this network graph.
         */
-       public byte[] get_genesis_hash() {
-               byte[] ret = bindings.NetworkGraph_get_genesis_hash(this.ptr);
+       public byte[] get_chain_hash() {
+               long ret = bindings.NetworkGraph_get_chain_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Serialize the NetworkGraph object into a byte array which can be read by NetworkGraph_read
         */
        public byte[] write() {
-               byte[] ret = bindings.NetworkGraph_write(this.ptr);
+               long ret = bindings.NetworkGraph_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a NetworkGraph from a byte array, created by NetworkGraph_write
         */
        public static Result_NetworkGraphDecodeErrorZ read(byte[] ser, org.ldk.structs.Logger arg) {
-               long ret = bindings.NetworkGraph_read(ser, arg.ptr);
+               long ret = bindings.NetworkGraph_read(InternalUtils.encodeUint8Array(ser), arg.ptr);
                GC.KeepAlive(ser);
                GC.KeepAlive(arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -210,7 +216,7 @@ public class NetworkGraph : CommonBase {
         * All other parameters as used in [`msgs::UnsignedChannelAnnouncement`] fields.
         */
        public Result_NoneLightningErrorZ add_channel_from_partial_announcement(long short_channel_id, long timestamp, org.ldk.structs.ChannelFeatures features, byte[] node_id_1, byte[] node_id_2) {
-               long ret = bindings.NetworkGraph_add_channel_from_partial_announcement(this.ptr, short_channel_id, timestamp, features == null ? 0 : features.ptr, InternalUtils.check_arr_len(node_id_1, 33), InternalUtils.check_arr_len(node_id_2, 33));
+               long ret = bindings.NetworkGraph_add_channel_from_partial_announcement(this.ptr, short_channel_id, timestamp, features == null ? 0 : features.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id_1, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id_2, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(short_channel_id);
                GC.KeepAlive(timestamp);
@@ -239,7 +245,7 @@ public class NetworkGraph : CommonBase {
         * from local storage.
         */
        public void node_failed_permanent(byte[] node_id) {
-               bindings.NetworkGraph_node_failed_permanent(this.ptr, InternalUtils.check_arr_len(node_id, 33));
+               bindings.NetworkGraph_node_failed_permanent(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(node_id);
        }
@@ -292,8 +298,8 @@ public class NetworkGraph : CommonBase {
         * For an already known (from announcement) channel, update info about one of the directions
         * of the channel.
         * 
-        * You probably don't want to call this directly, instead relying on a P2PGossipSync's
-        * RoutingMessageHandler implementation to call it indirectly. This may be useful to accept
+        * You probably don't want to call this directly, instead relying on a [`P2PGossipSync`]'s
+        * [`RoutingMessageHandler`] implementation to call it indirectly. This may be useful to accept
         * routing messages from a source using a protocol other than the lightning P2P protocol.
         * 
         * If built with `no-std`, any updates with a timestamp more than two weeks in the past or
@@ -327,5 +333,23 @@ public class NetworkGraph : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * For an already known (from announcement) channel, verify the given [`ChannelUpdate`].
+        * 
+        * This checks whether the update currently is applicable by [`Self::update_channel`].
+        * 
+        * If built with `no-std`, any updates with a timestamp more than two weeks in the past or
+        * materially in the future will be rejected.
+        */
+       public Result_NoneLightningErrorZ verify_channel_update(org.ldk.structs.ChannelUpdate msg) {
+               long ret = bindings.NetworkGraph_verify_channel_update(this.ptr, msg == null ? 0 : msg.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(msg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneLightningErrorZ ret_hu_conv = Result_NoneLightningErrorZ.constr_from_ptr(ret);
+               if (this != null) { this.ptrs_to.AddLast(msg); };
+               return ret_hu_conv;
+       }
+
 }
 } } }
index dac4739036b6cdc338fe802a38349b07ebe842f5..44ba3641a7db0b3f84589495978c1d312e5cfd77 100644 (file)
@@ -69,7 +69,9 @@ public class NetworkUpdate : CommonBase {
                 */
                public bool is_permanent;
                internal NetworkUpdate_NodeFailure(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKNetworkUpdate_NodeFailure_get_node_id(ptr);
+                       long node_id = bindings.LDKNetworkUpdate_NodeFailure_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
                        this.is_permanent = bindings.LDKNetworkUpdate_NodeFailure_get_is_permanent(ptr);
                }
        }
@@ -121,7 +123,7 @@ public class NetworkUpdate : CommonBase {
         * Utility method to constructs a new NodeFailure-variant NetworkUpdate
         */
        public static NetworkUpdate node_failure(byte[] node_id, bool is_permanent) {
-               long ret = bindings.NetworkUpdate_node_failure(InternalUtils.check_arr_len(node_id, 33), is_permanent);
+               long ret = bindings.NetworkUpdate_node_failure(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id, 33)), is_permanent);
                GC.KeepAlive(node_id);
                GC.KeepAlive(is_permanent);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -149,9 +151,11 @@ public class NetworkUpdate : CommonBase {
         * Serialize the NetworkUpdate object into a byte array which can be read by NetworkUpdate_read
         */
        public byte[] write() {
-               byte[] ret = bindings.NetworkUpdate_write(this.ptr);
+               long ret = bindings.NetworkUpdate_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index b0cb8e6b8eec0c59646dc7b56799745f3c1e3910..84c9daa85f4083873191e5d97dd9864410bb2de7 100644 (file)
@@ -19,13 +19,15 @@ public class NodeAlias : CommonBase {
        }
 
        public byte[] get_a() {
-               byte[] ret = bindings.NodeAlias_get_a(this.ptr);
+               long ret = bindings.NodeAlias_get_a(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        public void set_a(byte[] val) {
-               bindings.NodeAlias_set_a(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.NodeAlias_set_a(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -34,7 +36,7 @@ public class NodeAlias : CommonBase {
         * Constructs a new NodeAlias given each field
         */
        public static NodeAlias of(byte[] a_arg) {
-               long ret = bindings.NodeAlias_new(InternalUtils.check_arr_len(a_arg, 32));
+               long ret = bindings.NodeAlias_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a_arg, 32)));
                GC.KeepAlive(a_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.NodeAlias ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.NodeAlias(null, ret); }
@@ -81,16 +83,18 @@ public class NodeAlias : CommonBase {
         * Serialize the NodeAlias object into a byte array which can be read by NodeAlias_read
         */
        public byte[] write() {
-               byte[] ret = bindings.NodeAlias_write(this.ptr);
+               long ret = bindings.NodeAlias_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a NodeAlias from a byte array, created by NodeAlias_write
         */
        public static Result_NodeAliasDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.NodeAlias_read(ser);
+               long ret = bindings.NodeAlias_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_NodeAliasDecodeErrorZ ret_hu_conv = Result_NodeAliasDecodeErrorZ.constr_from_ptr(ret);
index 9540cbb424279715172a2d23941c65452845e0bc..4b870b48d8d099dceb6e9da3ba0289b9760ad277 100644 (file)
@@ -21,16 +21,18 @@ public class NodeAnnouncement : CommonBase {
         * The signature by the node key
         */
        public byte[] get_signature() {
-               byte[] ret = bindings.NodeAnnouncement_get_signature(this.ptr);
+               long ret = bindings.NodeAnnouncement_get_signature(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The signature by the node key
         */
        public void set_signature(byte[] val) {
-               bindings.NodeAnnouncement_set_signature(this.ptr, InternalUtils.check_arr_len(val, 64));
+               bindings.NodeAnnouncement_set_signature(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 64)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -61,7 +63,7 @@ public class NodeAnnouncement : CommonBase {
         * Constructs a new NodeAnnouncement given each field
         */
        public static NodeAnnouncement of(byte[] signature_arg, org.ldk.structs.UnsignedNodeAnnouncement contents_arg) {
-               long ret = bindings.NodeAnnouncement_new(InternalUtils.check_arr_len(signature_arg, 64), contents_arg == null ? 0 : contents_arg.ptr);
+               long ret = bindings.NodeAnnouncement_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(signature_arg, 64)), contents_arg == null ? 0 : contents_arg.ptr);
                GC.KeepAlive(signature_arg);
                GC.KeepAlive(contents_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -110,16 +112,18 @@ public class NodeAnnouncement : CommonBase {
         * Serialize the NodeAnnouncement object into a byte array which can be read by NodeAnnouncement_read
         */
        public byte[] write() {
-               byte[] ret = bindings.NodeAnnouncement_write(this.ptr);
+               long ret = bindings.NodeAnnouncement_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a NodeAnnouncement from a byte array, created by NodeAnnouncement_write
         */
        public static Result_NodeAnnouncementDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.NodeAnnouncement_read(ser);
+               long ret = bindings.NodeAnnouncement_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_NodeAnnouncementDecodeErrorZ ret_hu_conv = Result_NodeAnnouncementDecodeErrorZ.constr_from_ptr(ret);
index 0d1053b4fdb935090e475d425e5c3fdfb74064e7..e1a6e0227b2675915bd1c20c163cc66cee1e7767 100644 (file)
@@ -61,16 +61,18 @@ public class NodeAnnouncementInfo : CommonBase {
         * Color assigned to the node
         */
        public byte[] get_rgb() {
-               byte[] ret = bindings.NodeAnnouncementInfo_get_rgb(this.ptr);
+               long ret = bindings.NodeAnnouncementInfo_get_rgb(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Color assigned to the node
         */
        public void set_rgb(byte[] val) {
-               bindings.NodeAnnouncementInfo_set_rgb(this.ptr, InternalUtils.check_arr_len(val, 3));
+               bindings.NodeAnnouncementInfo_set_rgb(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 3)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -135,9 +137,11 @@ public class NodeAnnouncementInfo : CommonBase {
 
        /**
         * Constructs a new NodeAnnouncementInfo given each field
+        * 
+        * Note that announcement_message_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public static NodeAnnouncementInfo of(org.ldk.structs.NodeFeatures features_arg, int last_update_arg, byte[] rgb_arg, org.ldk.structs.NodeAlias alias_arg, org.ldk.structs.NodeAnnouncement announcement_message_arg) {
-               long ret = bindings.NodeAnnouncementInfo_new(features_arg == null ? 0 : features_arg.ptr, last_update_arg, InternalUtils.check_arr_len(rgb_arg, 3), alias_arg == null ? 0 : alias_arg.ptr, announcement_message_arg == null ? 0 : announcement_message_arg.ptr);
+               long ret = bindings.NodeAnnouncementInfo_new(features_arg == null ? 0 : features_arg.ptr, last_update_arg, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(rgb_arg, 3)), alias_arg == null ? 0 : alias_arg.ptr, announcement_message_arg == null ? 0 : announcement_message_arg.ptr);
                GC.KeepAlive(features_arg);
                GC.KeepAlive(last_update_arg);
                GC.KeepAlive(rgb_arg);
@@ -190,34 +194,38 @@ public class NodeAnnouncementInfo : CommonBase {
        /**
         * Internet-level addresses via which one can connect to the node
         */
-       public NetAddress[] addresses() {
-               long[] ret = bindings.NodeAnnouncementInfo_addresses(this.ptr);
+       public SocketAddress[] addresses() {
+               long ret = bindings.NodeAnnouncementInfo_addresses(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_12_len = ret.Length;
-               NetAddress[] ret_conv_12_arr = new NetAddress[ret_conv_12_len];
-               for (int m = 0; m < ret_conv_12_len; m++) {
-                       long ret_conv_12 = ret[m];
-                       org.ldk.structs.NetAddress ret_conv_12_hu_conv = org.ldk.structs.NetAddress.constr_from_ptr(ret_conv_12);
-                       if (ret_conv_12_hu_conv != null) { ret_conv_12_hu_conv.ptrs_to.AddLast(this); };
-                       ret_conv_12_arr[m] = ret_conv_12_hu_conv;
+               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;
                }
-               return ret_conv_12_arr;
+               bindings.free_buffer(ret);
+               return ret_conv_15_arr;
        }
 
        /**
         * Serialize the NodeAnnouncementInfo object into a byte array which can be read by NodeAnnouncementInfo_read
         */
        public byte[] write() {
-               byte[] ret = bindings.NodeAnnouncementInfo_write(this.ptr);
+               long ret = bindings.NodeAnnouncementInfo_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a NodeAnnouncementInfo from a byte array, created by NodeAnnouncementInfo_write
         */
        public static Result_NodeAnnouncementInfoDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.NodeAnnouncementInfo_read(ser);
+               long ret = bindings.NodeAnnouncementInfo_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_NodeAnnouncementInfoDecodeErrorZ ret_hu_conv = Result_NodeAnnouncementInfoDecodeErrorZ.constr_from_ptr(ret);
index 84f27848bf43a6f550784ea2a88463d050e3378d..83fa4df267fbfd030a11ec9f3afe2d928b84d1b1 100644 (file)
@@ -82,6 +82,42 @@ public class NodeFeatures : CommonBase {
                return ret;
        }
 
+       /**
+        * Sets a required feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Required bits are even. If an odd bit is given, then the corresponding even bit will
+        * be set instead (i.e., `bit - 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_required_feature_bit(long bit) {
+               long ret = bindings.NodeFeatures_set_required_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Sets an optional feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Optional bits are odd. If an even bit is given, then the corresponding odd bit will be
+        * set instead (i.e., `bit + 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_optional_feature_bit(long bit) {
+               long ret = bindings.NodeFeatures_set_optional_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
        /**
         * Sets a required custom feature bit. Errors if `bit` is outside the custom range as defined
         * by [bLIP 2] or if it is a known `T` feature.
@@ -122,16 +158,18 @@ public class NodeFeatures : CommonBase {
         * Serialize the NodeFeatures object into a byte array which can be read by NodeFeatures_read
         */
        public byte[] write() {
-               byte[] ret = bindings.NodeFeatures_write(this.ptr);
+               long ret = bindings.NodeFeatures_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a NodeFeatures from a byte array, created by NodeFeatures_write
         */
        public static Result_NodeFeaturesDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.NodeFeatures_read(ser);
+               long ret = bindings.NodeFeatures_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_NodeFeaturesDecodeErrorZ ret_hu_conv = Result_NodeFeaturesDecodeErrorZ.constr_from_ptr(ret);
@@ -512,6 +550,40 @@ public class NodeFeatures : CommonBase {
                return ret;
        }
 
+       /**
+        * Set this feature as optional.
+        */
+       public void set_taproot_optional() {
+               bindings.NodeFeatures_set_taproot_optional(this.ptr);
+               GC.KeepAlive(this);
+       }
+
+       /**
+        * Set this feature as required.
+        */
+       public void set_taproot_required() {
+               bindings.NodeFeatures_set_taproot_required(this.ptr);
+               GC.KeepAlive(this);
+       }
+
+       /**
+        * Checks if this feature is supported.
+        */
+       public bool supports_taproot() {
+               bool ret = bindings.NodeFeatures_supports_taproot(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Checks if this feature is required.
+        */
+       public bool requires_taproot() {
+               bool ret = bindings.NodeFeatures_requires_taproot(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
        /**
         * Set this feature as optional.
         */
index b4924b5d0157cc5a2f1d76b5bf3a0f94c4d925cf..0aa9014c1fa0305f02b33a7dceb3a04b17f51c15 100644 (file)
@@ -37,7 +37,7 @@ public class NodeId : CommonBase {
         * Create a new NodeId from a public key
         */
        public static NodeId from_pubkey(byte[] pubkey) {
-               long ret = bindings.NodeId_from_pubkey(InternalUtils.check_arr_len(pubkey, 33));
+               long ret = bindings.NodeId_from_pubkey(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(pubkey, 33)));
                GC.KeepAlive(pubkey);
                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); }
@@ -49,19 +49,21 @@ public class NodeId : CommonBase {
         * Get the public key slice from this NodeId
         */
        public byte[] as_slice() {
-               byte[] ret = bindings.NodeId_as_slice(this.ptr);
+               long ret = bindings.NodeId_as_slice(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Get the public key from this NodeId
         */
-       public Result_PublicKeyErrorZ as_pubkey() {
+       public Result_PublicKeySecp256k1ErrorZ as_pubkey() {
                long ret = bindings.NodeId_as_pubkey(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PublicKeyErrorZ ret_hu_conv = Result_PublicKeyErrorZ.constr_from_ptr(ret);
+               Result_PublicKeySecp256k1ErrorZ ret_hu_conv = Result_PublicKeySecp256k1ErrorZ.constr_from_ptr(ret);
                return ret_hu_conv;
        }
 
@@ -81,16 +83,18 @@ public class NodeId : CommonBase {
         * Serialize the NodeId object into a byte array which can be read by NodeId_read
         */
        public byte[] write() {
-               byte[] ret = bindings.NodeId_write(this.ptr);
+               long ret = bindings.NodeId_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a NodeId from a byte array, created by NodeId_write
         */
        public static Result_NodeIdDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.NodeId_read(ser);
+               long ret = bindings.NodeId_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_NodeIdDecodeErrorZ ret_hu_conv = Result_NodeIdDecodeErrorZ.constr_from_ptr(ret);
index 542ba8c14bdef0eefc57ff061a961bd7dca5c32b..78bb61900857f9fe3fe8d7a10c93b5f778e6561c 100644 (file)
@@ -21,16 +21,18 @@ public class NodeInfo : CommonBase {
         * Returns a copy of the field.
         */
        public long[] get_channels() {
-               long[] ret = bindings.NodeInfo_get_channels(this.ptr);
+               long ret = bindings.NodeInfo_get_channels(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               long[] ret_conv = InternalUtils.decodeUint64Array(ret);
+               return ret_conv;
        }
 
        /**
         * All valid channels a node has announced
         */
        public void set_channels(long[] val) {
-               bindings.NodeInfo_set_channels(this.ptr, val);
+               bindings.NodeInfo_set_channels(this.ptr, InternalUtils.encodeUint64Array(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -67,9 +69,11 @@ public class NodeInfo : CommonBase {
 
        /**
         * Constructs a new NodeInfo given each field
+        * 
+        * Note that announcement_info_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public static NodeInfo of(long[] channels_arg, org.ldk.structs.NodeAnnouncementInfo announcement_info_arg) {
-               long ret = bindings.NodeInfo_new(channels_arg, announcement_info_arg == null ? 0 : announcement_info_arg.ptr);
+               long ret = bindings.NodeInfo_new(InternalUtils.encodeUint64Array(channels_arg), announcement_info_arg == null ? 0 : announcement_info_arg.ptr);
                GC.KeepAlive(channels_arg);
                GC.KeepAlive(announcement_info_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -118,16 +122,18 @@ public class NodeInfo : CommonBase {
         * Serialize the NodeInfo object into a byte array which can be read by NodeInfo_read
         */
        public byte[] write() {
-               byte[] ret = bindings.NodeInfo_write(this.ptr);
+               long ret = bindings.NodeInfo_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a NodeInfo from a byte array, created by NodeInfo_write
         */
        public static Result_NodeInfoDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.NodeInfo_read(ser);
+               long ret = bindings.NodeInfo_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_NodeInfoDecodeErrorZ ret_hu_conv = Result_NodeInfoDecodeErrorZ.constr_from_ptr(ret);
index e454bb17fb5b8ee4ebcb62bb84d213031c571f7d..033f93acf3ff707358946b44ca10ce34bde3c461 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,86 +6,109 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of NodeSigner */
+public interface NodeSignerInterface {
+       /**Get secret key material as bytes for use in encrypting and decrypting inbound payment data.
+        * 
+        * If the implementor of this trait supports [phantom node payments], then every node that is
+        * intended to be included in the phantom invoice route hints must return the same value from
+        * this method.
+        * 
+        * This method must return the same value each time it is called.
+        * 
+        * [phantom node payments]: PhantomKeysManager
+        */
+       byte[] get_inbound_payment_key_material();
+       /**Get node id based on the provided [`Recipient`].
+        * 
+        * This method must return the same value each time it is called with a given [`Recipient`]
+        * parameter.
+        * 
+        * Errors if the [`Recipient`] variant is not supported by the implementation.
+        */
+       Result_PublicKeyNoneZ get_node_id(Recipient recipient);
+       /**Gets the ECDH shared secret of our node secret and `other_key`, multiplying by `tweak` if
+        * one is provided. Note that this tweak can be applied to `other_key` instead of our node
+        * secret, though this is less efficient.
+        * 
+        * Note that if this fails while attempting to forward an HTLC, LDK will panic. The error
+        * should be resolved to allow LDK to resume forwarding HTLCs.
+        * 
+        * Errors if the [`Recipient`] variant is not supported by the implementation.
+        */
+       Result_ThirtyTwoBytesNoneZ ecdh(Recipient recipient, byte[] other_key, Option_BigEndianScalarZ tweak);
+       /**Sign an invoice.
+        * 
+        * By parameterizing by the raw invoice bytes instead of the hash, we allow implementors of
+        * this trait to parse the invoice and make sure they're signing what they expect, rather than
+        * blindly signing the hash.
+        * 
+        * The `hrp_bytes` are ASCII bytes, while the `invoice_data` is base32.
+        * 
+        * The secret key used to sign the invoice is dependent on the [`Recipient`].
+        * 
+        * Errors if the [`Recipient`] variant is not supported by the implementation.
+        */
+       Result_RecoverableSignatureNoneZ sign_invoice(byte[] hrp_bytes, UInt5[] invoice_data, Recipient recipient);
+       /**Signs the [`TaggedHash`] of a BOLT 12 invoice request.
+        * 
+        * May be called by a function passed to [`UnsignedInvoiceRequest::sign`] where
+        * `invoice_request` is the callee.
+        * 
+        * Implementors may check that the `invoice_request` is expected rather than blindly signing
+        * the tagged hash. An `Ok` result should sign `invoice_request.tagged_hash().as_digest()` with
+        * the node's signing key or an ephemeral key to preserve privacy, whichever is associated with
+        * [`UnsignedInvoiceRequest::payer_id`].
+        * 
+        * [`TaggedHash`]: crate::offers::merkle::TaggedHash
+        */
+       Result_SchnorrSignatureNoneZ sign_bolt12_invoice_request(UnsignedInvoiceRequest invoice_request);
+       /**Signs the [`TaggedHash`] of a BOLT 12 invoice.
+        * 
+        * May be called by a function passed to [`UnsignedBolt12Invoice::sign`] where `invoice` is the
+        * callee.
+        * 
+        * Implementors may check that the `invoice` is expected rather than blindly signing the tagged
+        * hash. An `Ok` result should sign `invoice.tagged_hash().as_digest()` with the node's signing
+        * key or an ephemeral key to preserve privacy, whichever is associated with
+        * [`UnsignedBolt12Invoice::signing_pubkey`].
+        * 
+        * [`TaggedHash`]: crate::offers::merkle::TaggedHash
+        */
+       Result_SchnorrSignatureNoneZ sign_bolt12_invoice(UnsignedBolt12Invoice invoice);
+       /**Sign a gossip message.
+        * 
+        * Note that if this fails, LDK may panic and the message will not be broadcast to the network
+        * or a possible channel counterparty. If LDK panics, the error should be resolved to allow the
+        * message to be broadcast, as otherwise it may prevent one from receiving funds over the
+        * corresponding channel.
+        */
+       Result_ECDSASignatureNoneZ sign_gossip_message(UnsignedGossipMessage msg);
+}
+
 /**
  * A trait that can handle cryptographic operations at the scope level of a node.
  */
 public class NodeSigner : CommonBase {
-       internal readonly bindings.LDKNodeSigner bindings_instance;
+       internal bindings.LDKNodeSigner bindings_instance;
+       internal long instance_idx;
+
        internal NodeSigner(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private NodeSigner(bindings.LDKNodeSigner arg) : base(bindings.LDKNodeSigner_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~NodeSigner() {
                if (ptr != 0) { bindings.NodeSigner_free(ptr); }
        }
 
-       public interface NodeSignerInterface {
-               /**
-                * Get secret key material as bytes for use in encrypting and decrypting inbound payment data.
-                * 
-                * If the implementor of this trait supports [phantom node payments], then every node that is
-                * intended to be included in the phantom invoice route hints must return the same value from
-                * this method.
-                * 
-                * This method must return the same value each time it is called.
-                * 
-                * [phantom node payments]: PhantomKeysManager
-                */
-               byte[] get_inbound_payment_key_material();
-               /**
-                * Get node id based on the provided [`Recipient`].
-                * 
-                * This method must return the same value each time it is called with a given [`Recipient`]
-                * parameter.
-                * 
-                * Errors if the [`Recipient`] variant is not supported by the implementation.
-                */
-               Result_PublicKeyNoneZ get_node_id(Recipient _recipient);
-               /**
-                * Gets the ECDH shared secret of our node secret and `other_key`, multiplying by `tweak` if
-                * one is provided. Note that this tweak can be applied to `other_key` instead of our node
-                * secret, though this is less efficient.
-                * 
-                * Note that if this fails while attempting to forward an HTLC, LDK will panic. The error
-                * should be resolved to allow LDK to resume forwarding HTLCs.
-                * 
-                * Errors if the [`Recipient`] variant is not supported by the implementation.
-                */
-               Result_SharedSecretNoneZ ecdh(Recipient _recipient, byte[] _other_key, Option_ScalarZ _tweak);
-               /**
-                * Sign an invoice.
-                * 
-                * By parameterizing by the raw invoice bytes instead of the hash, we allow implementors of
-                * this trait to parse the invoice and make sure they're signing what they expect, rather than
-                * blindly signing the hash.
-                * 
-                * The `hrp_bytes` are ASCII bytes, while the `invoice_data` is base32.
-                * 
-                * The secret key used to sign the invoice is dependent on the [`Recipient`].
-                * 
-                * Errors if the [`Recipient`] variant is not supported by the implementation.
-                */
-               Result_RecoverableSignatureNoneZ sign_invoice(byte[] _hrp_bytes, UInt5[] _invoice_data, Recipient _recipient);
-               /**
-                * Sign a gossip message.
-                * 
-                * Note that if this fails, LDK may panic and the message will not be broadcast to the network
-                * or a possible channel counterparty. If LDK panics, the error should be resolved to allow the
-                * message to be broadcast, as otherwise it may prevent one from receiving funds over the
-                * corresponding channel.
-                */
-               Result_SignatureNoneZ sign_gossip_message(UnsignedGossipMessage _msg);
-       }
        private class LDKNodeSignerHolder { internal NodeSigner held; }
        private class LDKNodeSignerImpl : bindings.LDKNodeSigner {
                internal LDKNodeSignerImpl(NodeSignerInterface arg, LDKNodeSignerHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private NodeSignerInterface arg;
                private LDKNodeSignerHolder impl_holder;
-               public byte[] get_inbound_payment_key_material() {
+               public long get_inbound_payment_key_material() {
                        byte[] ret = arg.get_inbound_payment_key_material();
                                GC.KeepAlive(arg);
-                       byte[] result = InternalUtils.check_arr_len(ret, 32);
+                       long result = InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(ret, 32));
                        return result;
                }
                public long get_node_id(Recipient _recipient) {
@@ -93,23 +117,40 @@ public class NodeSigner : CommonBase {
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long ecdh(Recipient _recipient, byte[] _other_key, long _tweak) {
-                       org.ldk.structs.Option_ScalarZ _tweak_hu_conv = org.ldk.structs.Option_ScalarZ.constr_from_ptr(_tweak);
+               public long ecdh(Recipient _recipient, long _other_key, long _tweak) {
+                       byte[] _other_key_conv = InternalUtils.decodeUint8Array(_other_key);
+                       org.ldk.structs.Option_BigEndianScalarZ _tweak_hu_conv = org.ldk.structs.Option_BigEndianScalarZ.constr_from_ptr(_tweak);
                        if (_tweak_hu_conv != null) { _tweak_hu_conv.ptrs_to.AddLast(this); };
-                       Result_SharedSecretNoneZ ret = arg.ecdh(_recipient, _other_key, _tweak_hu_conv);
+                       Result_ThirtyTwoBytesNoneZ ret = arg.ecdh(_recipient, _other_key_conv, _tweak_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long sign_invoice(byte[] _hrp_bytes, byte[] _invoice_data, Recipient _recipient) {
-                       int _invoice_data_conv_7_len = _invoice_data.Length;
+               public long sign_invoice(long _hrp_bytes, long _invoice_data, Recipient _recipient) {
+                       byte[] _hrp_bytes_conv = InternalUtils.decodeUint8Array(_hrp_bytes);
+                       int _invoice_data_conv_7_len = InternalUtils.getArrayLength(_invoice_data);
                        UInt5[] _invoice_data_conv_7_arr = new UInt5[_invoice_data_conv_7_len];
                        for (int h = 0; h < _invoice_data_conv_7_len; h++) {
-                               byte _invoice_data_conv_7 = _invoice_data[h];
+                               byte _invoice_data_conv_7 = InternalUtils.getU8ArrayElem(_invoice_data, h);
                                UInt5 _invoice_data_conv_7_conv = new UInt5(_invoice_data_conv_7);
                                _invoice_data_conv_7_arr[h] = _invoice_data_conv_7_conv;
                        }
-                       Result_RecoverableSignatureNoneZ ret = arg.sign_invoice(_hrp_bytes, _invoice_data_conv_7_arr, _recipient);
+                       bindings.free_buffer(_invoice_data);
+                       Result_RecoverableSignatureNoneZ ret = arg.sign_invoice(_hrp_bytes_conv, _invoice_data_conv_7_arr, _recipient);
+                               GC.KeepAlive(arg);
+                       long result = ret == null ? 0 : ret.clone_ptr();
+                       return result;
+               }
+               public long sign_bolt12_invoice_request(long _invoice_request) {
+                       org.ldk.structs.UnsignedInvoiceRequest _invoice_request_hu_conv = null; if (_invoice_request < 0 || _invoice_request > 4096) { _invoice_request_hu_conv = new org.ldk.structs.UnsignedInvoiceRequest(null, _invoice_request); }
+                       Result_SchnorrSignatureNoneZ ret = arg.sign_bolt12_invoice_request(_invoice_request_hu_conv);
+                               GC.KeepAlive(arg);
+                       long result = ret == null ? 0 : ret.clone_ptr();
+                       return result;
+               }
+               public long sign_bolt12_invoice(long _invoice) {
+                       org.ldk.structs.UnsignedBolt12Invoice _invoice_hu_conv = null; if (_invoice < 0 || _invoice > 4096) { _invoice_hu_conv = new org.ldk.structs.UnsignedBolt12Invoice(null, _invoice); }
+                       Result_SchnorrSignatureNoneZ ret = arg.sign_bolt12_invoice(_invoice_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
@@ -117,17 +158,25 @@ public class NodeSigner : CommonBase {
                public long sign_gossip_message(long _msg) {
                        org.ldk.structs.UnsignedGossipMessage _msg_hu_conv = org.ldk.structs.UnsignedGossipMessage.constr_from_ptr(_msg);
                        if (_msg_hu_conv != null) { _msg_hu_conv.ptrs_to.AddLast(this); };
-                       Result_SignatureNoneZ ret = arg.sign_gossip_message(_msg_hu_conv);
+                       Result_ECDSASignatureNoneZ ret = arg.sign_gossip_message(_msg_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
        }
+
+       /** Creates a new instance of NodeSigner from a given implementation */
        public static NodeSigner new_impl(NodeSignerInterface arg) {
                LDKNodeSignerHolder impl_holder = new LDKNodeSignerHolder();
-               impl_holder.held = new NodeSigner(new LDKNodeSignerImpl(arg, impl_holder));
+               LDKNodeSignerImpl impl = new LDKNodeSignerImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKNodeSigner_new(impl);
+
+               impl_holder.held = new NodeSigner(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Get secret key material as bytes for use in encrypting and decrypting inbound payment data.
         * 
@@ -140,9 +189,11 @@ public class NodeSigner : CommonBase {
         * [phantom node payments]: PhantomKeysManager
         */
        public byte[] get_inbound_payment_key_material() {
-               byte[] ret = bindings.NodeSigner_get_inbound_payment_key_material(this.ptr);
+               long ret = bindings.NodeSigner_get_inbound_payment_key_material(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -172,14 +223,14 @@ public class NodeSigner : CommonBase {
         * 
         * Errors if the [`Recipient`] variant is not supported by the implementation.
         */
-       public Result_SharedSecretNoneZ ecdh(Recipient recipient, byte[] other_key, org.ldk.structs.Option_ScalarZ tweak) {
-               long ret = bindings.NodeSigner_ecdh(this.ptr, recipient, InternalUtils.check_arr_len(other_key, 33), tweak.ptr);
+       public Result_ThirtyTwoBytesNoneZ ecdh(Recipient recipient, byte[] other_key, org.ldk.structs.Option_BigEndianScalarZ tweak) {
+               long ret = bindings.NodeSigner_ecdh(this.ptr, recipient, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(other_key, 33)), tweak.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(recipient);
                GC.KeepAlive(other_key);
                GC.KeepAlive(tweak);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_SharedSecretNoneZ ret_hu_conv = Result_SharedSecretNoneZ.constr_from_ptr(ret);
+               Result_ThirtyTwoBytesNoneZ ret_hu_conv = Result_ThirtyTwoBytesNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(tweak); };
                return ret_hu_conv;
        }
@@ -198,7 +249,7 @@ public class NodeSigner : CommonBase {
         * Errors if the [`Recipient`] variant is not supported by the implementation.
         */
        public Result_RecoverableSignatureNoneZ sign_invoice(byte[] hrp_bytes, UInt5[] invoice_data, Recipient recipient) {
-               long ret = bindings.NodeSigner_sign_invoice(this.ptr, hrp_bytes, invoice_data != null ? InternalUtils.convUInt5Array(invoice_data) : null, recipient);
+               long ret = bindings.NodeSigner_sign_invoice(this.ptr, InternalUtils.encodeUint8Array(hrp_bytes), InternalUtils.encodeUint8Array(InternalUtils.convUInt5Array(invoice_data)), recipient);
                GC.KeepAlive(this);
                GC.KeepAlive(hrp_bytes);
                GC.KeepAlive(invoice_data);
@@ -208,6 +259,52 @@ public class NodeSigner : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Signs the [`TaggedHash`] of a BOLT 12 invoice request.
+        * 
+        * May be called by a function passed to [`UnsignedInvoiceRequest::sign`] where
+        * `invoice_request` is the callee.
+        * 
+        * Implementors may check that the `invoice_request` is expected rather than blindly signing
+        * the tagged hash. An `Ok` result should sign `invoice_request.tagged_hash().as_digest()` with
+        * the node's signing key or an ephemeral key to preserve privacy, whichever is associated with
+        * [`UnsignedInvoiceRequest::payer_id`].
+        * 
+        * [`TaggedHash`]: crate::offers::merkle::TaggedHash
+        */
+       public Result_SchnorrSignatureNoneZ sign_bolt12_invoice_request(org.ldk.structs.UnsignedInvoiceRequest invoice_request) {
+               long ret = bindings.NodeSigner_sign_bolt12_invoice_request(this.ptr, invoice_request == null ? 0 : invoice_request.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(invoice_request);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SchnorrSignatureNoneZ ret_hu_conv = Result_SchnorrSignatureNoneZ.constr_from_ptr(ret);
+               if (this != null) { this.ptrs_to.AddLast(invoice_request); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Signs the [`TaggedHash`] of a BOLT 12 invoice.
+        * 
+        * May be called by a function passed to [`UnsignedBolt12Invoice::sign`] where `invoice` is the
+        * callee.
+        * 
+        * Implementors may check that the `invoice` is expected rather than blindly signing the tagged
+        * hash. An `Ok` result should sign `invoice.tagged_hash().as_digest()` with the node's signing
+        * key or an ephemeral key to preserve privacy, whichever is associated with
+        * [`UnsignedBolt12Invoice::signing_pubkey`].
+        * 
+        * [`TaggedHash`]: crate::offers::merkle::TaggedHash
+        */
+       public Result_SchnorrSignatureNoneZ sign_bolt12_invoice(org.ldk.structs.UnsignedBolt12Invoice invoice) {
+               long ret = bindings.NodeSigner_sign_bolt12_invoice(this.ptr, invoice == null ? 0 : invoice.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(invoice);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SchnorrSignatureNoneZ ret_hu_conv = Result_SchnorrSignatureNoneZ.constr_from_ptr(ret);
+               if (this != null) { this.ptrs_to.AddLast(invoice); };
+               return ret_hu_conv;
+       }
+
        /**
         * Sign a gossip message.
         * 
@@ -216,12 +313,12 @@ public class NodeSigner : CommonBase {
         * message to be broadcast, as otherwise it may prevent one from receiving funds over the
         * corresponding channel.
         */
-       public Result_SignatureNoneZ sign_gossip_message(org.ldk.structs.UnsignedGossipMessage msg) {
+       public Result_ECDSASignatureNoneZ sign_gossip_message(org.ldk.structs.UnsignedGossipMessage msg) {
                long ret = bindings.NodeSigner_sign_gossip_message(this.ptr, msg.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(msg);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_SignatureNoneZ ret_hu_conv = Result_SignatureNoneZ.constr_from_ptr(ret);
+               Result_ECDSASignatureNoneZ ret_hu_conv = Result_ECDSASignatureNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(msg); };
                return ret_hu_conv;
        }
index c23621e4a4a5eb9ea02ed7f1c03095b7e306c11d..2ac035d9703463e7d0b65c2478f105e753ff03da 100644 (file)
@@ -51,19 +51,18 @@ public class Offer : CommonBase {
         * for the selected chain.
         */
        public byte[][] chains() {
-               byte[][] ret = bindings.Offer_chains(this.ptr);
+               long ret = bindings.Offer_chains(this.ptr);
                GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Returns whether the given chain is supported by the offer.
-        */
-       public bool supports_chain(byte[] chain) {
-               bool ret = bindings.Offer_supports_chain(this.ptr, InternalUtils.check_arr_len(chain, 32));
-               GC.KeepAlive(this);
-               GC.KeepAlive(chain);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_8_len = InternalUtils.getArrayLength(ret);
+               byte[][] ret_conv_8_arr = new byte[ret_conv_8_len][];
+               for (int i = 0; i < ret_conv_8_len; i++) {
+                       long ret_conv_8 = InternalUtils.getU64ArrayElem(ret, i);
+                       byte[] ret_conv_8_conv = InternalUtils.decodeUint8Array(ret_conv_8);
+                       ret_conv_8_arr[i] = ret_conv_8_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_8_arr;
        }
 
        /**
@@ -109,8 +108,8 @@ public class Offer : CommonBase {
        /**
         * Features pertaining to the offer.
         */
-       public OfferFeatures features() {
-               long ret = bindings.Offer_features(this.ptr);
+       public OfferFeatures offer_features() {
+               long ret = bindings.Offer_offer_features(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.OfferFeatures ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.OfferFeatures(null, ret); }
@@ -123,24 +122,15 @@ public class Offer : CommonBase {
         * 
         * If `None`, the offer does not expire.
         */
-       public Option_DurationZ absolute_expiry() {
+       public Option_u64Z absolute_expiry() {
                long ret = bindings.Offer_absolute_expiry(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_DurationZ ret_hu_conv = org.ldk.structs.Option_DurationZ.constr_from_ptr(ret);
+               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;
        }
 
-       /**
-        * Whether the offer has expired.
-        */
-       public bool is_expired() {
-               bool ret = bindings.Offer_is_expired(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
        /**
         * The issuer of the offer, 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.
@@ -161,16 +151,18 @@ public class Offer : CommonBase {
         * recipient privacy by obfuscating its node id.
         */
        public BlindedPath[] paths() {
-               long[] ret = bindings.Offer_paths(this.ptr);
+               long ret = bindings.Offer_paths(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_13_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_13_len = InternalUtils.getArrayLength(ret);
                BlindedPath[] ret_conv_13_arr = new BlindedPath[ret_conv_13_len];
                for (int n = 0; n < ret_conv_13_len; n++) {
-                       long ret_conv_13 = ret[n];
+                       long ret_conv_13 = InternalUtils.getU64ArrayElem(ret, n);
                        org.ldk.structs.BlindedPath ret_conv_13_hu_conv = null; if (ret_conv_13 < 0 || ret_conv_13 > 4096) { ret_conv_13_hu_conv = new org.ldk.structs.BlindedPath(null, ret_conv_13); }
                        if (ret_conv_13_hu_conv != null) { ret_conv_13_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_13_arr[n] = ret_conv_13_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_13_arr;
        }
 
@@ -186,6 +178,36 @@ public class Offer : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * The public key used by the recipient to sign invoices.
+        */
+       public byte[] signing_pubkey() {
+               long ret = bindings.Offer_signing_pubkey(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Returns whether the given chain is supported by the offer.
+        */
+       public bool supports_chain(byte[] chain) {
+               bool ret = bindings.Offer_supports_chain(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(chain, 32)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(chain);
+               return ret;
+       }
+
+       /**
+        * Whether the offer has expired.
+        */
+       public bool is_expired() {
+               bool ret = bindings.Offer_is_expired(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
        /**
         * Returns whether the given quantity is valid for the offer.
         */
@@ -207,29 +229,22 @@ public class Offer : CommonBase {
                return ret;
        }
 
-       /**
-        * The public key used by the recipient to sign invoices.
-        */
-       public byte[] signing_pubkey() {
-               byte[] ret = bindings.Offer_signing_pubkey(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
        /**
         * Serialize the Offer object into a byte array which can be read by Offer_read
         */
        public byte[] write() {
-               byte[] ret = bindings.Offer_write(this.ptr);
+               long ret = bindings.Offer_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a Offer object from a string
         */
        public static Result_OfferBolt12ParseErrorZ from_str(string s) {
-               long ret = bindings.Offer_from_str(s);
+               long ret = bindings.Offer_from_str(InternalUtils.encodeString(s));
                GC.KeepAlive(s);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_OfferBolt12ParseErrorZ ret_hu_conv = Result_OfferBolt12ParseErrorZ.constr_from_ptr(ret);
index 6ce10456eb99b565c2282be247932dabe9537bc2..9bfc37876ef2c6131170321633dbac5486e564e0 100644 (file)
@@ -82,6 +82,42 @@ public class OfferFeatures : CommonBase {
                return ret;
        }
 
+       /**
+        * Sets a required feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Required bits are even. If an odd bit is given, then the corresponding even bit will
+        * be set instead (i.e., `bit - 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_required_feature_bit(long bit) {
+               long ret = bindings.OfferFeatures_set_required_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Sets an optional feature bit. Errors if `bit` is outside the feature range as defined
+        * by [BOLT 9].
+        * 
+        * Note: Optional bits are odd. If an even bit is given, then the corresponding odd bit will be
+        * set instead (i.e., `bit + 1`).
+        * 
+        * [BOLT 9]: https://github.com/lightning/bolts/blob/master/09-features.md
+        */
+       public Result_NoneNoneZ set_optional_feature_bit(long bit) {
+               long ret = bindings.OfferFeatures_set_optional_feature_bit(this.ptr, bit);
+               GC.KeepAlive(this);
+               GC.KeepAlive(bit);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
        /**
         * Sets a required custom feature bit. Errors if `bit` is outside the custom range as defined
         * by [bLIP 2] or if it is a known `T` feature.
index dbe6f19d20eb4fcf1cd2ff95661dddf886a7c4e8..af4a42f0daf428a2c78a026aa7ea8e9c79109791 100644 (file)
@@ -114,29 +114,22 @@ public class OffersMessage : CommonBase {
                return ret_hu_conv;
        }
 
-       /**
-        * The TLV record type for the message as used in an `onionmsg_tlv` TLV stream.
-        */
-       public long tlv_type() {
-               long ret = bindings.OffersMessage_tlv_type(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
        /**
         * Serialize the OffersMessage object into a byte array which can be read by OffersMessage_read
         */
        public byte[] write() {
-               byte[] ret = bindings.OffersMessage_write(this.ptr);
+               long ret = bindings.OffersMessage_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a OffersMessage from a byte array, created by OffersMessage_write
         */
        public static Result_OffersMessageDecodeErrorZ read(byte[] ser, long arg_a, org.ldk.structs.Logger arg_b) {
-               long ret = bindings.OffersMessage_read(ser, arg_a, arg_b.ptr);
+               long ret = bindings.OffersMessage_read(InternalUtils.encodeUint8Array(ser), arg_a, arg_b.ptr);
                GC.KeepAlive(ser);
                GC.KeepAlive(arg_a);
                GC.KeepAlive(arg_b);
index 30b15de91cfbea5c02bce31d57a04d9a3e414d7d..e5fc001a6a569c729132c7f6948d8e361081d7d9 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,29 +6,40 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of OffersMessageHandler */
+public interface OffersMessageHandlerInterface {
+       /**Handles the given message by either responding with an [`Bolt12Invoice`], sending a payment,
+        * or replying with an error.
+        * 
+        * The returned [`OffersMessage`], if any, is enqueued to be sent by [`OnionMessenger`].
+        * 
+        * [`OnionMessenger`]: crate::onion_message::OnionMessenger
+        */
+       Option_OffersMessageZ handle_message(OffersMessage message);
+       /**Releases any [`OffersMessage`]s that need to be sent.
+        * 
+        * Typically, this is used for messages initiating a payment flow rather than in response to
+        * another message. The latter should use the return value of [`Self::handle_message`].
+        */
+       ThreeTuple_OffersMessageDestinationBlindedPathZ[] release_pending_messages();
+}
+
 /**
  * A handler for an [`OnionMessage`] containing a BOLT 12 Offers message as its payload.
  * 
  * [`OnionMessage`]: crate::ln::msgs::OnionMessage
  */
 public class OffersMessageHandler : CommonBase {
-       internal readonly bindings.LDKOffersMessageHandler bindings_instance;
+       internal bindings.LDKOffersMessageHandler bindings_instance;
+       internal long instance_idx;
+
        internal OffersMessageHandler(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private OffersMessageHandler(bindings.LDKOffersMessageHandler arg) : base(bindings.LDKOffersMessageHandler_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~OffersMessageHandler() {
                if (ptr != 0) { bindings.OffersMessageHandler_free(ptr); }
        }
 
-       public interface OffersMessageHandlerInterface {
-               /**
-                * Handles the given message by either responding with an [`Bolt12Invoice`], sending a payment,
-                * or replying with an error.
-                */
-               Option_OffersMessageZ handle_message(OffersMessage _message);
-       }
        private class LDKOffersMessageHandlerHolder { internal OffersMessageHandler held; }
        private class LDKOffersMessageHandlerImpl : bindings.LDKOffersMessageHandler {
                internal LDKOffersMessageHandlerImpl(OffersMessageHandlerInterface arg, LDKOffersMessageHandlerHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
@@ -42,15 +54,33 @@ public class OffersMessageHandler : CommonBase {
                        if (impl_holder.held != null) { impl_holder.held.ptrs_to.AddLast(ret); };
                        return result;
                }
+               public long release_pending_messages() {
+                       ThreeTuple_OffersMessageDestinationBlindedPathZ[] ret = arg.release_pending_messages();
+                               GC.KeepAlive(arg);
+                       long result = InternalUtils.encodeUint64Array(InternalUtils.mapArray(ret, ret_conv_49 => ret_conv_49 == null ? 0 : ret_conv_49.clone_ptr()));
+                       return result;
+               }
        }
+
+       /** Creates a new instance of OffersMessageHandler from a given implementation */
        public static OffersMessageHandler new_impl(OffersMessageHandlerInterface arg) {
                LDKOffersMessageHandlerHolder impl_holder = new LDKOffersMessageHandlerHolder();
-               impl_holder.held = new OffersMessageHandler(new LDKOffersMessageHandlerImpl(arg, impl_holder));
+               LDKOffersMessageHandlerImpl impl = new LDKOffersMessageHandlerImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKOffersMessageHandler_new(impl);
+
+               impl_holder.held = new OffersMessageHandler(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Handles the given message by either responding with an [`Bolt12Invoice`], sending a payment,
         * or replying with an error.
+        * 
+        * The returned [`OffersMessage`], if any, is enqueued to be sent by [`OnionMessenger`].
+        * 
+        * [`OnionMessenger`]: crate::onion_message::OnionMessenger
         */
        public Option_OffersMessageZ handle_message(org.ldk.structs.OffersMessage message) {
                long ret = bindings.OffersMessageHandler_handle_message(this.ptr, message.ptr);
@@ -63,5 +93,27 @@ public class OffersMessageHandler : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Releases any [`OffersMessage`]s that need to be sent.
+        * 
+        * Typically, this is used for messages initiating a payment flow rather than in response to
+        * another message. The latter should use the return value of [`Self::handle_message`].
+        */
+       public ThreeTuple_OffersMessageDestinationBlindedPathZ[] release_pending_messages() {
+               long ret = bindings.OffersMessageHandler_release_pending_messages(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_49_len = InternalUtils.getArrayLength(ret);
+               ThreeTuple_OffersMessageDestinationBlindedPathZ[] ret_conv_49_arr = new ThreeTuple_OffersMessageDestinationBlindedPathZ[ret_conv_49_len];
+               for (int x = 0; x < ret_conv_49_len; x++) {
+                       long ret_conv_49 = InternalUtils.getU64ArrayElem(ret, x);
+                       ThreeTuple_OffersMessageDestinationBlindedPathZ ret_conv_49_hu_conv = new ThreeTuple_OffersMessageDestinationBlindedPathZ(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;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_49_arr;
+       }
+
 }
 } } }
index f20ba5ceddff4f89d68a59ea07205d36bf50adb7..47c72bafa455de22f59cfff7851d525b81e15360 100644 (file)
@@ -19,20 +19,58 @@ public class OnionMessage : CommonBase {
         * Used in decrypting the onion packet's payload.
         */
        public byte[] get_blinding_point() {
-               byte[] ret = bindings.OnionMessage_get_blinding_point(this.ptr);
+               long ret = bindings.OnionMessage_get_blinding_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Used in decrypting the onion packet's payload.
         */
        public void set_blinding_point(byte[] val) {
-               bindings.OnionMessage_set_blinding_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.OnionMessage_set_blinding_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
 
+       /**
+        * The full onion packet including hop data, pubkey, and hmac
+        */
+       public Packet get_onion_routing_packet() {
+               long ret = bindings.OnionMessage_get_onion_routing_packet(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Packet ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Packet(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The full onion packet including hop data, pubkey, and hmac
+        */
+       public void set_onion_routing_packet(org.ldk.structs.Packet val) {
+               bindings.OnionMessage_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); };
+       }
+
+       /**
+        * Constructs a new OnionMessage given each field
+        */
+       public static OnionMessage of(byte[] blinding_point_arg, org.ldk.structs.Packet onion_routing_packet_arg) {
+               long ret = bindings.OnionMessage_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(blinding_point_arg, 33)), onion_routing_packet_arg == null ? 0 : onion_routing_packet_arg.ptr);
+               GC.KeepAlive(blinding_point_arg);
+               GC.KeepAlive(onion_routing_packet_arg);
+               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(ret_hu_conv); };
+               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.OnionMessage_clone_ptr(this.ptr);
                GC.KeepAlive(this);
@@ -72,7 +110,7 @@ public class OnionMessage : CommonBase {
         * Read a OnionMessage from a byte array, created by OnionMessage_write
         */
        public static Result_OnionMessageDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.OnionMessage_read(ser);
+               long ret = bindings.OnionMessage_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_OnionMessageDecodeErrorZ ret_hu_conv = Result_OnionMessageDecodeErrorZ.constr_from_ptr(ret);
@@ -83,9 +121,11 @@ public class OnionMessage : CommonBase {
         * Serialize the OnionMessage object into a byte array which can be read by OnionMessage_read
         */
        public byte[] write() {
-               byte[] ret = bindings.OnionMessage_write(this.ptr);
+               long ret = bindings.OnionMessage_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index ab3ff3ffad725d15bcb57c2a22b2fd1f2daed5d0..8bd84802e170a76e61486fa7636744215f884989 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,87 +6,95 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of OnionMessageContents */
+public interface OnionMessageContentsInterface {
+       /**Returns the TLV type identifying the message contents. MUST be >= 64.
+        */
+       long tlv_type();
+       /**Serialize the object into a byte array
+        */
+       byte[] write();
+}
+
 /**
- * The contents of an onion message. In the context of offers, this would be the invoice, invoice
- * request, or invoice error.
+ * The contents of an onion message.
  */
 public class OnionMessageContents : CommonBase {
-       protected OnionMessageContents(object _dummy, long ptr) : base(ptr) { }
+       internal bindings.LDKOnionMessageContents bindings_instance;
+       internal long instance_idx;
+
+       internal OnionMessageContents(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
        ~OnionMessageContents() {
                if (ptr != 0) { bindings.OnionMessageContents_free(ptr); }
        }
 
-       internal static OnionMessageContents constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKOnionMessageContents_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new OnionMessageContents_Offers(ptr);
-                       case 1: return new OnionMessageContents_Custom(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
+       private class LDKOnionMessageContentsHolder { internal OnionMessageContents held; }
+       private class LDKOnionMessageContentsImpl : bindings.LDKOnionMessageContents {
+               internal LDKOnionMessageContentsImpl(OnionMessageContentsInterface arg, LDKOnionMessageContentsHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
+               private OnionMessageContentsInterface arg;
+               private LDKOnionMessageContentsHolder impl_holder;
+               public long tlv_type() {
+                       long ret = arg.tlv_type();
+                               GC.KeepAlive(arg);
+                       return ret;
                }
-       }
-
-       /** A OnionMessageContents of type Offers */
-       public class OnionMessageContents_Offers : OnionMessageContents {
-               public OffersMessage offers;
-               internal OnionMessageContents_Offers(long ptr) : base(null, ptr) {
-                       long offers = bindings.LDKOnionMessageContents_Offers_get_offers(ptr);
-                       org.ldk.structs.OffersMessage offers_hu_conv = org.ldk.structs.OffersMessage.constr_from_ptr(offers);
-                       if (offers_hu_conv != null) { offers_hu_conv.ptrs_to.AddLast(this); };
-                       this.offers = offers_hu_conv;
+               public long write() {
+                       byte[] ret = arg.write();
+                               GC.KeepAlive(arg);
+                       long result = InternalUtils.encodeUint8Array(ret);
+                       return result;
                }
        }
-       /** A OnionMessageContents of type Custom */
-       public class OnionMessageContents_Custom : OnionMessageContents {
-               public CustomOnionMessageContents custom;
-               internal OnionMessageContents_Custom(long ptr) : base(null, ptr) {
-                       long custom = bindings.LDKOnionMessageContents_Custom_get_custom(ptr);
-                       CustomOnionMessageContents ret_hu_conv = new CustomOnionMessageContents(null, custom);
-                       if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-                       this.custom = ret_hu_conv;
-               }
+
+       /** Creates a new instance of OnionMessageContents from a given implementation */
+       public static OnionMessageContents new_impl(OnionMessageContentsInterface arg) {
+               LDKOnionMessageContentsHolder impl_holder = new LDKOnionMessageContentsHolder();
+               LDKOnionMessageContentsImpl impl = new LDKOnionMessageContentsImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKOnionMessageContents_new(impl);
+
+               impl_holder.held = new OnionMessageContents(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
+               return impl_holder.held;
        }
-       internal long clone_ptr() {
-               long ret = bindings.OnionMessageContents_clone_ptr(this.ptr);
+
+       /**
+        * Returns the TLV type identifying the message contents. MUST be >= 64.
+        */
+       public long tlv_type() {
+               long ret = bindings.OnionMessageContents_tlv_type(this.ptr);
                GC.KeepAlive(this);
                return ret;
        }
 
        /**
-        * Creates a copy of the OnionMessageContents
+        * Serialize the object into a byte array
         */
-       public OnionMessageContents clone() {
-               long ret = bindings.OnionMessageContents_clone(this.ptr);
+       public byte[] write() {
+               long ret = bindings.OnionMessageContents_write(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.OnionMessageContents ret_hu_conv = org.ldk.structs.OnionMessageContents.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
-       /**
-        * Utility method to constructs a new Offers-variant OnionMessageContents
-        */
-       public static OnionMessageContents offers(org.ldk.structs.OffersMessage a) {
-               long ret = bindings.OnionMessageContents_offers(a.ptr);
-               GC.KeepAlive(a);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.OnionMessageContents ret_hu_conv = org.ldk.structs.OnionMessageContents.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;
+       internal long clone_ptr() {
+               long ret = bindings.OnionMessageContents_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
        }
 
        /**
-        * Utility method to constructs a new Custom-variant OnionMessageContents
+        * Creates a copy of a OnionMessageContents
         */
-       public static OnionMessageContents custom(org.ldk.structs.CustomOnionMessageContents a) {
-               long ret = bindings.OnionMessageContents_custom(a.ptr);
-               GC.KeepAlive(a);
+       public OnionMessageContents clone() {
+               long ret = bindings.OnionMessageContents_clone(this.ptr);
+               GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.OnionMessageContents ret_hu_conv = org.ldk.structs.OnionMessageContents.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); };
+               OnionMessageContents ret_hu_conv = new OnionMessageContents(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
                return ret_hu_conv;
        }
 
index 6b77c7a8b967113b07d323470f3d45458a476414..ac96df6ff70aa00bff3d27d61cd240e48193c592 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,74 +6,85 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of OnionMessageHandler */
+public interface OnionMessageHandlerInterface {
+       /**Handle an incoming `onion_message` message from the given peer.
+        */
+       void handle_onion_message(byte[] peer_node_id, OnionMessage msg);
+       /**Returns the next pending onion message for the peer with the given node id.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       OnionMessage next_onion_message_for_peer(byte[] peer_node_id);
+       /**Called when a connection is established with a peer. Can be used to track which peers
+        * advertise onion message support and are online.
+        * 
+        * May return an `Err(())` if the features the peer supports are not sufficient to communicate
+        * with us. Implementors should be somewhat conservative about doing so, however, as other
+        * message handlers may still wish to communicate with this peer.
+        */
+       Result_NoneNoneZ peer_connected(byte[] their_node_id, Init init, bool inbound);
+       /**Indicates a connection to the peer failed/an existing connection was lost. Allows handlers to
+        * drop and refuse to forward onion messages to this peer.
+        */
+       void peer_disconnected(byte[] their_node_id);
+       /**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.
+        */
+       NodeFeatures provided_node_features();
+       /**Gets the init feature flags which should be sent to the given peer. All available handlers
+        * are queried similarly and their feature flags are OR'd together to form the [`InitFeatures`]
+        * which are sent in our [`Init`] message.
+        * 
+        * Note that this method is called before [`Self::peer_connected`].
+        */
+       InitFeatures provided_init_features(byte[] their_node_id);
+}
+
 /**
- * A trait to describe an object that can receive onion messages.
+ * A handler for received [`OnionMessage`]s and for providing generated ones to send.
  */
 public class OnionMessageHandler : CommonBase {
-       internal readonly bindings.LDKOnionMessageHandler bindings_instance;
+       internal bindings.LDKOnionMessageHandler bindings_instance;
+       internal long instance_idx;
+
        internal OnionMessageHandler(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private OnionMessageHandler(bindings.LDKOnionMessageHandler arg, bindings.LDKOnionMessageProvider OnionMessageProvider) : base(bindings.LDKOnionMessageHandler_new(arg, OnionMessageProvider)) {
-               this.ptrs_to.AddLast(arg);
-               this.ptrs_to.AddLast(OnionMessageProvider);
-               this.bindings_instance = arg;
-       }
        ~OnionMessageHandler() {
                if (ptr != 0) { bindings.OnionMessageHandler_free(ptr); }
        }
 
-       public interface OnionMessageHandlerInterface {
-               /**
-                * Handle an incoming `onion_message` message from the given peer.
-                */
-               void handle_onion_message(byte[] _peer_node_id, OnionMessage _msg);
-               /**
-                * Called when a connection is established with a peer. Can be used to track which peers
-                * advertise onion message support and are online.
-                * 
-                * May return an `Err(())` if the features the peer supports are not sufficient to communicate
-                * with us. Implementors should be somewhat conservative about doing so, however, as other
-                * message handlers may still wish to communicate with this peer.
-                */
-               Result_NoneNoneZ peer_connected(byte[] _their_node_id, Init _init, bool _inbound);
-               /**
-                * Indicates a connection to the peer failed/an existing connection was lost. Allows handlers to
-                * drop and refuse to forward onion messages to this peer.
-                */
-               void peer_disconnected(byte[] _their_node_id);
-               /**
-                * 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.
-                */
-               NodeFeatures provided_node_features();
-               /**
-                * Gets the init feature flags which should be sent to the given peer. All available handlers
-                * are queried similarly and their feature flags are OR'd together to form the [`InitFeatures`]
-                * which are sent in our [`Init`] message.
-                * 
-                * Note that this method is called before [`Self::peer_connected`].
-                */
-               InitFeatures provided_init_features(byte[] _their_node_id);
-       }
        private class LDKOnionMessageHandlerHolder { internal OnionMessageHandler held; }
        private class LDKOnionMessageHandlerImpl : bindings.LDKOnionMessageHandler {
                internal LDKOnionMessageHandlerImpl(OnionMessageHandlerInterface arg, LDKOnionMessageHandlerHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private OnionMessageHandlerInterface arg;
                private LDKOnionMessageHandlerHolder impl_holder;
-               public void handle_onion_message(byte[] _peer_node_id, long _msg) {
+               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); }
-                       arg.handle_onion_message(_peer_node_id, _msg_hu_conv);
+                       arg.handle_onion_message(_peer_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
-               public long peer_connected(byte[] _their_node_id, long _init, bool _inbound) {
+               public long next_onion_message_for_peer(long _peer_node_id) {
+                       byte[] _peer_node_id_conv = InternalUtils.decodeUint8Array(_peer_node_id);
+                       OnionMessage ret = arg.next_onion_message_for_peer(_peer_node_id_conv);
+                               GC.KeepAlive(arg);
+                       long result = ret == null ? 0 : ret.clone_ptr();
+                       return result;
+               }
+               public long peer_connected(long _their_node_id, long _init, bool _inbound) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.Init _init_hu_conv = null; if (_init < 0 || _init > 4096) { _init_hu_conv = new org.ldk.structs.Init(null, _init); }
-                       Result_NoneNoneZ ret = arg.peer_connected(_their_node_id, _init_hu_conv, _inbound);
+                       Result_NoneNoneZ ret = arg.peer_connected(_their_node_id_conv, _init_hu_conv, _inbound);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public void peer_disconnected(byte[] _their_node_id) {
-                       arg.peer_disconnected(_their_node_id);
+               public void peer_disconnected(long _their_node_id) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
+                       arg.peer_disconnected(_their_node_id_conv);
                                GC.KeepAlive(arg);
                }
                public long provided_node_features() {
@@ -81,39 +93,53 @@ public class OnionMessageHandler : CommonBase {
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long provided_init_features(byte[] _their_node_id) {
-                       InitFeatures ret = arg.provided_init_features(_their_node_id);
+               public long provided_init_features(long _their_node_id) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
+                       InitFeatures ret = arg.provided_init_features(_their_node_id_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
        }
-       public static OnionMessageHandler new_impl(OnionMessageHandlerInterface arg, OnionMessageProvider.OnionMessageProviderInterface OnionMessageProvider_impl) {
+
+       /** Creates a new instance of OnionMessageHandler from a given implementation */
+       public static OnionMessageHandler new_impl(OnionMessageHandlerInterface arg) {
                LDKOnionMessageHandlerHolder impl_holder = new LDKOnionMessageHandlerHolder();
-               impl_holder.held = new OnionMessageHandler(new LDKOnionMessageHandlerImpl(arg, impl_holder), OnionMessageProvider.new_impl(OnionMessageProvider_impl).bindings_instance);
-               return impl_holder.held;
-       }
+               LDKOnionMessageHandlerImpl impl = new LDKOnionMessageHandlerImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKOnionMessageHandler_new(impl);
 
-       /**
-        * Gets the underlying OnionMessageProvider.
-        */
-       public OnionMessageProvider get_onion_message_provider() {
-               OnionMessageProvider res = new OnionMessageProvider(null, bindings.LDKOnionMessageHandler_get_OnionMessageProvider(this.ptr));
-               this.ptrs_to.AddLast(res);
-               return res;
+               impl_holder.held = new OnionMessageHandler(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
+               return impl_holder.held;
        }
 
        /**
         * Handle an incoming `onion_message` message from the given peer.
         */
        public void handle_onion_message(byte[] peer_node_id, org.ldk.structs.OnionMessage msg) {
-               bindings.OnionMessageHandler_handle_onion_message(this.ptr, InternalUtils.check_arr_len(peer_node_id, 33), msg == null ? 0 : msg.ptr);
+               bindings.OnionMessageHandler_handle_onion_message(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(peer_node_id, 33)), msg == null ? 0 : msg.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(peer_node_id);
                GC.KeepAlive(msg);
                if (this != null) { this.ptrs_to.AddLast(msg); };
        }
 
+       /**
+        * Returns the next pending onion message for the peer with the given node id.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public OnionMessage next_onion_message_for_peer(byte[] peer_node_id) {
+               long ret = bindings.OnionMessageHandler_next_onion_message_for_peer(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(peer_node_id, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(peer_node_id);
+               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;
+       }
+
        /**
         * Called when a connection is established with a peer. Can be used to track which peers
         * advertise onion message support and are online.
@@ -123,7 +149,7 @@ public class OnionMessageHandler : CommonBase {
         * message handlers may still wish to communicate with this peer.
         */
        public Result_NoneNoneZ peer_connected(byte[] their_node_id, org.ldk.structs.Init init, bool inbound) {
-               long ret = bindings.OnionMessageHandler_peer_connected(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), init == null ? 0 : init.ptr, inbound);
+               long ret = bindings.OnionMessageHandler_peer_connected(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_node_id, 33)), init == null ? 0 : init.ptr, inbound);
                GC.KeepAlive(this);
                GC.KeepAlive(their_node_id);
                GC.KeepAlive(init);
@@ -139,7 +165,7 @@ public class OnionMessageHandler : CommonBase {
         * drop and refuse to forward onion messages to this peer.
         */
        public void peer_disconnected(byte[] their_node_id) {
-               bindings.OnionMessageHandler_peer_disconnected(this.ptr, InternalUtils.check_arr_len(their_node_id, 33));
+               bindings.OnionMessageHandler_peer_disconnected(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_node_id, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(their_node_id);
        }
@@ -166,7 +192,7 @@ public class OnionMessageHandler : CommonBase {
         * Note that this method is called before [`Self::peer_connected`].
         */
        public InitFeatures provided_init_features(byte[] their_node_id) {
-               long ret = bindings.OnionMessageHandler_provided_init_features(this.ptr, InternalUtils.check_arr_len(their_node_id, 33));
+               long ret = bindings.OnionMessageHandler_provided_init_features(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_node_id, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(their_node_id);
                if (ret >= 0 && ret <= 4096) { return null; }
index fca88d9716f9f5ea06d97c24baa72eaa08d4bb83..087c20277d81854d988618b8d91fee9ad75fc0c5 100644 (file)
@@ -7,7 +7,7 @@ namespace org { namespace ldk { namespace structs {
 
 
 /**
- * A path for sending an [`msgs::OnionMessage`].
+ * A path for sending an [`OnionMessage`].
  */
 public class OnionMessagePath : CommonBase {
        internal OnionMessagePath(object _dummy, long ptr) : base(ptr) { }
@@ -21,16 +21,25 @@ public class OnionMessagePath : CommonBase {
         * Returns a copy of the field.
         */
        public byte[][] get_intermediate_nodes() {
-               byte[][] ret = bindings.OnionMessagePath_get_intermediate_nodes(this.ptr);
+               long ret = bindings.OnionMessagePath_get_intermediate_nodes(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_8_len = InternalUtils.getArrayLength(ret);
+               byte[][] ret_conv_8_arr = new byte[ret_conv_8_len][];
+               for (int i = 0; i < ret_conv_8_len; i++) {
+                       long ret_conv_8 = InternalUtils.getU64ArrayElem(ret, i);
+                       byte[] ret_conv_8_conv = InternalUtils.decodeUint8Array(ret_conv_8);
+                       ret_conv_8_arr[i] = ret_conv_8_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_8_arr;
        }
 
        /**
         * Nodes on the path between the sender and the destination.
         */
        public void set_intermediate_nodes(byte[][] val) {
-               bindings.OnionMessagePath_set_intermediate_nodes(this.ptr, val != null ? InternalUtils.mapArray(val, val_conv_8 => InternalUtils.check_arr_len(val_conv_8, 33)) : null);
+               bindings.OnionMessagePath_set_intermediate_nodes(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(val, val_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val_conv_8, 33)))));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -61,7 +70,7 @@ public class OnionMessagePath : CommonBase {
         * 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(intermediate_nodes_arg != null ? InternalUtils.mapArray(intermediate_nodes_arg, intermediate_nodes_arg_conv_8 => InternalUtils.check_arr_len(intermediate_nodes_arg_conv_8, 33)) : null, destination_arg.ptr);
+               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);
                GC.KeepAlive(intermediate_nodes_arg);
                GC.KeepAlive(destination_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
diff --git a/c_sharp/src/org/ldk/structs/OnionMessageProvider.cs b/c_sharp/src/org/ldk/structs/OnionMessageProvider.cs
deleted file mode 100644 (file)
index 57fac38..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * A trait indicating an object may generate onion messages to send
- */
-public class OnionMessageProvider : CommonBase {
-       internal readonly bindings.LDKOnionMessageProvider bindings_instance;
-       internal OnionMessageProvider(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private OnionMessageProvider(bindings.LDKOnionMessageProvider arg) : base(bindings.LDKOnionMessageProvider_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
-       ~OnionMessageProvider() {
-               if (ptr != 0) { bindings.OnionMessageProvider_free(ptr); }
-       }
-
-       public interface OnionMessageProviderInterface {
-               /**
-                * Gets the next pending onion message for the peer with the given node id.
-                * 
-                * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
-                */
-               OnionMessage next_onion_message_for_peer(byte[] _peer_node_id);
-       }
-       private class LDKOnionMessageProviderHolder { internal OnionMessageProvider held; }
-       private class LDKOnionMessageProviderImpl : bindings.LDKOnionMessageProvider {
-               internal LDKOnionMessageProviderImpl(OnionMessageProviderInterface arg, LDKOnionMessageProviderHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
-               private OnionMessageProviderInterface arg;
-               private LDKOnionMessageProviderHolder impl_holder;
-               public long next_onion_message_for_peer(byte[] _peer_node_id) {
-                       OnionMessage ret = arg.next_onion_message_for_peer(_peer_node_id);
-                               GC.KeepAlive(arg);
-                       long result = ret == null ? 0 : ret.clone_ptr();
-                       return result;
-               }
-       }
-       public static OnionMessageProvider new_impl(OnionMessageProviderInterface arg) {
-               LDKOnionMessageProviderHolder impl_holder = new LDKOnionMessageProviderHolder();
-               impl_holder.held = new OnionMessageProvider(new LDKOnionMessageProviderImpl(arg, impl_holder));
-               return impl_holder.held;
-       }
-       /**
-        * Gets the next pending onion message for the peer with the given node id.
-        * 
-        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
-        */
-       public OnionMessage next_onion_message_for_peer(byte[] peer_node_id) {
-               long ret = bindings.OnionMessageProvider_next_onion_message_for_peer(this.ptr, InternalUtils.check_arr_len(peer_node_id, 33));
-               GC.KeepAlive(this);
-               GC.KeepAlive(peer_node_id);
-               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;
-       }
-
-}
-} } }
index 457b960870a4dc7d5334b6edc184f359eecac841..5ad8a929c735416ac93bd6a87a6d3bd3ab33fb5e 100644 (file)
@@ -7,9 +7,21 @@ namespace org { namespace ldk { namespace structs {
 
 
 /**
- * A sender, receiver and forwarder of onion messages. In upcoming releases, this object will be
- * used to retrieve invoices and fulfill invoice requests from [offers]. Currently, only sending
- * and receiving custom onion messages is supported.
+ * A sender, receiver and forwarder of [`OnionMessage`]s.
+ * 
+ * # Handling Messages
+ * 
+ * `OnionMessenger` implements [`OnionMessageHandler`], making it responsible for either forwarding
+ * messages to peers or delegating to the appropriate handler for the message type. Currently, the
+ * available handlers are:
+ * [`OffersMessageHandler`], for responding to [`InvoiceRequest`]s and paying [`Bolt12Invoice`]s
+ * [`CustomOnionMessageHandler`], for handling user-defined message types
+ * 
+ * # Sending Messages
+ * 
+ * [`OnionMessage`]s are sent initially using [`OnionMessenger::send_onion_message`]. When handling
+ * a message, the matched handler may return a response message which `OnionMessenger` will send
+ * on its behalf.
  * 
  * # Example
  * 
@@ -21,7 +33,7 @@ namespace org { namespace ldk { namespace structs {
  * # use lightning::sign::KeysManager;
  * # use lightning::ln::peer_handler::IgnoringMessageHandler;
  * # use lightning::onion_message::messenger::{Destination, MessageRouter, OnionMessenger, OnionMessagePath};
- * # use lightning::onion_message::packet::{CustomOnionMessageContents, OnionMessageContents};
+ * # use lightning::onion_message::packet::OnionMessageContents;
  * # use lightning::util::logger::{Logger, Record};
  * # use lightning::util::ser::{Writeable, Writer};
  * # use lightning::io;
@@ -63,7 +75,7 @@ namespace org { namespace ldk { namespace structs {
  * \t\t// Write your custom onion message to `w`
  * \t}
  * }
- * impl CustomOnionMessageContents for YourCustomMessage {
+ * impl OnionMessageContents for YourCustomMessage {
  * \tfn tlv_type(&self) -> u64 {
  * \t\t# let your_custom_message_type = 42;
  * \t\tyour_custom_message_type
@@ -75,8 +87,7 @@ namespace org { namespace ldk { namespace structs {
  * \tdestination: Destination::Node(destination_node_id),
  * };
  * let reply_path = None;
- * # let your_custom_message = YourCustomMessage {};
- * let message = OnionMessageContents::Custom(your_custom_message);
+ * # let message = YourCustomMessage {};
  * onion_messenger.send_onion_message(path, message, reply_path);
  * 
  * Create a blinded path to yourself, for someone to send an onion message to.
@@ -90,13 +101,12 @@ namespace org { namespace ldk { namespace structs {
  * \tdestination: Destination::BlindedPath(blinded_path),
  * };
  * let reply_path = None;
- * # let your_custom_message = YourCustomMessage {};
- * let message = OnionMessageContents::Custom(your_custom_message);
+ * # let message = YourCustomMessage {};
  * onion_messenger.send_onion_message(path, message, reply_path);
  * ```
  * 
- * [offers]: <https://github.com/lightning/bolts/pull/798>
- * [`OnionMessenger`]: crate::onion_message::OnionMessenger
+ * [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest
+ * [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
  */
 public class OnionMessenger : CommonBase {
        internal OnionMessenger(object _dummy, long ptr) : base(ptr) { }
@@ -129,22 +139,23 @@ public class OnionMessenger : CommonBase {
        }
 
        /**
-        * Send an onion message with contents `message` to the destination of `path`.
+        * Sends an [`OnionMessage`] with the given `contents` for sending to the destination of
+        * `path`.
         * 
         * 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 message, org.ldk.structs.BlindedPath reply_path) {
-               long ret = bindings.OnionMessenger_send_onion_message(this.ptr, path == null ? 0 : path.ptr, message.ptr, reply_path == null ? 0 : reply_path.ptr);
+       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);
                GC.KeepAlive(this);
                GC.KeepAlive(path);
-               GC.KeepAlive(message);
+               GC.KeepAlive(contents);
                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); };
-               if (this != null) { this.ptrs_to.AddLast(message); };
+               if (this != null) { this.ptrs_to.AddLast(contents); };
                if (this != null) { this.ptrs_to.AddLast(reply_path); };
                return ret_hu_conv;
        }
@@ -162,18 +173,5 @@ public class OnionMessenger : CommonBase {
                return ret_hu_conv;
        }
 
-       /**
-        * Constructs a new OnionMessageProvider which calls the relevant methods on this_arg.
-        * This copies the `inner` pointer in this_arg and thus the returned OnionMessageProvider must be freed before this_arg is
-        */
-       public OnionMessageProvider as_OnionMessageProvider() {
-               long ret = bindings.OnionMessenger_as_OnionMessageProvider(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               OnionMessageProvider ret_hu_conv = new OnionMessageProvider(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
 }
 } } }
index a7e112223239a6fee44fdcfcec136405f83e4cd3..9a0f4536c02d3a629e7adc2a4e6f4076f61fcae5 100644 (file)
@@ -23,16 +23,18 @@ public class OpenChannel : CommonBase {
         * The genesis hash of the blockchain where the channel is to be opened
         */
        public byte[] get_chain_hash() {
-               byte[] ret = bindings.OpenChannel_get_chain_hash(this.ptr);
+               long ret = bindings.OpenChannel_get_chain_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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 to be opened
         */
        public void set_chain_hash(byte[] val) {
-               bindings.OpenChannel_set_chain_hash(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.OpenChannel_set_chain_hash(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -41,16 +43,18 @@ public class OpenChannel : CommonBase {
         * A temporary channel ID, until the funding outpoint is announced
         */
        public byte[] get_temporary_channel_id() {
-               byte[] ret = bindings.OpenChannel_get_temporary_channel_id(this.ptr);
+               long ret = bindings.OpenChannel_get_temporary_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * A temporary channel ID, until the funding outpoint is announced
         */
        public void set_temporary_channel_id(byte[] val) {
-               bindings.OpenChannel_set_temporary_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.OpenChannel_set_temporary_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -225,16 +229,18 @@ public class OpenChannel : CommonBase {
         * The sender's key controlling the funding transaction
         */
        public byte[] get_funding_pubkey() {
-               byte[] ret = bindings.OpenChannel_get_funding_pubkey(this.ptr);
+               long ret = bindings.OpenChannel_get_funding_pubkey(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The sender's key controlling the funding transaction
         */
        public void set_funding_pubkey(byte[] val) {
-               bindings.OpenChannel_set_funding_pubkey(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.OpenChannel_set_funding_pubkey(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -243,16 +249,18 @@ public class OpenChannel : CommonBase {
         * Used to derive a revocation key for transactions broadcast by counterparty
         */
        public byte[] get_revocation_basepoint() {
-               byte[] ret = bindings.OpenChannel_get_revocation_basepoint(this.ptr);
+               long ret = bindings.OpenChannel_get_revocation_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Used to derive a revocation key for transactions broadcast by counterparty
         */
        public void set_revocation_basepoint(byte[] val) {
-               bindings.OpenChannel_set_revocation_basepoint(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.OpenChannel_set_revocation_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -261,16 +269,18 @@ public class OpenChannel : CommonBase {
         * A payment key to sender for transactions broadcast by counterparty
         */
        public byte[] get_payment_point() {
-               byte[] ret = bindings.OpenChannel_get_payment_point(this.ptr);
+               long ret = bindings.OpenChannel_get_payment_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * A payment key to sender for transactions broadcast by counterparty
         */
        public void set_payment_point(byte[] val) {
-               bindings.OpenChannel_set_payment_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.OpenChannel_set_payment_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -279,16 +289,18 @@ public class OpenChannel : CommonBase {
         * Used to derive a payment key to sender for transactions broadcast by sender
         */
        public byte[] get_delayed_payment_basepoint() {
-               byte[] ret = bindings.OpenChannel_get_delayed_payment_basepoint(this.ptr);
+               long ret = bindings.OpenChannel_get_delayed_payment_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Used to derive a payment key to sender for transactions broadcast by sender
         */
        public void set_delayed_payment_basepoint(byte[] val) {
-               bindings.OpenChannel_set_delayed_payment_basepoint(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.OpenChannel_set_delayed_payment_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -297,16 +309,18 @@ public class OpenChannel : CommonBase {
         * Used to derive an HTLC payment key to sender
         */
        public byte[] get_htlc_basepoint() {
-               byte[] ret = bindings.OpenChannel_get_htlc_basepoint(this.ptr);
+               long ret = bindings.OpenChannel_get_htlc_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Used to derive an HTLC payment key to sender
         */
        public void set_htlc_basepoint(byte[] val) {
-               bindings.OpenChannel_set_htlc_basepoint(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.OpenChannel_set_htlc_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -315,16 +329,18 @@ public class OpenChannel : CommonBase {
         * The first to-be-broadcast-by-sender transaction's per commitment point
         */
        public byte[] get_first_per_commitment_point() {
-               byte[] ret = bindings.OpenChannel_get_first_per_commitment_point(this.ptr);
+               long ret = bindings.OpenChannel_get_first_per_commitment_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The first to-be-broadcast-by-sender transaction's per commitment point
         */
        public void set_first_per_commitment_point(byte[] val) {
-               bindings.OpenChannel_set_first_per_commitment_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.OpenChannel_set_first_per_commitment_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -350,11 +366,11 @@ public class OpenChannel : CommonBase {
        /**
         * A request to pre-set the to-sender output's `scriptPubkey` for when we collaboratively close
         */
-       public Option_ScriptZ get_shutdown_scriptpubkey() {
+       public Option_CVec_u8ZZ get_shutdown_scriptpubkey() {
                long ret = bindings.OpenChannel_get_shutdown_scriptpubkey(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_ScriptZ ret_hu_conv = org.ldk.structs.Option_ScriptZ.constr_from_ptr(ret);
+               org.ldk.structs.Option_CVec_u8ZZ ret_hu_conv = org.ldk.structs.Option_CVec_u8ZZ.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
                return ret_hu_conv;
        }
@@ -362,7 +378,7 @@ public class OpenChannel : CommonBase {
        /**
         * A request to pre-set the to-sender output's `scriptPubkey` for when we collaboratively close
         */
-       public void set_shutdown_scriptpubkey(org.ldk.structs.Option_ScriptZ val) {
+       public void set_shutdown_scriptpubkey(org.ldk.structs.Option_CVec_u8ZZ val) {
                bindings.OpenChannel_set_shutdown_scriptpubkey(this.ptr, val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
@@ -403,9 +419,11 @@ public class OpenChannel : CommonBase {
 
        /**
         * Constructs a new OpenChannel given each field
+        * 
+        * Note that channel_type_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
-       public static OpenChannel of(byte[] chain_hash_arg, byte[] temporary_channel_id_arg, long funding_satoshis_arg, long push_msat_arg, long dust_limit_satoshis_arg, long max_htlc_value_in_flight_msat_arg, long channel_reserve_satoshis_arg, long htlc_minimum_msat_arg, int feerate_per_kw_arg, short to_self_delay_arg, short max_accepted_htlcs_arg, byte[] funding_pubkey_arg, byte[] revocation_basepoint_arg, byte[] payment_point_arg, byte[] delayed_payment_basepoint_arg, byte[] htlc_basepoint_arg, byte[] first_per_commitment_point_arg, byte channel_flags_arg, org.ldk.structs.Option_ScriptZ shutdown_scriptpubkey_arg, org.ldk.structs.ChannelTypeFeatures channel_type_arg) {
-               long ret = bindings.OpenChannel_new(InternalUtils.check_arr_len(chain_hash_arg, 32), InternalUtils.check_arr_len(temporary_channel_id_arg, 32), funding_satoshis_arg, push_msat_arg, dust_limit_satoshis_arg, max_htlc_value_in_flight_msat_arg, channel_reserve_satoshis_arg, htlc_minimum_msat_arg, feerate_per_kw_arg, to_self_delay_arg, max_accepted_htlcs_arg, InternalUtils.check_arr_len(funding_pubkey_arg, 33), InternalUtils.check_arr_len(revocation_basepoint_arg, 33), InternalUtils.check_arr_len(payment_point_arg, 33), InternalUtils.check_arr_len(delayed_payment_basepoint_arg, 33), InternalUtils.check_arr_len(htlc_basepoint_arg, 33), InternalUtils.check_arr_len(first_per_commitment_point_arg, 33), channel_flags_arg, shutdown_scriptpubkey_arg.ptr, channel_type_arg == null ? 0 : channel_type_arg.ptr);
+       public static OpenChannel of(byte[] chain_hash_arg, byte[] temporary_channel_id_arg, long funding_satoshis_arg, long push_msat_arg, long dust_limit_satoshis_arg, long max_htlc_value_in_flight_msat_arg, long channel_reserve_satoshis_arg, long htlc_minimum_msat_arg, int feerate_per_kw_arg, short to_self_delay_arg, short max_accepted_htlcs_arg, byte[] funding_pubkey_arg, byte[] revocation_basepoint_arg, byte[] payment_point_arg, byte[] delayed_payment_basepoint_arg, byte[] htlc_basepoint_arg, byte[] first_per_commitment_point_arg, byte channel_flags_arg, org.ldk.structs.Option_CVec_u8ZZ shutdown_scriptpubkey_arg, org.ldk.structs.ChannelTypeFeatures channel_type_arg) {
+               long ret = bindings.OpenChannel_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(chain_hash_arg, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(temporary_channel_id_arg, 32)), funding_satoshis_arg, push_msat_arg, dust_limit_satoshis_arg, max_htlc_value_in_flight_msat_arg, channel_reserve_satoshis_arg, htlc_minimum_msat_arg, feerate_per_kw_arg, to_self_delay_arg, max_accepted_htlcs_arg, 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)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(first_per_commitment_point_arg, 33)), channel_flags_arg, shutdown_scriptpubkey_arg.ptr, channel_type_arg == null ? 0 : channel_type_arg.ptr);
                GC.KeepAlive(chain_hash_arg);
                GC.KeepAlive(temporary_channel_id_arg);
                GC.KeepAlive(funding_satoshis_arg);
@@ -473,16 +491,18 @@ public class OpenChannel : CommonBase {
         * Serialize the OpenChannel object into a byte array which can be read by OpenChannel_read
         */
        public byte[] write() {
-               byte[] ret = bindings.OpenChannel_write(this.ptr);
+               long ret = bindings.OpenChannel_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a OpenChannel from a byte array, created by OpenChannel_write
         */
        public static Result_OpenChannelDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.OpenChannel_read(ser);
+               long ret = bindings.OpenChannel_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_OpenChannelDecodeErrorZ ret_hu_conv = Result_OpenChannelDecodeErrorZ.constr_from_ptr(ret);
index dbe0ff4b30cfb73d3e80f828a8b3e776795c2762..6ddfeb0e9f266a6998653c3cf039a0cb9c218e73 100644 (file)
@@ -21,16 +21,18 @@ public class OpenChannelV2 : CommonBase {
         * The genesis hash of the blockchain where the channel is to be opened
         */
        public byte[] get_chain_hash() {
-               byte[] ret = bindings.OpenChannelV2_get_chain_hash(this.ptr);
+               long ret = bindings.OpenChannelV2_get_chain_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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 to be opened
         */
        public void set_chain_hash(byte[] val) {
-               bindings.OpenChannelV2_set_chain_hash(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.OpenChannelV2_set_chain_hash(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -39,16 +41,18 @@ public class OpenChannelV2 : CommonBase {
         * A temporary channel ID derived using a zeroed out value for the channel acceptor's revocation basepoint
         */
        public byte[] get_temporary_channel_id() {
-               byte[] ret = bindings.OpenChannelV2_get_temporary_channel_id(this.ptr);
+               long ret = bindings.OpenChannelV2_get_temporary_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * A temporary channel ID derived using a zeroed out value for the channel acceptor's revocation basepoint
         */
        public void set_temporary_channel_id(byte[] val) {
-               bindings.OpenChannelV2_set_temporary_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.OpenChannelV2_set_temporary_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -223,16 +227,18 @@ public class OpenChannelV2 : CommonBase {
         * The channel initiator's key controlling the funding transaction
         */
        public byte[] get_funding_pubkey() {
-               byte[] ret = bindings.OpenChannelV2_get_funding_pubkey(this.ptr);
+               long ret = bindings.OpenChannelV2_get_funding_pubkey(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The channel initiator's key controlling the funding transaction
         */
        public void set_funding_pubkey(byte[] val) {
-               bindings.OpenChannelV2_set_funding_pubkey(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.OpenChannelV2_set_funding_pubkey(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -241,16 +247,18 @@ public class OpenChannelV2 : CommonBase {
         * Used to derive a revocation key for transactions broadcast by counterparty
         */
        public byte[] get_revocation_basepoint() {
-               byte[] ret = bindings.OpenChannelV2_get_revocation_basepoint(this.ptr);
+               long ret = bindings.OpenChannelV2_get_revocation_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Used to derive a revocation key for transactions broadcast by counterparty
         */
        public void set_revocation_basepoint(byte[] val) {
-               bindings.OpenChannelV2_set_revocation_basepoint(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.OpenChannelV2_set_revocation_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -259,16 +267,18 @@ public class OpenChannelV2 : CommonBase {
         * A payment key to channel initiator for transactions broadcast by counterparty
         */
        public byte[] get_payment_basepoint() {
-               byte[] ret = bindings.OpenChannelV2_get_payment_basepoint(this.ptr);
+               long ret = bindings.OpenChannelV2_get_payment_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * A payment key to channel initiator for transactions broadcast by counterparty
         */
        public void set_payment_basepoint(byte[] val) {
-               bindings.OpenChannelV2_set_payment_basepoint(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.OpenChannelV2_set_payment_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -278,9 +288,11 @@ public class OpenChannelV2 : CommonBase {
         * initiator
         */
        public byte[] get_delayed_payment_basepoint() {
-               byte[] ret = bindings.OpenChannelV2_get_delayed_payment_basepoint(this.ptr);
+               long ret = bindings.OpenChannelV2_get_delayed_payment_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -288,7 +300,7 @@ public class OpenChannelV2 : CommonBase {
         * initiator
         */
        public void set_delayed_payment_basepoint(byte[] val) {
-               bindings.OpenChannelV2_set_delayed_payment_basepoint(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.OpenChannelV2_set_delayed_payment_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -297,16 +309,18 @@ public class OpenChannelV2 : CommonBase {
         * Used to derive an HTLC payment key to channel initiator
         */
        public byte[] get_htlc_basepoint() {
-               byte[] ret = bindings.OpenChannelV2_get_htlc_basepoint(this.ptr);
+               long ret = bindings.OpenChannelV2_get_htlc_basepoint(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Used to derive an HTLC payment key to channel initiator
         */
        public void set_htlc_basepoint(byte[] val) {
-               bindings.OpenChannelV2_set_htlc_basepoint(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.OpenChannelV2_set_htlc_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -315,16 +329,18 @@ public class OpenChannelV2 : CommonBase {
         * The first to-be-broadcast-by-channel-initiator transaction's per commitment point
         */
        public byte[] get_first_per_commitment_point() {
-               byte[] ret = bindings.OpenChannelV2_get_first_per_commitment_point(this.ptr);
+               long ret = bindings.OpenChannelV2_get_first_per_commitment_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The first to-be-broadcast-by-channel-initiator transaction's per commitment point
         */
        public void set_first_per_commitment_point(byte[] val) {
-               bindings.OpenChannelV2_set_first_per_commitment_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.OpenChannelV2_set_first_per_commitment_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -333,16 +349,18 @@ public class OpenChannelV2 : CommonBase {
         * The second to-be-broadcast-by-channel-initiator transaction's per commitment point
         */
        public byte[] get_second_per_commitment_point() {
-               byte[] ret = bindings.OpenChannelV2_get_second_per_commitment_point(this.ptr);
+               long ret = bindings.OpenChannelV2_get_second_per_commitment_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The second to-be-broadcast-by-channel-initiator transaction's per commitment point
         */
        public void set_second_per_commitment_point(byte[] val) {
-               bindings.OpenChannelV2_set_second_per_commitment_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.OpenChannelV2_set_second_per_commitment_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -369,11 +387,11 @@ public class OpenChannelV2 : CommonBase {
         * Optionally, a request to pre-set the to-channel-initiator output's scriptPubkey for when we
         * collaboratively close
         */
-       public Option_ScriptZ get_shutdown_scriptpubkey() {
+       public Option_CVec_u8ZZ get_shutdown_scriptpubkey() {
                long ret = bindings.OpenChannelV2_get_shutdown_scriptpubkey(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_ScriptZ ret_hu_conv = org.ldk.structs.Option_ScriptZ.constr_from_ptr(ret);
+               org.ldk.structs.Option_CVec_u8ZZ ret_hu_conv = org.ldk.structs.Option_CVec_u8ZZ.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
                return ret_hu_conv;
        }
@@ -382,7 +400,7 @@ public class OpenChannelV2 : CommonBase {
         * Optionally, a request to pre-set the to-channel-initiator output's scriptPubkey for when we
         * collaboratively close
         */
-       public void set_shutdown_scriptpubkey(org.ldk.structs.Option_ScriptZ val) {
+       public void set_shutdown_scriptpubkey(org.ldk.structs.Option_CVec_u8ZZ val) {
                bindings.OpenChannelV2_set_shutdown_scriptpubkey(this.ptr, val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
@@ -439,9 +457,11 @@ public class OpenChannelV2 : CommonBase {
 
        /**
         * Constructs a new OpenChannelV2 given each field
+        * 
+        * Note that channel_type_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
-       public static OpenChannelV2 of(byte[] chain_hash_arg, byte[] temporary_channel_id_arg, int funding_feerate_sat_per_1000_weight_arg, int commitment_feerate_sat_per_1000_weight_arg, long funding_satoshis_arg, long dust_limit_satoshis_arg, long max_htlc_value_in_flight_msat_arg, long htlc_minimum_msat_arg, short to_self_delay_arg, short max_accepted_htlcs_arg, int locktime_arg, byte[] funding_pubkey_arg, byte[] revocation_basepoint_arg, byte[] payment_basepoint_arg, byte[] delayed_payment_basepoint_arg, byte[] htlc_basepoint_arg, byte[] first_per_commitment_point_arg, byte[] second_per_commitment_point_arg, byte channel_flags_arg, org.ldk.structs.Option_ScriptZ shutdown_scriptpubkey_arg, org.ldk.structs.ChannelTypeFeatures channel_type_arg, COption_NoneZ require_confirmed_inputs_arg) {
-               long ret = bindings.OpenChannelV2_new(InternalUtils.check_arr_len(chain_hash_arg, 32), InternalUtils.check_arr_len(temporary_channel_id_arg, 32), funding_feerate_sat_per_1000_weight_arg, commitment_feerate_sat_per_1000_weight_arg, funding_satoshis_arg, dust_limit_satoshis_arg, max_htlc_value_in_flight_msat_arg, htlc_minimum_msat_arg, to_self_delay_arg, max_accepted_htlcs_arg, locktime_arg, InternalUtils.check_arr_len(funding_pubkey_arg, 33), InternalUtils.check_arr_len(revocation_basepoint_arg, 33), InternalUtils.check_arr_len(payment_basepoint_arg, 33), InternalUtils.check_arr_len(delayed_payment_basepoint_arg, 33), InternalUtils.check_arr_len(htlc_basepoint_arg, 33), InternalUtils.check_arr_len(first_per_commitment_point_arg, 33), InternalUtils.check_arr_len(second_per_commitment_point_arg, 33), channel_flags_arg, shutdown_scriptpubkey_arg.ptr, channel_type_arg == null ? 0 : channel_type_arg.ptr, require_confirmed_inputs_arg);
+       public static OpenChannelV2 of(byte[] chain_hash_arg, byte[] temporary_channel_id_arg, int funding_feerate_sat_per_1000_weight_arg, int commitment_feerate_sat_per_1000_weight_arg, long funding_satoshis_arg, long dust_limit_satoshis_arg, long max_htlc_value_in_flight_msat_arg, long htlc_minimum_msat_arg, short to_self_delay_arg, short max_accepted_htlcs_arg, int locktime_arg, byte[] funding_pubkey_arg, byte[] revocation_basepoint_arg, byte[] payment_basepoint_arg, byte[] delayed_payment_basepoint_arg, byte[] htlc_basepoint_arg, byte[] first_per_commitment_point_arg, byte[] second_per_commitment_point_arg, byte channel_flags_arg, org.ldk.structs.Option_CVec_u8ZZ shutdown_scriptpubkey_arg, org.ldk.structs.ChannelTypeFeatures channel_type_arg, COption_NoneZ require_confirmed_inputs_arg) {
+               long ret = bindings.OpenChannelV2_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(chain_hash_arg, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(temporary_channel_id_arg, 32)), funding_feerate_sat_per_1000_weight_arg, commitment_feerate_sat_per_1000_weight_arg, funding_satoshis_arg, dust_limit_satoshis_arg, max_htlc_value_in_flight_msat_arg, htlc_minimum_msat_arg, to_self_delay_arg, max_accepted_htlcs_arg, locktime_arg, 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_basepoint_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(delayed_payment_basepoint_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(htlc_basepoint_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(first_per_commitment_point_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(second_per_commitment_point_arg, 33)), channel_flags_arg, shutdown_scriptpubkey_arg.ptr, channel_type_arg == null ? 0 : channel_type_arg.ptr, require_confirmed_inputs_arg);
                GC.KeepAlive(chain_hash_arg);
                GC.KeepAlive(temporary_channel_id_arg);
                GC.KeepAlive(funding_feerate_sat_per_1000_weight_arg);
@@ -511,16 +531,18 @@ public class OpenChannelV2 : CommonBase {
         * Serialize the OpenChannelV2 object into a byte array which can be read by OpenChannelV2_read
         */
        public byte[] write() {
-               byte[] ret = bindings.OpenChannelV2_write(this.ptr);
+               long ret = bindings.OpenChannelV2_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a OpenChannelV2 from a byte array, created by OpenChannelV2_write
         */
        public static Result_OpenChannelV2DecodeErrorZ read(byte[] ser) {
-               long ret = bindings.OpenChannelV2_read(ser);
+               long ret = bindings.OpenChannelV2_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_OpenChannelV2DecodeErrorZ ret_hu_conv = Result_OpenChannelV2DecodeErrorZ.constr_from_ptr(ret);
diff --git a/c_sharp/src/org/ldk/structs/Option_BigEndianScalarZ.cs b/c_sharp/src/org/ldk/structs/Option_BigEndianScalarZ.cs
new file mode 100644 (file)
index 0000000..1cc7869
--- /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 {
+
+/**
+ * An enum which can either contain a crate::c_types::BigEndianScalar or not
+ */
+public class Option_BigEndianScalarZ : CommonBase {
+       protected Option_BigEndianScalarZ(object _dummy, long ptr) : base(ptr) { }
+       ~Option_BigEndianScalarZ() {
+               if (ptr != 0) { bindings.COption_BigEndianScalarZ_free(ptr); }
+       }
+
+       internal static Option_BigEndianScalarZ constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKCOption_BigEndianScalarZ_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new Option_BigEndianScalarZ_Some(ptr);
+                       case 1: return new Option_BigEndianScalarZ_None(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A Option_BigEndianScalarZ of type Some */
+       public class Option_BigEndianScalarZ_Some : Option_BigEndianScalarZ {
+               public BigEndianScalar some;
+               internal Option_BigEndianScalarZ_Some(long ptr) : base(null, ptr) {
+                       long some = bindings.LDKCOption_BigEndianScalarZ_Some_get_some(ptr);
+                       BigEndianScalar some_conv = new BigEndianScalar(null, some);
+                       this.some = some_conv;
+               }
+       }
+       /** A Option_BigEndianScalarZ of type None */
+       public class Option_BigEndianScalarZ_None : Option_BigEndianScalarZ {
+               internal Option_BigEndianScalarZ_None(long ptr) : base(null, ptr) {
+               }
+       }
+       /**
+        * Constructs a new COption_BigEndianScalarZ containing a crate::c_types::BigEndianScalar
+        */
+       public static Option_BigEndianScalarZ some(byte[] o_big_endian_bytes) {
+               long ret = bindings.COption_BigEndianScalarZ_some(bindings.BigEndianScalar_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(o_big_endian_bytes, 32))));
+               GC.KeepAlive(o_big_endian_bytes);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_BigEndianScalarZ ret_hu_conv = org.ldk.structs.Option_BigEndianScalarZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               ;
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new COption_BigEndianScalarZ containing nothing
+        */
+       public static Option_BigEndianScalarZ none() {
+               long ret = bindings.COption_BigEndianScalarZ_none();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_BigEndianScalarZ ret_hu_conv = org.ldk.structs.Option_BigEndianScalarZ.constr_from_ptr(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.COption_BigEndianScalarZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new COption_BigEndianScalarZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Option_BigEndianScalarZ clone() {
+               long ret = bindings.COption_BigEndianScalarZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_BigEndianScalarZ ret_hu_conv = org.ldk.structs.Option_BigEndianScalarZ.constr_from_ptr(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/Option_BlockHashZ.cs b/c_sharp/src/org/ldk/structs/Option_BlockHashZ.cs
deleted file mode 100644 (file)
index bb039db..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * An enum which can either contain a crate::c_types::ThirtyTwoBytes or not
- */
-public class Option_BlockHashZ : CommonBase {
-       protected Option_BlockHashZ(object _dummy, long ptr) : base(ptr) { }
-       ~Option_BlockHashZ() {
-               if (ptr != 0) { bindings.COption_BlockHashZ_free(ptr); }
-       }
-
-       internal static Option_BlockHashZ constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_BlockHashZ_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_BlockHashZ_Some(ptr);
-                       case 1: return new Option_BlockHashZ_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_BlockHashZ of type Some */
-       public class Option_BlockHashZ_Some : Option_BlockHashZ {
-               public byte[] some;
-               internal Option_BlockHashZ_Some(long ptr) : base(null, ptr) {
-                       this.some = bindings.LDKCOption_BlockHashZ_Some_get_some(ptr);
-               }
-       }
-       /** A Option_BlockHashZ of type None */
-       public class Option_BlockHashZ_None : Option_BlockHashZ {
-               internal Option_BlockHashZ_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_BlockHashZ containing a crate::c_types::ThirtyTwoBytes
-        */
-       public static Option_BlockHashZ some(byte[] o) {
-               long ret = bindings.COption_BlockHashZ_some(InternalUtils.check_arr_len(o, 32));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_BlockHashZ ret_hu_conv = org.ldk.structs.Option_BlockHashZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_BlockHashZ containing nothing
-        */
-       public static Option_BlockHashZ none() {
-               long ret = bindings.COption_BlockHashZ_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_BlockHashZ ret_hu_conv = org.ldk.structs.Option_BlockHashZ.constr_from_ptr(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.COption_BlockHashZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_BlockHashZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_BlockHashZ clone() {
-               long ret = bindings.COption_BlockHashZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_BlockHashZ ret_hu_conv = org.ldk.structs.Option_BlockHashZ.constr_from_ptr(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/Option_C2Tuple_EightU16sEightU16sZZ.cs b/c_sharp/src/org/ldk/structs/Option_C2Tuple_EightU16sEightU16sZZ.cs
deleted file mode 100644 (file)
index cb718e2..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 {
-
-/**
- * An enum which can either contain a crate::c_types::derived::C2Tuple__u168_u168Z or not
- */
-public class Option_C2Tuple_EightU16sEightU16sZZ : CommonBase {
-       protected Option_C2Tuple_EightU16sEightU16sZZ(object _dummy, long ptr) : base(ptr) { }
-       ~Option_C2Tuple_EightU16sEightU16sZZ() {
-               if (ptr != 0) { bindings.COption_C2Tuple_EightU16sEightU16sZZ_free(ptr); }
-       }
-
-       internal static Option_C2Tuple_EightU16sEightU16sZZ constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_C2Tuple_EightU16sEightU16sZZ_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_C2Tuple_EightU16sEightU16sZZ_Some(ptr);
-                       case 1: return new Option_C2Tuple_EightU16sEightU16sZZ_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_C2Tuple_EightU16sEightU16sZZ of type Some */
-       public class Option_C2Tuple_EightU16sEightU16sZZ_Some : Option_C2Tuple_EightU16sEightU16sZZ {
-               public TwoTuple__u168_u168Z some;
-               internal Option_C2Tuple_EightU16sEightU16sZZ_Some(long ptr) : base(null, ptr) {
-                       long some = bindings.LDKCOption_C2Tuple_EightU16sEightU16sZZ_Some_get_some(ptr);
-                       TwoTuple__u168_u168Z some_hu_conv = new TwoTuple__u168_u168Z(null, some);
-                       if (some_hu_conv != null) { some_hu_conv.ptrs_to.AddLast(this); };
-                       this.some = some_hu_conv;
-               }
-       }
-       /** A Option_C2Tuple_EightU16sEightU16sZZ of type None */
-       public class Option_C2Tuple_EightU16sEightU16sZZ_None : Option_C2Tuple_EightU16sEightU16sZZ {
-               internal Option_C2Tuple_EightU16sEightU16sZZ_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_C2Tuple_EightU16sEightU16sZZ containing a crate::c_types::derived::C2Tuple__u168_u168Z
-        */
-       public static Option_C2Tuple_EightU16sEightU16sZZ some(org.ldk.structs.TwoTuple__u168_u168Z o) {
-               long ret = bindings.COption_C2Tuple_EightU16sEightU16sZZ_some(o != null ? o.ptr : 0);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_C2Tuple_EightU16sEightU16sZZ ret_hu_conv = org.ldk.structs.Option_C2Tuple_EightU16sEightU16sZZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_C2Tuple_EightU16sEightU16sZZ containing nothing
-        */
-       public static Option_C2Tuple_EightU16sEightU16sZZ none() {
-               long ret = bindings.COption_C2Tuple_EightU16sEightU16sZZ_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_C2Tuple_EightU16sEightU16sZZ ret_hu_conv = org.ldk.structs.Option_C2Tuple_EightU16sEightU16sZZ.constr_from_ptr(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.COption_C2Tuple_EightU16sEightU16sZZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_C2Tuple_EightU16sEightU16sZZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_C2Tuple_EightU16sEightU16sZZ clone() {
-               long ret = bindings.COption_C2Tuple_EightU16sEightU16sZZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_C2Tuple_EightU16sEightU16sZZ ret_hu_conv = org.ldk.structs.Option_C2Tuple_EightU16sEightU16sZZ.constr_from_ptr(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/Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ.cs b/c_sharp/src/org/ldk/structs/Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ.cs
new file mode 100644 (file)
index 0000000..d293a8e
--- /dev/null
@@ -0,0 +1,66 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+/**
+ * An enum which can either contain a crate::c_types::derived::C2Tuple__u1632_u1632Z or not
+ */
+public class Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ : CommonBase {
+       protected Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ(object _dummy, long ptr) : base(ptr) { }
+       ~Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ() {
+               if (ptr != 0) { bindings.COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_free(ptr); }
+       }
+
+       internal static Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_Some(ptr);
+                       case 1: return new Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_None(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ of type Some */
+       public class Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_Some : Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ {
+               public TwoTuple__u1632_u1632Z some;
+               internal Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_Some(long ptr) : base(null, ptr) {
+                       long some = bindings.LDKCOption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_Some_get_some(ptr);
+                       TwoTuple__u1632_u1632Z some_hu_conv = new TwoTuple__u1632_u1632Z(null, some);
+                       if (some_hu_conv != null) { some_hu_conv.ptrs_to.AddLast(this); };
+                       this.some = some_hu_conv;
+               }
+       }
+       /** A Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ of type None */
+       public class Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_None : Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ {
+               internal Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_None(long ptr) : base(null, ptr) {
+               }
+       }
+       /**
+        * Constructs a new COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ containing a crate::c_types::derived::C2Tuple__u1632_u1632Z
+        */
+       public static Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ some(org.ldk.structs.TwoTuple__u1632_u1632Z o) {
+               long ret = bindings.COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_some(o != null ? o.ptr : 0);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ ret_hu_conv = org.ldk.structs.Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ containing nothing
+        */
+       public static Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ none() {
+               long ret = bindings.COption_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ_none();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ ret_hu_conv = org.ldk.structs.Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ.constr_from_ptr(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/Option_C2Tuple_u64u16ZZ.cs b/c_sharp/src/org/ldk/structs/Option_C2Tuple_u64u16ZZ.cs
new file mode 100644 (file)
index 0000000..fcd352b
--- /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 {
+
+/**
+ * An enum which can either contain a crate::c_types::derived::C2Tuple_u64u16Z or not
+ */
+public class Option_C2Tuple_u64u16ZZ : CommonBase {
+       protected Option_C2Tuple_u64u16ZZ(object _dummy, long ptr) : base(ptr) { }
+       ~Option_C2Tuple_u64u16ZZ() {
+               if (ptr != 0) { bindings.COption_C2Tuple_u64u16ZZ_free(ptr); }
+       }
+
+       internal static Option_C2Tuple_u64u16ZZ constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKCOption_C2Tuple_u64u16ZZ_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new Option_C2Tuple_u64u16ZZ_Some(ptr);
+                       case 1: return new Option_C2Tuple_u64u16ZZ_None(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A Option_C2Tuple_u64u16ZZ of type Some */
+       public class Option_C2Tuple_u64u16ZZ_Some : Option_C2Tuple_u64u16ZZ {
+               public TwoTuple_u64u16Z some;
+               internal Option_C2Tuple_u64u16ZZ_Some(long ptr) : base(null, ptr) {
+                       long some = bindings.LDKCOption_C2Tuple_u64u16ZZ_Some_get_some(ptr);
+                       TwoTuple_u64u16Z some_hu_conv = new TwoTuple_u64u16Z(null, some);
+                       if (some_hu_conv != null) { some_hu_conv.ptrs_to.AddLast(this); };
+                       this.some = some_hu_conv;
+               }
+       }
+       /** A Option_C2Tuple_u64u16ZZ of type None */
+       public class Option_C2Tuple_u64u16ZZ_None : Option_C2Tuple_u64u16ZZ {
+               internal Option_C2Tuple_u64u16ZZ_None(long ptr) : base(null, ptr) {
+               }
+       }
+       /**
+        * Constructs a new COption_C2Tuple_u64u16ZZ containing a crate::c_types::derived::C2Tuple_u64u16Z
+        */
+       public static Option_C2Tuple_u64u16ZZ some(org.ldk.structs.TwoTuple_u64u16Z o) {
+               long ret = bindings.COption_C2Tuple_u64u16ZZ_some(o != null ? o.ptr : 0);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_C2Tuple_u64u16ZZ ret_hu_conv = org.ldk.structs.Option_C2Tuple_u64u16ZZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new COption_C2Tuple_u64u16ZZ containing nothing
+        */
+       public static Option_C2Tuple_u64u16ZZ none() {
+               long ret = bindings.COption_C2Tuple_u64u16ZZ_none();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_C2Tuple_u64u16ZZ ret_hu_conv = org.ldk.structs.Option_C2Tuple_u64u16ZZ.constr_from_ptr(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.COption_C2Tuple_u64u16ZZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new COption_C2Tuple_u64u16ZZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Option_C2Tuple_u64u16ZZ clone() {
+               long ret = bindings.COption_C2Tuple_u64u16ZZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_C2Tuple_u64u16ZZ ret_hu_conv = org.ldk.structs.Option_C2Tuple_u64u16ZZ.constr_from_ptr(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/Option_CVec_ChainHashZZ.cs b/c_sharp/src/org/ldk/structs/Option_CVec_ChainHashZZ.cs
deleted file mode 100644 (file)
index 49c008b..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * An enum which can either contain a crate::c_types::derived::CVec_ChainHashZ or not
- */
-public class Option_CVec_ChainHashZZ : CommonBase {
-       protected Option_CVec_ChainHashZZ(object _dummy, long ptr) : base(ptr) { }
-       ~Option_CVec_ChainHashZZ() {
-               if (ptr != 0) { bindings.COption_CVec_ChainHashZZ_free(ptr); }
-       }
-
-       internal static Option_CVec_ChainHashZZ constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_CVec_ChainHashZZ_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_CVec_ChainHashZZ_Some(ptr);
-                       case 1: return new Option_CVec_ChainHashZZ_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_CVec_ChainHashZZ of type Some */
-       public class Option_CVec_ChainHashZZ_Some : Option_CVec_ChainHashZZ {
-               public byte[][] some;
-               internal Option_CVec_ChainHashZZ_Some(long ptr) : base(null, ptr) {
-                       this.some = bindings.LDKCOption_CVec_ChainHashZZ_Some_get_some(ptr);
-               }
-       }
-       /** A Option_CVec_ChainHashZZ of type None */
-       public class Option_CVec_ChainHashZZ_None : Option_CVec_ChainHashZZ {
-               internal Option_CVec_ChainHashZZ_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_CVec_ChainHashZZ containing a crate::c_types::derived::CVec_ChainHashZ
-        */
-       public static Option_CVec_ChainHashZZ some(byte[][] o) {
-               long ret = bindings.COption_CVec_ChainHashZZ_some(o != null ? InternalUtils.mapArray(o, o_conv_8 => InternalUtils.check_arr_len(o_conv_8, 32)) : null);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_CVec_ChainHashZZ ret_hu_conv = org.ldk.structs.Option_CVec_ChainHashZZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_CVec_ChainHashZZ containing nothing
-        */
-       public static Option_CVec_ChainHashZZ none() {
-               long ret = bindings.COption_CVec_ChainHashZZ_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_CVec_ChainHashZZ ret_hu_conv = org.ldk.structs.Option_CVec_ChainHashZZ.constr_from_ptr(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.COption_CVec_ChainHashZZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_CVec_ChainHashZZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_CVec_ChainHashZZ clone() {
-               long ret = bindings.COption_CVec_ChainHashZZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_CVec_ChainHashZZ ret_hu_conv = org.ldk.structs.Option_CVec_ChainHashZZ.constr_from_ptr(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/Option_CVec_NetAddressZZ.cs b/c_sharp/src/org/ldk/structs/Option_CVec_NetAddressZZ.cs
deleted file mode 100644 (file)
index 70910cd..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * An enum which can either contain a crate::c_types::derived::CVec_NetAddressZ or not
- */
-public class Option_CVec_NetAddressZZ : CommonBase {
-       protected Option_CVec_NetAddressZZ(object _dummy, long ptr) : base(ptr) { }
-       ~Option_CVec_NetAddressZZ() {
-               if (ptr != 0) { bindings.COption_CVec_NetAddressZZ_free(ptr); }
-       }
-
-       internal static Option_CVec_NetAddressZZ constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_CVec_NetAddressZZ_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_CVec_NetAddressZZ_Some(ptr);
-                       case 1: return new Option_CVec_NetAddressZZ_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_CVec_NetAddressZZ of type Some */
-       public class Option_CVec_NetAddressZZ_Some : Option_CVec_NetAddressZZ {
-               public NetAddress[] some;
-               internal Option_CVec_NetAddressZZ_Some(long ptr) : base(null, ptr) {
-                       long[] some = bindings.LDKCOption_CVec_NetAddressZZ_Some_get_some(ptr);
-                       int some_conv_12_len = some.Length;
-                       NetAddress[] some_conv_12_arr = new NetAddress[some_conv_12_len];
-                       for (int m = 0; m < some_conv_12_len; m++) {
-                               long some_conv_12 = some[m];
-                               org.ldk.structs.NetAddress some_conv_12_hu_conv = org.ldk.structs.NetAddress.constr_from_ptr(some_conv_12);
-                               if (some_conv_12_hu_conv != null) { some_conv_12_hu_conv.ptrs_to.AddLast(this); };
-                               some_conv_12_arr[m] = some_conv_12_hu_conv;
-                       }
-                       this.some = some_conv_12_arr;
-               }
-       }
-       /** A Option_CVec_NetAddressZZ of type None */
-       public class Option_CVec_NetAddressZZ_None : Option_CVec_NetAddressZZ {
-               internal Option_CVec_NetAddressZZ_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_CVec_NetAddressZZ containing a crate::c_types::derived::CVec_NetAddressZ
-        */
-       public static Option_CVec_NetAddressZZ some(NetAddress[] o) {
-               long ret = bindings.COption_CVec_NetAddressZZ_some(o != null ? InternalUtils.mapArray(o, o_conv_12 => o_conv_12.ptr) : null);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_CVec_NetAddressZZ ret_hu_conv = org.ldk.structs.Option_CVec_NetAddressZZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               foreach (NetAddress o_conv_12 in o) { if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o_conv_12); }; };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_CVec_NetAddressZZ containing nothing
-        */
-       public static Option_CVec_NetAddressZZ none() {
-               long ret = bindings.COption_CVec_NetAddressZZ_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_CVec_NetAddressZZ ret_hu_conv = org.ldk.structs.Option_CVec_NetAddressZZ.constr_from_ptr(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.COption_CVec_NetAddressZZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_CVec_NetAddressZZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_CVec_NetAddressZZ clone() {
-               long ret = bindings.COption_CVec_NetAddressZZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_CVec_NetAddressZZ ret_hu_conv = org.ldk.structs.Option_CVec_NetAddressZZ.constr_from_ptr(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/Option_CVec_SocketAddressZZ.cs b/c_sharp/src/org/ldk/structs/Option_CVec_SocketAddressZZ.cs
new file mode 100644 (file)
index 0000000..616239e
--- /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 {
+
+/**
+ * An enum which can either contain a crate::c_types::derived::CVec_SocketAddressZ or not
+ */
+public class Option_CVec_SocketAddressZZ : CommonBase {
+       protected Option_CVec_SocketAddressZZ(object _dummy, long ptr) : base(ptr) { }
+       ~Option_CVec_SocketAddressZZ() {
+               if (ptr != 0) { bindings.COption_CVec_SocketAddressZZ_free(ptr); }
+       }
+
+       internal static Option_CVec_SocketAddressZZ constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKCOption_CVec_SocketAddressZZ_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new Option_CVec_SocketAddressZZ_Some(ptr);
+                       case 1: return new Option_CVec_SocketAddressZZ_None(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A Option_CVec_SocketAddressZZ of type Some */
+       public class Option_CVec_SocketAddressZZ_Some : Option_CVec_SocketAddressZZ {
+               public SocketAddress[] some;
+               internal Option_CVec_SocketAddressZZ_Some(long ptr) : base(null, ptr) {
+                       long some = bindings.LDKCOption_CVec_SocketAddressZZ_Some_get_some(ptr);
+                       int some_conv_15_len = InternalUtils.getArrayLength(some);
+                       SocketAddress[] some_conv_15_arr = new SocketAddress[some_conv_15_len];
+                       for (int p = 0; p < some_conv_15_len; p++) {
+                               long some_conv_15 = InternalUtils.getU64ArrayElem(some, p);
+                               org.ldk.structs.SocketAddress some_conv_15_hu_conv = org.ldk.structs.SocketAddress.constr_from_ptr(some_conv_15);
+                               if (some_conv_15_hu_conv != null) { some_conv_15_hu_conv.ptrs_to.AddLast(this); };
+                               some_conv_15_arr[p] = some_conv_15_hu_conv;
+                       }
+                       bindings.free_buffer(some);
+                       this.some = some_conv_15_arr;
+               }
+       }
+       /** A Option_CVec_SocketAddressZZ of type None */
+       public class Option_CVec_SocketAddressZZ_None : Option_CVec_SocketAddressZZ {
+               internal Option_CVec_SocketAddressZZ_None(long ptr) : base(null, ptr) {
+               }
+       }
+       /**
+        * Constructs a new COption_CVec_SocketAddressZZ containing a crate::c_types::derived::CVec_SocketAddressZ
+        */
+       public static Option_CVec_SocketAddressZZ some(SocketAddress[] o) {
+               long ret = bindings.COption_CVec_SocketAddressZZ_some(InternalUtils.encodeUint64Array(InternalUtils.mapArray(o, o_conv_15 => o_conv_15.ptr)));
+               GC.KeepAlive(o);
+               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(ret_hu_conv); };
+               foreach (SocketAddress o_conv_15 in o) { if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o_conv_15); }; };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new COption_CVec_SocketAddressZZ containing nothing
+        */
+       public static Option_CVec_SocketAddressZZ none() {
+               long ret = bindings.COption_CVec_SocketAddressZZ_none();
+               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(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.COption_CVec_SocketAddressZZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new COption_CVec_SocketAddressZZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Option_CVec_SocketAddressZZ clone() {
+               long ret = bindings.COption_CVec_SocketAddressZZ_clone(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;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Option_CVec_ThirtyTwoBytesZZ.cs b/c_sharp/src/org/ldk/structs/Option_CVec_ThirtyTwoBytesZZ.cs
new file mode 100644 (file)
index 0000000..b078a66
--- /dev/null
@@ -0,0 +1,91 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+/**
+ * An enum which can either contain a crate::c_types::derived::CVec_ThirtyTwoBytesZ or not
+ */
+public class Option_CVec_ThirtyTwoBytesZZ : CommonBase {
+       protected Option_CVec_ThirtyTwoBytesZZ(object _dummy, long ptr) : base(ptr) { }
+       ~Option_CVec_ThirtyTwoBytesZZ() {
+               if (ptr != 0) { bindings.COption_CVec_ThirtyTwoBytesZZ_free(ptr); }
+       }
+
+       internal static Option_CVec_ThirtyTwoBytesZZ constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKCOption_CVec_ThirtyTwoBytesZZ_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new Option_CVec_ThirtyTwoBytesZZ_Some(ptr);
+                       case 1: return new Option_CVec_ThirtyTwoBytesZZ_None(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A Option_CVec_ThirtyTwoBytesZZ of type Some */
+       public class Option_CVec_ThirtyTwoBytesZZ_Some : Option_CVec_ThirtyTwoBytesZZ {
+               public byte[][] some;
+               internal Option_CVec_ThirtyTwoBytesZZ_Some(long ptr) : base(null, ptr) {
+                       long some = bindings.LDKCOption_CVec_ThirtyTwoBytesZZ_Some_get_some(ptr);
+                       int some_conv_8_len = InternalUtils.getArrayLength(some);
+                       byte[][] some_conv_8_arr = new byte[some_conv_8_len][];
+                       for (int i = 0; i < some_conv_8_len; i++) {
+                               long some_conv_8 = InternalUtils.getU64ArrayElem(some, i);
+                               byte[] some_conv_8_conv = InternalUtils.decodeUint8Array(some_conv_8);
+                               some_conv_8_arr[i] = some_conv_8_conv;
+                       }
+                       bindings.free_buffer(some);
+                       this.some = some_conv_8_arr;
+               }
+       }
+       /** A Option_CVec_ThirtyTwoBytesZZ of type None */
+       public class Option_CVec_ThirtyTwoBytesZZ_None : Option_CVec_ThirtyTwoBytesZZ {
+               internal Option_CVec_ThirtyTwoBytesZZ_None(long ptr) : base(null, ptr) {
+               }
+       }
+       /**
+        * Constructs a new COption_CVec_ThirtyTwoBytesZZ containing a crate::c_types::derived::CVec_ThirtyTwoBytesZ
+        */
+       public static Option_CVec_ThirtyTwoBytesZZ some(byte[][] o) {
+               long ret = bindings.COption_CVec_ThirtyTwoBytesZZ_some(InternalUtils.encodeUint64Array(InternalUtils.mapArray(o, o_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(o_conv_8, 32)))));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_CVec_ThirtyTwoBytesZZ ret_hu_conv = org.ldk.structs.Option_CVec_ThirtyTwoBytesZZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new COption_CVec_ThirtyTwoBytesZZ containing nothing
+        */
+       public static Option_CVec_ThirtyTwoBytesZZ none() {
+               long ret = bindings.COption_CVec_ThirtyTwoBytesZZ_none();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_CVec_ThirtyTwoBytesZZ ret_hu_conv = org.ldk.structs.Option_CVec_ThirtyTwoBytesZZ.constr_from_ptr(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.COption_CVec_ThirtyTwoBytesZZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new COption_CVec_ThirtyTwoBytesZZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Option_CVec_ThirtyTwoBytesZZ clone() {
+               long ret = bindings.COption_CVec_ThirtyTwoBytesZZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_CVec_ThirtyTwoBytesZZ ret_hu_conv = org.ldk.structs.Option_CVec_ThirtyTwoBytesZZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 3e0cc3599c70225a5224ef912cd99e88086afdb1..24d7b51ffec29fe8a8384a3b11962be14edfb59b 100644 (file)
@@ -28,7 +28,9 @@ public class Option_CVec_u8ZZ : CommonBase {
        public class Option_CVec_u8ZZ_Some : Option_CVec_u8ZZ {
                public byte[] some;
                internal Option_CVec_u8ZZ_Some(long ptr) : base(null, ptr) {
-                       this.some = bindings.LDKCOption_CVec_u8ZZ_Some_get_some(ptr);
+                       long some = bindings.LDKCOption_CVec_u8ZZ_Some_get_some(ptr);
+                       byte[] some_conv = InternalUtils.decodeUint8Array(some);
+                       this.some = some_conv;
                }
        }
        /** A Option_CVec_u8ZZ of type None */
@@ -40,7 +42,7 @@ public class Option_CVec_u8ZZ : CommonBase {
         * Constructs a new COption_CVec_u8ZZ containing a crate::c_types::derived::CVec_u8Z
         */
        public static Option_CVec_u8ZZ some(byte[] o) {
-               long ret = bindings.COption_CVec_u8ZZ_some(o);
+               long ret = bindings.COption_CVec_u8ZZ_some(InternalUtils.encodeUint8Array(o));
                GC.KeepAlive(o);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.Option_CVec_u8ZZ ret_hu_conv = org.ldk.structs.Option_CVec_u8ZZ.constr_from_ptr(ret);
diff --git a/c_sharp/src/org/ldk/structs/Option_CustomOnionMessageContentsZ.cs b/c_sharp/src/org/ldk/structs/Option_CustomOnionMessageContentsZ.cs
deleted file mode 100644 (file)
index 472dcba..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 {
-
-/**
- * An enum which can either contain a crate::lightning::onion_message::packet::CustomOnionMessageContents or not
- */
-public class Option_CustomOnionMessageContentsZ : CommonBase {
-       protected Option_CustomOnionMessageContentsZ(object _dummy, long ptr) : base(ptr) { }
-       ~Option_CustomOnionMessageContentsZ() {
-               if (ptr != 0) { bindings.COption_CustomOnionMessageContentsZ_free(ptr); }
-       }
-
-       internal static Option_CustomOnionMessageContentsZ constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_CustomOnionMessageContentsZ_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_CustomOnionMessageContentsZ_Some(ptr);
-                       case 1: return new Option_CustomOnionMessageContentsZ_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_CustomOnionMessageContentsZ of type Some */
-       public class Option_CustomOnionMessageContentsZ_Some : Option_CustomOnionMessageContentsZ {
-               public CustomOnionMessageContents some;
-               internal Option_CustomOnionMessageContentsZ_Some(long ptr) : base(null, ptr) {
-                       long some = bindings.LDKCOption_CustomOnionMessageContentsZ_Some_get_some(ptr);
-                       CustomOnionMessageContents ret_hu_conv = new CustomOnionMessageContents(null, some);
-                       if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-                       this.some = ret_hu_conv;
-               }
-       }
-       /** A Option_CustomOnionMessageContentsZ of type None */
-       public class Option_CustomOnionMessageContentsZ_None : Option_CustomOnionMessageContentsZ {
-               internal Option_CustomOnionMessageContentsZ_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_CustomOnionMessageContentsZ containing a crate::lightning::onion_message::packet::CustomOnionMessageContents
-        */
-       public static Option_CustomOnionMessageContentsZ some(org.ldk.structs.CustomOnionMessageContents o) {
-               long ret = bindings.COption_CustomOnionMessageContentsZ_some(o.ptr);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_CustomOnionMessageContentsZ ret_hu_conv = org.ldk.structs.Option_CustomOnionMessageContentsZ.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(o); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_CustomOnionMessageContentsZ containing nothing
-        */
-       public static Option_CustomOnionMessageContentsZ none() {
-               long ret = bindings.COption_CustomOnionMessageContentsZ_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_CustomOnionMessageContentsZ ret_hu_conv = org.ldk.structs.Option_CustomOnionMessageContentsZ.constr_from_ptr(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.COption_CustomOnionMessageContentsZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_CustomOnionMessageContentsZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_CustomOnionMessageContentsZ clone() {
-               long ret = bindings.COption_CustomOnionMessageContentsZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_CustomOnionMessageContentsZ ret_hu_conv = org.ldk.structs.Option_CustomOnionMessageContentsZ.constr_from_ptr(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/Option_DurationZ.cs b/c_sharp/src/org/ldk/structs/Option_DurationZ.cs
deleted file mode 100644 (file)
index b9e182d..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * An enum which can either contain a u64 or not
- */
-public class Option_DurationZ : CommonBase {
-       protected Option_DurationZ(object _dummy, long ptr) : base(ptr) { }
-       ~Option_DurationZ() {
-               if (ptr != 0) { bindings.COption_DurationZ_free(ptr); }
-       }
-
-       internal static Option_DurationZ constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_DurationZ_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_DurationZ_Some(ptr);
-                       case 1: return new Option_DurationZ_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_DurationZ of type Some */
-       public class Option_DurationZ_Some : Option_DurationZ {
-               public long some;
-               internal Option_DurationZ_Some(long ptr) : base(null, ptr) {
-                       this.some = bindings.LDKCOption_DurationZ_Some_get_some(ptr);
-               }
-       }
-       /** A Option_DurationZ of type None */
-       public class Option_DurationZ_None : Option_DurationZ {
-               internal Option_DurationZ_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_DurationZ containing a u64
-        */
-       public static Option_DurationZ some(long o) {
-               long ret = bindings.COption_DurationZ_some(o);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_DurationZ ret_hu_conv = org.ldk.structs.Option_DurationZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_DurationZ containing nothing
-        */
-       public static Option_DurationZ none() {
-               long ret = bindings.COption_DurationZ_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_DurationZ ret_hu_conv = org.ldk.structs.Option_DurationZ.constr_from_ptr(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.COption_DurationZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_DurationZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_DurationZ clone() {
-               long ret = bindings.COption_DurationZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_DurationZ ret_hu_conv = org.ldk.structs.Option_DurationZ.constr_from_ptr(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/Option_KeyPairZ.cs b/c_sharp/src/org/ldk/structs/Option_KeyPairZ.cs
deleted file mode 100644 (file)
index 5722cae..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * An enum which can either contain a crate::c_types::SecretKey or not
- */
-public class Option_KeyPairZ : CommonBase {
-       protected Option_KeyPairZ(object _dummy, long ptr) : base(ptr) { }
-       ~Option_KeyPairZ() {
-               if (ptr != 0) { bindings.COption_KeyPairZ_free(ptr); }
-       }
-
-       internal static Option_KeyPairZ constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_KeyPairZ_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_KeyPairZ_Some(ptr);
-                       case 1: return new Option_KeyPairZ_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_KeyPairZ of type Some */
-       public class Option_KeyPairZ_Some : Option_KeyPairZ {
-               public byte[] some;
-               internal Option_KeyPairZ_Some(long ptr) : base(null, ptr) {
-                       this.some = bindings.LDKCOption_KeyPairZ_Some_get_some(ptr);
-               }
-       }
-       /** A Option_KeyPairZ of type None */
-       public class Option_KeyPairZ_None : Option_KeyPairZ {
-               internal Option_KeyPairZ_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_KeyPairZ containing a crate::c_types::SecretKey
-        */
-       public static Option_KeyPairZ some(byte[] o) {
-               long ret = bindings.COption_KeyPairZ_some(InternalUtils.check_arr_len(o, 32));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_KeyPairZ ret_hu_conv = org.ldk.structs.Option_KeyPairZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_KeyPairZ containing nothing
-        */
-       public static Option_KeyPairZ none() {
-               long ret = bindings.COption_KeyPairZ_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_KeyPairZ ret_hu_conv = org.ldk.structs.Option_KeyPairZ.constr_from_ptr(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.COption_KeyPairZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_KeyPairZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_KeyPairZ clone() {
-               long ret = bindings.COption_KeyPairZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_KeyPairZ ret_hu_conv = org.ldk.structs.Option_KeyPairZ.constr_from_ptr(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/Option_NetAddressZ.cs b/c_sharp/src/org/ldk/structs/Option_NetAddressZ.cs
deleted file mode 100644 (file)
index f2e9ca0..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 {
-
-/**
- * An enum which can either contain a crate::lightning::ln::msgs::NetAddress or not
- */
-public class Option_NetAddressZ : CommonBase {
-       protected Option_NetAddressZ(object _dummy, long ptr) : base(ptr) { }
-       ~Option_NetAddressZ() {
-               if (ptr != 0) { bindings.COption_NetAddressZ_free(ptr); }
-       }
-
-       internal static Option_NetAddressZ constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_NetAddressZ_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_NetAddressZ_Some(ptr);
-                       case 1: return new Option_NetAddressZ_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_NetAddressZ of type Some */
-       public class Option_NetAddressZ_Some : Option_NetAddressZ {
-               public NetAddress some;
-               internal Option_NetAddressZ_Some(long ptr) : base(null, ptr) {
-                       long some = bindings.LDKCOption_NetAddressZ_Some_get_some(ptr);
-                       org.ldk.structs.NetAddress some_hu_conv = org.ldk.structs.NetAddress.constr_from_ptr(some);
-                       if (some_hu_conv != null) { some_hu_conv.ptrs_to.AddLast(this); };
-                       this.some = some_hu_conv;
-               }
-       }
-       /** A Option_NetAddressZ of type None */
-       public class Option_NetAddressZ_None : Option_NetAddressZ {
-               internal Option_NetAddressZ_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_NetAddressZ containing a crate::lightning::ln::msgs::NetAddress
-        */
-       public static Option_NetAddressZ some(org.ldk.structs.NetAddress o) {
-               long ret = bindings.COption_NetAddressZ_some(o.ptr);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_NetAddressZ ret_hu_conv = org.ldk.structs.Option_NetAddressZ.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(o); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_NetAddressZ containing nothing
-        */
-       public static Option_NetAddressZ none() {
-               long ret = bindings.COption_NetAddressZ_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_NetAddressZ ret_hu_conv = org.ldk.structs.Option_NetAddressZ.constr_from_ptr(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.COption_NetAddressZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_NetAddressZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_NetAddressZ clone() {
-               long ret = bindings.COption_NetAddressZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_NetAddressZ ret_hu_conv = org.ldk.structs.Option_NetAddressZ.constr_from_ptr(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/Option_OnionMessageContentsZ.cs b/c_sharp/src/org/ldk/structs/Option_OnionMessageContentsZ.cs
new file mode 100644 (file)
index 0000000..8d6102c
--- /dev/null
@@ -0,0 +1,86 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+/**
+ * An enum which can either contain a crate::lightning::onion_message::packet::OnionMessageContents or not
+ */
+public class Option_OnionMessageContentsZ : CommonBase {
+       protected Option_OnionMessageContentsZ(object _dummy, long ptr) : base(ptr) { }
+       ~Option_OnionMessageContentsZ() {
+               if (ptr != 0) { bindings.COption_OnionMessageContentsZ_free(ptr); }
+       }
+
+       internal static Option_OnionMessageContentsZ constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKCOption_OnionMessageContentsZ_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new Option_OnionMessageContentsZ_Some(ptr);
+                       case 1: return new Option_OnionMessageContentsZ_None(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A Option_OnionMessageContentsZ of type Some */
+       public class Option_OnionMessageContentsZ_Some : Option_OnionMessageContentsZ {
+               public OnionMessageContents some;
+               internal Option_OnionMessageContentsZ_Some(long ptr) : base(null, ptr) {
+                       long some = bindings.LDKCOption_OnionMessageContentsZ_Some_get_some(ptr);
+                       OnionMessageContents ret_hu_conv = new OnionMessageContents(null, some);
+                       if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+                       this.some = ret_hu_conv;
+               }
+       }
+       /** A Option_OnionMessageContentsZ of type None */
+       public class Option_OnionMessageContentsZ_None : Option_OnionMessageContentsZ {
+               internal Option_OnionMessageContentsZ_None(long ptr) : base(null, ptr) {
+               }
+       }
+       /**
+        * Constructs a new COption_OnionMessageContentsZ containing a crate::lightning::onion_message::packet::OnionMessageContents
+        */
+       public static Option_OnionMessageContentsZ some(org.ldk.structs.OnionMessageContents o) {
+               long ret = bindings.COption_OnionMessageContentsZ_some(o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_OnionMessageContentsZ ret_hu_conv = org.ldk.structs.Option_OnionMessageContentsZ.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(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new COption_OnionMessageContentsZ containing nothing
+        */
+       public static Option_OnionMessageContentsZ none() {
+               long ret = bindings.COption_OnionMessageContentsZ_none();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_OnionMessageContentsZ ret_hu_conv = org.ldk.structs.Option_OnionMessageContentsZ.constr_from_ptr(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.COption_OnionMessageContentsZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new COption_OnionMessageContentsZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Option_OnionMessageContentsZ clone() {
+               long ret = bindings.COption_OnionMessageContentsZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_OnionMessageContentsZ ret_hu_conv = org.ldk.structs.Option_OnionMessageContentsZ.constr_from_ptr(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/Option_PackedLockTimeZ.cs b/c_sharp/src/org/ldk/structs/Option_PackedLockTimeZ.cs
deleted file mode 100644 (file)
index ac874e6..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * An enum which can either contain a u32 or not
- */
-public class Option_PackedLockTimeZ : CommonBase {
-       protected Option_PackedLockTimeZ(object _dummy, long ptr) : base(ptr) { }
-       ~Option_PackedLockTimeZ() {
-               if (ptr != 0) { bindings.COption_PackedLockTimeZ_free(ptr); }
-       }
-
-       internal static Option_PackedLockTimeZ constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_PackedLockTimeZ_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_PackedLockTimeZ_Some(ptr);
-                       case 1: return new Option_PackedLockTimeZ_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_PackedLockTimeZ of type Some */
-       public class Option_PackedLockTimeZ_Some : Option_PackedLockTimeZ {
-               public int some;
-               internal Option_PackedLockTimeZ_Some(long ptr) : base(null, ptr) {
-                       this.some = bindings.LDKCOption_PackedLockTimeZ_Some_get_some(ptr);
-               }
-       }
-       /** A Option_PackedLockTimeZ of type None */
-       public class Option_PackedLockTimeZ_None : Option_PackedLockTimeZ {
-               internal Option_PackedLockTimeZ_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_PackedLockTimeZ containing a u32
-        */
-       public static Option_PackedLockTimeZ some(int o) {
-               long ret = bindings.COption_PackedLockTimeZ_some(o);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PackedLockTimeZ ret_hu_conv = org.ldk.structs.Option_PackedLockTimeZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_PackedLockTimeZ containing nothing
-        */
-       public static Option_PackedLockTimeZ none() {
-               long ret = bindings.COption_PackedLockTimeZ_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PackedLockTimeZ ret_hu_conv = org.ldk.structs.Option_PackedLockTimeZ.constr_from_ptr(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.COption_PackedLockTimeZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_PackedLockTimeZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_PackedLockTimeZ clone() {
-               long ret = bindings.COption_PackedLockTimeZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PackedLockTimeZ ret_hu_conv = org.ldk.structs.Option_PackedLockTimeZ.constr_from_ptr(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/Option_PaymentHashZ.cs b/c_sharp/src/org/ldk/structs/Option_PaymentHashZ.cs
deleted file mode 100644 (file)
index 7fb2617..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * An enum which can either contain a crate::c_types::ThirtyTwoBytes or not
- */
-public class Option_PaymentHashZ : CommonBase {
-       protected Option_PaymentHashZ(object _dummy, long ptr) : base(ptr) { }
-       ~Option_PaymentHashZ() {
-               if (ptr != 0) { bindings.COption_PaymentHashZ_free(ptr); }
-       }
-
-       internal static Option_PaymentHashZ constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_PaymentHashZ_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_PaymentHashZ_Some(ptr);
-                       case 1: return new Option_PaymentHashZ_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_PaymentHashZ of type Some */
-       public class Option_PaymentHashZ_Some : Option_PaymentHashZ {
-               public byte[] some;
-               internal Option_PaymentHashZ_Some(long ptr) : base(null, ptr) {
-                       this.some = bindings.LDKCOption_PaymentHashZ_Some_get_some(ptr);
-               }
-       }
-       /** A Option_PaymentHashZ of type None */
-       public class Option_PaymentHashZ_None : Option_PaymentHashZ {
-               internal Option_PaymentHashZ_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_PaymentHashZ containing a crate::c_types::ThirtyTwoBytes
-        */
-       public static Option_PaymentHashZ some(byte[] o) {
-               long ret = bindings.COption_PaymentHashZ_some(InternalUtils.check_arr_len(o, 32));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PaymentHashZ ret_hu_conv = org.ldk.structs.Option_PaymentHashZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_PaymentHashZ containing nothing
-        */
-       public static Option_PaymentHashZ none() {
-               long ret = bindings.COption_PaymentHashZ_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PaymentHashZ ret_hu_conv = org.ldk.structs.Option_PaymentHashZ.constr_from_ptr(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.COption_PaymentHashZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_PaymentHashZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_PaymentHashZ clone() {
-               long ret = bindings.COption_PaymentHashZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PaymentHashZ ret_hu_conv = org.ldk.structs.Option_PaymentHashZ.constr_from_ptr(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/Option_PaymentIdZ.cs b/c_sharp/src/org/ldk/structs/Option_PaymentIdZ.cs
deleted file mode 100644 (file)
index 56235db..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * An enum which can either contain a crate::c_types::ThirtyTwoBytes or not
- */
-public class Option_PaymentIdZ : CommonBase {
-       protected Option_PaymentIdZ(object _dummy, long ptr) : base(ptr) { }
-       ~Option_PaymentIdZ() {
-               if (ptr != 0) { bindings.COption_PaymentIdZ_free(ptr); }
-       }
-
-       internal static Option_PaymentIdZ constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_PaymentIdZ_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_PaymentIdZ_Some(ptr);
-                       case 1: return new Option_PaymentIdZ_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_PaymentIdZ of type Some */
-       public class Option_PaymentIdZ_Some : Option_PaymentIdZ {
-               public byte[] some;
-               internal Option_PaymentIdZ_Some(long ptr) : base(null, ptr) {
-                       this.some = bindings.LDKCOption_PaymentIdZ_Some_get_some(ptr);
-               }
-       }
-       /** A Option_PaymentIdZ of type None */
-       public class Option_PaymentIdZ_None : Option_PaymentIdZ {
-               internal Option_PaymentIdZ_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_PaymentIdZ containing a crate::c_types::ThirtyTwoBytes
-        */
-       public static Option_PaymentIdZ some(byte[] o) {
-               long ret = bindings.COption_PaymentIdZ_some(InternalUtils.check_arr_len(o, 32));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PaymentIdZ ret_hu_conv = org.ldk.structs.Option_PaymentIdZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_PaymentIdZ containing nothing
-        */
-       public static Option_PaymentIdZ none() {
-               long ret = bindings.COption_PaymentIdZ_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PaymentIdZ ret_hu_conv = org.ldk.structs.Option_PaymentIdZ.constr_from_ptr(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.COption_PaymentIdZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_PaymentIdZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_PaymentIdZ clone() {
-               long ret = bindings.COption_PaymentIdZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PaymentIdZ ret_hu_conv = org.ldk.structs.Option_PaymentIdZ.constr_from_ptr(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/Option_PaymentPreimageZ.cs b/c_sharp/src/org/ldk/structs/Option_PaymentPreimageZ.cs
deleted file mode 100644 (file)
index 350eb4c..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * An enum which can either contain a crate::c_types::ThirtyTwoBytes or not
- */
-public class Option_PaymentPreimageZ : CommonBase {
-       protected Option_PaymentPreimageZ(object _dummy, long ptr) : base(ptr) { }
-       ~Option_PaymentPreimageZ() {
-               if (ptr != 0) { bindings.COption_PaymentPreimageZ_free(ptr); }
-       }
-
-       internal static Option_PaymentPreimageZ constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_PaymentPreimageZ_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_PaymentPreimageZ_Some(ptr);
-                       case 1: return new Option_PaymentPreimageZ_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_PaymentPreimageZ of type Some */
-       public class Option_PaymentPreimageZ_Some : Option_PaymentPreimageZ {
-               public byte[] some;
-               internal Option_PaymentPreimageZ_Some(long ptr) : base(null, ptr) {
-                       this.some = bindings.LDKCOption_PaymentPreimageZ_Some_get_some(ptr);
-               }
-       }
-       /** A Option_PaymentPreimageZ of type None */
-       public class Option_PaymentPreimageZ_None : Option_PaymentPreimageZ {
-               internal Option_PaymentPreimageZ_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_PaymentPreimageZ containing a crate::c_types::ThirtyTwoBytes
-        */
-       public static Option_PaymentPreimageZ some(byte[] o) {
-               long ret = bindings.COption_PaymentPreimageZ_some(InternalUtils.check_arr_len(o, 32));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PaymentPreimageZ ret_hu_conv = org.ldk.structs.Option_PaymentPreimageZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_PaymentPreimageZ containing nothing
-        */
-       public static Option_PaymentPreimageZ none() {
-               long ret = bindings.COption_PaymentPreimageZ_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PaymentPreimageZ ret_hu_conv = org.ldk.structs.Option_PaymentPreimageZ.constr_from_ptr(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.COption_PaymentPreimageZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_PaymentPreimageZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_PaymentPreimageZ clone() {
-               long ret = bindings.COption_PaymentPreimageZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PaymentPreimageZ ret_hu_conv = org.ldk.structs.Option_PaymentPreimageZ.constr_from_ptr(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/Option_PaymentSecretZ.cs b/c_sharp/src/org/ldk/structs/Option_PaymentSecretZ.cs
deleted file mode 100644 (file)
index 907b40d..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * An enum which can either contain a crate::c_types::ThirtyTwoBytes or not
- */
-public class Option_PaymentSecretZ : CommonBase {
-       protected Option_PaymentSecretZ(object _dummy, long ptr) : base(ptr) { }
-       ~Option_PaymentSecretZ() {
-               if (ptr != 0) { bindings.COption_PaymentSecretZ_free(ptr); }
-       }
-
-       internal static Option_PaymentSecretZ constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_PaymentSecretZ_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_PaymentSecretZ_Some(ptr);
-                       case 1: return new Option_PaymentSecretZ_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_PaymentSecretZ of type Some */
-       public class Option_PaymentSecretZ_Some : Option_PaymentSecretZ {
-               public byte[] some;
-               internal Option_PaymentSecretZ_Some(long ptr) : base(null, ptr) {
-                       this.some = bindings.LDKCOption_PaymentSecretZ_Some_get_some(ptr);
-               }
-       }
-       /** A Option_PaymentSecretZ of type None */
-       public class Option_PaymentSecretZ_None : Option_PaymentSecretZ {
-               internal Option_PaymentSecretZ_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_PaymentSecretZ containing a crate::c_types::ThirtyTwoBytes
-        */
-       public static Option_PaymentSecretZ some(byte[] o) {
-               long ret = bindings.COption_PaymentSecretZ_some(InternalUtils.check_arr_len(o, 32));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PaymentSecretZ ret_hu_conv = org.ldk.structs.Option_PaymentSecretZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_PaymentSecretZ containing nothing
-        */
-       public static Option_PaymentSecretZ none() {
-               long ret = bindings.COption_PaymentSecretZ_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PaymentSecretZ ret_hu_conv = org.ldk.structs.Option_PaymentSecretZ.constr_from_ptr(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.COption_PaymentSecretZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_PaymentSecretZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_PaymentSecretZ clone() {
-               long ret = bindings.COption_PaymentSecretZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PaymentSecretZ ret_hu_conv = org.ldk.structs.Option_PaymentSecretZ.constr_from_ptr(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/Option_ScalarZ.cs b/c_sharp/src/org/ldk/structs/Option_ScalarZ.cs
deleted file mode 100644 (file)
index b3ef017..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 {
-
-/**
- * An enum which can either contain a crate::c_types::BigEndianScalar or not
- */
-public class Option_ScalarZ : CommonBase {
-       protected Option_ScalarZ(object _dummy, long ptr) : base(ptr) { }
-       ~Option_ScalarZ() {
-               if (ptr != 0) { bindings.COption_ScalarZ_free(ptr); }
-       }
-
-       internal static Option_ScalarZ constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_ScalarZ_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_ScalarZ_Some(ptr);
-                       case 1: return new Option_ScalarZ_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_ScalarZ of type Some */
-       public class Option_ScalarZ_Some : Option_ScalarZ {
-               public BigEndianScalar some;
-               internal Option_ScalarZ_Some(long ptr) : base(null, ptr) {
-                       long some = bindings.LDKCOption_ScalarZ_Some_get_some(ptr);
-                       BigEndianScalar some_conv = new BigEndianScalar(null, some);
-                       this.some = some_conv;
-               }
-       }
-       /** A Option_ScalarZ of type None */
-       public class Option_ScalarZ_None : Option_ScalarZ {
-               internal Option_ScalarZ_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_ScalarZ containing a crate::c_types::BigEndianScalar
-        */
-       public static Option_ScalarZ some(byte[] o_big_endian_bytes) {
-               long ret = bindings.COption_ScalarZ_some(bindings.BigEndianScalar_new(InternalUtils.check_arr_len(o_big_endian_bytes, 32)));
-               GC.KeepAlive(o_big_endian_bytes);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_ScalarZ ret_hu_conv = org.ldk.structs.Option_ScalarZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               ;
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_ScalarZ containing nothing
-        */
-       public static Option_ScalarZ none() {
-               long ret = bindings.COption_ScalarZ_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_ScalarZ ret_hu_conv = org.ldk.structs.Option_ScalarZ.constr_from_ptr(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.COption_ScalarZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_ScalarZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_ScalarZ clone() {
-               long ret = bindings.COption_ScalarZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_ScalarZ ret_hu_conv = org.ldk.structs.Option_ScalarZ.constr_from_ptr(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/Option_ScriptZ.cs b/c_sharp/src/org/ldk/structs/Option_ScriptZ.cs
deleted file mode 100644 (file)
index df9abd4..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * An enum which can either contain a crate::c_types::derived::CVec_u8Z or not
- */
-public class Option_ScriptZ : CommonBase {
-       protected Option_ScriptZ(object _dummy, long ptr) : base(ptr) { }
-       ~Option_ScriptZ() {
-               if (ptr != 0) { bindings.COption_ScriptZ_free(ptr); }
-       }
-
-       internal static Option_ScriptZ constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_ScriptZ_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_ScriptZ_Some(ptr);
-                       case 1: return new Option_ScriptZ_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_ScriptZ of type Some */
-       public class Option_ScriptZ_Some : Option_ScriptZ {
-               public byte[] some;
-               internal Option_ScriptZ_Some(long ptr) : base(null, ptr) {
-                       this.some = bindings.LDKCOption_ScriptZ_Some_get_some(ptr);
-               }
-       }
-       /** A Option_ScriptZ of type None */
-       public class Option_ScriptZ_None : Option_ScriptZ {
-               internal Option_ScriptZ_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_ScriptZ containing a crate::c_types::derived::CVec_u8Z
-        */
-       public static Option_ScriptZ some(byte[] o) {
-               long ret = bindings.COption_ScriptZ_some(o);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_ScriptZ ret_hu_conv = org.ldk.structs.Option_ScriptZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_ScriptZ containing nothing
-        */
-       public static Option_ScriptZ none() {
-               long ret = bindings.COption_ScriptZ_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_ScriptZ ret_hu_conv = org.ldk.structs.Option_ScriptZ.constr_from_ptr(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.COption_ScriptZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_ScriptZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_ScriptZ clone() {
-               long ret = bindings.COption_ScriptZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_ScriptZ ret_hu_conv = org.ldk.structs.Option_ScriptZ.constr_from_ptr(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/Option_SecretKeyZ.cs b/c_sharp/src/org/ldk/structs/Option_SecretKeyZ.cs
new file mode 100644 (file)
index 0000000..b716b0b
--- /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 {
+
+/**
+ * An enum which can either contain a crate::c_types::SecretKey or not
+ */
+public class Option_SecretKeyZ : CommonBase {
+       protected Option_SecretKeyZ(object _dummy, long ptr) : base(ptr) { }
+       ~Option_SecretKeyZ() {
+               if (ptr != 0) { bindings.COption_SecretKeyZ_free(ptr); }
+       }
+
+       internal static Option_SecretKeyZ constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKCOption_SecretKeyZ_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new Option_SecretKeyZ_Some(ptr);
+                       case 1: return new Option_SecretKeyZ_None(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A Option_SecretKeyZ of type Some */
+       public class Option_SecretKeyZ_Some : Option_SecretKeyZ {
+               public byte[] some;
+               internal Option_SecretKeyZ_Some(long ptr) : base(null, ptr) {
+                       long some = bindings.LDKCOption_SecretKeyZ_Some_get_some(ptr);
+                       byte[] some_conv = InternalUtils.decodeUint8Array(some);
+                       this.some = some_conv;
+               }
+       }
+       /** A Option_SecretKeyZ of type None */
+       public class Option_SecretKeyZ_None : Option_SecretKeyZ {
+               internal Option_SecretKeyZ_None(long ptr) : base(null, ptr) {
+               }
+       }
+       /**
+        * Constructs a new COption_SecretKeyZ containing a crate::c_types::SecretKey
+        */
+       public static Option_SecretKeyZ some(byte[] o) {
+               long ret = bindings.COption_SecretKeyZ_some(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(o, 32)));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_SecretKeyZ ret_hu_conv = org.ldk.structs.Option_SecretKeyZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new COption_SecretKeyZ containing nothing
+        */
+       public static Option_SecretKeyZ none() {
+               long ret = bindings.COption_SecretKeyZ_none();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_SecretKeyZ ret_hu_conv = org.ldk.structs.Option_SecretKeyZ.constr_from_ptr(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.COption_SecretKeyZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new COption_SecretKeyZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Option_SecretKeyZ clone() {
+               long ret = bindings.COption_SecretKeyZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_SecretKeyZ ret_hu_conv = org.ldk.structs.Option_SecretKeyZ.constr_from_ptr(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/Option_SocketAddressZ.cs b/c_sharp/src/org/ldk/structs/Option_SocketAddressZ.cs
new file mode 100644 (file)
index 0000000..fda7b85
--- /dev/null
@@ -0,0 +1,86 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+/**
+ * An enum which can either contain a crate::lightning::ln::msgs::SocketAddress or not
+ */
+public class Option_SocketAddressZ : CommonBase {
+       protected Option_SocketAddressZ(object _dummy, long ptr) : base(ptr) { }
+       ~Option_SocketAddressZ() {
+               if (ptr != 0) { bindings.COption_SocketAddressZ_free(ptr); }
+       }
+
+       internal static Option_SocketAddressZ constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKCOption_SocketAddressZ_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new Option_SocketAddressZ_Some(ptr);
+                       case 1: return new Option_SocketAddressZ_None(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A Option_SocketAddressZ of type Some */
+       public class Option_SocketAddressZ_Some : Option_SocketAddressZ {
+               public SocketAddress some;
+               internal Option_SocketAddressZ_Some(long ptr) : base(null, ptr) {
+                       long some = bindings.LDKCOption_SocketAddressZ_Some_get_some(ptr);
+                       org.ldk.structs.SocketAddress some_hu_conv = org.ldk.structs.SocketAddress.constr_from_ptr(some);
+                       if (some_hu_conv != null) { some_hu_conv.ptrs_to.AddLast(this); };
+                       this.some = some_hu_conv;
+               }
+       }
+       /** A Option_SocketAddressZ of type None */
+       public class Option_SocketAddressZ_None : Option_SocketAddressZ {
+               internal Option_SocketAddressZ_None(long ptr) : base(null, ptr) {
+               }
+       }
+       /**
+        * Constructs a new COption_SocketAddressZ containing a crate::lightning::ln::msgs::SocketAddress
+        */
+       public static Option_SocketAddressZ some(org.ldk.structs.SocketAddress o) {
+               long ret = bindings.COption_SocketAddressZ_some(o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_SocketAddressZ ret_hu_conv = org.ldk.structs.Option_SocketAddressZ.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(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new COption_SocketAddressZ containing nothing
+        */
+       public static Option_SocketAddressZ none() {
+               long ret = bindings.COption_SocketAddressZ_none();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_SocketAddressZ ret_hu_conv = org.ldk.structs.Option_SocketAddressZ.constr_from_ptr(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.COption_SocketAddressZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new COption_SocketAddressZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Option_SocketAddressZ clone() {
+               long ret = bindings.COption_SocketAddressZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_SocketAddressZ ret_hu_conv = org.ldk.structs.Option_SocketAddressZ.constr_from_ptr(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/Option_StrZ.cs b/c_sharp/src/org/ldk/structs/Option_StrZ.cs
new file mode 100644 (file)
index 0000000..cf48467
--- /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 {
+
+/**
+ * An enum which can either contain a crate::c_types::Str or not
+ */
+public class Option_StrZ : CommonBase {
+       protected Option_StrZ(object _dummy, long ptr) : base(ptr) { }
+       ~Option_StrZ() {
+               if (ptr != 0) { bindings.COption_StrZ_free(ptr); }
+       }
+
+       internal static Option_StrZ constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKCOption_StrZ_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new Option_StrZ_Some(ptr);
+                       case 1: return new Option_StrZ_None(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A Option_StrZ of type Some */
+       public class Option_StrZ_Some : Option_StrZ {
+               public string some;
+               internal Option_StrZ_Some(long ptr) : base(null, ptr) {
+                       long some = bindings.LDKCOption_StrZ_Some_get_some(ptr);
+                       string some_conv = InternalUtils.decodeString(some);
+                       this.some = some_conv;
+               }
+       }
+       /** A Option_StrZ of type None */
+       public class Option_StrZ_None : Option_StrZ {
+               internal Option_StrZ_None(long ptr) : base(null, ptr) {
+               }
+       }
+       /**
+        * Constructs a new COption_StrZ containing a crate::c_types::Str
+        */
+       public static Option_StrZ some(string o) {
+               long ret = bindings.COption_StrZ_some(InternalUtils.encodeString(o));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_StrZ ret_hu_conv = org.ldk.structs.Option_StrZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new COption_StrZ containing nothing
+        */
+       public static Option_StrZ none() {
+               long ret = bindings.COption_StrZ_none();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_StrZ ret_hu_conv = org.ldk.structs.Option_StrZ.constr_from_ptr(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.COption_StrZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new COption_StrZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Option_StrZ clone() {
+               long ret = bindings.COption_StrZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_StrZ ret_hu_conv = org.ldk.structs.Option_StrZ.constr_from_ptr(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/Option_ThirtyTwoBytesZ.cs b/c_sharp/src/org/ldk/structs/Option_ThirtyTwoBytesZ.cs
new file mode 100644 (file)
index 0000000..a8bd27c
--- /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 {
+
+/**
+ * An enum which can either contain a crate::c_types::ThirtyTwoBytes or not
+ */
+public class Option_ThirtyTwoBytesZ : CommonBase {
+       protected Option_ThirtyTwoBytesZ(object _dummy, long ptr) : base(ptr) { }
+       ~Option_ThirtyTwoBytesZ() {
+               if (ptr != 0) { bindings.COption_ThirtyTwoBytesZ_free(ptr); }
+       }
+
+       internal static Option_ThirtyTwoBytesZ constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKCOption_ThirtyTwoBytesZ_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new Option_ThirtyTwoBytesZ_Some(ptr);
+                       case 1: return new Option_ThirtyTwoBytesZ_None(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A Option_ThirtyTwoBytesZ of type Some */
+       public class Option_ThirtyTwoBytesZ_Some : Option_ThirtyTwoBytesZ {
+               public byte[] some;
+               internal Option_ThirtyTwoBytesZ_Some(long ptr) : base(null, ptr) {
+                       long some = bindings.LDKCOption_ThirtyTwoBytesZ_Some_get_some(ptr);
+                       byte[] some_conv = InternalUtils.decodeUint8Array(some);
+                       this.some = some_conv;
+               }
+       }
+       /** A Option_ThirtyTwoBytesZ of type None */
+       public class Option_ThirtyTwoBytesZ_None : Option_ThirtyTwoBytesZ {
+               internal Option_ThirtyTwoBytesZ_None(long ptr) : base(null, ptr) {
+               }
+       }
+       /**
+        * Constructs a new COption_ThirtyTwoBytesZ containing a crate::c_types::ThirtyTwoBytes
+        */
+       public static Option_ThirtyTwoBytesZ some(byte[] o) {
+               long ret = bindings.COption_ThirtyTwoBytesZ_some(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(o, 32)));
+               GC.KeepAlive(o);
+               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(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new COption_ThirtyTwoBytesZ containing nothing
+        */
+       public static Option_ThirtyTwoBytesZ none() {
+               long ret = bindings.COption_ThirtyTwoBytesZ_none();
+               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(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.COption_ThirtyTwoBytesZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new COption_ThirtyTwoBytesZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Option_ThirtyTwoBytesZ clone() {
+               long ret = bindings.COption_ThirtyTwoBytesZ_clone(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;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Option_TxidZ.cs b/c_sharp/src/org/ldk/structs/Option_TxidZ.cs
deleted file mode 100644 (file)
index 06d31ec..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * An enum which can either contain a crate::c_types::ThirtyTwoBytes or not
- */
-public class Option_TxidZ : CommonBase {
-       protected Option_TxidZ(object _dummy, long ptr) : base(ptr) { }
-       ~Option_TxidZ() {
-               if (ptr != 0) { bindings.COption_TxidZ_free(ptr); }
-       }
-
-       internal static Option_TxidZ constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_TxidZ_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_TxidZ_Some(ptr);
-                       case 1: return new Option_TxidZ_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_TxidZ of type Some */
-       public class Option_TxidZ_Some : Option_TxidZ {
-               public byte[] some;
-               internal Option_TxidZ_Some(long ptr) : base(null, ptr) {
-                       this.some = bindings.LDKCOption_TxidZ_Some_get_some(ptr);
-               }
-       }
-       /** A Option_TxidZ of type None */
-       public class Option_TxidZ_None : Option_TxidZ {
-               internal Option_TxidZ_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_TxidZ containing a crate::c_types::ThirtyTwoBytes
-        */
-       public static Option_TxidZ some(byte[] o) {
-               long ret = bindings.COption_TxidZ_some(InternalUtils.check_arr_len(o, 32));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_TxidZ ret_hu_conv = org.ldk.structs.Option_TxidZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_TxidZ containing nothing
-        */
-       public static Option_TxidZ none() {
-               long ret = bindings.COption_TxidZ_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_TxidZ ret_hu_conv = org.ldk.structs.Option_TxidZ.constr_from_ptr(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.COption_TxidZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_TxidZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_TxidZ clone() {
-               long ret = bindings.COption_TxidZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_TxidZ ret_hu_conv = org.ldk.structs.Option_TxidZ.constr_from_ptr(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/Option_U128Z.cs b/c_sharp/src/org/ldk/structs/Option_U128Z.cs
new file mode 100644 (file)
index 0000000..d34c8f1
--- /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 {
+
+/**
+ * An enum which can either contain a crate::c_types::U128 or not
+ */
+public class Option_U128Z : CommonBase {
+       protected Option_U128Z(object _dummy, long ptr) : base(ptr) { }
+       ~Option_U128Z() {
+               if (ptr != 0) { bindings.COption_U128Z_free(ptr); }
+       }
+
+       internal static Option_U128Z constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKCOption_U128Z_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new Option_U128Z_Some(ptr);
+                       case 1: return new Option_U128Z_None(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A Option_U128Z of type Some */
+       public class Option_U128Z_Some : Option_U128Z {
+               public UInt128 some;
+               internal Option_U128Z_Some(long ptr) : base(null, ptr) {
+                       long some = bindings.LDKCOption_U128Z_Some_get_some(ptr);
+                       org.ldk.util.UInt128 some_conv = new org.ldk.util.UInt128(some);
+                       this.some = some_conv;
+               }
+       }
+       /** A Option_U128Z of type None */
+       public class Option_U128Z_None : Option_U128Z {
+               internal Option_U128Z_None(long ptr) : base(null, ptr) {
+               }
+       }
+       /**
+        * Constructs a new COption_U128Z containing a crate::c_types::U128
+        */
+       public static Option_U128Z some(org.ldk.util.UInt128 o) {
+               long ret = bindings.COption_U128Z_some(InternalUtils.encodeUint8Array(o.getLEBytes()));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_U128Z ret_hu_conv = org.ldk.structs.Option_U128Z.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new COption_U128Z containing nothing
+        */
+       public static Option_U128Z none() {
+               long ret = bindings.COption_U128Z_none();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_U128Z ret_hu_conv = org.ldk.structs.Option_U128Z.constr_from_ptr(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.COption_U128Z_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new COption_U128Z which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Option_U128Z clone() {
+               long ret = bindings.COption_U128Z_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_U128Z ret_hu_conv = org.ldk.structs.Option_U128Z.constr_from_ptr(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/Option_boolZ.cs b/c_sharp/src/org/ldk/structs/Option_boolZ.cs
new file mode 100644 (file)
index 0000000..2e06d56
--- /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 {
+
+/**
+ * An enum which can either contain a bool or not
+ */
+public class Option_boolZ : CommonBase {
+       protected Option_boolZ(object _dummy, long ptr) : base(ptr) { }
+       ~Option_boolZ() {
+               if (ptr != 0) { bindings.COption_boolZ_free(ptr); }
+       }
+
+       internal static Option_boolZ constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKCOption_boolZ_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new Option_boolZ_Some(ptr);
+                       case 1: return new Option_boolZ_None(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A Option_boolZ of type Some */
+       public class Option_boolZ_Some : Option_boolZ {
+               public bool some;
+               internal Option_boolZ_Some(long ptr) : base(null, ptr) {
+                       this.some = bindings.LDKCOption_boolZ_Some_get_some(ptr);
+               }
+       }
+       /** A Option_boolZ of type None */
+       public class Option_boolZ_None : Option_boolZ {
+               internal Option_boolZ_None(long ptr) : base(null, ptr) {
+               }
+       }
+       /**
+        * Constructs a new COption_boolZ containing a bool
+        */
+       public static Option_boolZ some(bool o) {
+               long ret = bindings.COption_boolZ_some(o);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_boolZ ret_hu_conv = org.ldk.structs.Option_boolZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new COption_boolZ containing nothing
+        */
+       public static Option_boolZ none() {
+               long ret = bindings.COption_boolZ_none();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_boolZ ret_hu_conv = org.ldk.structs.Option_boolZ.constr_from_ptr(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.COption_boolZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new COption_boolZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Option_boolZ clone() {
+               long ret = bindings.COption_boolZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_boolZ ret_hu_conv = org.ldk.structs.Option_boolZ.constr_from_ptr(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/Option_f64Z.cs b/c_sharp/src/org/ldk/structs/Option_f64Z.cs
new file mode 100644 (file)
index 0000000..e548059
--- /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 {
+
+/**
+ * An enum which can either contain a f64 or not
+ */
+public class Option_f64Z : CommonBase {
+       protected Option_f64Z(object _dummy, long ptr) : base(ptr) { }
+       ~Option_f64Z() {
+               if (ptr != 0) { bindings.COption_f64Z_free(ptr); }
+       }
+
+       internal static Option_f64Z constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKCOption_f64Z_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new Option_f64Z_Some(ptr);
+                       case 1: return new Option_f64Z_None(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A Option_f64Z of type Some */
+       public class Option_f64Z_Some : Option_f64Z {
+               public double some;
+               internal Option_f64Z_Some(long ptr) : base(null, ptr) {
+                       this.some = bindings.LDKCOption_f64Z_Some_get_some(ptr);
+               }
+       }
+       /** A Option_f64Z of type None */
+       public class Option_f64Z_None : Option_f64Z {
+               internal Option_f64Z_None(long ptr) : base(null, ptr) {
+               }
+       }
+       /**
+        * Constructs a new COption_f64Z containing a f64
+        */
+       public static Option_f64Z some(double o) {
+               long ret = bindings.COption_f64Z_some(o);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_f64Z ret_hu_conv = org.ldk.structs.Option_f64Z.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new COption_f64Z containing nothing
+        */
+       public static Option_f64Z none() {
+               long ret = bindings.COption_f64Z_none();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_f64Z ret_hu_conv = org.ldk.structs.Option_f64Z.constr_from_ptr(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.COption_f64Z_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new COption_f64Z which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Option_f64Z clone() {
+               long ret = bindings.COption_f64Z_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_f64Z ret_hu_conv = org.ldk.structs.Option_f64Z.constr_from_ptr(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/Option_u128Z.cs b/c_sharp/src/org/ldk/structs/Option_u128Z.cs
deleted file mode 100644 (file)
index af03384..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * An enum which can either contain a crate::c_types::U128 or not
- */
-public class Option_u128Z : CommonBase {
-       protected Option_u128Z(object _dummy, long ptr) : base(ptr) { }
-       ~Option_u128Z() {
-               if (ptr != 0) { bindings.COption_u128Z_free(ptr); }
-       }
-
-       internal static Option_u128Z constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKCOption_u128Z_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new Option_u128Z_Some(ptr);
-                       case 1: return new Option_u128Z_None(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A Option_u128Z of type Some */
-       public class Option_u128Z_Some : Option_u128Z {
-               public UInt128 some;
-               internal Option_u128Z_Some(long ptr) : base(null, ptr) {
-                       byte[] some = bindings.LDKCOption_u128Z_Some_get_some(ptr);
-                       org.ldk.util.UInt128 some_conv = new org.ldk.util.UInt128(some);
-                       this.some = some_conv;
-               }
-       }
-       /** A Option_u128Z of type None */
-       public class Option_u128Z_None : Option_u128Z {
-               internal Option_u128Z_None(long ptr) : base(null, ptr) {
-               }
-       }
-       /**
-        * Constructs a new COption_u128Z containing a crate::c_types::U128
-        */
-       public static Option_u128Z some(org.ldk.util.UInt128 o) {
-               long ret = bindings.COption_u128Z_some(o.getLEBytes());
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_u128Z ret_hu_conv = org.ldk.structs.Option_u128Z.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Constructs a new COption_u128Z containing nothing
-        */
-       public static Option_u128Z none() {
-               long ret = bindings.COption_u128Z_none();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_u128Z ret_hu_conv = org.ldk.structs.Option_u128Z.constr_from_ptr(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.COption_u128Z_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new COption_u128Z which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Option_u128Z clone() {
-               long ret = bindings.COption_u128Z_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_u128Z ret_hu_conv = org.ldk.structs.Option_u128Z.constr_from_ptr(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/Option_usizeZ.cs b/c_sharp/src/org/ldk/structs/Option_usizeZ.cs
new file mode 100644 (file)
index 0000000..da79fdc
--- /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 {
+
+/**
+ * An enum which can either contain a usize or not
+ */
+public class Option_usizeZ : CommonBase {
+       protected Option_usizeZ(object _dummy, long ptr) : base(ptr) { }
+       ~Option_usizeZ() {
+               if (ptr != 0) { bindings.COption_usizeZ_free(ptr); }
+       }
+
+       internal static Option_usizeZ constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKCOption_usizeZ_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new Option_usizeZ_Some(ptr);
+                       case 1: return new Option_usizeZ_None(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A Option_usizeZ of type Some */
+       public class Option_usizeZ_Some : Option_usizeZ {
+               public long some;
+               internal Option_usizeZ_Some(long ptr) : base(null, ptr) {
+                       this.some = bindings.LDKCOption_usizeZ_Some_get_some(ptr);
+               }
+       }
+       /** A Option_usizeZ of type None */
+       public class Option_usizeZ_None : Option_usizeZ {
+               internal Option_usizeZ_None(long ptr) : base(null, ptr) {
+               }
+       }
+       /**
+        * Constructs a new COption_usizeZ containing a usize
+        */
+       public static Option_usizeZ some(long o) {
+               long ret = bindings.COption_usizeZ_some(o);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_usizeZ ret_hu_conv = org.ldk.structs.Option_usizeZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new COption_usizeZ containing nothing
+        */
+       public static Option_usizeZ none() {
+               long ret = bindings.COption_usizeZ_none();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_usizeZ ret_hu_conv = org.ldk.structs.Option_usizeZ.constr_from_ptr(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.COption_usizeZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new COption_usizeZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Option_usizeZ clone() {
+               long ret = bindings.COption_usizeZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_usizeZ ret_hu_conv = org.ldk.structs.Option_usizeZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index c7187ff8ffec71f284ba19122c4ac2cd4ce05f71..2d01d0a24cc9c02ab95d5f77cff1cbb846cd3e50 100644 (file)
@@ -22,16 +22,18 @@ public class OutPoint : CommonBase {
         * The referenced transaction's txid.
         */
        public byte[] get_txid() {
-               byte[] ret = bindings.OutPoint_get_txid(this.ptr);
+               long ret = bindings.OutPoint_get_txid(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The referenced transaction's txid.
         */
        public void set_txid(byte[] val) {
-               bindings.OutPoint_set_txid(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.OutPoint_set_txid(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -58,7 +60,7 @@ public class OutPoint : CommonBase {
         * Constructs a new OutPoint given each field
         */
        public static OutPoint of(byte[] txid_arg, short index_arg) {
-               long ret = bindings.OutPoint_new(InternalUtils.check_arr_len(txid_arg, 32), index_arg);
+               long ret = bindings.OutPoint_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(txid_arg, 32)), index_arg);
                GC.KeepAlive(txid_arg);
                GC.KeepAlive(index_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -118,25 +120,29 @@ public class OutPoint : CommonBase {
         * Convert an `OutPoint` to a lightning channel id.
         */
        public byte[] to_channel_id() {
-               byte[] ret = bindings.OutPoint_to_channel_id(this.ptr);
+               long ret = bindings.OutPoint_to_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Serialize the OutPoint object into a byte array which can be read by OutPoint_read
         */
        public byte[] write() {
-               byte[] ret = bindings.OutPoint_write(this.ptr);
+               long ret = bindings.OutPoint_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a OutPoint from a byte array, created by OutPoint_write
         */
        public static Result_OutPointDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.OutPoint_read(ser);
+               long ret = bindings.OutPoint_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_OutPointDecodeErrorZ ret_hu_conv = Result_OutPointDecodeErrorZ.constr_from_ptr(ret);
diff --git a/c_sharp/src/org/ldk/structs/Packet.cs b/c_sharp/src/org/ldk/structs/Packet.cs
new file mode 100644 (file)
index 0000000..3fad01f
--- /dev/null
@@ -0,0 +1,160 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * Packet of hop data for next peer
+ */
+public class Packet : CommonBase {
+       internal Packet(object _dummy, long ptr) : base(ptr) { }
+       ~Packet() {
+               if (ptr != 0) { bindings.Packet_free(ptr); }
+       }
+
+       /**
+        * Bolt 04 version number
+        */
+       public byte get_version() {
+               byte ret = bindings.Packet_get_version(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Bolt 04 version number
+        */
+       public void set_version(byte val) {
+               bindings.Packet_set_version(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * A random sepc256k1 point, used to build the ECDH shared secret to decrypt hop_data
+        */
+       public byte[] get_public_key() {
+               long ret = bindings.Packet_get_public_key(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * A random sepc256k1 point, used to build the ECDH shared secret to decrypt hop_data
+        */
+       public void set_public_key(byte[] val) {
+               bindings.Packet_set_public_key(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Encrypted payload for the next hop
+        * 
+        * Returns a copy of the field.
+        */
+       public byte[] get_hop_data() {
+               long ret = bindings.Packet_get_hop_data(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Encrypted payload for the next hop
+        */
+       public void set_hop_data(byte[] val) {
+               bindings.Packet_set_hop_data(this.ptr, InternalUtils.encodeUint8Array(val));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * HMAC to verify the integrity of hop_data
+        */
+       public byte[] get_hmac() {
+               long ret = bindings.Packet_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.Packet_set_hmac(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new Packet given each field
+        */
+       public static Packet of(byte version_arg, byte[] public_key_arg, byte[] hop_data_arg, byte[] hmac_arg) {
+               long ret = bindings.Packet_new(version_arg, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(public_key_arg, 33)), InternalUtils.encodeUint8Array(hop_data_arg), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(hmac_arg, 32)));
+               GC.KeepAlive(version_arg);
+               GC.KeepAlive(public_key_arg);
+               GC.KeepAlive(hop_data_arg);
+               GC.KeepAlive(hmac_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Packet ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Packet(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.Packet_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the Packet
+        */
+       public Packet clone() {
+               long ret = bindings.Packet_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Packet ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Packet(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if two Packets 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.Packet b) {
+               bool ret = bindings.Packet_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 Packet)) return false;
+               return this.eq((Packet)o);
+       }
+       /**
+        * Serialize the Packet object into a byte array which can be read by Packet_read
+        */
+       public byte[] write() {
+               long ret = bindings.Packet_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+}
+} } }
index c534f89077e1f2ea81acef97ecf9b18c9379689d..d1f27fd37e0a1c85f77e3554d71ddd339f7549a9 100644 (file)
@@ -105,9 +105,11 @@ public class ParseOrSemanticError : CommonBase {
         * Get the string representation of a ParseOrSemanticError object
         */
        public string to_str() {
-               string ret = bindings.ParseOrSemanticError_to_str(this.ptr);
+               long ret = bindings.ParseOrSemanticError_to_str(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
        }
 
 }
diff --git a/c_sharp/src/org/ldk/structs/ParsedOnionMessageContents.cs b/c_sharp/src/org/ldk/structs/ParsedOnionMessageContents.cs
new file mode 100644 (file)
index 0000000..9bf441f
--- /dev/null
@@ -0,0 +1,118 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+/**
+ * The contents of an [`OnionMessage`] as read from the wire.
+ * 
+ * [`OnionMessage`]: crate::ln::msgs::OnionMessage
+ */
+public class ParsedOnionMessageContents : CommonBase {
+       protected ParsedOnionMessageContents(object _dummy, long ptr) : base(ptr) { }
+       ~ParsedOnionMessageContents() {
+               if (ptr != 0) { bindings.ParsedOnionMessageContents_free(ptr); }
+       }
+
+       internal static ParsedOnionMessageContents constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKParsedOnionMessageContents_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new ParsedOnionMessageContents_Offers(ptr);
+                       case 1: return new ParsedOnionMessageContents_Custom(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A ParsedOnionMessageContents of type Offers */
+       public class ParsedOnionMessageContents_Offers : ParsedOnionMessageContents {
+               public OffersMessage offers;
+               internal ParsedOnionMessageContents_Offers(long ptr) : base(null, ptr) {
+                       long offers = bindings.LDKParsedOnionMessageContents_Offers_get_offers(ptr);
+                       org.ldk.structs.OffersMessage offers_hu_conv = org.ldk.structs.OffersMessage.constr_from_ptr(offers);
+                       if (offers_hu_conv != null) { offers_hu_conv.ptrs_to.AddLast(this); };
+                       this.offers = offers_hu_conv;
+               }
+       }
+       /** A ParsedOnionMessageContents of type Custom */
+       public class ParsedOnionMessageContents_Custom : ParsedOnionMessageContents {
+               public OnionMessageContents custom;
+               internal ParsedOnionMessageContents_Custom(long ptr) : base(null, ptr) {
+                       long custom = bindings.LDKParsedOnionMessageContents_Custom_get_custom(ptr);
+                       OnionMessageContents ret_hu_conv = new OnionMessageContents(null, custom);
+                       if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+                       this.custom = ret_hu_conv;
+               }
+       }
+       internal long clone_ptr() {
+               long ret = bindings.ParsedOnionMessageContents_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the ParsedOnionMessageContents
+        */
+       public ParsedOnionMessageContents clone() {
+               long ret = bindings.ParsedOnionMessageContents_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ParsedOnionMessageContents ret_hu_conv = org.ldk.structs.ParsedOnionMessageContents.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 Offers-variant ParsedOnionMessageContents
+        */
+       public static ParsedOnionMessageContents offers(org.ldk.structs.OffersMessage a) {
+               long ret = bindings.ParsedOnionMessageContents_offers(a.ptr);
+               GC.KeepAlive(a);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ParsedOnionMessageContents ret_hu_conv = org.ldk.structs.ParsedOnionMessageContents.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 Custom-variant ParsedOnionMessageContents
+        */
+       public static ParsedOnionMessageContents custom(org.ldk.structs.OnionMessageContents a) {
+               long ret = bindings.ParsedOnionMessageContents_custom(a.ptr);
+               GC.KeepAlive(a);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ParsedOnionMessageContents ret_hu_conv = org.ldk.structs.ParsedOnionMessageContents.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;
+       }
+
+       /**
+        * 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.ParsedOnionMessageContents_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 ParsedOnionMessageContents object into a byte array which can be read by ParsedOnionMessageContents_read
+        */
+       public byte[] write() {
+               long ret = bindings.ParsedOnionMessageContents_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+}
+} } }
index a48757dc239a1bf3353de0409ec7297b1a04a993..05eadf00bc39e7ff4b2f878f735ee70b5a001d2e 100644 (file)
@@ -20,16 +20,18 @@ public class Path : CommonBase {
         * The list of unblinded hops in this [`Path`]. Must be at least length one.
         */
        public RouteHop[] get_hops() {
-               long[] ret = bindings.Path_get_hops(this.ptr);
+               long ret = bindings.Path_get_hops(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_10_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_10_len = InternalUtils.getArrayLength(ret);
                RouteHop[] ret_conv_10_arr = new RouteHop[ret_conv_10_len];
                for (int k = 0; k < ret_conv_10_len; k++) {
-                       long ret_conv_10 = ret[k];
+                       long ret_conv_10 = InternalUtils.getU64ArrayElem(ret, k);
                        org.ldk.structs.RouteHop ret_conv_10_hu_conv = null; if (ret_conv_10 < 0 || ret_conv_10 > 4096) { ret_conv_10_hu_conv = new org.ldk.structs.RouteHop(null, ret_conv_10); }
                        if (ret_conv_10_hu_conv != null) { ret_conv_10_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_10_arr[k] = ret_conv_10_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_10_arr;
        }
 
@@ -37,7 +39,7 @@ public class Path : CommonBase {
         * The list of unblinded hops in this [`Path`]. Must be at least length one.
         */
        public void set_hops(RouteHop[] val) {
-               bindings.Path_set_hops(this.ptr, val != null ? InternalUtils.mapArray(val, val_conv_10 => val_conv_10 == null ? 0 : val_conv_10.ptr) : null);
+               bindings.Path_set_hops(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(val, val_conv_10 => val_conv_10 == null ? 0 : val_conv_10.ptr)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
                foreach (RouteHop val_conv_10 in val) { if (this != null) { this.ptrs_to.AddLast(val_conv_10); }; };
@@ -71,9 +73,11 @@ public class Path : CommonBase {
 
        /**
         * Constructs a new Path given each field
+        * 
+        * Note that blinded_tail_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public static Path of(RouteHop[] hops_arg, org.ldk.structs.BlindedTail blinded_tail_arg) {
-               long ret = bindings.Path_new(hops_arg != null ? InternalUtils.mapArray(hops_arg, hops_arg_conv_10 => hops_arg_conv_10 == null ? 0 : hops_arg_conv_10.ptr) : null, blinded_tail_arg == null ? 0 : blinded_tail_arg.ptr);
+               long ret = bindings.Path_new(InternalUtils.encodeUint64Array(InternalUtils.mapArray(hops_arg, hops_arg_conv_10 => hops_arg_conv_10 == null ? 0 : hops_arg_conv_10.ptr)), blinded_tail_arg == null ? 0 : blinded_tail_arg.ptr);
                GC.KeepAlive(hops_arg);
                GC.KeepAlive(blinded_tail_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
index c4c30685d06ae269f4958914b2275d6e5fcced1a..598915210e87c71498b2b3b3636763ad04ce729f 100644 (file)
@@ -121,9 +121,11 @@ public class PathFailure : CommonBase {
         * Serialize the PathFailure object into a byte array which can be read by PathFailure_read
         */
        public byte[] write() {
-               byte[] ret = bindings.PathFailure_write(this.ptr);
+               long ret = bindings.PathFailure_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index fd4f93d0a769418ba077fa3d7c4b0a3568b4e6eb..69b6a4a26b771b5fda60995489a1332bdf1a7499 100644 (file)
@@ -42,15 +42,16 @@ public class Payee : CommonBase {
                 */
                public Bolt12InvoiceFeatures features;
                internal Payee_Blinded(long ptr) : base(null, ptr) {
-                       long[] route_hints = bindings.LDKPayee_Blinded_get_route_hints(ptr);
-                       int route_hints_conv_37_len = route_hints.Length;
+                       long route_hints = bindings.LDKPayee_Blinded_get_route_hints(ptr);
+                       int route_hints_conv_37_len = InternalUtils.getArrayLength(route_hints);
                        TwoTuple_BlindedPayInfoBlindedPathZ[] route_hints_conv_37_arr = new TwoTuple_BlindedPayInfoBlindedPathZ[route_hints_conv_37_len];
                        for (int l = 0; l < route_hints_conv_37_len; l++) {
-                               long route_hints_conv_37 = route_hints[l];
+                               long route_hints_conv_37 = InternalUtils.getU64ArrayElem(route_hints, l);
                                TwoTuple_BlindedPayInfoBlindedPathZ route_hints_conv_37_hu_conv = new TwoTuple_BlindedPayInfoBlindedPathZ(null, route_hints_conv_37);
                                if (route_hints_conv_37_hu_conv != null) { route_hints_conv_37_hu_conv.ptrs_to.AddLast(this); };
                                route_hints_conv_37_arr[l] = route_hints_conv_37_hu_conv;
                        }
+                       bindings.free_buffer(route_hints);
                        this.route_hints = route_hints_conv_37_arr;
                        long features = bindings.LDKPayee_Blinded_get_features(ptr);
                        org.ldk.structs.Bolt12InvoiceFeatures features_hu_conv = null; if (features < 0 || features > 4096) { features_hu_conv = new org.ldk.structs.Bolt12InvoiceFeatures(null, features); }
@@ -84,16 +85,19 @@ public class Payee : CommonBase {
                 */
                public int final_cltv_expiry_delta;
                internal Payee_Clear(long ptr) : base(null, ptr) {
-                       this.node_id = bindings.LDKPayee_Clear_get_node_id(ptr);
-                       long[] route_hints = bindings.LDKPayee_Clear_get_route_hints(ptr);
-                       int route_hints_conv_11_len = route_hints.Length;
+                       long node_id = bindings.LDKPayee_Clear_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
+                       long route_hints = bindings.LDKPayee_Clear_get_route_hints(ptr);
+                       int route_hints_conv_11_len = InternalUtils.getArrayLength(route_hints);
                        RouteHint[] route_hints_conv_11_arr = new RouteHint[route_hints_conv_11_len];
                        for (int l = 0; l < route_hints_conv_11_len; l++) {
-                               long route_hints_conv_11 = route_hints[l];
+                               long route_hints_conv_11 = InternalUtils.getU64ArrayElem(route_hints, l);
                                org.ldk.structs.RouteHint route_hints_conv_11_hu_conv = null; if (route_hints_conv_11 < 0 || route_hints_conv_11 > 4096) { route_hints_conv_11_hu_conv = new org.ldk.structs.RouteHint(null, route_hints_conv_11); }
                                if (route_hints_conv_11_hu_conv != null) { route_hints_conv_11_hu_conv.ptrs_to.AddLast(this); };
                                route_hints_conv_11_arr[l] = route_hints_conv_11_hu_conv;
                        }
+                       bindings.free_buffer(route_hints);
                        this.route_hints = route_hints_conv_11_arr;
                        long features = bindings.LDKPayee_Clear_get_features(ptr);
                        org.ldk.structs.Bolt11InvoiceFeatures features_hu_conv = null; if (features < 0 || features > 4096) { features_hu_conv = new org.ldk.structs.Bolt11InvoiceFeatures(null, features); }
@@ -124,7 +128,7 @@ public class Payee : CommonBase {
         * Utility method to constructs a new Blinded-variant Payee
         */
        public static Payee blinded(TwoTuple_BlindedPayInfoBlindedPathZ[] route_hints, org.ldk.structs.Bolt12InvoiceFeatures features) {
-               long ret = bindings.Payee_blinded(route_hints != null ? InternalUtils.mapArray(route_hints, route_hints_conv_37 => route_hints_conv_37 != null ? route_hints_conv_37.ptr : 0) : null, features == null ? 0 : features.ptr);
+               long ret = bindings.Payee_blinded(InternalUtils.encodeUint64Array(InternalUtils.mapArray(route_hints, route_hints_conv_37 => route_hints_conv_37 != null ? route_hints_conv_37.ptr : 0)), features == null ? 0 : features.ptr);
                GC.KeepAlive(route_hints);
                GC.KeepAlive(features);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -138,7 +142,7 @@ public class Payee : CommonBase {
         * Utility method to constructs a new Clear-variant Payee
         */
        public static Payee clear(byte[] node_id, RouteHint[] route_hints, org.ldk.structs.Bolt11InvoiceFeatures features, int final_cltv_expiry_delta) {
-               long ret = bindings.Payee_clear(InternalUtils.check_arr_len(node_id, 33), route_hints != null ? InternalUtils.mapArray(route_hints, route_hints_conv_11 => route_hints_conv_11 == null ? 0 : route_hints_conv_11.ptr) : null, features == null ? 0 : features.ptr, final_cltv_expiry_delta);
+               long ret = bindings.Payee_clear(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id, 33)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(route_hints, route_hints_conv_11 => route_hints_conv_11 == null ? 0 : route_hints_conv_11.ptr)), features == null ? 0 : features.ptr, final_cltv_expiry_delta);
                GC.KeepAlive(node_id);
                GC.KeepAlive(route_hints);
                GC.KeepAlive(features);
index f10ae64af39fb560a7c700fbfca573a5b75be1d2..46a18c1ea69060be570028e5b2c37c38def71ed0 100644 (file)
@@ -16,13 +16,15 @@ public class PayeePubKey : CommonBase {
        }
 
        public byte[] get_a() {
-               byte[] ret = bindings.PayeePubKey_get_a(this.ptr);
+               long ret = bindings.PayeePubKey_get_a(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        public void set_a(byte[] val) {
-               bindings.PayeePubKey_set_a(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.PayeePubKey_set_a(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -31,7 +33,7 @@ public class PayeePubKey : CommonBase {
         * Constructs a new PayeePubKey given each field
         */
        public static PayeePubKey of(byte[] a_arg) {
-               long ret = bindings.PayeePubKey_new(InternalUtils.check_arr_len(a_arg, 33));
+               long ret = bindings.PayeePubKey_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a_arg, 33)));
                GC.KeepAlive(a_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.PayeePubKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PayeePubKey(null, ret); }
diff --git a/c_sharp/src/org/ldk/structs/PaymentConstraints.cs b/c_sharp/src/org/ldk/structs/PaymentConstraints.cs
new file mode 100644 (file)
index 0000000..543e935
--- /dev/null
@@ -0,0 +1,112 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * Constraints for relaying over a given [`BlindedHop`].
+ * 
+ * [`BlindedHop`]: crate::blinded_path::BlindedHop
+ */
+public class PaymentConstraints : CommonBase {
+       internal PaymentConstraints(object _dummy, long ptr) : base(ptr) { }
+       ~PaymentConstraints() {
+               if (ptr != 0) { bindings.PaymentConstraints_free(ptr); }
+       }
+
+       /**
+        * The maximum total CLTV that is acceptable when relaying a payment over this [`BlindedHop`].
+        */
+       public int get_max_cltv_expiry() {
+               int ret = bindings.PaymentConstraints_get_max_cltv_expiry(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * The maximum total CLTV that is acceptable when relaying a payment over this [`BlindedHop`].
+        */
+       public void set_max_cltv_expiry(int val) {
+               bindings.PaymentConstraints_set_max_cltv_expiry(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The minimum value, in msat, that may be accepted by the node corresponding to this
+        * [`BlindedHop`].
+        */
+       public long get_htlc_minimum_msat() {
+               long ret = bindings.PaymentConstraints_get_htlc_minimum_msat(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * The minimum value, in msat, that may be accepted by the node corresponding to this
+        * [`BlindedHop`].
+        */
+       public void set_htlc_minimum_msat(long val) {
+               bindings.PaymentConstraints_set_htlc_minimum_msat(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new PaymentConstraints given each field
+        */
+       public static PaymentConstraints of(int max_cltv_expiry_arg, long htlc_minimum_msat_arg) {
+               long ret = bindings.PaymentConstraints_new(max_cltv_expiry_arg, htlc_minimum_msat_arg);
+               GC.KeepAlive(max_cltv_expiry_arg);
+               GC.KeepAlive(htlc_minimum_msat_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PaymentConstraints ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PaymentConstraints(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.PaymentConstraints_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the PaymentConstraints
+        */
+       public PaymentConstraints clone() {
+               long ret = bindings.PaymentConstraints_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PaymentConstraints ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PaymentConstraints(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Serialize the PaymentConstraints object into a byte array which can be read by PaymentConstraints_read
+        */
+       public byte[] write() {
+               long ret = bindings.PaymentConstraints_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a PaymentConstraints from a byte array, created by PaymentConstraints_write
+        */
+       public static Result_PaymentConstraintsDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.PaymentConstraints_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PaymentConstraintsDecodeErrorZ ret_hu_conv = Result_PaymentConstraintsDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 1e0597a51ea12e0aefe9cb0a10d92f471ce82afc..7df158b315b68cbaa1578de66bd50fc24914d7f6 100644 (file)
@@ -28,7 +28,9 @@ public class PaymentError : CommonBase {
        public class PaymentError_Invoice : PaymentError {
                public string invoice;
                internal PaymentError_Invoice(long ptr) : base(null, ptr) {
-                       this.invoice = bindings.LDKPaymentError_Invoice_get_invoice(ptr);
+                       long invoice = bindings.LDKPaymentError_Invoice_get_invoice(ptr);
+                       string invoice_conv = InternalUtils.decodeString(invoice);
+                       this.invoice = invoice_conv;
                }
        }
        /** A PaymentError of type Sending */
@@ -60,7 +62,7 @@ public class PaymentError : CommonBase {
         * Utility method to constructs a new Invoice-variant PaymentError
         */
        public static PaymentError invoice(string a) {
-               long ret = bindings.PaymentError_invoice(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);
index 0cd24e8a150af256ca62b19067bca445ee2d941c..4ac140d34609451965eb06734f329207ce51ea98 100644 (file)
@@ -149,9 +149,11 @@ public class PaymentParameters : CommonBase {
         * Returns a copy of the field.
         */
        public long[] get_previously_failed_channels() {
-               long[] ret = bindings.PaymentParameters_get_previously_failed_channels(this.ptr);
+               long ret = bindings.PaymentParameters_get_previously_failed_channels(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               long[] ret_conv = InternalUtils.decodeUint64Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -160,7 +162,7 @@ public class PaymentParameters : CommonBase {
         * these SCIDs.
         */
        public void set_previously_failed_channels(long[] val) {
-               bindings.PaymentParameters_set_previously_failed_channels(this.ptr, val);
+               bindings.PaymentParameters_set_previously_failed_channels(this.ptr, InternalUtils.encodeUint64Array(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -169,7 +171,7 @@ public class PaymentParameters : CommonBase {
         * 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, 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));
                GC.KeepAlive(payee_arg);
                GC.KeepAlive(expiry_time_arg);
                GC.KeepAlive(max_total_cltv_expiry_delta_arg);
@@ -235,16 +237,18 @@ public class PaymentParameters : CommonBase {
         * Serialize the PaymentParameters object into a byte array which can be read by PaymentParameters_read
         */
        public byte[] write() {
-               byte[] ret = bindings.PaymentParameters_write(this.ptr);
+               long ret = bindings.PaymentParameters_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a PaymentParameters from a byte array, created by PaymentParameters_write
         */
        public static Result_PaymentParametersDecodeErrorZ read(byte[] ser, int arg) {
-               long ret = bindings.PaymentParameters_read(ser, arg);
+               long ret = bindings.PaymentParameters_read(InternalUtils.encodeUint8Array(ser), arg);
                GC.KeepAlive(ser);
                GC.KeepAlive(arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -259,7 +263,7 @@ public class PaymentParameters : CommonBase {
         * provided.
         */
        public static PaymentParameters from_node_id(byte[] payee_pubkey, int final_cltv_expiry_delta) {
-               long ret = bindings.PaymentParameters_from_node_id(InternalUtils.check_arr_len(payee_pubkey, 33), final_cltv_expiry_delta);
+               long ret = bindings.PaymentParameters_from_node_id(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payee_pubkey, 33)), final_cltv_expiry_delta);
                GC.KeepAlive(payee_pubkey);
                GC.KeepAlive(final_cltv_expiry_delta);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -282,7 +286,7 @@ public class PaymentParameters : CommonBase {
         * [`RecipientOnionFields::secret_only`]: crate::ln::channelmanager::RecipientOnionFields::secret_only
         */
        public static PaymentParameters for_keysend(byte[] payee_pubkey, int final_cltv_expiry_delta, bool allow_mpp) {
-               long ret = bindings.PaymentParameters_for_keysend(InternalUtils.check_arr_len(payee_pubkey, 33), final_cltv_expiry_delta, allow_mpp);
+               long ret = bindings.PaymentParameters_for_keysend(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payee_pubkey, 33)), final_cltv_expiry_delta, allow_mpp);
                GC.KeepAlive(payee_pubkey);
                GC.KeepAlive(final_cltv_expiry_delta);
                GC.KeepAlive(allow_mpp);
@@ -307,5 +311,17 @@ public class PaymentParameters : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Creates parameters for paying to a blinded payee from the provided blinded route hints.
+        */
+       public static PaymentParameters blinded(TwoTuple_BlindedPayInfoBlindedPathZ[] blinded_route_hints) {
+               long ret = bindings.PaymentParameters_blinded(InternalUtils.encodeUint64Array(InternalUtils.mapArray(blinded_route_hints, blinded_route_hints_conv_37 => blinded_route_hints_conv_37 != null ? blinded_route_hints_conv_37.ptr : 0)));
+               GC.KeepAlive(blinded_route_hints);
+               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); };
+               return ret_hu_conv;
+       }
+
 }
 } } }
index 535e752628433909a84b1703c710e161bda6f09e..ebd6168e875bd450df98150a20a9d1eb7cb42984 100644 (file)
@@ -35,7 +35,7 @@ public class PaymentPurpose : CommonBase {
                 * [`ChannelManager::create_inbound_payment`]: crate::ln::channelmanager::ChannelManager::create_inbound_payment
                 * [`ChannelManager::claim_funds`]: crate::ln::channelmanager::ChannelManager::claim_funds
                 */
-               public Option_PaymentPreimageZ payment_preimage;
+               public Option_ThirtyTwoBytesZ payment_preimage;
                /**
                 * The \"payment secret\". This authenticates the sender to the recipient, preventing a
                 * number of deanonymization attacks during the routing process.
@@ -51,17 +51,21 @@ public class PaymentPurpose : CommonBase {
                public byte[] payment_secret;
                internal PaymentPurpose_InvoicePayment(long ptr) : base(null, ptr) {
                        long payment_preimage = bindings.LDKPaymentPurpose_InvoicePayment_get_payment_preimage(ptr);
-                       org.ldk.structs.Option_PaymentPreimageZ payment_preimage_hu_conv = org.ldk.structs.Option_PaymentPreimageZ.constr_from_ptr(payment_preimage);
+                       org.ldk.structs.Option_ThirtyTwoBytesZ payment_preimage_hu_conv = org.ldk.structs.Option_ThirtyTwoBytesZ.constr_from_ptr(payment_preimage);
                        if (payment_preimage_hu_conv != null) { payment_preimage_hu_conv.ptrs_to.AddLast(this); };
                        this.payment_preimage = payment_preimage_hu_conv;
-                       this.payment_secret = bindings.LDKPaymentPurpose_InvoicePayment_get_payment_secret(ptr);
+                       long payment_secret = bindings.LDKPaymentPurpose_InvoicePayment_get_payment_secret(ptr);
+                       byte[] payment_secret_conv = InternalUtils.decodeUint8Array(payment_secret);
+                       this.payment_secret = payment_secret_conv;
                }
        }
        /** A PaymentPurpose of type SpontaneousPayment */
        public class PaymentPurpose_SpontaneousPayment : PaymentPurpose {
                public byte[] spontaneous_payment;
                internal PaymentPurpose_SpontaneousPayment(long ptr) : base(null, ptr) {
-                       this.spontaneous_payment = bindings.LDKPaymentPurpose_SpontaneousPayment_get_spontaneous_payment(ptr);
+                       long spontaneous_payment = bindings.LDKPaymentPurpose_SpontaneousPayment_get_spontaneous_payment(ptr);
+                       byte[] spontaneous_payment_conv = InternalUtils.decodeUint8Array(spontaneous_payment);
+                       this.spontaneous_payment = spontaneous_payment_conv;
                }
        }
        internal long clone_ptr() {
@@ -85,8 +89,8 @@ public class PaymentPurpose : CommonBase {
        /**
         * Utility method to constructs a new InvoicePayment-variant PaymentPurpose
         */
-       public static PaymentPurpose invoice_payment(org.ldk.structs.Option_PaymentPreimageZ payment_preimage, byte[] payment_secret) {
-               long ret = bindings.PaymentPurpose_invoice_payment(payment_preimage.ptr, InternalUtils.check_arr_len(payment_secret, 32));
+       public static PaymentPurpose invoice_payment(org.ldk.structs.Option_ThirtyTwoBytesZ payment_preimage, byte[] payment_secret) {
+               long ret = bindings.PaymentPurpose_invoice_payment(payment_preimage.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_secret, 32)));
                GC.KeepAlive(payment_preimage);
                GC.KeepAlive(payment_secret);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -100,7 +104,7 @@ public class PaymentPurpose : CommonBase {
         * Utility method to constructs a new SpontaneousPayment-variant PaymentPurpose
         */
        public static PaymentPurpose spontaneous_payment(byte[] a) {
-               long ret = bindings.PaymentPurpose_spontaneous_payment(InternalUtils.check_arr_len(a, 32));
+               long ret = bindings.PaymentPurpose_spontaneous_payment(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 32)));
                GC.KeepAlive(a);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.PaymentPurpose ret_hu_conv = org.ldk.structs.PaymentPurpose.constr_from_ptr(ret);
@@ -127,16 +131,18 @@ public class PaymentPurpose : CommonBase {
         * Serialize the PaymentPurpose object into a byte array which can be read by PaymentPurpose_read
         */
        public byte[] write() {
-               byte[] ret = bindings.PaymentPurpose_write(this.ptr);
+               long ret = bindings.PaymentPurpose_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a PaymentPurpose from a byte array, created by PaymentPurpose_write
         */
        public static Result_PaymentPurposeDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.PaymentPurpose_read(ser);
+               long ret = bindings.PaymentPurpose_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_PaymentPurposeDecodeErrorZ ret_hu_conv = Result_PaymentPurposeDecodeErrorZ.constr_from_ptr(ret);
diff --git a/c_sharp/src/org/ldk/structs/PaymentRelay.cs b/c_sharp/src/org/ldk/structs/PaymentRelay.cs
new file mode 100644 (file)
index 0000000..2ad2107
--- /dev/null
@@ -0,0 +1,131 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * Parameters for relaying over a given [`BlindedHop`].
+ * 
+ * [`BlindedHop`]: crate::blinded_path::BlindedHop
+ */
+public class PaymentRelay : CommonBase {
+       internal PaymentRelay(object _dummy, long ptr) : base(ptr) { }
+       ~PaymentRelay() {
+               if (ptr != 0) { bindings.PaymentRelay_free(ptr); }
+       }
+
+       /**
+        * Number of blocks subtracted from an incoming HTLC's `cltv_expiry` for this [`BlindedHop`].
+        */
+       public short get_cltv_expiry_delta() {
+               short ret = bindings.PaymentRelay_get_cltv_expiry_delta(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Number of blocks subtracted from an incoming HTLC's `cltv_expiry` for this [`BlindedHop`].
+        */
+       public void set_cltv_expiry_delta(short val) {
+               bindings.PaymentRelay_set_cltv_expiry_delta(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Liquidity fee charged (in millionths of the amount transferred) for relaying a payment over
+        * this [`BlindedHop`], (i.e., 10,000 is 1%).
+        */
+       public int get_fee_proportional_millionths() {
+               int ret = bindings.PaymentRelay_get_fee_proportional_millionths(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Liquidity fee charged (in millionths of the amount transferred) for relaying a payment over
+        * this [`BlindedHop`], (i.e., 10,000 is 1%).
+        */
+       public void set_fee_proportional_millionths(int val) {
+               bindings.PaymentRelay_set_fee_proportional_millionths(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Base fee charged (in millisatoshi) for relaying a payment over this [`BlindedHop`].
+        */
+       public int get_fee_base_msat() {
+               int ret = bindings.PaymentRelay_get_fee_base_msat(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Base fee charged (in millisatoshi) for relaying a payment over this [`BlindedHop`].
+        */
+       public void set_fee_base_msat(int val) {
+               bindings.PaymentRelay_set_fee_base_msat(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new PaymentRelay given each field
+        */
+       public static PaymentRelay of(short cltv_expiry_delta_arg, int fee_proportional_millionths_arg, int fee_base_msat_arg) {
+               long ret = bindings.PaymentRelay_new(cltv_expiry_delta_arg, fee_proportional_millionths_arg, fee_base_msat_arg);
+               GC.KeepAlive(cltv_expiry_delta_arg);
+               GC.KeepAlive(fee_proportional_millionths_arg);
+               GC.KeepAlive(fee_base_msat_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PaymentRelay ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PaymentRelay(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.PaymentRelay_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the PaymentRelay
+        */
+       public PaymentRelay clone() {
+               long ret = bindings.PaymentRelay_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PaymentRelay ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PaymentRelay(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Serialize the PaymentRelay object into a byte array which can be read by PaymentRelay_read
+        */
+       public byte[] write() {
+               long ret = bindings.PaymentRelay_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a PaymentRelay from a byte array, created by PaymentRelay_write
+        */
+       public static Result_PaymentRelayDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.PaymentRelay_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PaymentRelayDecodeErrorZ ret_hu_conv = Result_PaymentRelayDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 3d161fae1b47addf19f527888728e56c40cb160d..cb3c70dd27f112c67e6a95b5db2f207b6f8b322f 100644 (file)
@@ -45,14 +45,15 @@ public class PaymentSendFailure : CommonBase {
        public class PaymentSendFailure_PathParameterError : PaymentSendFailure {
                public Result_NoneAPIErrorZ[] path_parameter_error;
                internal PaymentSendFailure_PathParameterError(long ptr) : base(null, ptr) {
-                       long[] path_parameter_error = bindings.LDKPaymentSendFailure_PathParameterError_get_path_parameter_error(ptr);
-                       int path_parameter_error_conv_22_len = path_parameter_error.Length;
+                       long path_parameter_error = bindings.LDKPaymentSendFailure_PathParameterError_get_path_parameter_error(ptr);
+                       int path_parameter_error_conv_22_len = InternalUtils.getArrayLength(path_parameter_error);
                        Result_NoneAPIErrorZ[] path_parameter_error_conv_22_arr = new Result_NoneAPIErrorZ[path_parameter_error_conv_22_len];
                        for (int w = 0; w < path_parameter_error_conv_22_len; w++) {
-                               long path_parameter_error_conv_22 = path_parameter_error[w];
+                               long path_parameter_error_conv_22 = InternalUtils.getU64ArrayElem(path_parameter_error, w);
                                Result_NoneAPIErrorZ path_parameter_error_conv_22_hu_conv = Result_NoneAPIErrorZ.constr_from_ptr(path_parameter_error_conv_22);
                                path_parameter_error_conv_22_arr[w] = path_parameter_error_conv_22_hu_conv;
                        }
+                       bindings.free_buffer(path_parameter_error);
                        this.path_parameter_error = path_parameter_error_conv_22_arr;
                }
        }
@@ -60,15 +61,16 @@ public class PaymentSendFailure : CommonBase {
        public class PaymentSendFailure_AllFailedResendSafe : PaymentSendFailure {
                public APIError[] all_failed_resend_safe;
                internal PaymentSendFailure_AllFailedResendSafe(long ptr) : base(null, ptr) {
-                       long[] all_failed_resend_safe = bindings.LDKPaymentSendFailure_AllFailedResendSafe_get_all_failed_resend_safe(ptr);
-                       int all_failed_resend_safe_conv_10_len = all_failed_resend_safe.Length;
+                       long all_failed_resend_safe = bindings.LDKPaymentSendFailure_AllFailedResendSafe_get_all_failed_resend_safe(ptr);
+                       int all_failed_resend_safe_conv_10_len = InternalUtils.getArrayLength(all_failed_resend_safe);
                        APIError[] all_failed_resend_safe_conv_10_arr = new APIError[all_failed_resend_safe_conv_10_len];
                        for (int k = 0; k < all_failed_resend_safe_conv_10_len; k++) {
-                               long all_failed_resend_safe_conv_10 = all_failed_resend_safe[k];
+                               long all_failed_resend_safe_conv_10 = InternalUtils.getU64ArrayElem(all_failed_resend_safe, k);
                                org.ldk.structs.APIError all_failed_resend_safe_conv_10_hu_conv = org.ldk.structs.APIError.constr_from_ptr(all_failed_resend_safe_conv_10);
                                if (all_failed_resend_safe_conv_10_hu_conv != null) { all_failed_resend_safe_conv_10_hu_conv.ptrs_to.AddLast(this); };
                                all_failed_resend_safe_conv_10_arr[k] = all_failed_resend_safe_conv_10_hu_conv;
                        }
+                       bindings.free_buffer(all_failed_resend_safe);
                        this.all_failed_resend_safe = all_failed_resend_safe_conv_10_arr;
                }
        }
@@ -95,20 +97,23 @@ public class PaymentSendFailure : CommonBase {
                 */
                public byte[] payment_id;
                internal PaymentSendFailure_PartialFailure(long ptr) : base(null, ptr) {
-                       long[] results = bindings.LDKPaymentSendFailure_PartialFailure_get_results(ptr);
-                       int results_conv_22_len = results.Length;
+                       long results = bindings.LDKPaymentSendFailure_PartialFailure_get_results(ptr);
+                       int results_conv_22_len = InternalUtils.getArrayLength(results);
                        Result_NoneAPIErrorZ[] results_conv_22_arr = new Result_NoneAPIErrorZ[results_conv_22_len];
                        for (int w = 0; w < results_conv_22_len; w++) {
-                               long results_conv_22 = results[w];
+                               long results_conv_22 = InternalUtils.getU64ArrayElem(results, w);
                                Result_NoneAPIErrorZ results_conv_22_hu_conv = Result_NoneAPIErrorZ.constr_from_ptr(results_conv_22);
                                results_conv_22_arr[w] = results_conv_22_hu_conv;
                        }
+                       bindings.free_buffer(results);
                        this.results = results_conv_22_arr;
                        long failed_paths_retry = bindings.LDKPaymentSendFailure_PartialFailure_get_failed_paths_retry(ptr);
                        org.ldk.structs.RouteParameters failed_paths_retry_hu_conv = null; if (failed_paths_retry < 0 || failed_paths_retry > 4096) { failed_paths_retry_hu_conv = new org.ldk.structs.RouteParameters(null, failed_paths_retry); }
                        if (failed_paths_retry_hu_conv != null) { failed_paths_retry_hu_conv.ptrs_to.AddLast(this); };
                        this.failed_paths_retry = failed_paths_retry_hu_conv;
-                       this.payment_id = bindings.LDKPaymentSendFailure_PartialFailure_get_payment_id(ptr);
+                       long payment_id = bindings.LDKPaymentSendFailure_PartialFailure_get_payment_id(ptr);
+                       byte[] payment_id_conv = InternalUtils.decodeUint8Array(payment_id);
+                       this.payment_id = payment_id_conv;
                }
        }
        internal long clone_ptr() {
@@ -146,7 +151,7 @@ public class PaymentSendFailure : CommonBase {
         * Utility method to constructs a new PathParameterError-variant PaymentSendFailure
         */
        public static PaymentSendFailure path_parameter_error(Result_NoneAPIErrorZ[] a) {
-               long ret = bindings.PaymentSendFailure_path_parameter_error(a != null ? InternalUtils.mapArray(a, a_conv_22 => a_conv_22 != null ? a_conv_22.ptr : 0) : null);
+               long ret = bindings.PaymentSendFailure_path_parameter_error(InternalUtils.encodeUint64Array(InternalUtils.mapArray(a, a_conv_22 => a_conv_22 != null ? a_conv_22.ptr : 0)));
                GC.KeepAlive(a);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.PaymentSendFailure ret_hu_conv = org.ldk.structs.PaymentSendFailure.constr_from_ptr(ret);
@@ -158,7 +163,7 @@ public class PaymentSendFailure : CommonBase {
         * Utility method to constructs a new AllFailedResendSafe-variant PaymentSendFailure
         */
        public static PaymentSendFailure all_failed_resend_safe(APIError[] a) {
-               long ret = bindings.PaymentSendFailure_all_failed_resend_safe(a != null ? InternalUtils.mapArray(a, a_conv_10 => a_conv_10.ptr) : null);
+               long ret = bindings.PaymentSendFailure_all_failed_resend_safe(InternalUtils.encodeUint64Array(InternalUtils.mapArray(a, a_conv_10 => a_conv_10.ptr)));
                GC.KeepAlive(a);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.PaymentSendFailure ret_hu_conv = org.ldk.structs.PaymentSendFailure.constr_from_ptr(ret);
@@ -182,7 +187,7 @@ public class PaymentSendFailure : CommonBase {
         * Utility method to constructs a new PartialFailure-variant PaymentSendFailure
         */
        public static PaymentSendFailure partial_failure(Result_NoneAPIErrorZ[] results, org.ldk.structs.RouteParameters failed_paths_retry, byte[] payment_id) {
-               long ret = bindings.PaymentSendFailure_partial_failure(results != null ? InternalUtils.mapArray(results, results_conv_22 => results_conv_22 != null ? results_conv_22.ptr : 0) : null, failed_paths_retry == null ? 0 : failed_paths_retry.ptr, InternalUtils.check_arr_len(payment_id, 32));
+               long ret = bindings.PaymentSendFailure_partial_failure(InternalUtils.encodeUint64Array(InternalUtils.mapArray(results, results_conv_22 => results_conv_22 != null ? results_conv_22.ptr : 0)), failed_paths_retry == null ? 0 : failed_paths_retry.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)));
                GC.KeepAlive(results);
                GC.KeepAlive(failed_paths_retry);
                GC.KeepAlive(payment_id);
@@ -193,5 +198,20 @@ public class PaymentSendFailure : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Checks if two PaymentSendFailures contain equal inner contents.
+        * This ignores pointers and is_owned flags and looks at the values in fields.
+        */
+       public bool eq(org.ldk.structs.PaymentSendFailure b) {
+               bool ret = bindings.PaymentSendFailure_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 PaymentSendFailure)) return false;
+               return this.eq((PaymentSendFailure)o);
+       }
 }
 } } }
diff --git a/c_sharp/src/org/ldk/structs/PeeledOnion.cs b/c_sharp/src/org/ldk/structs/PeeledOnion.cs
new file mode 100644 (file)
index 0000000..e3840e4
--- /dev/null
@@ -0,0 +1,116 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+/**
+ * A processed incoming onion message, containing either a Forward (another onion message)
+ * or a Receive payload with decrypted contents.
+ */
+public class PeeledOnion : CommonBase {
+       protected PeeledOnion(object _dummy, long ptr) : base(ptr) { }
+       ~PeeledOnion() {
+               if (ptr != 0) { bindings.PeeledOnion_free(ptr); }
+       }
+
+       internal static PeeledOnion constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKPeeledOnion_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new PeeledOnion_Forward(ptr);
+                       case 1: return new PeeledOnion_Receive(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A PeeledOnion of type Forward */
+       public class PeeledOnion_Forward : PeeledOnion {
+               public byte[] _0;
+               public OnionMessage _1;
+               internal PeeledOnion_Forward(long ptr) : base(null, ptr) {
+                       long _0 = bindings.LDKPeeledOnion_Forward_get__0(ptr);
+                       byte[] _0_conv = InternalUtils.decodeUint8Array(_0);
+                       this._0 = _0_conv;
+                       long _1 = bindings.LDKPeeledOnion_Forward_get__1(ptr);
+                       org.ldk.structs.OnionMessage _1_hu_conv = null; if (_1 < 0 || _1 > 4096) { _1_hu_conv = new org.ldk.structs.OnionMessage(null, _1); }
+                       if (_1_hu_conv != null) { _1_hu_conv.ptrs_to.AddLast(this); };
+                       this._1 = _1_hu_conv;
+               }
+       }
+       /** A PeeledOnion of type Receive */
+       public class PeeledOnion_Receive : PeeledOnion {
+               public ParsedOnionMessageContents _0;
+               /**
+                * Note that this (or a relevant inner pointer) may be NULL or all-0s to represent None
+                */
+               public byte[] _1;
+               /**
+                * Note that this (or a relevant inner pointer) may be NULL or all-0s to represent None
+                */
+               public BlindedPath _2;
+               internal PeeledOnion_Receive(long ptr) : base(null, ptr) {
+                       long _0 = bindings.LDKPeeledOnion_Receive_get__0(ptr);
+                       org.ldk.structs.ParsedOnionMessageContents _0_hu_conv = org.ldk.structs.ParsedOnionMessageContents.constr_from_ptr(_0);
+                       if (_0_hu_conv != null) { _0_hu_conv.ptrs_to.AddLast(this); };
+                       this._0 = _0_hu_conv;
+                       long _1 = bindings.LDKPeeledOnion_Receive_get__1(ptr);
+                       byte[] _1_conv = InternalUtils.decodeUint8Array(_1);
+                       this._1 = _1_conv;
+                       long _2 = bindings.LDKPeeledOnion_Receive_get__2(ptr);
+                       org.ldk.structs.BlindedPath _2_hu_conv = null; if (_2 < 0 || _2 > 4096) { _2_hu_conv = new org.ldk.structs.BlindedPath(null, _2); }
+                       if (_2_hu_conv != null) { _2_hu_conv.ptrs_to.AddLast(this); };
+                       this._2 = _2_hu_conv;
+               }
+       }
+       internal long clone_ptr() {
+               long ret = bindings.PeeledOnion_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the PeeledOnion
+        */
+       public PeeledOnion clone() {
+               long ret = bindings.PeeledOnion_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PeeledOnion ret_hu_conv = org.ldk.structs.PeeledOnion.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 PeeledOnion
+        */
+       public static PeeledOnion forward(byte[] a, org.ldk.structs.OnionMessage b) {
+               long ret = bindings.PeeledOnion_forward(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; }
+               org.ldk.structs.PeeledOnion ret_hu_conv = org.ldk.structs.PeeledOnion.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(b); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Utility method to constructs a new Receive-variant PeeledOnion
+        */
+       public static PeeledOnion receive(org.ldk.structs.ParsedOnionMessageContents a, byte[] b, org.ldk.structs.BlindedPath c) {
+               long ret = bindings.PeeledOnion_receive(a.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(b, 32)), c == null ? 0 : c.ptr);
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               GC.KeepAlive(c);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PeeledOnion ret_hu_conv = org.ldk.structs.PeeledOnion.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); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(c); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 4760b660f29a8ad21afafe68ac58fc45d6ec42bb..051f3bf28fe351be324fe345bfcdfc1f16e6c3b5 100644 (file)
@@ -45,7 +45,7 @@ public class PeerManager : CommonBase {
         * minute should suffice.
         */
        public static PeerManager of(ChannelMessageHandler message_handler_chan_handler_arg, RoutingMessageHandler message_handler_route_handler_arg, OnionMessageHandler message_handler_onion_message_handler_arg, CustomMessageHandler message_handler_custom_message_handler_arg, int current_time, byte[] ephemeral_random_data, org.ldk.structs.Logger logger, org.ldk.structs.NodeSigner node_signer) {
-               long ret = bindings.PeerManager_new(bindings.MessageHandler_new(message_handler_chan_handler_arg.ptr, message_handler_route_handler_arg.ptr, message_handler_onion_message_handler_arg.ptr, message_handler_custom_message_handler_arg.ptr), current_time, InternalUtils.check_arr_len(ephemeral_random_data, 32), logger.ptr, node_signer.ptr);
+               long ret = bindings.PeerManager_new(bindings.MessageHandler_new(message_handler_chan_handler_arg.ptr, message_handler_route_handler_arg.ptr, message_handler_onion_message_handler_arg.ptr, message_handler_custom_message_handler_arg.ptr), current_time, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(ephemeral_random_data, 32)), logger.ptr, node_signer.ptr);
                GC.KeepAlive(message_handler_chan_handler_arg);
                GC.KeepAlive(message_handler_route_handler_arg);
                GC.KeepAlive(message_handler_onion_message_handler_arg);
@@ -78,18 +78,20 @@ public class PeerManager : CommonBase {
         * The returned `Option`s will only be `Some` if an address had been previously given via
         * [`Self::new_outbound_connection`] or [`Self::new_inbound_connection`].
         */
-       public TwoTuple_PublicKeyCOption_NetAddressZZ[] get_peer_node_ids() {
-               long[] ret = bindings.PeerManager_get_peer_node_ids(this.ptr);
+       public TwoTuple_PublicKeyCOption_SocketAddressZZ[] get_peer_node_ids() {
+               long ret = bindings.PeerManager_get_peer_node_ids(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_40_len = ret.Length;
-               TwoTuple_PublicKeyCOption_NetAddressZZ[] ret_conv_40_arr = new TwoTuple_PublicKeyCOption_NetAddressZZ[ret_conv_40_len];
-               for (int o = 0; o < ret_conv_40_len; o++) {
-                       long ret_conv_40 = ret[o];
-                       TwoTuple_PublicKeyCOption_NetAddressZZ ret_conv_40_hu_conv = new TwoTuple_PublicKeyCOption_NetAddressZZ(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;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_43_len = InternalUtils.getArrayLength(ret);
+               TwoTuple_PublicKeyCOption_SocketAddressZZ[] ret_conv_43_arr = new TwoTuple_PublicKeyCOption_SocketAddressZZ[ret_conv_43_len];
+               for (int r = 0; r < ret_conv_43_len; r++) {
+                       long ret_conv_43 = InternalUtils.getU64ArrayElem(ret, r);
+                       TwoTuple_PublicKeyCOption_SocketAddressZZ ret_conv_43_hu_conv = new TwoTuple_PublicKeyCOption_SocketAddressZZ(null, ret_conv_43);
+                       if (ret_conv_43_hu_conv != null) { ret_conv_43_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_43_arr[r] = ret_conv_43_hu_conv;
                }
-               return ret_conv_40_arr;
+               bindings.free_buffer(ret);
+               return ret_conv_43_arr;
        }
 
        /**
@@ -109,8 +111,8 @@ public class PeerManager : CommonBase {
         * 
         * [`socket_disconnected`]: PeerManager::socket_disconnected
         */
-       public Result_CVec_u8ZPeerHandleErrorZ new_outbound_connection(byte[] their_node_id, org.ldk.structs.SocketDescriptor descriptor, org.ldk.structs.Option_NetAddressZ remote_network_address) {
-               long ret = bindings.PeerManager_new_outbound_connection(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), descriptor.ptr, remote_network_address.ptr);
+       public Result_CVec_u8ZPeerHandleErrorZ new_outbound_connection(byte[] their_node_id, org.ldk.structs.SocketDescriptor descriptor, org.ldk.structs.Option_SocketAddressZ remote_network_address) {
+               long ret = bindings.PeerManager_new_outbound_connection(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_node_id, 33)), descriptor.ptr, remote_network_address.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(their_node_id);
                GC.KeepAlive(descriptor);
@@ -139,7 +141,7 @@ public class PeerManager : CommonBase {
         * 
         * [`socket_disconnected`]: PeerManager::socket_disconnected
         */
-       public Result_NonePeerHandleErrorZ new_inbound_connection(org.ldk.structs.SocketDescriptor descriptor, org.ldk.structs.Option_NetAddressZ remote_network_address) {
+       public Result_NonePeerHandleErrorZ new_inbound_connection(org.ldk.structs.SocketDescriptor descriptor, org.ldk.structs.Option_SocketAddressZ remote_network_address) {
                long ret = bindings.PeerManager_new_inbound_connection(this.ptr, descriptor.ptr, remote_network_address.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(descriptor);
@@ -194,7 +196,7 @@ public class PeerManager : CommonBase {
         * [`process_events`]: PeerManager::process_events
         */
        public Result_boolPeerHandleErrorZ read_event(org.ldk.structs.SocketDescriptor peer_descriptor, byte[] data) {
-               long ret = bindings.PeerManager_read_event(this.ptr, peer_descriptor.ptr, data);
+               long ret = bindings.PeerManager_read_event(this.ptr, peer_descriptor.ptr, InternalUtils.encodeUint8Array(data));
                GC.KeepAlive(this);
                GC.KeepAlive(peer_descriptor);
                GC.KeepAlive(data);
@@ -245,7 +247,7 @@ public class PeerManager : CommonBase {
         * [`disconnect_socket`]: SocketDescriptor::disconnect_socket
         */
        public void disconnect_by_node_id(byte[] node_id) {
-               bindings.PeerManager_disconnect_by_node_id(this.ptr, InternalUtils.check_arr_len(node_id, 33));
+               bindings.PeerManager_disconnect_by_node_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(node_id);
        }
@@ -295,13 +297,13 @@ public class PeerManager : CommonBase {
         * 
         * [`get_and_clear_pending_msg_events`]: MessageSendEventsProvider::get_and_clear_pending_msg_events
         */
-       public void broadcast_node_announcement(byte[] rgb, byte[] alias, NetAddress[] addresses) {
-               bindings.PeerManager_broadcast_node_announcement(this.ptr, InternalUtils.check_arr_len(rgb, 3), InternalUtils.check_arr_len(alias, 32), addresses != null ? InternalUtils.mapArray(addresses, addresses_conv_12 => addresses_conv_12.ptr) : null);
+       public void broadcast_node_announcement(byte[] rgb, byte[] alias, SocketAddress[] addresses) {
+               bindings.PeerManager_broadcast_node_announcement(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(rgb, 3)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(alias, 32)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(addresses, addresses_conv_15 => addresses_conv_15.ptr)));
                GC.KeepAlive(this);
                GC.KeepAlive(rgb);
                GC.KeepAlive(alias);
                GC.KeepAlive(addresses);
-               foreach (NetAddress addresses_conv_12 in addresses) { if (this != null) { this.ptrs_to.AddLast(addresses_conv_12); }; };
+               foreach (SocketAddress addresses_conv_15 in addresses) { if (this != null) { this.ptrs_to.AddLast(addresses_conv_15); }; };
        }
 
 }
index 9a44bba3d8b2d5259315a9d398c9adfab23054e3..6cbed960e2426280b31f91c11f854b2a061e1c7e 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,97 +6,132 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of Persist */
+public interface PersistInterface {
+       /**Persist a new channel's data in response to a [`chain::Watch::watch_channel`] call. This is
+        * called by [`ChannelManager`] for new channels, or may be called directly, e.g. on startup.
+        * 
+        * The data can be stored any way you want, but the identifier provided by LDK is the
+        * channel's outpoint (and it is up to you to maintain a correct mapping between the outpoint
+        * and the stored channel data). Note that you **must** persist every new monitor to disk.
+        * 
+        * The `update_id` is used to identify this call to [`ChainMonitor::channel_monitor_updated`],
+        * if you return [`ChannelMonitorUpdateStatus::InProgress`].
+        * 
+        * See [`Writeable::write`] on [`ChannelMonitor`] for writing out a `ChannelMonitor`
+        * and [`ChannelMonitorUpdateStatus`] for requirements when returning errors.
+        * 
+        * [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
+        * [`Writeable::write`]: crate::util::ser::Writeable::write
+        */
+       ChannelMonitorUpdateStatus persist_new_channel(OutPoint channel_id, ChannelMonitor data, MonitorUpdateId update_id);
+       /**Update one channel's data. The provided [`ChannelMonitor`] has already applied the given
+        * update.
+        * 
+        * Note that on every update, you **must** persist either the [`ChannelMonitorUpdate`] or the
+        * updated monitor itself to disk/backups. See the [`Persist`] trait documentation for more
+        * details.
+        * 
+        * During blockchain synchronization operations, and in some rare cases, this may be called with
+        * no [`ChannelMonitorUpdate`], in which case the full [`ChannelMonitor`] needs to be persisted.
+        * Note that after the full [`ChannelMonitor`] is persisted any previous
+        * [`ChannelMonitorUpdate`]s which were persisted should be discarded - they can no longer be
+        * applied to the persisted [`ChannelMonitor`] as they were already applied.
+        * 
+        * If an implementer chooses to persist the updates only, they need to make
+        * sure that all the updates are applied to the `ChannelMonitors` *before
+        * the set of channel monitors is given to the `ChannelManager`
+        * deserialization routine. See [`ChannelMonitor::update_monitor`] for
+        * applying a monitor update to a monitor. If full `ChannelMonitors` are
+        * persisted, then there is no need to persist individual updates.
+        * 
+        * Note that there could be a performance tradeoff between persisting complete
+        * channel monitors on every update vs. persisting only updates and applying
+        * them in batches. The size of each monitor grows `O(number of state updates)`
+        * whereas updates are small and `O(1)`.
+        * 
+        * The `update_id` is used to identify this call to [`ChainMonitor::channel_monitor_updated`],
+        * if you return [`ChannelMonitorUpdateStatus::InProgress`].
+        * 
+        * See [`Writeable::write`] on [`ChannelMonitor`] for writing out a `ChannelMonitor`,
+        * [`Writeable::write`] on [`ChannelMonitorUpdate`] for writing out an update, and
+        * [`ChannelMonitorUpdateStatus`] for requirements when returning errors.
+        * 
+        * [`Writeable::write`]: crate::util::ser::Writeable::write
+        * 
+        * Note that update (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       ChannelMonitorUpdateStatus update_persisted_channel(OutPoint channel_id, ChannelMonitorUpdate update, ChannelMonitor data, MonitorUpdateId update_id);
+}
+
 /**
  * `Persist` defines behavior for persisting channel monitors: this could mean
  * writing once to disk, and/or uploading to one or more backup services.
  * 
- * Each method can return three possible values:
- * If persistence (including any relevant `fsync()` calls) happens immediately, the
- * implementation should return [`ChannelMonitorUpdateStatus::Completed`], indicating normal
- * channel operation should continue.
- * If persistence happens asynchronously, implementations should first ensure the
- * [`ChannelMonitor`] or [`ChannelMonitorUpdate`] are written durably to disk, and then return
- * [`ChannelMonitorUpdateStatus::InProgress`] while the update continues in the background.
- * Once the update completes, [`ChainMonitor::channel_monitor_updated`] should be called with
- * the corresponding [`MonitorUpdateId`].
+ * Persistence can happen in one of two ways - synchronously completing before the trait method
+ * calls return or asynchronously in the background.
+ * 
+ * # For those implementing synchronous persistence
+ * 
+ * If persistence completes fully (including any relevant `fsync()` calls), the implementation
+ * should return [`ChannelMonitorUpdateStatus::Completed`], indicating normal channel operation
+ * should continue.
+ * 
+ * If persistence fails for some reason, implementations should consider returning
+ * [`ChannelMonitorUpdateStatus::InProgress`] and retry all pending persistence operations in
+ * the background with [`ChainMonitor::list_pending_monitor_updates`] and
+ * [`ChainMonitor::get_monitor`].
+ * 
+ * Once a full [`ChannelMonitor`] has been persisted, all pending updates for that channel can
+ * be marked as complete via [`ChainMonitor::channel_monitor_updated`].
+ * 
+ * If at some point no further progress can be made towards persisting the pending updates, the
+ * node should simply shut down.
+ * 
+ * If the persistence has failed and cannot be retried further (e.g. because of an outage),
+ * [`ChannelMonitorUpdateStatus::UnrecoverableError`] can be used, though this will result in
+ * an immediate panic and future operations in LDK generally failing.
+ * 
+ * # For those implementing asynchronous persistence
+ * 
+ * All calls should generally spawn a background task and immediately return
+ * [`ChannelMonitorUpdateStatus::InProgress`]. Once the update completes,
+ * [`ChainMonitor::channel_monitor_updated`] should be called with the corresponding
+ * [`MonitorUpdateId`].
  * 
  * Note that unlike the direct [`chain::Watch`] interface,
  * [`ChainMonitor::channel_monitor_updated`] must be called once for *each* update which occurs.
  * 
- * If persistence fails for some reason, implementations should return
- * [`ChannelMonitorUpdateStatus::PermanentFailure`], in which case the channel will likely be
- * closed without broadcasting the latest state. See
- * [`ChannelMonitorUpdateStatus::PermanentFailure`] for more details.
+ * If at some point no further progress can be made towards persisting a pending update, the node
+ * should simply shut down. Until then, the background task should either loop indefinitely, or
+ * persistence should be regularly retried with [`ChainMonitor::list_pending_monitor_updates`]
+ * and [`ChainMonitor::get_monitor`] (note that if a full monitor is persisted all pending
+ * monitor updates may be marked completed).
+ * 
+ * # Using remote watchtowers
+ * 
+ * Watchtowers may be updated as a part of an implementation of this trait, utilizing the async
+ * update process described above while the watchtower is being updated. The following methods are
+ * provided for bulding transactions for a watchtower:
+ * [`ChannelMonitor::initial_counterparty_commitment_tx`],
+ * [`ChannelMonitor::counterparty_commitment_txs_from_update`],
+ * [`ChannelMonitor::sign_to_local_justice_tx`], [`TrustedCommitmentTransaction::revokeable_output_index`],
+ * [`TrustedCommitmentTransaction::build_to_local_justice_tx`].
+ * 
+ * [`TrustedCommitmentTransaction::revokeable_output_index`]: crate::ln::chan_utils::TrustedCommitmentTransaction::revokeable_output_index
+ * [`TrustedCommitmentTransaction::build_to_local_justice_tx`]: crate::ln::chan_utils::TrustedCommitmentTransaction::build_to_local_justice_tx
  */
 public class Persist : CommonBase {
-       internal readonly bindings.LDKPersist bindings_instance;
+       internal bindings.LDKPersist bindings_instance;
+       internal long instance_idx;
+
        internal Persist(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private Persist(bindings.LDKPersist arg) : base(bindings.LDKPersist_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~Persist() {
                if (ptr != 0) { bindings.Persist_free(ptr); }
        }
 
-       public interface PersistInterface {
-               /**
-                * Persist a new channel's data in response to a [`chain::Watch::watch_channel`] call. This is
-                * called by [`ChannelManager`] for new channels, or may be called directly, e.g. on startup.
-                * 
-                * The data can be stored any way you want, but the identifier provided by LDK is the
-                * channel's outpoint (and it is up to you to maintain a correct mapping between the outpoint
-                * and the stored channel data). Note that you **must** persist every new monitor to disk.
-                * 
-                * The `update_id` is used to identify this call to [`ChainMonitor::channel_monitor_updated`],
-                * if you return [`ChannelMonitorUpdateStatus::InProgress`].
-                * 
-                * See [`Writeable::write`] on [`ChannelMonitor`] for writing out a `ChannelMonitor`
-                * and [`ChannelMonitorUpdateStatus`] for requirements when returning errors.
-                * 
-                * [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
-                * [`Writeable::write`]: crate::util::ser::Writeable::write
-                */
-               ChannelMonitorUpdateStatus persist_new_channel(OutPoint _channel_id, ChannelMonitor _data, MonitorUpdateId _update_id);
-               /**
-                * Update one channel's data. The provided [`ChannelMonitor`] has already applied the given
-                * update.
-                * 
-                * Note that on every update, you **must** persist either the [`ChannelMonitorUpdate`] or the
-                * updated monitor itself to disk/backups. See the [`Persist`] trait documentation for more
-                * details.
-                * 
-                * During blockchain synchronization operations, this may be called with no
-                * [`ChannelMonitorUpdate`], in which case the full [`ChannelMonitor`] needs to be persisted.
-                * Note that after the full [`ChannelMonitor`] is persisted any previous
-                * [`ChannelMonitorUpdate`]s which were persisted should be discarded - they can no longer be
-                * applied to the persisted [`ChannelMonitor`] as they were already applied.
-                * 
-                * If an implementer chooses to persist the updates only, they need to make
-                * sure that all the updates are applied to the `ChannelMonitors` *before
-                * the set of channel monitors is given to the `ChannelManager`
-                * deserialization routine. See [`ChannelMonitor::update_monitor`] for
-                * applying a monitor update to a monitor. If full `ChannelMonitors` are
-                * persisted, then there is no need to persist individual updates.
-                * 
-                * Note that there could be a performance tradeoff between persisting complete
-                * channel monitors on every update vs. persisting only updates and applying
-                * them in batches. The size of each monitor grows `O(number of state updates)`
-                * whereas updates are small and `O(1)`.
-                * 
-                * The `update_id` is used to identify this call to [`ChainMonitor::channel_monitor_updated`],
-                * if you return [`ChannelMonitorUpdateStatus::InProgress`].
-                * 
-                * See [`Writeable::write`] on [`ChannelMonitor`] for writing out a `ChannelMonitor`,
-                * [`Writeable::write`] on [`ChannelMonitorUpdate`] for writing out an update, and
-                * [`ChannelMonitorUpdateStatus`] for requirements when returning errors.
-                * 
-                * [`Writeable::write`]: crate::util::ser::Writeable::write
-                * 
-                * Note that update (or a relevant inner pointer) may be NULL or all-0s to represent None
-                */
-               ChannelMonitorUpdateStatus update_persisted_channel(OutPoint _channel_id, ChannelMonitorUpdate _update, ChannelMonitor _data, MonitorUpdateId _update_id);
-       }
        private class LDKPersistHolder { internal Persist held; }
        private class LDKPersistImpl : bindings.LDKPersist {
                internal LDKPersistImpl(PersistInterface arg, LDKPersistHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
@@ -124,11 +160,19 @@ public class Persist : CommonBase {
                        return ret;
                }
        }
+
+       /** Creates a new instance of Persist from a given implementation */
        public static Persist new_impl(PersistInterface arg) {
                LDKPersistHolder impl_holder = new LDKPersistHolder();
-               impl_holder.held = new Persist(new LDKPersistImpl(arg, impl_holder));
+               LDKPersistImpl impl = new LDKPersistImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKPersist_new(impl);
+
+               impl_holder.held = new Persist(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Persist a new channel's data in response to a [`chain::Watch::watch_channel`] call. This is
         * called by [`ChannelManager`] for new channels, or may be called directly, e.g. on startup.
@@ -166,8 +210,8 @@ public class Persist : CommonBase {
         * updated monitor itself to disk/backups. See the [`Persist`] trait documentation for more
         * details.
         * 
-        * During blockchain synchronization operations, this may be called with no
-        * [`ChannelMonitorUpdate`], in which case the full [`ChannelMonitor`] needs to be persisted.
+        * During blockchain synchronization operations, and in some rare cases, this may be called with
+        * no [`ChannelMonitorUpdate`], in which case the full [`ChannelMonitor`] needs to be persisted.
         * Note that after the full [`ChannelMonitor`] is persisted any previous
         * [`ChannelMonitorUpdate`]s which were persisted should be discarded - they can no longer be
         * applied to the persisted [`ChannelMonitor`] as they were already applied.
index 0f9bbe37e72187ad9a4e3951b9e69d6d73abd812..6f707579ff7cc75cea567a394c0eadbf9d5233ec 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,34 +6,33 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of Persister */
+public interface PersisterInterface {
+       /**Persist the given ['ChannelManager'] to disk, returning an error if persistence failed.
+        */
+       Result_NoneIOErrorZ persist_manager(ChannelManager channel_manager);
+       /**Persist the given [`NetworkGraph`] to disk, returning an error if persistence failed.
+        */
+       Result_NoneIOErrorZ persist_graph(NetworkGraph network_graph);
+       /**Persist the given [`WriteableScore`] to disk, returning an error if persistence failed.
+        */
+       Result_NoneIOErrorZ persist_scorer(WriteableScore scorer);
+}
+
 /**
  * Trait that handles persisting a [`ChannelManager`], [`NetworkGraph`], and [`WriteableScore`] to disk.
  */
 public class Persister : CommonBase {
-       internal readonly bindings.LDKPersister bindings_instance;
+       internal bindings.LDKPersister bindings_instance;
+       internal long instance_idx;
+
        internal Persister(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private Persister(bindings.LDKPersister arg) : base(bindings.LDKPersister_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~Persister() {
                if (ptr != 0) { bindings.Persister_free(ptr); }
        }
 
-       public interface PersisterInterface {
-               /**
-                * Persist the given ['ChannelManager'] to disk, returning an error if persistence failed.
-                */
-               Result_NoneErrorZ persist_manager(ChannelManager _channel_manager);
-               /**
-                * Persist the given [`NetworkGraph`] to disk, returning an error if persistence failed.
-                */
-               Result_NoneErrorZ persist_graph(NetworkGraph _network_graph);
-               /**
-                * Persist the given [`WriteableScore`] to disk, returning an error if persistence failed.
-                */
-               Result_NoneErrorZ persist_scorer(WriteableScore _scorer);
-       }
        private class LDKPersisterHolder { internal Persister held; }
        private class LDKPersisterImpl : bindings.LDKPersister {
                internal LDKPersisterImpl(PersisterInterface arg, LDKPersisterHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
@@ -40,14 +40,14 @@ public class Persister : CommonBase {
                private LDKPersisterHolder impl_holder;
                public long persist_manager(long _channel_manager) {
                        org.ldk.structs.ChannelManager _channel_manager_hu_conv = null; if (_channel_manager < 0 || _channel_manager > 4096) { _channel_manager_hu_conv = new org.ldk.structs.ChannelManager(null, _channel_manager); }
-                       Result_NoneErrorZ ret = arg.persist_manager(_channel_manager_hu_conv);
+                       Result_NoneIOErrorZ ret = arg.persist_manager(_channel_manager_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
                public long persist_graph(long _network_graph) {
                        org.ldk.structs.NetworkGraph _network_graph_hu_conv = null; if (_network_graph < 0 || _network_graph > 4096) { _network_graph_hu_conv = new org.ldk.structs.NetworkGraph(null, _network_graph); }
-                       Result_NoneErrorZ ret = arg.persist_graph(_network_graph_hu_conv);
+                       Result_NoneIOErrorZ ret = arg.persist_graph(_network_graph_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
@@ -55,26 +55,34 @@ public class Persister : CommonBase {
                public long persist_scorer(long _scorer) {
                        WriteableScore ret_hu_conv = new WriteableScore(null, _scorer);
                        if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-                       Result_NoneErrorZ ret = arg.persist_scorer(ret_hu_conv);
+                       Result_NoneIOErrorZ ret = arg.persist_scorer(ret_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
        }
+
+       /** Creates a new instance of Persister from a given implementation */
        public static Persister new_impl(PersisterInterface arg) {
                LDKPersisterHolder impl_holder = new LDKPersisterHolder();
-               impl_holder.held = new Persister(new LDKPersisterImpl(arg, impl_holder));
+               LDKPersisterImpl impl = new LDKPersisterImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKPersister_new(impl);
+
+               impl_holder.held = new Persister(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Persist the given ['ChannelManager'] to disk, returning an error if persistence failed.
         */
-       public Result_NoneErrorZ persist_manager(org.ldk.structs.ChannelManager channel_manager) {
+       public Result_NoneIOErrorZ persist_manager(org.ldk.structs.ChannelManager channel_manager) {
                long ret = bindings.Persister_persist_manager(this.ptr, channel_manager == null ? 0 : channel_manager.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(channel_manager);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NoneErrorZ ret_hu_conv = Result_NoneErrorZ.constr_from_ptr(ret);
+               Result_NoneIOErrorZ ret_hu_conv = Result_NoneIOErrorZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(channel_manager); };
                return ret_hu_conv;
        }
@@ -82,12 +90,12 @@ public class Persister : CommonBase {
        /**
         * Persist the given [`NetworkGraph`] to disk, returning an error if persistence failed.
         */
-       public Result_NoneErrorZ persist_graph(org.ldk.structs.NetworkGraph network_graph) {
+       public Result_NoneIOErrorZ persist_graph(org.ldk.structs.NetworkGraph network_graph) {
                long ret = bindings.Persister_persist_graph(this.ptr, network_graph == null ? 0 : network_graph.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(network_graph);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NoneErrorZ ret_hu_conv = Result_NoneErrorZ.constr_from_ptr(ret);
+               Result_NoneIOErrorZ ret_hu_conv = Result_NoneIOErrorZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(network_graph); };
                return ret_hu_conv;
        }
@@ -95,12 +103,12 @@ public class Persister : CommonBase {
        /**
         * Persist the given [`WriteableScore`] to disk, returning an error if persistence failed.
         */
-       public Result_NoneErrorZ persist_scorer(org.ldk.structs.WriteableScore scorer) {
+       public Result_NoneIOErrorZ persist_scorer(org.ldk.structs.WriteableScore scorer) {
                long ret = bindings.Persister_persist_scorer(this.ptr, scorer.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(scorer);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NoneErrorZ ret_hu_conv = Result_NoneErrorZ.constr_from_ptr(ret);
+               Result_NoneIOErrorZ ret_hu_conv = Result_NoneIOErrorZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(scorer); };
                return ret_hu_conv;
        }
index 6b4183d7bd2136e7fc49dc11dae67918f78e78fc..1453a891188789ba5c2c6cc5ec102d1fc4366b2c 100644 (file)
@@ -82,7 +82,7 @@ public class PhantomKeysManager : CommonBase {
         * [phantom node payments]: PhantomKeysManager
         */
        public static PhantomKeysManager of(byte[] seed, long starting_time_secs, int starting_time_nanos, byte[] cross_node_seed) {
-               long ret = bindings.PhantomKeysManager_new(InternalUtils.check_arr_len(seed, 32), starting_time_secs, starting_time_nanos, InternalUtils.check_arr_len(cross_node_seed, 32));
+               long ret = bindings.PhantomKeysManager_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(seed, 32)), starting_time_secs, starting_time_nanos, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(cross_node_seed, 32)));
                GC.KeepAlive(seed);
                GC.KeepAlive(starting_time_secs);
                GC.KeepAlive(starting_time_nanos);
@@ -96,8 +96,8 @@ public class PhantomKeysManager : CommonBase {
        /**
         * See [`KeysManager::spend_spendable_outputs`] for documentation on this method.
         */
-       public Result_TransactionNoneZ spend_spendable_outputs(SpendableOutputDescriptor[] descriptors, TxOut[] outputs, byte[] change_destination_script, int feerate_sat_per_1000_weight, org.ldk.structs.Option_PackedLockTimeZ locktime) {
-               long ret = bindings.PhantomKeysManager_spend_spendable_outputs(this.ptr, descriptors != null ? InternalUtils.mapArray(descriptors, descriptors_conv_27 => descriptors_conv_27.ptr) : null, outputs != null ? InternalUtils.mapArray(outputs, outputs_conv_7 => outputs_conv_7.ptr) : null, change_destination_script, feerate_sat_per_1000_weight, locktime.ptr);
+       public Result_TransactionNoneZ spend_spendable_outputs(SpendableOutputDescriptor[] descriptors, TxOut[] outputs, byte[] change_destination_script, int feerate_sat_per_1000_weight, org.ldk.structs.Option_u32Z locktime) {
+               long ret = bindings.PhantomKeysManager_spend_spendable_outputs(this.ptr, 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(this);
                GC.KeepAlive(descriptors);
                GC.KeepAlive(outputs);
@@ -115,7 +115,7 @@ public class PhantomKeysManager : CommonBase {
         * See [`KeysManager::derive_channel_keys`] for documentation on this method.
         */
        public InMemorySigner derive_channel_keys(long channel_value_satoshis, byte[] _params) {
-               long ret = bindings.PhantomKeysManager_derive_channel_keys(this.ptr, channel_value_satoshis, InternalUtils.check_arr_len(_params, 32));
+               long ret = bindings.PhantomKeysManager_derive_channel_keys(this.ptr, channel_value_satoshis, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(_params, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(channel_value_satoshis);
                GC.KeepAlive(_params);
@@ -129,9 +129,11 @@ public class PhantomKeysManager : CommonBase {
         * Gets the \"node_id\" secret key used to sign gossip announcements, decode onion data, etc.
         */
        public byte[] get_node_secret_key() {
-               byte[] ret = bindings.PhantomKeysManager_get_node_secret_key(this.ptr);
+               long ret = bindings.PhantomKeysManager_get_node_secret_key(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -139,9 +141,11 @@ public class PhantomKeysManager : CommonBase {
         * last-hop onion data, etc.
         */
        public byte[] get_phantom_node_secret_key() {
-               byte[] ret = bindings.PhantomKeysManager_get_phantom_node_secret_key(this.ptr);
+               long ret = bindings.PhantomKeysManager_get_phantom_node_secret_key(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index b20941e299cf142fe3956e5c7660ac451a3e3a88..e6587b8b4e02f8333eb2e887ce57506aa121ecea 100644 (file)
@@ -21,16 +21,18 @@ public class PhantomRouteHints : CommonBase {
         * The list of channels to be included in the invoice route hints.
         */
        public ChannelDetails[] get_channels() {
-               long[] ret = bindings.PhantomRouteHints_get_channels(this.ptr);
+               long ret = bindings.PhantomRouteHints_get_channels(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_16_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_16_len = InternalUtils.getArrayLength(ret);
                ChannelDetails[] ret_conv_16_arr = new ChannelDetails[ret_conv_16_len];
                for (int q = 0; q < ret_conv_16_len; q++) {
-                       long ret_conv_16 = ret[q];
+                       long ret_conv_16 = InternalUtils.getU64ArrayElem(ret, q);
                        org.ldk.structs.ChannelDetails ret_conv_16_hu_conv = null; if (ret_conv_16 < 0 || ret_conv_16 > 4096) { ret_conv_16_hu_conv = new org.ldk.structs.ChannelDetails(null, ret_conv_16); }
                        if (ret_conv_16_hu_conv != null) { ret_conv_16_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_16_arr[q] = ret_conv_16_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_16_arr;
        }
 
@@ -38,7 +40,7 @@ public class PhantomRouteHints : CommonBase {
         * The list of channels to be included in the invoice route hints.
         */
        public void set_channels(ChannelDetails[] val) {
-               bindings.PhantomRouteHints_set_channels(this.ptr, val != null ? InternalUtils.mapArray(val, val_conv_16 => val_conv_16 == null ? 0 : val_conv_16.ptr) : null);
+               bindings.PhantomRouteHints_set_channels(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(val, val_conv_16 => val_conv_16 == null ? 0 : val_conv_16.ptr)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
                foreach (ChannelDetails val_conv_16 in val) { if (this != null) { this.ptrs_to.AddLast(val_conv_16); }; };
@@ -68,16 +70,18 @@ public class PhantomRouteHints : CommonBase {
         * The pubkey of the real backing node that would ultimately receive the payment.
         */
        public byte[] get_real_node_pubkey() {
-               byte[] ret = bindings.PhantomRouteHints_get_real_node_pubkey(this.ptr);
+               long ret = bindings.PhantomRouteHints_get_real_node_pubkey(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The pubkey of the real backing node that would ultimately receive the payment.
         */
        public void set_real_node_pubkey(byte[] val) {
-               bindings.PhantomRouteHints_set_real_node_pubkey(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.PhantomRouteHints_set_real_node_pubkey(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -86,7 +90,7 @@ public class PhantomRouteHints : CommonBase {
         * Constructs a new PhantomRouteHints given each field
         */
        public static PhantomRouteHints of(ChannelDetails[] channels_arg, long phantom_scid_arg, byte[] real_node_pubkey_arg) {
-               long ret = bindings.PhantomRouteHints_new(channels_arg != null ? InternalUtils.mapArray(channels_arg, channels_arg_conv_16 => channels_arg_conv_16 == null ? 0 : channels_arg_conv_16.ptr) : null, phantom_scid_arg, InternalUtils.check_arr_len(real_node_pubkey_arg, 33));
+               long ret = bindings.PhantomRouteHints_new(InternalUtils.encodeUint64Array(InternalUtils.mapArray(channels_arg, channels_arg_conv_16 => channels_arg_conv_16 == null ? 0 : channels_arg_conv_16.ptr)), phantom_scid_arg, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(real_node_pubkey_arg, 33)));
                GC.KeepAlive(channels_arg);
                GC.KeepAlive(phantom_scid_arg);
                GC.KeepAlive(real_node_pubkey_arg);
@@ -119,16 +123,18 @@ public class PhantomRouteHints : CommonBase {
         * Serialize the PhantomRouteHints object into a byte array which can be read by PhantomRouteHints_read
         */
        public byte[] write() {
-               byte[] ret = bindings.PhantomRouteHints_write(this.ptr);
+               long ret = bindings.PhantomRouteHints_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a PhantomRouteHints from a byte array, created by PhantomRouteHints_write
         */
        public static Result_PhantomRouteHintsDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.PhantomRouteHints_read(ser);
+               long ret = bindings.PhantomRouteHints_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_PhantomRouteHintsDecodeErrorZ ret_hu_conv = Result_PhantomRouteHintsDecodeErrorZ.constr_from_ptr(ret);
index 9ca8849c6ee109eda4c2d47401cc18be09cd0ef5..3bdad4c0b92914ebcfd1896fdeceeae6bbdff802 100644 (file)
@@ -109,16 +109,18 @@ public class Ping : CommonBase {
         * Serialize the Ping object into a byte array which can be read by Ping_read
         */
        public byte[] write() {
-               byte[] ret = bindings.Ping_write(this.ptr);
+               long ret = bindings.Ping_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a Ping from a byte array, created by Ping_write
         */
        public static Result_PingDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.Ping_read(ser);
+               long ret = bindings.Ping_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_PingDecodeErrorZ ret_hu_conv = Result_PingDecodeErrorZ.constr_from_ptr(ret);
index 2163b350ad026940a08730ca9d41f169808ded59..ed704f8707461c7a78dd8e60b8323202c5c957d3 100644 (file)
@@ -90,16 +90,18 @@ public class Pong : CommonBase {
         * Serialize the Pong object into a byte array which can be read by Pong_read
         */
        public byte[] write() {
-               byte[] ret = bindings.Pong_write(this.ptr);
+               long ret = bindings.Pong_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a Pong from a byte array, created by Pong_write
         */
        public static Result_PongDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.Pong_read(ser);
+               long ret = bindings.Pong_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_PongDecodeErrorZ ret_hu_conv = Result_PongDecodeErrorZ.constr_from_ptr(ret);
index b20ad717d3677637f636eb73d5f97206a611afeb..075cad4f2891e3acef51c6f177128df5a2e2e850 100644 (file)
@@ -17,13 +17,15 @@ public class PrintableString : CommonBase {
        }
 
        public string get_a() {
-               string ret = bindings.PrintableString_get_a(this.ptr);
+               long ret = bindings.PrintableString_get_a(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
        }
 
        public void set_a(string val) {
-               bindings.PrintableString_set_a(this.ptr, val);
+               bindings.PrintableString_set_a(this.ptr, InternalUtils.encodeString(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -32,7 +34,7 @@ public class PrintableString : CommonBase {
         * Constructs a new PrintableString given each field
         */
        public static PrintableString of(string a_arg) {
-               long ret = bindings.PrintableString_new(a_arg);
+               long ret = bindings.PrintableString_new(InternalUtils.encodeString(a_arg));
                GC.KeepAlive(a_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.PrintableString ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PrintableString(null, ret); }
index c14395ee5735e28925a1f5e7dbe15726a59a4762..2bbdf38ffbdb262cecfed496ded678c010845980 100644 (file)
@@ -7,7 +7,7 @@ namespace org { namespace ldk { namespace structs {
 
 
 /**
- * [`Score`] implementation using channel success probability distributions.
+ * [`ScoreLookUp`] implementation using channel success probability distributions.
  * 
  * Channels are tracked with upper and lower liquidity bounds - when an HTLC fails at a channel,
  * we learn that the upper-bound on the available liquidity is lower than the amount of the HTLC.
@@ -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
@@ -99,34 +99,89 @@ public class ProbabilisticScorer : CommonBase {
         * Query the historical estimated minimum and maximum liquidity available for sending a
         * payment over the channel with `scid` towards the given `target` node.
         * 
-        * Returns two sets of 8 buckets. The first set describes the octiles for lower-bound
-        * liquidity estimates, the second set describes the octiles for upper-bound liquidity
-        * estimates. Each bucket describes the relative frequency at which we've seen a liquidity
-        * bound in the octile relative to the channel's total capacity, on an arbitrary scale.
-        * Because the values are slowly decayed, more recent data points are weighted more heavily
-        * than older datapoints.
+        * Returns two sets of 32 buckets. The first set describes the lower-bound liquidity history,
+        * the second set describes the upper-bound liquidity history. Each bucket describes the
+        * relative frequency at which we've seen a liquidity bound in the bucket's range relative to
+        * the channel's total capacity, on an arbitrary scale. Because the values are slowly decayed,
+        * more recent data points are weighted more heavily than older datapoints.
+        * 
+        * Note that the range of each bucket varies by its location to provide more granular results
+        * at the edges of a channel's capacity, where it is more likely to sit.
         * 
-        * When scoring, the estimated probability that an upper-/lower-bound lies in a given octile
-        * relative to the channel's total capacity is calculated by dividing that bucket's value with
-        * the total of all buckets for the given bound.
+        * When scoring, the estimated probability that an upper-/lower-bound lies in a given bucket
+        * is calculated by dividing that bucket's value with the total value of all buckets.
         * 
-        * For example, a value of `[0, 0, 0, 0, 0, 0, 32]` indicates that we believe the probability
-        * of a bound being in the top octile to be 100%, and have never (recently) seen it in any
-        * other octiles. A value of `[31, 0, 0, 0, 0, 0, 0, 32]` indicates we've seen the bound being
-        * both in the top and bottom octile, and roughly with similar (recent) frequency.
+        * For example, using a lower bucket count for illustrative purposes, a value of
+        * `[0, 0, 0, ..., 0, 32]` indicates that we believe the probability of a bound being very
+        * close to the channel's capacity to be 100%, and have never (recently) seen it in any other
+        * bucket. A value of `[31, 0, 0, ..., 0, 0, 32]` indicates we've seen the bound being both
+        * 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(([0; 8], [0; 8]))`.
+        * `Some(([1; 32], [1; 32]))` and then to `None` once no datapoints remain.
+        * 
+        * 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`].
         */
-       public Option_C2Tuple_EightU16sEightU16sZZ historical_estimated_channel_liquidity_probabilities(long scid, org.ldk.structs.NodeId target) {
+       public Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ historical_estimated_channel_liquidity_probabilities(long scid, org.ldk.structs.NodeId target) {
                long ret = bindings.ProbabilisticScorer_historical_estimated_channel_liquidity_probabilities(this.ptr, scid, target == null ? 0 : target.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(scid);
                GC.KeepAlive(target);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_C2Tuple_EightU16sEightU16sZZ ret_hu_conv = org.ldk.structs.Option_C2Tuple_EightU16sEightU16sZZ.constr_from_ptr(ret);
+               org.ldk.structs.Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ ret_hu_conv = org.ldk.structs.Option_C2Tuple_ThirtyTwoU16sThirtyTwoU16sZZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               if (this != null) { this.ptrs_to.AddLast(target); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Query the probability of payment success sending the given `amount_msat` over the channel
+        * with `scid` towards the given `target` node, based on the historical estimated liquidity
+        * bounds.
+        * 
+        * These are the same bounds as returned by
+        * [`Self::historical_estimated_channel_liquidity_probabilities`] (but not those returned by
+        * [`Self::estimated_channel_liquidity_range`]).
+        */
+       public Option_f64Z historical_estimated_payment_success_probability(long scid, org.ldk.structs.NodeId target, long amount_msat, org.ldk.structs.ProbabilisticScoringFeeParameters _params) {
+               long ret = bindings.ProbabilisticScorer_historical_estimated_payment_success_probability(this.ptr, scid, target == null ? 0 : target.ptr, amount_msat, _params == null ? 0 : _params.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(scid);
+               GC.KeepAlive(target);
+               GC.KeepAlive(amount_msat);
+               GC.KeepAlive(_params);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_f64Z ret_hu_conv = org.ldk.structs.Option_f64Z.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
                if (this != null) { this.ptrs_to.AddLast(target); };
+               if (this != null) { this.ptrs_to.AddLast(_params); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new ScoreLookUp which calls the relevant methods on this_arg.
+        * This copies the `inner` pointer in this_arg and thus the returned ScoreLookUp must be freed before this_arg is
+        */
+       public ScoreLookUp as_ScoreLookUp() {
+               long ret = bindings.ProbabilisticScorer_as_ScoreLookUp(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               ScoreLookUp ret_hu_conv = new ScoreLookUp(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constructs a new ScoreUpdate which calls the relevant methods on this_arg.
+        * This copies the `inner` pointer in this_arg and thus the returned ScoreUpdate must be freed before this_arg is
+        */
+       public ScoreUpdate as_ScoreUpdate() {
+               long ret = bindings.ProbabilisticScorer_as_ScoreUpdate(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               ScoreUpdate ret_hu_conv = new ScoreUpdate(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
                return ret_hu_conv;
        }
 
@@ -147,16 +202,18 @@ public class ProbabilisticScorer : CommonBase {
         * Serialize the ProbabilisticScorer object into a byte array which can be read by ProbabilisticScorer_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ProbabilisticScorer_write(this.ptr);
+               long ret = bindings.ProbabilisticScorer_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ProbabilisticScorer from a byte array, created by ProbabilisticScorer_write
         */
        public static Result_ProbabilisticScorerDecodeErrorZ read(byte[] ser, org.ldk.structs.ProbabilisticScoringDecayParameters arg_a, org.ldk.structs.NetworkGraph arg_b, org.ldk.structs.Logger arg_c) {
-               long ret = bindings.ProbabilisticScorer_read(ser, arg_a == null ? 0 : arg_a.ptr, arg_b == null ? 0 : arg_b.ptr, arg_c.ptr);
+               long ret = bindings.ProbabilisticScorer_read(InternalUtils.encodeUint8Array(ser), arg_a == null ? 0 : arg_a.ptr, arg_b == null ? 0 : arg_b.ptr, arg_c.ptr);
                GC.KeepAlive(ser);
                GC.KeepAlive(arg_a);
                GC.KeepAlive(arg_b);
index b3528ffa7022947f50d996b4b2410e5385d94cd2..c901c71d6a7de7d6833256d75bc2303c4c3bf814 100644 (file)
@@ -44,12 +44,13 @@ public class ProbabilisticScoringFeeParameters : CommonBase {
        }
 
        /**
-        * A multiplier used with the payment amount to calculate a fixed penalty applied to each
-        * channel, in excess of the [`base_penalty_msat`].
+        * A multiplier used with the total amount flowing over a channel to calculate a fixed penalty
+        * applied to each channel, in excess of the [`base_penalty_msat`].
         * 
         * The purpose of the amount penalty is to avoid having fees dominate the channel cost (i.e.,
         * fees plus penalty) for large payments. The penalty is computed as the product of this
-        * multiplier and `2^30`ths of the payment amount.
+        * multiplier and `2^30`ths of the total amount flowing over a channel (i.e. the payment
+        * amount plus the amount of any other HTLCs flowing we sent over the same channel).
         * 
         * ie `base_penalty_amount_multiplier_msat * amount_msat / 2^30`
         * 
@@ -64,12 +65,13 @@ public class ProbabilisticScoringFeeParameters : CommonBase {
        }
 
        /**
-        * A multiplier used with the payment amount to calculate a fixed penalty applied to each
-        * channel, in excess of the [`base_penalty_msat`].
+        * A multiplier used with the total amount flowing over a channel to calculate a fixed penalty
+        * applied to each channel, in excess of the [`base_penalty_msat`].
         * 
         * The purpose of the amount penalty is to avoid having fees dominate the channel cost (i.e.,
         * fees plus penalty) for large payments. The penalty is computed as the product of this
-        * multiplier and `2^30`ths of the payment amount.
+        * multiplier and `2^30`ths of the total amount flowing over a channel (i.e. the payment
+        * amount plus the amount of any other HTLCs flowing we sent over the same channel).
         * 
         * ie `base_penalty_amount_multiplier_msat * amount_msat / 2^30`
         * 
@@ -132,14 +134,14 @@ public class ProbabilisticScoringFeeParameters : CommonBase {
        }
 
        /**
-        * A multiplier used in conjunction with a payment amount and the negative `log10` of the
-        * channel's success probability for the payment, as determined by our latest estimates of the
-        * channel's liquidity, to determine the amount penalty.
+        * A multiplier used in conjunction with the total amount flowing over a channel and the
+        * negative `log10` of the channel's success probability for the payment, as determined by our
+        * latest estimates of the channel's liquidity, to determine the amount penalty.
         * 
         * The purpose of the amount penalty is to avoid having fees dominate the channel cost (i.e.,
         * fees plus penalty) for large payments. The penalty is computed as the product of this
-        * multiplier and `2^20`ths of the payment amount, weighted by the negative `log10` of the
-        * success probability.
+        * multiplier and `2^20`ths of the amount flowing over this channel, weighted by the negative
+        * `log10` of the success probability.
         * 
         * `-log10(success_probability) * liquidity_penalty_amount_multiplier_msat * amount_msat / 2^20`
         * 
@@ -158,14 +160,14 @@ public class ProbabilisticScoringFeeParameters : CommonBase {
        }
 
        /**
-        * A multiplier used in conjunction with a payment amount and the negative `log10` of the
-        * channel's success probability for the payment, as determined by our latest estimates of the
-        * channel's liquidity, to determine the amount penalty.
+        * A multiplier used in conjunction with the total amount flowing over a channel and the
+        * negative `log10` of the channel's success probability for the payment, as determined by our
+        * latest estimates of the channel's liquidity, to determine the amount penalty.
         * 
         * The purpose of the amount penalty is to avoid having fees dominate the channel cost (i.e.,
         * fees plus penalty) for large payments. The penalty is computed as the product of this
-        * multiplier and `2^20`ths of the payment amount, weighted by the negative `log10` of the
-        * success probability.
+        * multiplier and `2^20`ths of the amount flowing over this channel, weighted by the negative
+        * `log10` of the success probability.
         * 
         * `-log10(success_probability) * liquidity_penalty_amount_multiplier_msat * amount_msat / 2^20`
         * 
@@ -228,13 +230,15 @@ public class ProbabilisticScoringFeeParameters : CommonBase {
        }
 
        /**
-        * A multiplier used in conjunction with the payment amount and the negative `log10` of the
-        * channel's success probability for the payment, as determined based on the history of our
-        * estimates of the channel's available liquidity, to determine a penalty.
+        * A multiplier used in conjunction with the total amount flowing over a channel and the
+        * negative `log10` of the channel's success probability for the payment, as determined based
+        * on the history of our estimates of the channel's available liquidity, to determine a
+        * penalty.
         * 
         * The purpose of the amount penalty is to avoid having fees dominate the channel cost for
-        * large payments. The penalty is computed as the product of this multiplier and the `2^20`ths
-        * of the payment amount, weighted by the negative `log10` of the success probability.
+        * large payments. The penalty is computed as the product of this multiplier and `2^20`ths
+        * of the amount flowing over this channel, weighted by the negative `log10` of the success
+        * probability.
         * 
         * This penalty is similar to [`liquidity_penalty_amount_multiplier_msat`], however, instead
         * of using only our latest estimate for the current liquidity available in the channel, it
@@ -254,13 +258,15 @@ public class ProbabilisticScoringFeeParameters : CommonBase {
        }
 
        /**
-        * A multiplier used in conjunction with the payment amount and the negative `log10` of the
-        * channel's success probability for the payment, as determined based on the history of our
-        * estimates of the channel's available liquidity, to determine a penalty.
+        * A multiplier used in conjunction with the total amount flowing over a channel and the
+        * negative `log10` of the channel's success probability for the payment, as determined based
+        * on the history of our estimates of the channel's available liquidity, to determine a
+        * penalty.
         * 
         * The purpose of the amount penalty is to avoid having fees dominate the channel cost for
-        * large payments. The penalty is computed as the product of this multiplier and the `2^20`ths
-        * of the payment amount, weighted by the negative `log10` of the success probability.
+        * large payments. The penalty is computed as the product of this multiplier and `2^20`ths
+        * of the amount flowing over this channel, weighted by the negative `log10` of the success
+        * probability.
         * 
         * This penalty is similar to [`liquidity_penalty_amount_multiplier_msat`], however, instead
         * of using only our latest estimate for the current liquidity available in the channel, it
@@ -310,8 +316,9 @@ public class ProbabilisticScoringFeeParameters : CommonBase {
        }
 
        /**
-        * This penalty is applied when the amount we're attempting to send over a channel exceeds our
-        * current estimate of the channel's available liquidity.
+        * This penalty is applied when the total amount flowing over a channel exceeds our current
+        * estimate of the channel's available liquidity. The total amount is the amount of the
+        * current HTLC plus any HTLCs which we've sent over the same channel.
         * 
         * Note that in this case all other penalties, including the
         * [`liquidity_penalty_multiplier_msat`] and [`liquidity_penalty_amount_multiplier_msat`]-based
@@ -335,8 +342,9 @@ public class ProbabilisticScoringFeeParameters : CommonBase {
        }
 
        /**
-        * This penalty is applied when the amount we're attempting to send over a channel exceeds our
-        * current estimate of the channel's available liquidity.
+        * This penalty is applied when the total amount flowing over a channel exceeds our current
+        * estimate of the channel's available liquidity. The total amount is the amount of the
+        * current HTLC plus any HTLCs which we've sent over the same channel.
         * 
         * Note that in this case all other penalties, including the
         * [`liquidity_penalty_multiplier_msat`] and [`liquidity_penalty_amount_multiplier_msat`]-based
@@ -359,6 +367,62 @@ public class ProbabilisticScoringFeeParameters : CommonBase {
                GC.KeepAlive(val);
        }
 
+       /**
+        * In order to calculate most of the scores above, we must first convert a lower and upper
+        * bound on the available liquidity in a channel into the probability that we think a payment
+        * will succeed. That probability is derived from a Probability Density Function for where we
+        * think the liquidity in a channel likely lies, given such bounds.
+        * 
+        * If this flag is set, that PDF is simply a constant - we assume that the actual available
+        * liquidity in a channel is just as likely to be at any point between our lower and upper
+        * bounds.
+        * 
+        * If this flag is *not* set, that PDF is `(x - 0.5*capacity) ^ 2`. That is, we use an
+        * exponential curve which expects the liquidity of a channel to lie \"at the edges\". This
+        * matches experimental results - most routing nodes do not aggressively rebalance their
+        * channels and flows in the network are often unbalanced, leaving liquidity usually
+        * unavailable.
+        * 
+        * Thus, for the \"best\" routes, leave this flag `false`. However, the flag does imply a number
+        * of floating-point multiplications in the hottest routing code, which may lead to routing
+        * performance degradation on some machines.
+        * 
+        * Default value: false
+        */
+       public bool get_linear_success_probability() {
+               bool ret = bindings.ProbabilisticScoringFeeParameters_get_linear_success_probability(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * In order to calculate most of the scores above, we must first convert a lower and upper
+        * bound on the available liquidity in a channel into the probability that we think a payment
+        * will succeed. That probability is derived from a Probability Density Function for where we
+        * think the liquidity in a channel likely lies, given such bounds.
+        * 
+        * If this flag is set, that PDF is simply a constant - we assume that the actual available
+        * liquidity in a channel is just as likely to be at any point between our lower and upper
+        * bounds.
+        * 
+        * If this flag is *not* set, that PDF is `(x - 0.5*capacity) ^ 2`. That is, we use an
+        * exponential curve which expects the liquidity of a channel to lie \"at the edges\". This
+        * matches experimental results - most routing nodes do not aggressively rebalance their
+        * channels and flows in the network are often unbalanced, leaving liquidity usually
+        * unavailable.
+        * 
+        * Thus, for the \"best\" routes, leave this flag `false`. However, the flag does imply a number
+        * of floating-point multiplications in the hottest routing code, which may lead to routing
+        * performance degradation on some machines.
+        * 
+        * Default value: false
+        */
+       public void set_linear_success_probability(bool val) {
+               bindings.ProbabilisticScoringFeeParameters_set_linear_success_probability(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
        internal long clone_ptr() {
                long ret = bindings.ProbabilisticScoringFeeParameters_clone_ptr(this.ptr);
                GC.KeepAlive(this);
@@ -404,7 +468,7 @@ public class ProbabilisticScoringFeeParameters : CommonBase {
         * they will be avoided during path finding.
         */
        public void add_banned_from_list(NodeId[] node_ids) {
-               bindings.ProbabilisticScoringFeeParameters_add_banned_from_list(this.ptr, node_ids != null ? InternalUtils.mapArray(node_ids, node_ids_conv_8 => node_ids_conv_8 == null ? 0 : node_ids_conv_8.ptr) : null);
+               bindings.ProbabilisticScoringFeeParameters_add_banned_from_list(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(node_ids, node_ids_conv_8 => node_ids_conv_8 == null ? 0 : node_ids_conv_8.ptr)));
                GC.KeepAlive(this);
                GC.KeepAlive(node_ids);
                foreach (NodeId node_ids_conv_8 in node_ids) { if (this != null) { this.ptrs_to.AddLast(node_ids_conv_8); }; };
diff --git a/c_sharp/src/org/ldk/structs/ProbeSendFailure.cs b/c_sharp/src/org/ldk/structs/ProbeSendFailure.cs
new file mode 100644 (file)
index 0000000..34ec6c6
--- /dev/null
@@ -0,0 +1,103 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+/**
+ * Indicates that we failed to send a payment probe. Further errors may be surfaced later via
+ * [`Event::ProbeFailed`].
+ * 
+ * [`Event::ProbeFailed`]: crate::events::Event::ProbeFailed
+ */
+public class ProbeSendFailure : CommonBase {
+       protected ProbeSendFailure(object _dummy, long ptr) : base(ptr) { }
+       ~ProbeSendFailure() {
+               if (ptr != 0) { bindings.ProbeSendFailure_free(ptr); }
+       }
+
+       internal static ProbeSendFailure constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKProbeSendFailure_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new ProbeSendFailure_RouteNotFound(ptr);
+                       case 1: return new ProbeSendFailure_SendingFailed(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A ProbeSendFailure of type RouteNotFound */
+       public class ProbeSendFailure_RouteNotFound : ProbeSendFailure {
+               internal ProbeSendFailure_RouteNotFound(long ptr) : base(null, ptr) {
+               }
+       }
+       /** A ProbeSendFailure of type SendingFailed */
+       public class ProbeSendFailure_SendingFailed : ProbeSendFailure {
+               public PaymentSendFailure sending_failed;
+               internal ProbeSendFailure_SendingFailed(long ptr) : base(null, ptr) {
+                       long sending_failed = bindings.LDKProbeSendFailure_SendingFailed_get_sending_failed(ptr);
+                       org.ldk.structs.PaymentSendFailure sending_failed_hu_conv = org.ldk.structs.PaymentSendFailure.constr_from_ptr(sending_failed);
+                       if (sending_failed_hu_conv != null) { sending_failed_hu_conv.ptrs_to.AddLast(this); };
+                       this.sending_failed = sending_failed_hu_conv;
+               }
+       }
+       internal long clone_ptr() {
+               long ret = bindings.ProbeSendFailure_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the ProbeSendFailure
+        */
+       public ProbeSendFailure clone() {
+               long ret = bindings.ProbeSendFailure_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ProbeSendFailure ret_hu_conv = org.ldk.structs.ProbeSendFailure.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 RouteNotFound-variant ProbeSendFailure
+        */
+       public static ProbeSendFailure route_not_found() {
+               long ret = bindings.ProbeSendFailure_route_not_found();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ProbeSendFailure ret_hu_conv = org.ldk.structs.ProbeSendFailure.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 SendingFailed-variant ProbeSendFailure
+        */
+       public static ProbeSendFailure sending_failed(org.ldk.structs.PaymentSendFailure a) {
+               long ret = bindings.ProbeSendFailure_sending_failed(a.ptr);
+               GC.KeepAlive(a);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ProbeSendFailure ret_hu_conv = org.ldk.structs.ProbeSendFailure.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 ProbeSendFailures contain equal inner contents.
+        * This ignores pointers and is_owned flags and looks at the values in fields.
+        */
+       public bool eq(org.ldk.structs.ProbeSendFailure b) {
+               bool ret = bindings.ProbeSendFailure_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 ProbeSendFailure)) return false;
+               return this.eq((ProbeSendFailure)o);
+       }
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/ProbingError.cs b/c_sharp/src/org/ldk/structs/ProbingError.cs
new file mode 100644 (file)
index 0000000..3ce9f99
--- /dev/null
@@ -0,0 +1,105 @@
+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);
+       }
+}
+} } }
index 998b7bf3508d037895a7fff1d4bdf0d028b0eb2f..ae91c5aa277612dfb323822d32e0ecf93ef439dd 100644 (file)
@@ -24,16 +24,18 @@ public class QueryChannelRange : CommonBase {
         * The genesis hash of the blockchain being queried
         */
        public byte[] get_chain_hash() {
-               byte[] ret = bindings.QueryChannelRange_get_chain_hash(this.ptr);
+               long ret = bindings.QueryChannelRange_get_chain_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The genesis hash of the blockchain being queried
         */
        public void set_chain_hash(byte[] val) {
-               bindings.QueryChannelRange_set_chain_hash(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.QueryChannelRange_set_chain_hash(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -78,7 +80,7 @@ public class QueryChannelRange : CommonBase {
         * Constructs a new QueryChannelRange given each field
         */
        public static QueryChannelRange of(byte[] chain_hash_arg, int first_blocknum_arg, int number_of_blocks_arg) {
-               long ret = bindings.QueryChannelRange_new(InternalUtils.check_arr_len(chain_hash_arg, 32), first_blocknum_arg, number_of_blocks_arg);
+               long ret = bindings.QueryChannelRange_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(chain_hash_arg, 32)), first_blocknum_arg, number_of_blocks_arg);
                GC.KeepAlive(chain_hash_arg);
                GC.KeepAlive(first_blocknum_arg);
                GC.KeepAlive(number_of_blocks_arg);
@@ -138,16 +140,18 @@ public class QueryChannelRange : CommonBase {
         * Serialize the QueryChannelRange object into a byte array which can be read by QueryChannelRange_read
         */
        public byte[] write() {
-               byte[] ret = bindings.QueryChannelRange_write(this.ptr);
+               long ret = bindings.QueryChannelRange_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a QueryChannelRange from a byte array, created by QueryChannelRange_write
         */
        public static Result_QueryChannelRangeDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.QueryChannelRange_read(ser);
+               long ret = bindings.QueryChannelRange_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_QueryChannelRangeDecodeErrorZ ret_hu_conv = Result_QueryChannelRangeDecodeErrorZ.constr_from_ptr(ret);
index f374fd26cf7d6cd5542f02e225d94a3556fcaa0c..f450b34ff730ea3c58089a49d57c30257d33e5e6 100644 (file)
@@ -29,16 +29,18 @@ public class QueryShortChannelIds : CommonBase {
         * The genesis hash of the blockchain being queried
         */
        public byte[] get_chain_hash() {
-               byte[] ret = bindings.QueryShortChannelIds_get_chain_hash(this.ptr);
+               long ret = bindings.QueryShortChannelIds_get_chain_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The genesis hash of the blockchain being queried
         */
        public void set_chain_hash(byte[] val) {
-               bindings.QueryShortChannelIds_set_chain_hash(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.QueryShortChannelIds_set_chain_hash(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -49,16 +51,18 @@ public class QueryShortChannelIds : CommonBase {
         * Returns a copy of the field.
         */
        public long[] get_short_channel_ids() {
-               long[] ret = bindings.QueryShortChannelIds_get_short_channel_ids(this.ptr);
+               long ret = bindings.QueryShortChannelIds_get_short_channel_ids(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               long[] ret_conv = InternalUtils.decodeUint64Array(ret);
+               return ret_conv;
        }
 
        /**
         * The short_channel_ids that are being queried
         */
        public void set_short_channel_ids(long[] val) {
-               bindings.QueryShortChannelIds_set_short_channel_ids(this.ptr, val);
+               bindings.QueryShortChannelIds_set_short_channel_ids(this.ptr, InternalUtils.encodeUint64Array(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -67,7 +71,7 @@ public class QueryShortChannelIds : CommonBase {
         * Constructs a new QueryShortChannelIds given each field
         */
        public static QueryShortChannelIds of(byte[] chain_hash_arg, long[] short_channel_ids_arg) {
-               long ret = bindings.QueryShortChannelIds_new(InternalUtils.check_arr_len(chain_hash_arg, 32), short_channel_ids_arg);
+               long ret = bindings.QueryShortChannelIds_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(chain_hash_arg, 32)), InternalUtils.encodeUint64Array(short_channel_ids_arg));
                GC.KeepAlive(chain_hash_arg);
                GC.KeepAlive(short_channel_ids_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -115,7 +119,7 @@ public class QueryShortChannelIds : CommonBase {
         * Read a QueryShortChannelIds from a byte array, created by QueryShortChannelIds_write
         */
        public static Result_QueryShortChannelIdsDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.QueryShortChannelIds_read(ser);
+               long ret = bindings.QueryShortChannelIds_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_QueryShortChannelIdsDecodeErrorZ ret_hu_conv = Result_QueryShortChannelIdsDecodeErrorZ.constr_from_ptr(ret);
@@ -126,9 +130,11 @@ public class QueryShortChannelIds : CommonBase {
         * Serialize the QueryShortChannelIds object into a byte array which can be read by QueryShortChannelIds_read
         */
        public byte[] write() {
-               byte[] ret = bindings.QueryShortChannelIds_write(this.ptr);
+               long ret = bindings.QueryShortChannelIds_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index 6a727b5a2a614681fd0346b284b2ce987d2a2f98..3937e289edc40059c57f8a222913c15357e90f46 100644 (file)
@@ -43,7 +43,7 @@ public class RapidGossipSync : CommonBase {
         * `sync_path`: Path to the file where the gossip update data is located
         */
        public Result_u32GraphSyncErrorZ sync_network_graph_with_file_path(string sync_path) {
-               long ret = bindings.RapidGossipSync_sync_network_graph_with_file_path(this.ptr, sync_path);
+               long ret = bindings.RapidGossipSync_sync_network_graph_with_file_path(this.ptr, InternalUtils.encodeString(sync_path));
                GC.KeepAlive(this);
                GC.KeepAlive(sync_path);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -58,7 +58,7 @@ public class RapidGossipSync : CommonBase {
         * `update_data`: `&[u8]` binary stream that comprises the update data
         */
        public Result_u32GraphSyncErrorZ update_network_graph(byte[] update_data) {
-               long ret = bindings.RapidGossipSync_update_network_graph(this.ptr, update_data);
+               long ret = bindings.RapidGossipSync_update_network_graph(this.ptr, InternalUtils.encodeUint8Array(update_data));
                GC.KeepAlive(this);
                GC.KeepAlive(update_data);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -74,7 +74,7 @@ public class RapidGossipSync : CommonBase {
         * `current_time_unix`: `Option<u64>` optional current timestamp to verify data age
         */
        public Result_u32GraphSyncErrorZ update_network_graph_no_std(byte[] update_data, org.ldk.structs.Option_u64Z current_time_unix) {
-               long ret = bindings.RapidGossipSync_update_network_graph_no_std(this.ptr, update_data, current_time_unix.ptr);
+               long ret = bindings.RapidGossipSync_update_network_graph_no_std(this.ptr, InternalUtils.encodeUint8Array(update_data), current_time_unix.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(update_data);
                GC.KeepAlive(current_time_unix);
index a4f7c66c750d5bca0abf7c3214a7fde7ac9cb418..6eab6a8826844d7cadc8db599975bd2091deff01 100644 (file)
@@ -92,9 +92,11 @@ public class RawBolt11Invoice : CommonBase {
         * Calculate the hash of the encoded `RawBolt11Invoice` which should be signed.
         */
        public byte[] signable_hash() {
-               byte[] ret = bindings.RawBolt11Invoice_signable_hash(this.ptr);
+               long ret = bindings.RawBolt11Invoice_signable_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -169,11 +171,11 @@ public class RawBolt11Invoice : CommonBase {
                return ret_hu_conv;
        }
 
-       public Option_PaymentSecretZ payment_secret() {
+       public Option_ThirtyTwoBytesZ payment_secret() {
                long ret = bindings.RawBolt11Invoice_payment_secret(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PaymentSecretZ ret_hu_conv = org.ldk.structs.Option_PaymentSecretZ.constr_from_ptr(ret);
+               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;
        }
@@ -200,16 +202,18 @@ public class RawBolt11Invoice : CommonBase {
        }
 
        public PrivateRoute[] private_routes() {
-               long[] ret = bindings.RawBolt11Invoice_private_routes(this.ptr);
+               long ret = bindings.RawBolt11Invoice_private_routes(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_14_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_14_len = InternalUtils.getArrayLength(ret);
                PrivateRoute[] ret_conv_14_arr = new PrivateRoute[ret_conv_14_len];
                for (int o = 0; o < ret_conv_14_len; o++) {
-                       long ret_conv_14 = ret[o];
+                       long ret_conv_14 = InternalUtils.getU64ArrayElem(ret, o);
                        org.ldk.structs.PrivateRoute ret_conv_14_hu_conv = null; if (ret_conv_14 < 0 || ret_conv_14 > 4096) { ret_conv_14_hu_conv = new org.ldk.structs.PrivateRoute(null, ret_conv_14); }
                        if (ret_conv_14_hu_conv != null) { ret_conv_14_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_14_arr[o] = ret_conv_14_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_14_arr;
        }
 
index 15b8005a083772f6d4b8590d3e98d81a4b46b2a0..0434b8903716fd7efb0f015ec6d2b4fe1e4c5346 100644 (file)
@@ -34,9 +34,11 @@ public class ReadOnlyNetworkGraph : CommonBase, IDisposable {
         * Returns the list of channels in the graph
         */
        public long[] list_channels() {
-               long[] ret = bindings.ReadOnlyNetworkGraph_list_channels(this.ptr);
+               long ret = bindings.ReadOnlyNetworkGraph_list_channels(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               long[] ret_conv = InternalUtils.decodeUint64Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -59,16 +61,18 @@ public class ReadOnlyNetworkGraph : CommonBase, IDisposable {
         * Returns the list of nodes in the graph
         */
        public NodeId[] list_nodes() {
-               long[] ret = bindings.ReadOnlyNetworkGraph_list_nodes(this.ptr);
+               long ret = bindings.ReadOnlyNetworkGraph_list_nodes(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_8_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_8_len = InternalUtils.getArrayLength(ret);
                NodeId[] ret_conv_8_arr = new NodeId[ret_conv_8_len];
                for (int i = 0; i < ret_conv_8_len; i++) {
-                       long ret_conv_8 = ret[i];
+                       long ret_conv_8 = InternalUtils.getU64ArrayElem(ret, i);
                        org.ldk.structs.NodeId ret_conv_8_hu_conv = null; if (ret_conv_8 < 0 || ret_conv_8 > 4096) { ret_conv_8_hu_conv = new org.ldk.structs.NodeId(null, ret_conv_8); }
                        if (ret_conv_8_hu_conv != null) { ret_conv_8_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_8_arr[i] = ret_conv_8_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_8_arr;
        }
 
@@ -77,12 +81,12 @@ public class ReadOnlyNetworkGraph : CommonBase, IDisposable {
         * Returns None if the requested node is completely unknown,
         * or if node announcement for the node was never received.
         */
-       public Option_CVec_NetAddressZZ get_addresses(byte[] pubkey) {
-               long ret = bindings.ReadOnlyNetworkGraph_get_addresses(this.ptr, InternalUtils.check_arr_len(pubkey, 33));
+       public Option_CVec_SocketAddressZZ get_addresses(byte[] pubkey) {
+               long ret = bindings.ReadOnlyNetworkGraph_get_addresses(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(pubkey, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(pubkey);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_CVec_NetAddressZZ ret_hu_conv = org.ldk.structs.Option_CVec_NetAddressZZ.constr_from_ptr(ret);
+               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;
        }
diff --git a/c_sharp/src/org/ldk/structs/ReceiveTlvs.cs b/c_sharp/src/org/ldk/structs/ReceiveTlvs.cs
new file mode 100644 (file)
index 0000000..53b04a6
--- /dev/null
@@ -0,0 +1,116 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * Data to construct a [`BlindedHop`] for receiving a payment. This payload is custom to LDK and
+ * may not be valid if received by another lightning implementation.
+ */
+public class ReceiveTlvs : CommonBase {
+       internal ReceiveTlvs(object _dummy, long ptr) : base(ptr) { }
+       ~ReceiveTlvs() {
+               if (ptr != 0) { bindings.ReceiveTlvs_free(ptr); }
+       }
+
+       /**
+        * Used to authenticate the sender of a payment to the receiver and tie MPP HTLCs together.
+        */
+       public byte[] get_payment_secret() {
+               long ret = bindings.ReceiveTlvs_get_payment_secret(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Used to authenticate the sender of a payment to the receiver and tie MPP HTLCs together.
+        */
+       public void set_payment_secret(byte[] val) {
+               bindings.ReceiveTlvs_set_payment_secret(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constraints for the receiver of this payment.
+        */
+       public PaymentConstraints get_payment_constraints() {
+               long ret = bindings.ReceiveTlvs_get_payment_constraints(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PaymentConstraints ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PaymentConstraints(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Constraints for the receiver of this payment.
+        */
+       public void set_payment_constraints(org.ldk.structs.PaymentConstraints val) {
+               bindings.ReceiveTlvs_set_payment_constraints(this.ptr, val == null ? 0 : val.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
+       }
+
+       /**
+        * Constructs a new ReceiveTlvs given each field
+        */
+       public static ReceiveTlvs of(byte[] payment_secret_arg, org.ldk.structs.PaymentConstraints payment_constraints_arg) {
+               long ret = bindings.ReceiveTlvs_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_secret_arg, 32)), payment_constraints_arg == null ? 0 : payment_constraints_arg.ptr);
+               GC.KeepAlive(payment_secret_arg);
+               GC.KeepAlive(payment_constraints_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ReceiveTlvs ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ReceiveTlvs(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(payment_constraints_arg); };
+               return ret_hu_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.ReceiveTlvs_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the ReceiveTlvs
+        */
+       public ReceiveTlvs clone() {
+               long ret = bindings.ReceiveTlvs_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ReceiveTlvs ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ReceiveTlvs(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Serialize the ReceiveTlvs object into a byte array which can be read by ReceiveTlvs_read
+        */
+       public byte[] write() {
+               long ret = bindings.ReceiveTlvs_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               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 b52df11977560b41d22985c3fddec112b3ee2e8a..0a258bae374b852c6860b405d1d7b2814693affa 100644 (file)
@@ -18,16 +18,35 @@ public class RecentPaymentDetails : CommonBase {
        internal static RecentPaymentDetails constr_from_ptr(long ptr) {
                long raw_ty = bindings.LDKRecentPaymentDetails_ty_from_ptr(ptr);
                switch (raw_ty) {
-                       case 0: return new RecentPaymentDetails_Pending(ptr);
-                       case 1: return new RecentPaymentDetails_Fulfilled(ptr);
-                       case 2: return new RecentPaymentDetails_Abandoned(ptr);
+                       case 0: return new RecentPaymentDetails_AwaitingInvoice(ptr);
+                       case 1: return new RecentPaymentDetails_Pending(ptr);
+                       case 2: return new RecentPaymentDetails_Fulfilled(ptr);
+                       case 3: return new RecentPaymentDetails_Abandoned(ptr);
                        default:
                                throw new ArgumentException("Impossible enum variant");
                }
        }
 
+       /** A RecentPaymentDetails of type AwaitingInvoice */
+       public class RecentPaymentDetails_AwaitingInvoice : RecentPaymentDetails {
+               /**
+                * A user-provided identifier in [`ChannelManager::send_payment`] used to uniquely identify
+                * a payment and ensure idempotency in LDK.
+                */
+               public byte[] payment_id;
+               internal RecentPaymentDetails_AwaitingInvoice(long ptr) : base(null, ptr) {
+                       long payment_id = bindings.LDKRecentPaymentDetails_AwaitingInvoice_get_payment_id(ptr);
+                       byte[] payment_id_conv = InternalUtils.decodeUint8Array(payment_id);
+                       this.payment_id = payment_id_conv;
+               }
+       }
        /** A RecentPaymentDetails of type Pending */
        public class RecentPaymentDetails_Pending : RecentPaymentDetails {
+               /**
+                * A user-provided identifier in [`ChannelManager::send_payment`] used to uniquely identify
+                * a payment and ensure idempotency in LDK.
+                */
+               public byte[] payment_id;
                /**
                 * Hash of the payment that is currently being sent but has yet to be fulfilled or
                 * abandoned.
@@ -39,32 +58,55 @@ public class RecentPaymentDetails : CommonBase {
                 */
                public long total_msat;
                internal RecentPaymentDetails_Pending(long ptr) : base(null, ptr) {
-                       this.payment_hash = bindings.LDKRecentPaymentDetails_Pending_get_payment_hash(ptr);
+                       long payment_id = bindings.LDKRecentPaymentDetails_Pending_get_payment_id(ptr);
+                       byte[] payment_id_conv = InternalUtils.decodeUint8Array(payment_id);
+                       this.payment_id = payment_id_conv;
+                       long payment_hash = bindings.LDKRecentPaymentDetails_Pending_get_payment_hash(ptr);
+                       byte[] payment_hash_conv = InternalUtils.decodeUint8Array(payment_hash);
+                       this.payment_hash = payment_hash_conv;
                        this.total_msat = bindings.LDKRecentPaymentDetails_Pending_get_total_msat(ptr);
                }
        }
        /** A RecentPaymentDetails of type Fulfilled */
        public class RecentPaymentDetails_Fulfilled : RecentPaymentDetails {
+               /**
+                * A user-provided identifier in [`ChannelManager::send_payment`] used to uniquely identify
+                * a payment and ensure idempotency in LDK.
+                */
+               public byte[] payment_id;
                /**
                 * Hash of the payment that was claimed. `None` for serializations of [`ChannelManager`]
                 * made before LDK version 0.0.104.
                 */
-               public Option_PaymentHashZ payment_hash;
+               public Option_ThirtyTwoBytesZ payment_hash;
                internal RecentPaymentDetails_Fulfilled(long ptr) : base(null, ptr) {
+                       long payment_id = bindings.LDKRecentPaymentDetails_Fulfilled_get_payment_id(ptr);
+                       byte[] payment_id_conv = InternalUtils.decodeUint8Array(payment_id);
+                       this.payment_id = payment_id_conv;
                        long payment_hash = bindings.LDKRecentPaymentDetails_Fulfilled_get_payment_hash(ptr);
-                       org.ldk.structs.Option_PaymentHashZ payment_hash_hu_conv = org.ldk.structs.Option_PaymentHashZ.constr_from_ptr(payment_hash);
+                       org.ldk.structs.Option_ThirtyTwoBytesZ payment_hash_hu_conv = org.ldk.structs.Option_ThirtyTwoBytesZ.constr_from_ptr(payment_hash);
                        if (payment_hash_hu_conv != null) { payment_hash_hu_conv.ptrs_to.AddLast(this); };
                        this.payment_hash = payment_hash_hu_conv;
                }
        }
        /** A RecentPaymentDetails of type Abandoned */
        public class RecentPaymentDetails_Abandoned : RecentPaymentDetails {
+               /**
+                * A user-provided identifier in [`ChannelManager::send_payment`] used to uniquely identify
+                * a payment and ensure idempotency in LDK.
+                */
+               public byte[] payment_id;
                /**
                 * Hash of the payment that we have given up trying to send.
                 */
                public byte[] payment_hash;
                internal RecentPaymentDetails_Abandoned(long ptr) : base(null, ptr) {
-                       this.payment_hash = bindings.LDKRecentPaymentDetails_Abandoned_get_payment_hash(ptr);
+                       long payment_id = bindings.LDKRecentPaymentDetails_Abandoned_get_payment_id(ptr);
+                       byte[] payment_id_conv = InternalUtils.decodeUint8Array(payment_id);
+                       this.payment_id = payment_id_conv;
+                       long payment_hash = bindings.LDKRecentPaymentDetails_Abandoned_get_payment_hash(ptr);
+                       byte[] payment_hash_conv = InternalUtils.decodeUint8Array(payment_hash);
+                       this.payment_hash = payment_hash_conv;
                }
        }
        internal long clone_ptr() {
@@ -85,11 +127,24 @@ public class RecentPaymentDetails : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Utility method to constructs a new AwaitingInvoice-variant RecentPaymentDetails
+        */
+       public static RecentPaymentDetails awaiting_invoice(byte[] payment_id) {
+               long ret = bindings.RecentPaymentDetails_awaiting_invoice(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)));
+               GC.KeepAlive(payment_id);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.RecentPaymentDetails ret_hu_conv = org.ldk.structs.RecentPaymentDetails.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 Pending-variant RecentPaymentDetails
         */
-       public static RecentPaymentDetails pending(byte[] payment_hash, long total_msat) {
-               long ret = bindings.RecentPaymentDetails_pending(InternalUtils.check_arr_len(payment_hash, 32), total_msat);
+       public static RecentPaymentDetails pending(byte[] payment_id, byte[] payment_hash, long total_msat) {
+               long ret = bindings.RecentPaymentDetails_pending(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), total_msat);
+               GC.KeepAlive(payment_id);
                GC.KeepAlive(payment_hash);
                GC.KeepAlive(total_msat);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -101,8 +156,9 @@ public class RecentPaymentDetails : CommonBase {
        /**
         * Utility method to constructs a new Fulfilled-variant RecentPaymentDetails
         */
-       public static RecentPaymentDetails fulfilled(org.ldk.structs.Option_PaymentHashZ payment_hash) {
-               long ret = bindings.RecentPaymentDetails_fulfilled(payment_hash.ptr);
+       public static RecentPaymentDetails fulfilled(byte[] payment_id, org.ldk.structs.Option_ThirtyTwoBytesZ payment_hash) {
+               long ret = bindings.RecentPaymentDetails_fulfilled(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)), payment_hash.ptr);
+               GC.KeepAlive(payment_id);
                GC.KeepAlive(payment_hash);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.RecentPaymentDetails ret_hu_conv = org.ldk.structs.RecentPaymentDetails.constr_from_ptr(ret);
@@ -114,8 +170,9 @@ public class RecentPaymentDetails : CommonBase {
        /**
         * Utility method to constructs a new Abandoned-variant RecentPaymentDetails
         */
-       public static RecentPaymentDetails abandoned(byte[] payment_hash) {
-               long ret = bindings.RecentPaymentDetails_abandoned(InternalUtils.check_arr_len(payment_hash, 32));
+       public static RecentPaymentDetails abandoned(byte[] payment_id, byte[] payment_hash) {
+               long ret = bindings.RecentPaymentDetails_abandoned(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)));
+               GC.KeepAlive(payment_id);
                GC.KeepAlive(payment_hash);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.RecentPaymentDetails ret_hu_conv = org.ldk.structs.RecentPaymentDetails.constr_from_ptr(ret);
index 62b5ca60f92c49f9636fd153303ee17b71518bc7..219c29111561bc89b84cf4348ae7a47f62756b23 100644 (file)
@@ -31,11 +31,11 @@ public class RecipientOnionFields : CommonBase {
         * want to provide a secret for a spontaneous payment if MPP is needed and you know your
         * recipient will not reject it.
         */
-       public Option_PaymentSecretZ get_payment_secret() {
+       public Option_ThirtyTwoBytesZ get_payment_secret() {
                long ret = bindings.RecipientOnionFields_get_payment_secret(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_PaymentSecretZ ret_hu_conv = org.ldk.structs.Option_PaymentSecretZ.constr_from_ptr(ret);
+               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;
        }
@@ -53,7 +53,7 @@ public class RecipientOnionFields : CommonBase {
         * want to provide a secret for a spontaneous payment if MPP is needed and you know your
         * recipient will not reject it.
         */
-       public void set_payment_secret(org.ldk.structs.Option_PaymentSecretZ val) {
+       public void set_payment_secret(org.ldk.structs.Option_ThirtyTwoBytesZ val) {
                bindings.RecipientOnionFields_set_payment_secret(this.ptr, val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
@@ -106,21 +106,6 @@ public class RecipientOnionFields : CommonBase {
                if (this != null) { this.ptrs_to.AddLast(val); };
        }
 
-       /**
-        * Constructs a new RecipientOnionFields given each field
-        */
-       public static RecipientOnionFields of(org.ldk.structs.Option_PaymentSecretZ payment_secret_arg, org.ldk.structs.Option_CVec_u8ZZ payment_metadata_arg) {
-               long ret = bindings.RecipientOnionFields_new(payment_secret_arg.ptr, payment_metadata_arg.ptr);
-               GC.KeepAlive(payment_secret_arg);
-               GC.KeepAlive(payment_metadata_arg);
-               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(ret_hu_conv); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(payment_secret_arg); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(payment_metadata_arg); };
-               return ret_hu_conv;
-       }
-
        internal long clone_ptr() {
                long ret = bindings.RecipientOnionFields_clone_ptr(this.ptr);
                GC.KeepAlive(this);
@@ -160,16 +145,18 @@ public class RecipientOnionFields : CommonBase {
         * Serialize the RecipientOnionFields object into a byte array which can be read by RecipientOnionFields_read
         */
        public byte[] write() {
-               byte[] ret = bindings.RecipientOnionFields_write(this.ptr);
+               long ret = bindings.RecipientOnionFields_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a RecipientOnionFields from a byte array, created by RecipientOnionFields_write
         */
        public static Result_RecipientOnionFieldsDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.RecipientOnionFields_read(ser);
+               long ret = bindings.RecipientOnionFields_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_RecipientOnionFieldsDecodeErrorZ ret_hu_conv = Result_RecipientOnionFieldsDecodeErrorZ.constr_from_ptr(ret);
@@ -182,7 +169,7 @@ public class RecipientOnionFields : CommonBase {
         * but do not require or provide any further data.
         */
        public static RecipientOnionFields secret_only(byte[] payment_secret) {
-               long ret = bindings.RecipientOnionFields_secret_only(InternalUtils.check_arr_len(payment_secret, 32));
+               long ret = bindings.RecipientOnionFields_secret_only(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_secret, 32)));
                GC.KeepAlive(payment_secret);
                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); }
@@ -208,5 +195,54 @@ public class RecipientOnionFields : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Creates a new [`RecipientOnionFields`] from an existing one, adding custom TLVs. Each
+        * TLV is provided as a `(u64, Vec<u8>)` for the type number and serialized value
+        * respectively. TLV type numbers must be unique and within the range
+        * reserved for custom types, i.e. >= 2^16, otherwise this method will return `Err(())`.
+        * 
+        * This method will also error for types in the experimental range which have been
+        * standardized within the protocol, which only includes 5482373484 (keysend) for now.
+        * 
+        * See [`Self::custom_tlvs`] for more info.
+        */
+       public Result_RecipientOnionFieldsNoneZ with_custom_tlvs(TwoTuple_u64CVec_u8ZZ[] custom_tlvs) {
+               long ret = bindings.RecipientOnionFields_with_custom_tlvs(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(custom_tlvs, custom_tlvs_conv_23 => custom_tlvs_conv_23 != null ? custom_tlvs_conv_23.ptr : 0)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(custom_tlvs);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_RecipientOnionFieldsNoneZ ret_hu_conv = Result_RecipientOnionFieldsNoneZ.constr_from_ptr(ret);
+               if (this != null) { this.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Gets the custom TLVs that will be sent or have been received.
+        * 
+        * Custom TLVs allow sending extra application-specific data with a payment. They provide
+        * additional flexibility on top of payment metadata, as while other implementations may
+        * require `payment_metadata` to reflect metadata provided in an invoice, custom TLVs
+        * do not have this restriction.
+        * 
+        * Note that if this field is non-empty, it will contain strictly increasing TLVs, each
+        * represented by a `(u64, Vec<u8>)` for its type number and serialized value respectively.
+        * This is validated when setting this field using [`Self::with_custom_tlvs`].
+        */
+       public TwoTuple_u64CVec_u8ZZ[] custom_tlvs() {
+               long ret = bindings.RecipientOnionFields_custom_tlvs(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_23_len = InternalUtils.getArrayLength(ret);
+               TwoTuple_u64CVec_u8ZZ[] ret_conv_23_arr = new TwoTuple_u64CVec_u8ZZ[ret_conv_23_len];
+               for (int x = 0; x < ret_conv_23_len; x++) {
+                       long ret_conv_23 = InternalUtils.getU64ArrayElem(ret, x);
+                       TwoTuple_u64CVec_u8ZZ ret_conv_23_hu_conv = new TwoTuple_u64CVec_u8ZZ(null, ret_conv_23);
+                       if (ret_conv_23_hu_conv != null) { ret_conv_23_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_23_arr[x] = ret_conv_23_hu_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_23_arr;
+       }
+
 }
 } } }
index 560a6b5d62d1de2a399b911cb1785213185b1c41..54f0a5eb34d4bdb98ae6fa0d1e5c0b2ed2f7764a 100644 (file)
@@ -38,16 +38,18 @@ public class Record : CommonBase {
         * The message body.
         */
        public string get_args() {
-               string ret = bindings.Record_get_args(this.ptr);
+               long ret = bindings.Record_get_args(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
        }
 
        /**
         * The message body.
         */
        public void set_args(string val) {
-               bindings.Record_set_args(this.ptr, val);
+               bindings.Record_set_args(this.ptr, InternalUtils.encodeString(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -56,16 +58,18 @@ public class Record : CommonBase {
         * The module path of the message.
         */
        public string get_module_path() {
-               string ret = bindings.Record_get_module_path(this.ptr);
+               long ret = bindings.Record_get_module_path(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
        }
 
        /**
         * The module path of the message.
         */
        public void set_module_path(string val) {
-               bindings.Record_set_module_path(this.ptr, val);
+               bindings.Record_set_module_path(this.ptr, InternalUtils.encodeString(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -74,16 +78,18 @@ public class Record : CommonBase {
         * The source file containing the message.
         */
        public string get_file() {
-               string ret = bindings.Record_get_file(this.ptr);
+               long ret = bindings.Record_get_file(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
        }
 
        /**
         * The source file containing the message.
         */
        public void set_file(string val) {
-               bindings.Record_set_file(this.ptr, val);
+               bindings.Record_set_file(this.ptr, InternalUtils.encodeString(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
index 8ae3f582da7a877bb702f748434e6ca35f96367f..bff3dd94e54435cced27a238206b28d8ce2e3094 100644 (file)
@@ -58,11 +58,11 @@ public class Refund : CommonBase {
         * 
         * If `None`, the refund does not expire.
         */
-       public Option_DurationZ absolute_expiry() {
+       public Option_u64Z absolute_expiry() {
                long ret = bindings.Refund_absolute_expiry(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_DurationZ ret_hu_conv = org.ldk.structs.Option_DurationZ.constr_from_ptr(ret);
+               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;
        }
@@ -96,16 +96,18 @@ public class Refund : CommonBase {
         * privacy by obfuscating its node id.
         */
        public BlindedPath[] paths() {
-               long[] ret = bindings.Refund_paths(this.ptr);
+               long ret = bindings.Refund_paths(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_13_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_13_len = InternalUtils.getArrayLength(ret);
                BlindedPath[] ret_conv_13_arr = new BlindedPath[ret_conv_13_len];
                for (int n = 0; n < ret_conv_13_len; n++) {
-                       long ret_conv_13 = ret[n];
+                       long ret_conv_13 = InternalUtils.getU64ArrayElem(ret, n);
                        org.ldk.structs.BlindedPath ret_conv_13_hu_conv = null; if (ret_conv_13 < 0 || ret_conv_13 > 4096) { ret_conv_13_hu_conv = new org.ldk.structs.BlindedPath(null, ret_conv_13); }
                        if (ret_conv_13_hu_conv != null) { ret_conv_13_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_13_arr[n] = ret_conv_13_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_13_arr;
        }
 
@@ -115,19 +117,23 @@ public class Refund : CommonBase {
         * 
         * [`payer_id`]: Self::payer_id
         */
-       public byte[] metadata() {
-               byte[] ret = bindings.Refund_metadata(this.ptr);
+       public byte[] payer_metadata() {
+               long ret = bindings.Refund_payer_metadata(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * A chain that the refund is valid for.
         */
        public byte[] chain() {
-               byte[] ret = bindings.Refund_chain(this.ptr);
+               long ret = bindings.Refund_chain(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -172,9 +178,11 @@ public class Refund : CommonBase {
         * [`paths`]: Self::paths
         */
        public byte[] payer_id() {
-               byte[] ret = bindings.Refund_payer_id(this.ptr);
+               long ret = bindings.Refund_payer_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -195,16 +203,18 @@ public class Refund : CommonBase {
         * Serialize the Refund object into a byte array which can be read by Refund_read
         */
        public byte[] write() {
-               byte[] ret = bindings.Refund_write(this.ptr);
+               long ret = bindings.Refund_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a Refund object from a string
         */
        public static Result_RefundBolt12ParseErrorZ from_str(string s) {
-               long ret = bindings.Refund_from_str(s);
+               long ret = bindings.Refund_from_str(InternalUtils.encodeString(s));
                GC.KeepAlive(s);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_RefundBolt12ParseErrorZ ret_hu_conv = Result_RefundBolt12ParseErrorZ.constr_from_ptr(ret);
index dc2b90739b404f77972b90809fa9a78cc156a7c7..6b2ec479107bd7f589afa5e5fda9139b833ac764 100644 (file)
@@ -29,16 +29,18 @@ public class ReplyChannelRange : CommonBase {
         * The genesis hash of the blockchain being queried
         */
        public byte[] get_chain_hash() {
-               byte[] ret = bindings.ReplyChannelRange_get_chain_hash(this.ptr);
+               long ret = bindings.ReplyChannelRange_get_chain_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The genesis hash of the blockchain being queried
         */
        public void set_chain_hash(byte[] val) {
-               bindings.ReplyChannelRange_set_chain_hash(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.ReplyChannelRange_set_chain_hash(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -103,16 +105,18 @@ public class ReplyChannelRange : CommonBase {
         * Returns a copy of the field.
         */
        public long[] get_short_channel_ids() {
-               long[] ret = bindings.ReplyChannelRange_get_short_channel_ids(this.ptr);
+               long ret = bindings.ReplyChannelRange_get_short_channel_ids(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               long[] ret_conv = InternalUtils.decodeUint64Array(ret);
+               return ret_conv;
        }
 
        /**
         * The `short_channel_id`s in the channel range
         */
        public void set_short_channel_ids(long[] val) {
-               bindings.ReplyChannelRange_set_short_channel_ids(this.ptr, val);
+               bindings.ReplyChannelRange_set_short_channel_ids(this.ptr, InternalUtils.encodeUint64Array(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -121,7 +125,7 @@ public class ReplyChannelRange : CommonBase {
         * Constructs a new ReplyChannelRange given each field
         */
        public static ReplyChannelRange of(byte[] chain_hash_arg, int first_blocknum_arg, int number_of_blocks_arg, bool sync_complete_arg, long[] short_channel_ids_arg) {
-               long ret = bindings.ReplyChannelRange_new(InternalUtils.check_arr_len(chain_hash_arg, 32), first_blocknum_arg, number_of_blocks_arg, sync_complete_arg, short_channel_ids_arg);
+               long ret = bindings.ReplyChannelRange_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(chain_hash_arg, 32)), first_blocknum_arg, number_of_blocks_arg, sync_complete_arg, InternalUtils.encodeUint64Array(short_channel_ids_arg));
                GC.KeepAlive(chain_hash_arg);
                GC.KeepAlive(first_blocknum_arg);
                GC.KeepAlive(number_of_blocks_arg);
@@ -172,7 +176,7 @@ public class ReplyChannelRange : CommonBase {
         * Read a ReplyChannelRange from a byte array, created by ReplyChannelRange_write
         */
        public static Result_ReplyChannelRangeDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ReplyChannelRange_read(ser);
+               long ret = bindings.ReplyChannelRange_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ReplyChannelRangeDecodeErrorZ ret_hu_conv = Result_ReplyChannelRangeDecodeErrorZ.constr_from_ptr(ret);
@@ -183,9 +187,11 @@ public class ReplyChannelRange : CommonBase {
         * Serialize the ReplyChannelRange object into a byte array which can be read by ReplyChannelRange_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ReplyChannelRange_write(this.ptr);
+               long ret = bindings.ReplyChannelRange_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index 4fb74ed589fcb8721f11d2f624e3dee10fdbc8b1..2f7643136800d8e17e2247ed87396c0f927001a7 100644 (file)
@@ -24,16 +24,18 @@ public class ReplyShortChannelIdsEnd : CommonBase {
         * The genesis hash of the blockchain that was queried
         */
        public byte[] get_chain_hash() {
-               byte[] ret = bindings.ReplyShortChannelIdsEnd_get_chain_hash(this.ptr);
+               long ret = bindings.ReplyShortChannelIdsEnd_get_chain_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The genesis hash of the blockchain that was queried
         */
        public void set_chain_hash(byte[] val) {
-               bindings.ReplyShortChannelIdsEnd_set_chain_hash(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.ReplyShortChannelIdsEnd_set_chain_hash(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -62,7 +64,7 @@ public class ReplyShortChannelIdsEnd : CommonBase {
         * Constructs a new ReplyShortChannelIdsEnd given each field
         */
        public static ReplyShortChannelIdsEnd of(byte[] chain_hash_arg, bool full_information_arg) {
-               long ret = bindings.ReplyShortChannelIdsEnd_new(InternalUtils.check_arr_len(chain_hash_arg, 32), full_information_arg);
+               long ret = bindings.ReplyShortChannelIdsEnd_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(chain_hash_arg, 32)), full_information_arg);
                GC.KeepAlive(chain_hash_arg);
                GC.KeepAlive(full_information_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -110,16 +112,18 @@ public class ReplyShortChannelIdsEnd : CommonBase {
         * Serialize the ReplyShortChannelIdsEnd object into a byte array which can be read by ReplyShortChannelIdsEnd_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ReplyShortChannelIdsEnd_write(this.ptr);
+               long ret = bindings.ReplyShortChannelIdsEnd_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ReplyShortChannelIdsEnd from a byte array, created by ReplyShortChannelIdsEnd_write
         */
        public static Result_ReplyShortChannelIdsEndDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ReplyShortChannelIdsEnd_read(ser);
+               long ret = bindings.ReplyShortChannelIdsEnd_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ReplyShortChannelIdsEndDecodeErrorZ ret_hu_conv = Result_ReplyShortChannelIdsEndDecodeErrorZ.constr_from_ptr(ret);
diff --git a/c_sharp/src/org/ldk/structs/Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ.cs
new file mode 100644 (file)
index 0000000..0596342
--- /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_BlindedPayInfoBlindedPathZNoneZ : CommonBase {
+       Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ() {
+               if (ptr != 0) { bindings.CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_free(ptr); }
+       }
+
+       internal static Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_is_ok(ptr)) {
+                       return new Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_OK : Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ {
+               public readonly TwoTuple_BlindedPayInfoBlindedPathZ res;
+               internal Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_ok(ptr);
+                       TwoTuple_BlindedPayInfoBlindedPathZ res_hu_conv = new TwoTuple_BlindedPayInfoBlindedPathZ(null, res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_Err : Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ {
+               internal Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ in the success state.
+        */
+       public static Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ ok(org.ldk.structs.TwoTuple_BlindedPayInfoBlindedPathZ o) {
+               long ret = bindings.CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_ok(o != null ? o.ptr : 0);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ ret_hu_conv = Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ in the error state.
+        */
+       public static Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ err() {
+               long ret = bindings.CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ ret_hu_conv = Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ.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_BlindedPayInfoBlindedPathZNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ clone() {
+               long ret = bindings.CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ ret_hu_conv = Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ.cs
deleted file mode 100644 (file)
index 117c2c3..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_BlockHashChannelManagerZDecodeErrorZ : CommonBase {
-       Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ() {
-               if (ptr != 0) { bindings.CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_free(ptr); }
-       }
-
-       internal static Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_is_ok(ptr)) {
-                       return new Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_OK : Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ {
-               public readonly TwoTuple_BlockHashChannelManagerZ res;
-               internal Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long res = bindings.CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_get_ok(ptr);
-                       TwoTuple_BlockHashChannelManagerZ res_hu_conv = new TwoTuple_BlockHashChannelManagerZ(null, res);
-                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
-                       this.res = res_hu_conv;
-               }
-       }
-
-       public class Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_Err : Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ {
-               public readonly DecodeError err;
-               internal Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long err = bindings.CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_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_C2Tuple_BlockHashChannelManagerZDecodeErrorZ in the success state.
-        */
-       public static Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ ok(org.ldk.structs.TwoTuple_BlockHashChannelManagerZ o) {
-               long ret = bindings.CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_ok(o != null ? o.ptr : 0);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ ret_hu_conv = Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ in the error state.
-        */
-       public static Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ err(org.ldk.structs.DecodeError e) {
-               long ret = bindings.CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_err(e.ptr);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ ret_hu_conv = Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ.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_BlockHashChannelManagerZDecodeErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.cs
deleted file mode 100644 (file)
index e18c9fc..0000000
+++ /dev/null
@@ -1,92 +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_BlockHashChannelMonitorZDecodeErrorZ : CommonBase {
-       Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ() {
-               if (ptr != 0) { bindings.CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_free(ptr); }
-       }
-
-       internal static Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_is_ok(ptr)) {
-                       return new Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_OK : Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ {
-               public readonly TwoTuple_BlockHashChannelMonitorZ res;
-               internal Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long res = bindings.CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_get_ok(ptr);
-                       TwoTuple_BlockHashChannelMonitorZ res_hu_conv = new TwoTuple_BlockHashChannelMonitorZ(null, res);
-                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
-                       this.res = res_hu_conv;
-               }
-       }
-
-       public class Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_Err : Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ {
-               public readonly DecodeError err;
-               internal Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long err = bindings.CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_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_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ in the success state.
-        */
-       public static Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ ok(org.ldk.structs.TwoTuple_BlockHashChannelMonitorZ o) {
-               long ret = bindings.CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_ok(o != null ? o.ptr : 0);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ ret_hu_conv = Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ in the error state.
-        */
-       public static Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ err(org.ldk.structs.DecodeError e) {
-               long ret = bindings.CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_err(e.ptr);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ ret_hu_conv = Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.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_BlockHashChannelMonitorZDecodeErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ clone() {
-               long ret = bindings.CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ ret_hu_conv = Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.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
new file mode 100644 (file)
index 0000000..e6cd368
--- /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_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_ECDSASignatureCVec_ECDSASignatureZZNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ.cs
new file mode 100644 (file)
index 0000000..495b5fb
--- /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_ECDSASignatureCVec_ECDSASignatureZZNoneZ : CommonBase {
+       Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ() {
+               if (ptr != 0) { bindings.CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_free(ptr); }
+       }
+
+       internal static Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_is_ok(ptr)) {
+                       return new Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_OK : Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ {
+               public readonly TwoTuple_ECDSASignatureCVec_ECDSASignatureZZ res;
+               internal Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(ptr);
+                       TwoTuple_ECDSASignatureCVec_ECDSASignatureZZ res_hu_conv = new TwoTuple_ECDSASignatureCVec_ECDSASignatureZZ(null, res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_Err : Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ {
+               internal Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ in the success state.
+        */
+       public static Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ ok(org.ldk.structs.TwoTuple_ECDSASignatureCVec_ECDSASignatureZZ o) {
+               long ret = bindings.CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_ok(o != null ? o.ptr : 0);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ ret_hu_conv = Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ in the error state.
+        */
+       public static Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ err() {
+               long ret = bindings.CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ ret_hu_conv = Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ.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_ECDSASignatureCVec_ECDSASignatureZZNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ clone() {
+               long ret = bindings.CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ ret_hu_conv = Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ.cs
deleted file mode 100644 (file)
index 9a327b4..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_PartiallySignedTransactionusizeZNoneZ : CommonBase {
-       Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ() {
-               if (ptr != 0) { bindings.CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_free(ptr); }
-       }
-
-       internal static Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_is_ok(ptr)) {
-                       return new Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ_OK(null, ptr);
-               } else {
-                       return new Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ_Err(null, ptr);
-               }
-       }
-       public class Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ_OK : Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ {
-               public readonly TwoTuple_PartiallySignedTransactionusizeZ res;
-               internal Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long res = bindings.CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_get_ok(ptr);
-                       TwoTuple_PartiallySignedTransactionusizeZ res_hu_conv = new TwoTuple_PartiallySignedTransactionusizeZ(null, res);
-                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
-                       this.res = res_hu_conv;
-               }
-       }
-
-       public class Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ_Err : Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ {
-               internal Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-               }
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ in the success state.
-        */
-       public static Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ ok(org.ldk.structs.TwoTuple_PartiallySignedTransactionusizeZ o) {
-               long ret = bindings.CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_ok(o != null ? o.ptr : 0);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ ret_hu_conv = Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ in the error state.
-        */
-       public static Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ err() {
-               long ret = bindings.CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_err();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ ret_hu_conv = Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ.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_PartiallySignedTransactionusizeZNoneZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ clone() {
-               long ret = bindings.CResult_C2Tuple_PartiallySignedTransactionusizeZNoneZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ ret_hu_conv = Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ.cs b/c_sharp/src/org/ldk/structs/Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ.cs
deleted file mode 100644 (file)
index 4a3f2da..0000000
+++ /dev/null
@@ -1,92 +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_PaymentHashPaymentIdZPaymentSendFailureZ : CommonBase {
-       Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ() {
-               if (ptr != 0) { bindings.CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_free(ptr); }
-       }
-
-       internal static Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_is_ok(ptr)) {
-                       return new Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_OK(null, ptr);
-               } else {
-                       return new Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_Err(null, ptr);
-               }
-       }
-       public class Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_OK : Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ {
-               public readonly TwoTuple_PaymentHashPaymentIdZ res;
-               internal Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long res = bindings.CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_get_ok(ptr);
-                       TwoTuple_PaymentHashPaymentIdZ res_hu_conv = new TwoTuple_PaymentHashPaymentIdZ(null, res);
-                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
-                       this.res = res_hu_conv;
-               }
-       }
-
-       public class Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_Err : Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ {
-               public readonly PaymentSendFailure err;
-               internal Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long err = bindings.CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_get_err(ptr);
-                       org.ldk.structs.PaymentSendFailure err_hu_conv = org.ldk.structs.PaymentSendFailure.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_PaymentHashPaymentIdZPaymentSendFailureZ in the success state.
-        */
-       public static Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ ok(org.ldk.structs.TwoTuple_PaymentHashPaymentIdZ o) {
-               long ret = bindings.CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_ok(o != null ? o.ptr : 0);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ ret_hu_conv = Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ in the error state.
-        */
-       public static Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ err(org.ldk.structs.PaymentSendFailure e) {
-               long ret = bindings.CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_err(e.ptr);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ ret_hu_conv = Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ.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_PaymentHashPaymentIdZPaymentSendFailureZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ clone() {
-               long ret = bindings.CResult_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ ret_hu_conv = Result_C2Tuple_PaymentHashPaymentIdZPaymentSendFailureZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_C2Tuple_PaymentHashPaymentSecretZNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_C2Tuple_PaymentHashPaymentSecretZNoneZ.cs
deleted file mode 100644 (file)
index d939836..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_PaymentHashPaymentSecretZNoneZ : CommonBase {
-       Result_C2Tuple_PaymentHashPaymentSecretZNoneZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_C2Tuple_PaymentHashPaymentSecretZNoneZ() {
-               if (ptr != 0) { bindings.CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_free(ptr); }
-       }
-
-       internal static Result_C2Tuple_PaymentHashPaymentSecretZNoneZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_is_ok(ptr)) {
-                       return new Result_C2Tuple_PaymentHashPaymentSecretZNoneZ_OK(null, ptr);
-               } else {
-                       return new Result_C2Tuple_PaymentHashPaymentSecretZNoneZ_Err(null, ptr);
-               }
-       }
-       public class Result_C2Tuple_PaymentHashPaymentSecretZNoneZ_OK : Result_C2Tuple_PaymentHashPaymentSecretZNoneZ {
-               public readonly TwoTuple_PaymentHashPaymentSecretZ res;
-               internal Result_C2Tuple_PaymentHashPaymentSecretZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long res = bindings.CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_get_ok(ptr);
-                       TwoTuple_PaymentHashPaymentSecretZ res_hu_conv = new TwoTuple_PaymentHashPaymentSecretZ(null, res);
-                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
-                       this.res = res_hu_conv;
-               }
-       }
-
-       public class Result_C2Tuple_PaymentHashPaymentSecretZNoneZ_Err : Result_C2Tuple_PaymentHashPaymentSecretZNoneZ {
-               internal Result_C2Tuple_PaymentHashPaymentSecretZNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-               }
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ in the success state.
-        */
-       public static Result_C2Tuple_PaymentHashPaymentSecretZNoneZ ok(org.ldk.structs.TwoTuple_PaymentHashPaymentSecretZ o) {
-               long ret = bindings.CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_ok(o != null ? o.ptr : 0);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_PaymentHashPaymentSecretZNoneZ ret_hu_conv = Result_C2Tuple_PaymentHashPaymentSecretZNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ in the error state.
-        */
-       public static Result_C2Tuple_PaymentHashPaymentSecretZNoneZ err() {
-               long ret = bindings.CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_err();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_PaymentHashPaymentSecretZNoneZ ret_hu_conv = Result_C2Tuple_PaymentHashPaymentSecretZNoneZ.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_PaymentHashPaymentSecretZNoneZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_C2Tuple_PaymentHashPaymentSecretZNoneZ clone() {
-               long ret = bindings.CResult_C2Tuple_PaymentHashPaymentSecretZNoneZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_PaymentHashPaymentSecretZNoneZ ret_hu_conv = Result_C2Tuple_PaymentHashPaymentSecretZNoneZ.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
new file mode 100644 (file)
index 0000000..69fc62f
--- /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_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_C2Tuple_SignatureCVec_SignatureZZNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_C2Tuple_SignatureCVec_SignatureZZNoneZ.cs
deleted file mode 100644 (file)
index b36ca94..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_SignatureCVec_SignatureZZNoneZ : CommonBase {
-       Result_C2Tuple_SignatureCVec_SignatureZZNoneZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_C2Tuple_SignatureCVec_SignatureZZNoneZ() {
-               if (ptr != 0) { bindings.CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_free(ptr); }
-       }
-
-       internal static Result_C2Tuple_SignatureCVec_SignatureZZNoneZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_is_ok(ptr)) {
-                       return new Result_C2Tuple_SignatureCVec_SignatureZZNoneZ_OK(null, ptr);
-               } else {
-                       return new Result_C2Tuple_SignatureCVec_SignatureZZNoneZ_Err(null, ptr);
-               }
-       }
-       public class Result_C2Tuple_SignatureCVec_SignatureZZNoneZ_OK : Result_C2Tuple_SignatureCVec_SignatureZZNoneZ {
-               public readonly TwoTuple_SignatureCVec_SignatureZZ res;
-               internal Result_C2Tuple_SignatureCVec_SignatureZZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long res = bindings.CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_get_ok(ptr);
-                       TwoTuple_SignatureCVec_SignatureZZ res_hu_conv = new TwoTuple_SignatureCVec_SignatureZZ(null, res);
-                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
-                       this.res = res_hu_conv;
-               }
-       }
-
-       public class Result_C2Tuple_SignatureCVec_SignatureZZNoneZ_Err : Result_C2Tuple_SignatureCVec_SignatureZZNoneZ {
-               internal Result_C2Tuple_SignatureCVec_SignatureZZNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-               }
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ in the success state.
-        */
-       public static Result_C2Tuple_SignatureCVec_SignatureZZNoneZ ok(org.ldk.structs.TwoTuple_SignatureCVec_SignatureZZ o) {
-               long ret = bindings.CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_ok(o != null ? o.ptr : 0);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_SignatureCVec_SignatureZZNoneZ ret_hu_conv = Result_C2Tuple_SignatureCVec_SignatureZZNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ in the error state.
-        */
-       public static Result_C2Tuple_SignatureCVec_SignatureZZNoneZ err() {
-               long ret = bindings.CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_err();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_SignatureCVec_SignatureZZNoneZ ret_hu_conv = Result_C2Tuple_SignatureCVec_SignatureZZNoneZ.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_SignatureCVec_SignatureZZNoneZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_C2Tuple_SignatureCVec_SignatureZZNoneZ clone() {
-               long ret = bindings.CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_SignatureCVec_SignatureZZNoneZ ret_hu_conv = Result_C2Tuple_SignatureCVec_SignatureZZNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..02c6859
--- /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_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ : CommonBase {
+       Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_OK : Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ {
+               public readonly TwoTuple_ThirtyTwoBytesChannelManagerZ res;
+               internal Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_get_ok(ptr);
+                       TwoTuple_ThirtyTwoBytesChannelManagerZ res_hu_conv = new TwoTuple_ThirtyTwoBytesChannelManagerZ(null, res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_Err : Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_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_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ in the success state.
+        */
+       public static Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ ok(org.ldk.structs.TwoTuple_ThirtyTwoBytesChannelManagerZ o) {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_ok(o != null ? o.ptr : 0);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ in the error state.
+        */
+       public static Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ.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_ThirtyTwoBytesChannelManagerZDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..618c7eb
--- /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_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ : CommonBase {
+       Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_OK : Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ {
+               public readonly TwoTuple_ThirtyTwoBytesChannelMonitorZ res;
+               internal Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_get_ok(ptr);
+                       TwoTuple_ThirtyTwoBytesChannelMonitorZ res_hu_conv = new TwoTuple_ThirtyTwoBytesChannelMonitorZ(null, res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_Err : Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_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_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ in the success state.
+        */
+       public static Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ ok(org.ldk.structs.TwoTuple_ThirtyTwoBytesChannelMonitorZ o) {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_ok(o != null ? o.ptr : 0);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ in the error state.
+        */
+       public static Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ.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_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ clone() {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ.cs
new file mode 100644 (file)
index 0000000..ebf7da4
--- /dev/null
@@ -0,0 +1,88 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ : CommonBase {
+       Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ() {
+               if (ptr != 0) { bindings.CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_free(ptr); }
+       }
+
+       internal static Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_is_ok(ptr)) {
+                       return new Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_OK : Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ {
+               public readonly TwoTuple_ThirtyTwoBytesChannelMonitorZ res;
+               internal Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_ok(ptr);
+                       TwoTuple_ThirtyTwoBytesChannelMonitorZ res_hu_conv = new TwoTuple_ThirtyTwoBytesChannelMonitorZ(null, res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_Err : Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ {
+               public readonly IOError err;
+               internal Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       this.err = bindings.CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_get_err(ptr);
+               }
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ in the success state.
+        */
+       public static Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ ok(org.ldk.structs.TwoTuple_ThirtyTwoBytesChannelMonitorZ o) {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_ok(o != null ? o.ptr : 0);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ in the error state.
+        */
+       public static Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ err(IOError e) {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_err(e);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ.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_ThirtyTwoBytesChannelMonitorZIOErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ clone() {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesChannelMonitorZIOErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ.cs
new file mode 100644 (file)
index 0000000..4d16bf4
--- /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_ThirtyTwoBytesThirtyTwoBytesZNoneZ : CommonBase {
+       Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ() {
+               if (ptr != 0) { bindings.CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_free(ptr); }
+       }
+
+       internal static Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_is_ok(ptr)) {
+                       return new Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_OK : Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ {
+               public readonly TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ res;
+               internal Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_get_ok(ptr);
+                       TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ res_hu_conv = new TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ(null, res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_Err : Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ {
+               internal Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ in the success state.
+        */
+       public static Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ ok(org.ldk.structs.TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ o) {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_ok(o != null ? o.ptr : 0);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ in the error state.
+        */
+       public static Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ err() {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ.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_ThirtyTwoBytesThirtyTwoBytesZNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ clone() {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ.cs b/c_sharp/src/org/ldk/structs/Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ.cs
new file mode 100644 (file)
index 0000000..d929e30
--- /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_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ : CommonBase {
+       Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ() {
+               if (ptr != 0) { bindings.CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_free(ptr); }
+       }
+
+       internal static Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_is_ok(ptr)) {
+                       return new Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_OK(null, ptr);
+               } else {
+                       return new Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_Err(null, ptr);
+               }
+       }
+       public class Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_OK : Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ {
+               public readonly TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ res;
+               internal Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_ok(ptr);
+                       TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ res_hu_conv = new TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ(null, res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_Err : Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ {
+               public readonly PaymentSendFailure err;
+               internal Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_get_err(ptr);
+                       org.ldk.structs.PaymentSendFailure err_hu_conv = org.ldk.structs.PaymentSendFailure.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_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ in the success state.
+        */
+       public static Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ ok(org.ldk.structs.TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ o) {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_ok(o != null ? o.ptr : 0);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ in the error state.
+        */
+       public static Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ err(org.ldk.structs.PaymentSendFailure e) {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ.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_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ clone() {
+               long ret = bindings.CResult_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZPaymentSendFailureZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_COption_CustomOnionMessageContentsZDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_COption_CustomOnionMessageContentsZDecodeErrorZ.cs
deleted file mode 100644 (file)
index c78bc7c..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_COption_CustomOnionMessageContentsZDecodeErrorZ : CommonBase {
-       Result_COption_CustomOnionMessageContentsZDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_COption_CustomOnionMessageContentsZDecodeErrorZ() {
-               if (ptr != 0) { bindings.CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_free(ptr); }
-       }
-
-       internal static Result_COption_CustomOnionMessageContentsZDecodeErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_is_ok(ptr)) {
-                       return new Result_COption_CustomOnionMessageContentsZDecodeErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_COption_CustomOnionMessageContentsZDecodeErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_COption_CustomOnionMessageContentsZDecodeErrorZ_OK : Result_COption_CustomOnionMessageContentsZDecodeErrorZ {
-               public readonly Option_CustomOnionMessageContentsZ res;
-               internal Result_COption_CustomOnionMessageContentsZDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long res = bindings.CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_get_ok(ptr);
-                       org.ldk.structs.Option_CustomOnionMessageContentsZ res_hu_conv = org.ldk.structs.Option_CustomOnionMessageContentsZ.constr_from_ptr(res);
-                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
-                       this.res = res_hu_conv;
-               }
-       }
-
-       public class Result_COption_CustomOnionMessageContentsZDecodeErrorZ_Err : Result_COption_CustomOnionMessageContentsZDecodeErrorZ {
-               public readonly DecodeError err;
-               internal Result_COption_CustomOnionMessageContentsZDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long err = bindings.CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_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_COption_CustomOnionMessageContentsZDecodeErrorZ in the success state.
-        */
-       public static Result_COption_CustomOnionMessageContentsZDecodeErrorZ ok(org.ldk.structs.Option_CustomOnionMessageContentsZ o) {
-               long ret = bindings.CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_ok(o.ptr);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_COption_CustomOnionMessageContentsZDecodeErrorZ ret_hu_conv = Result_COption_CustomOnionMessageContentsZDecodeErrorZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_COption_CustomOnionMessageContentsZDecodeErrorZ in the error state.
-        */
-       public static Result_COption_CustomOnionMessageContentsZDecodeErrorZ err(org.ldk.structs.DecodeError e) {
-               long ret = bindings.CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_err(e.ptr);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_COption_CustomOnionMessageContentsZDecodeErrorZ ret_hu_conv = Result_COption_CustomOnionMessageContentsZDecodeErrorZ.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_COption_CustomOnionMessageContentsZDecodeErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_COption_CustomOnionMessageContentsZDecodeErrorZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_COption_CustomOnionMessageContentsZDecodeErrorZ clone() {
-               long ret = bindings.CResult_COption_CustomOnionMessageContentsZDecodeErrorZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_COption_CustomOnionMessageContentsZDecodeErrorZ ret_hu_conv = Result_COption_CustomOnionMessageContentsZDecodeErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_COption_KeyPairZNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_COption_KeyPairZNoneZ.cs
deleted file mode 100644 (file)
index 32a3480..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_COption_KeyPairZNoneZ : CommonBase {
-       Result_COption_KeyPairZNoneZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_COption_KeyPairZNoneZ() {
-               if (ptr != 0) { bindings.CResult_COption_KeyPairZNoneZ_free(ptr); }
-       }
-
-       internal static Result_COption_KeyPairZNoneZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_COption_KeyPairZNoneZ_is_ok(ptr)) {
-                       return new Result_COption_KeyPairZNoneZ_OK(null, ptr);
-               } else {
-                       return new Result_COption_KeyPairZNoneZ_Err(null, ptr);
-               }
-       }
-       public class Result_COption_KeyPairZNoneZ_OK : Result_COption_KeyPairZNoneZ {
-               public readonly Option_KeyPairZ res;
-               internal Result_COption_KeyPairZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long res = bindings.CResult_COption_KeyPairZNoneZ_get_ok(ptr);
-                       org.ldk.structs.Option_KeyPairZ res_hu_conv = org.ldk.structs.Option_KeyPairZ.constr_from_ptr(res);
-                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
-                       this.res = res_hu_conv;
-               }
-       }
-
-       public class Result_COption_KeyPairZNoneZ_Err : Result_COption_KeyPairZNoneZ {
-               internal Result_COption_KeyPairZNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-               }
-       }
-
-       /**
-        * Creates a new CResult_COption_KeyPairZNoneZ in the success state.
-        */
-       public static Result_COption_KeyPairZNoneZ ok(org.ldk.structs.Option_KeyPairZ o) {
-               long ret = bindings.CResult_COption_KeyPairZNoneZ_ok(o.ptr);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_COption_KeyPairZNoneZ ret_hu_conv = Result_COption_KeyPairZNoneZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_COption_KeyPairZNoneZ in the error state.
-        */
-       public static Result_COption_KeyPairZNoneZ err() {
-               long ret = bindings.CResult_COption_KeyPairZNoneZ_err();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_COption_KeyPairZNoneZ ret_hu_conv = Result_COption_KeyPairZNoneZ.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_COption_KeyPairZNoneZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_COption_KeyPairZNoneZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_COption_KeyPairZNoneZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_COption_KeyPairZNoneZ clone() {
-               long ret = bindings.CResult_COption_KeyPairZNoneZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_COption_KeyPairZNoneZ ret_hu_conv = Result_COption_KeyPairZNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_COption_OnionMessageContentsZDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_COption_OnionMessageContentsZDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..a71c821
--- /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_COption_OnionMessageContentsZDecodeErrorZ : CommonBase {
+       Result_COption_OnionMessageContentsZDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_COption_OnionMessageContentsZDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_COption_OnionMessageContentsZDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_COption_OnionMessageContentsZDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_COption_OnionMessageContentsZDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_COption_OnionMessageContentsZDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_COption_OnionMessageContentsZDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_COption_OnionMessageContentsZDecodeErrorZ_OK : Result_COption_OnionMessageContentsZDecodeErrorZ {
+               public readonly Option_OnionMessageContentsZ res;
+               internal Result_COption_OnionMessageContentsZDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_COption_OnionMessageContentsZDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.Option_OnionMessageContentsZ res_hu_conv = org.ldk.structs.Option_OnionMessageContentsZ.constr_from_ptr(res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_COption_OnionMessageContentsZDecodeErrorZ_Err : Result_COption_OnionMessageContentsZDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_COption_OnionMessageContentsZDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_COption_OnionMessageContentsZDecodeErrorZ_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_COption_OnionMessageContentsZDecodeErrorZ in the success state.
+        */
+       public static Result_COption_OnionMessageContentsZDecodeErrorZ ok(org.ldk.structs.Option_OnionMessageContentsZ o) {
+               long ret = bindings.CResult_COption_OnionMessageContentsZDecodeErrorZ_ok(o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_COption_OnionMessageContentsZDecodeErrorZ ret_hu_conv = Result_COption_OnionMessageContentsZDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_COption_OnionMessageContentsZDecodeErrorZ in the error state.
+        */
+       public static Result_COption_OnionMessageContentsZDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_COption_OnionMessageContentsZDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_COption_OnionMessageContentsZDecodeErrorZ ret_hu_conv = Result_COption_OnionMessageContentsZDecodeErrorZ.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_COption_OnionMessageContentsZDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_COption_OnionMessageContentsZDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_COption_OnionMessageContentsZDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_COption_OnionMessageContentsZDecodeErrorZ clone() {
+               long ret = bindings.CResult_COption_OnionMessageContentsZDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_COption_OnionMessageContentsZDecodeErrorZ ret_hu_conv = Result_COption_OnionMessageContentsZDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ.cs
deleted file mode 100644 (file)
index dd2c583..0000000
+++ /dev/null
@@ -1,94 +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_BlockHashChannelMonitorZZErrorZ : CommonBase {
-       Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ() {
-               if (ptr != 0) { bindings.CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_free(ptr); }
-       }
-
-       internal static Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_is_ok(ptr)) {
-                       return new Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_OK : Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ {
-               public readonly TwoTuple_BlockHashChannelMonitorZ[] res;
-               internal Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long[] res = bindings.CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_get_ok(ptr);
-                       int res_conv_35_len = res.Length;
-                       TwoTuple_BlockHashChannelMonitorZ[] res_conv_35_arr = new TwoTuple_BlockHashChannelMonitorZ[res_conv_35_len];
-                       for (int j = 0; j < res_conv_35_len; j++) {
-                               long res_conv_35 = res[j];
-                               TwoTuple_BlockHashChannelMonitorZ res_conv_35_hu_conv = new TwoTuple_BlockHashChannelMonitorZ(null, res_conv_35);
-                               if (res_conv_35_hu_conv != null) { res_conv_35_hu_conv.ptrs_to.AddLast(this); };
-                               res_conv_35_arr[j] = res_conv_35_hu_conv;
-                       }
-                       this.res = res_conv_35_arr;
-               }
-       }
-
-       public class Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_Err : Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ {
-               public readonly IOError err;
-               internal Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.err = bindings.CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_get_err(ptr);
-               }
-       }
-
-       /**
-        * Creates a new CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ in the success state.
-        */
-       public static Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ ok(TwoTuple_BlockHashChannelMonitorZ[] o) {
-               long ret = bindings.CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_ok(o != null ? InternalUtils.mapArray(o, o_conv_35 => o_conv_35 != null ? o_conv_35.ptr : 0) : null);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ ret_hu_conv = Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ in the error state.
-        */
-       public static Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ err(IOError e) {
-               long ret = bindings.CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_err(e);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ ret_hu_conv = Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ.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_BlockHashChannelMonitorZZErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ clone() {
-               long ret = bindings.CResult_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ ret_hu_conv = Result_CVec_C2Tuple_BlockHashChannelMonitorZZErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ.cs
new file mode 100644 (file)
index 0000000..c7f7aa2
--- /dev/null
@@ -0,0 +1,95 @@
+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_ThirtyTwoBytesChannelMonitorZZIOErrorZ : CommonBase {
+       Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ() {
+               if (ptr != 0) { bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_free(ptr); }
+       }
+
+       internal static Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_is_ok(ptr)) {
+                       return new Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_OK : Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ {
+               public readonly TwoTuple_ThirtyTwoBytesChannelMonitorZ[] res;
+               internal Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_ok(ptr);
+                       int res_conv_40_len = InternalUtils.getArrayLength(res);
+                       TwoTuple_ThirtyTwoBytesChannelMonitorZ[] res_conv_40_arr = new TwoTuple_ThirtyTwoBytesChannelMonitorZ[res_conv_40_len];
+                       for (int o = 0; o < res_conv_40_len; o++) {
+                               long res_conv_40 = InternalUtils.getU64ArrayElem(res, o);
+                               TwoTuple_ThirtyTwoBytesChannelMonitorZ res_conv_40_hu_conv = new TwoTuple_ThirtyTwoBytesChannelMonitorZ(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_ThirtyTwoBytesChannelMonitorZZIOErrorZ_Err : Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ {
+               public readonly IOError err;
+               internal Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       this.err = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_get_err(ptr);
+               }
+       }
+
+       /**
+        * Creates a new CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ in the success state.
+        */
+       public static Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ ok(TwoTuple_ThirtyTwoBytesChannelMonitorZ[] o) {
+               long ret = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_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_ThirtyTwoBytesChannelMonitorZZIOErrorZ ret_hu_conv = Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ in the error state.
+        */
+       public static Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ err(IOError e) {
+               long ret = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_err(e);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ ret_hu_conv = Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ.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_ThirtyTwoBytesChannelMonitorZZIOErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ clone() {
+               long ret = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ ret_hu_conv = Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ.cs b/c_sharp/src/org/ldk/structs/Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ.cs
new file mode 100644 (file)
index 0000000..666af7e
--- /dev/null
@@ -0,0 +1,99 @@
+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_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ : CommonBase {
+       Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ() {
+               if (ptr != 0) { bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_free(ptr); }
+       }
+
+       internal static Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_is_ok(ptr)) {
+                       return new Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_OK(null, ptr);
+               } else {
+                       return new Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_Err(null, ptr);
+               }
+       }
+       public class Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_OK : Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ {
+               public readonly TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ[] res;
+               internal Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_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_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_Err : Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ {
+               public readonly ProbeSendFailure err;
+               internal Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_get_err(ptr);
+                       org.ldk.structs.ProbeSendFailure err_hu_conv = org.ldk.structs.ProbeSendFailure.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_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ in the success state.
+        */
+       public static Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ ok(TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ[] o) {
+               long ret = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_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_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ ret_hu_conv = Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ in the error state.
+        */
+       public static Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ err(org.ldk.structs.ProbeSendFailure e) {
+               long ret = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ ret_hu_conv = Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ.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_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ clone() {
+               long ret = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ ret_hu_conv = Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbeSendFailureZ.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
new file mode 100644 (file)
index 0000000..37fe4a2
--- /dev/null
@@ -0,0 +1,99 @@
+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;
+       }
+
+}
+} } }
index 55a9364cb23f73013a5f7bc581e3dbc7c678f82c..6daf0ab887f92f871e88d7f6316ca13987d9d6df 100644 (file)
@@ -21,7 +21,16 @@ public class Result_CVec_CVec_u8ZZNoneZ : CommonBase {
        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) {
-                       this.res = bindings.CResult_CVec_CVec_u8ZZNoneZ_get_ok(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;
                }
        }
 
@@ -34,7 +43,7 @@ public class Result_CVec_CVec_u8ZZNoneZ : CommonBase {
         * 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(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);
diff --git a/c_sharp/src/org/ldk/structs/Result_CVec_ECDSASignatureZNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_CVec_ECDSASignatureZNoneZ.cs
new file mode 100644 (file)
index 0000000..a93fa39
--- /dev/null
@@ -0,0 +1,91 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_CVec_ECDSASignatureZNoneZ : CommonBase {
+       Result_CVec_ECDSASignatureZNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_CVec_ECDSASignatureZNoneZ() {
+               if (ptr != 0) { bindings.CResult_CVec_ECDSASignatureZNoneZ_free(ptr); }
+       }
+
+       internal static Result_CVec_ECDSASignatureZNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_CVec_ECDSASignatureZNoneZ_is_ok(ptr)) {
+                       return new Result_CVec_ECDSASignatureZNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_CVec_ECDSASignatureZNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_CVec_ECDSASignatureZNoneZ_OK : Result_CVec_ECDSASignatureZNoneZ {
+               public readonly byte[][] res;
+               internal Result_CVec_ECDSASignatureZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_CVec_ECDSASignatureZNoneZ_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_ECDSASignatureZNoneZ_Err : Result_CVec_ECDSASignatureZNoneZ {
+               internal Result_CVec_ECDSASignatureZNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_CVec_ECDSASignatureZNoneZ in the success state.
+        */
+       public static Result_CVec_ECDSASignatureZNoneZ ok(byte[][] o) {
+               long ret = bindings.CResult_CVec_ECDSASignatureZNoneZ_ok(InternalUtils.encodeUint64Array(InternalUtils.mapArray(o, o_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(o_conv_8, 64)))));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_ECDSASignatureZNoneZ ret_hu_conv = Result_CVec_ECDSASignatureZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_CVec_ECDSASignatureZNoneZ in the error state.
+        */
+       public static Result_CVec_ECDSASignatureZNoneZ err() {
+               long ret = bindings.CResult_CVec_ECDSASignatureZNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_ECDSASignatureZNoneZ ret_hu_conv = Result_CVec_ECDSASignatureZNoneZ.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_ECDSASignatureZNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_CVec_ECDSASignatureZNoneZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_CVec_ECDSASignatureZNoneZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_CVec_ECDSASignatureZNoneZ clone() {
+               long ret = bindings.CResult_CVec_ECDSASignatureZNoneZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_ECDSASignatureZNoneZ ret_hu_conv = Result_CVec_ECDSASignatureZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_CVec_SignatureZNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_CVec_SignatureZNoneZ.cs
deleted file mode 100644 (file)
index 710fba8..0000000
+++ /dev/null
@@ -1,82 +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_SignatureZNoneZ : CommonBase {
-       Result_CVec_SignatureZNoneZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_CVec_SignatureZNoneZ() {
-               if (ptr != 0) { bindings.CResult_CVec_SignatureZNoneZ_free(ptr); }
-       }
-
-       internal static Result_CVec_SignatureZNoneZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_CVec_SignatureZNoneZ_is_ok(ptr)) {
-                       return new Result_CVec_SignatureZNoneZ_OK(null, ptr);
-               } else {
-                       return new Result_CVec_SignatureZNoneZ_Err(null, ptr);
-               }
-       }
-       public class Result_CVec_SignatureZNoneZ_OK : Result_CVec_SignatureZNoneZ {
-               public readonly byte[][] res;
-               internal Result_CVec_SignatureZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult_CVec_SignatureZNoneZ_get_ok(ptr);
-               }
-       }
-
-       public class Result_CVec_SignatureZNoneZ_Err : Result_CVec_SignatureZNoneZ {
-               internal Result_CVec_SignatureZNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-               }
-       }
-
-       /**
-        * Creates a new CResult_CVec_SignatureZNoneZ in the success state.
-        */
-       public static Result_CVec_SignatureZNoneZ ok(byte[][] o) {
-               long ret = bindings.CResult_CVec_SignatureZNoneZ_ok(o != null ? InternalUtils.mapArray(o, o_conv_8 => InternalUtils.check_arr_len(o_conv_8, 64)) : null);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_SignatureZNoneZ ret_hu_conv = Result_CVec_SignatureZNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_CVec_SignatureZNoneZ in the error state.
-        */
-       public static Result_CVec_SignatureZNoneZ err() {
-               long ret = bindings.CResult_CVec_SignatureZNoneZ_err();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_SignatureZNoneZ ret_hu_conv = Result_CVec_SignatureZNoneZ.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_SignatureZNoneZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_CVec_SignatureZNoneZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_CVec_SignatureZNoneZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_CVec_SignatureZNoneZ clone() {
-               long ret = bindings.CResult_CVec_SignatureZNoneZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_SignatureZNoneZ ret_hu_conv = Result_CVec_SignatureZNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_CVec_StrZIOErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_CVec_StrZIOErrorZ.cs
new file mode 100644 (file)
index 0000000..05e96f7
--- /dev/null
@@ -0,0 +1,94 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_CVec_StrZIOErrorZ : CommonBase {
+       Result_CVec_StrZIOErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_CVec_StrZIOErrorZ() {
+               if (ptr != 0) { bindings.CResult_CVec_StrZIOErrorZ_free(ptr); }
+       }
+
+       internal static Result_CVec_StrZIOErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_CVec_StrZIOErrorZ_is_ok(ptr)) {
+                       return new Result_CVec_StrZIOErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_CVec_StrZIOErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_CVec_StrZIOErrorZ_OK : Result_CVec_StrZIOErrorZ {
+               public readonly string[] res;
+               internal Result_CVec_StrZIOErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_CVec_StrZIOErrorZ_get_ok(ptr);
+                       int res_conv_8_len = InternalUtils.getArrayLength(res);
+                       string[] res_conv_8_arr = new string[res_conv_8_len];
+                       for (int i = 0; i < res_conv_8_len; i++) {
+                               long res_conv_8 = InternalUtils.getU32ArrayElem(res, i);
+                               string res_conv_8_conv = InternalUtils.decodeString(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_StrZIOErrorZ_Err : Result_CVec_StrZIOErrorZ {
+               public readonly IOError err;
+               internal Result_CVec_StrZIOErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       this.err = bindings.CResult_CVec_StrZIOErrorZ_get_err(ptr);
+               }
+       }
+
+       /**
+        * Creates a new CResult_CVec_StrZIOErrorZ in the success state.
+        */
+       public static Result_CVec_StrZIOErrorZ ok(string[] o) {
+               long ret = bindings.CResult_CVec_StrZIOErrorZ_ok(InternalUtils.encodeUint64Array(InternalUtils.mapArray(o, o_conv_8 => InternalUtils.encodeString(o_conv_8))));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_StrZIOErrorZ ret_hu_conv = Result_CVec_StrZIOErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_CVec_StrZIOErrorZ in the error state.
+        */
+       public static Result_CVec_StrZIOErrorZ err(IOError e) {
+               long ret = bindings.CResult_CVec_StrZIOErrorZ_err(e);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_StrZIOErrorZ ret_hu_conv = Result_CVec_StrZIOErrorZ.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_StrZIOErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_CVec_StrZIOErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_CVec_StrZIOErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_CVec_StrZIOErrorZ clone() {
+               long ret = bindings.CResult_CVec_StrZIOErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_StrZIOErrorZ ret_hu_conv = Result_CVec_StrZIOErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 8a2a3b7c6a318f175fc826468cc756b8e93fdefb..636895d8a5a475aa9d8c644a6894de8ccb14ff26 100644 (file)
@@ -21,15 +21,16 @@ public class Result_CVec_UtxoZNoneZ : CommonBase {
        public class Result_CVec_UtxoZNoneZ_OK : Result_CVec_UtxoZNoneZ {
                public readonly Utxo[] res;
                internal Result_CVec_UtxoZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long[] res = bindings.CResult_CVec_UtxoZNoneZ_get_ok(ptr);
-                       int res_conv_6_len = res.Length;
+                       long res = bindings.CResult_CVec_UtxoZNoneZ_get_ok(ptr);
+                       int res_conv_6_len = InternalUtils.getArrayLength(res);
                        Utxo[] res_conv_6_arr = new Utxo[res_conv_6_len];
                        for (int g = 0; g < res_conv_6_len; g++) {
-                               long res_conv_6 = res[g];
+                               long res_conv_6 = InternalUtils.getU64ArrayElem(res, g);
                                org.ldk.structs.Utxo res_conv_6_hu_conv = null; if (res_conv_6 < 0 || res_conv_6 > 4096) { res_conv_6_hu_conv = new org.ldk.structs.Utxo(null, res_conv_6); }
                                if (res_conv_6_hu_conv != null) { res_conv_6_hu_conv.ptrs_to.AddLast(this); };
                                res_conv_6_arr[g] = res_conv_6_hu_conv;
                        }
+                       bindings.free_buffer(res);
                        this.res = res_conv_6_arr;
                }
        }
@@ -43,7 +44,7 @@ public class Result_CVec_UtxoZNoneZ : CommonBase {
         * Creates a new CResult_CVec_UtxoZNoneZ in the success state.
         */
        public static Result_CVec_UtxoZNoneZ ok(Utxo[] o) {
-               long ret = bindings.CResult_CVec_UtxoZNoneZ_ok(o != null ? InternalUtils.mapArray(o, o_conv_6 => o_conv_6 == null ? 0 : o_conv_6.ptr) : null);
+               long ret = bindings.CResult_CVec_UtxoZNoneZ_ok(InternalUtils.encodeUint64Array(InternalUtils.mapArray(o, o_conv_6 => o_conv_6 == null ? 0 : o_conv_6.ptr)));
                GC.KeepAlive(o);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_CVec_UtxoZNoneZ ret_hu_conv = Result_CVec_UtxoZNoneZ.constr_from_ptr(ret);
diff --git a/c_sharp/src/org/ldk/structs/Result_CVec_u8ZIOErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_CVec_u8ZIOErrorZ.cs
new file mode 100644 (file)
index 0000000..a780977
--- /dev/null
@@ -0,0 +1,87 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_CVec_u8ZIOErrorZ : CommonBase {
+       Result_CVec_u8ZIOErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_CVec_u8ZIOErrorZ() {
+               if (ptr != 0) { bindings.CResult_CVec_u8ZIOErrorZ_free(ptr); }
+       }
+
+       internal static Result_CVec_u8ZIOErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_CVec_u8ZIOErrorZ_is_ok(ptr)) {
+                       return new Result_CVec_u8ZIOErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_CVec_u8ZIOErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_CVec_u8ZIOErrorZ_OK : Result_CVec_u8ZIOErrorZ {
+               public readonly byte[] res;
+               internal Result_CVec_u8ZIOErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_CVec_u8ZIOErrorZ_get_ok(ptr);
+                       byte[] res_conv = InternalUtils.decodeUint8Array(res);
+                       this.res = res_conv;
+               }
+       }
+
+       public class Result_CVec_u8ZIOErrorZ_Err : Result_CVec_u8ZIOErrorZ {
+               public readonly IOError err;
+               internal Result_CVec_u8ZIOErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       this.err = bindings.CResult_CVec_u8ZIOErrorZ_get_err(ptr);
+               }
+       }
+
+       /**
+        * Creates a new CResult_CVec_u8ZIOErrorZ in the success state.
+        */
+       public static Result_CVec_u8ZIOErrorZ ok(byte[] o) {
+               long ret = bindings.CResult_CVec_u8ZIOErrorZ_ok(InternalUtils.encodeUint8Array(o));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_u8ZIOErrorZ ret_hu_conv = Result_CVec_u8ZIOErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_CVec_u8ZIOErrorZ in the error state.
+        */
+       public static Result_CVec_u8ZIOErrorZ err(IOError e) {
+               long ret = bindings.CResult_CVec_u8ZIOErrorZ_err(e);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_u8ZIOErrorZ ret_hu_conv = Result_CVec_u8ZIOErrorZ.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_u8ZIOErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_CVec_u8ZIOErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_CVec_u8ZIOErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_CVec_u8ZIOErrorZ clone() {
+               long ret = bindings.CResult_CVec_u8ZIOErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_u8ZIOErrorZ ret_hu_conv = Result_CVec_u8ZIOErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_CVec_u8ZNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_CVec_u8ZNoneZ.cs
new file mode 100644 (file)
index 0000000..68af83b
--- /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_CVec_u8ZNoneZ : CommonBase {
+       Result_CVec_u8ZNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_CVec_u8ZNoneZ() {
+               if (ptr != 0) { bindings.CResult_CVec_u8ZNoneZ_free(ptr); }
+       }
+
+       internal static Result_CVec_u8ZNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_CVec_u8ZNoneZ_is_ok(ptr)) {
+                       return new Result_CVec_u8ZNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_CVec_u8ZNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_CVec_u8ZNoneZ_OK : Result_CVec_u8ZNoneZ {
+               public readonly byte[] res;
+               internal Result_CVec_u8ZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_CVec_u8ZNoneZ_get_ok(ptr);
+                       byte[] res_conv = InternalUtils.decodeUint8Array(res);
+                       this.res = res_conv;
+               }
+       }
+
+       public class Result_CVec_u8ZNoneZ_Err : Result_CVec_u8ZNoneZ {
+               internal Result_CVec_u8ZNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_CVec_u8ZNoneZ in the success state.
+        */
+       public static Result_CVec_u8ZNoneZ ok(byte[] o) {
+               long ret = bindings.CResult_CVec_u8ZNoneZ_ok(InternalUtils.encodeUint8Array(o));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_u8ZNoneZ ret_hu_conv = Result_CVec_u8ZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_CVec_u8ZNoneZ in the error state.
+        */
+       public static Result_CVec_u8ZNoneZ err() {
+               long ret = bindings.CResult_CVec_u8ZNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_u8ZNoneZ ret_hu_conv = Result_CVec_u8ZNoneZ.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_u8ZNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_CVec_u8ZNoneZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_CVec_u8ZNoneZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_CVec_u8ZNoneZ clone() {
+               long ret = bindings.CResult_CVec_u8ZNoneZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               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 1c10f0666def97054ca74da51fe96fe53ed6dac4..26a9bc8f17dc4f1734797709cf791782b11bbe93 100644 (file)
@@ -21,7 +21,9 @@ public class Result_CVec_u8ZPeerHandleErrorZ : CommonBase {
        public class Result_CVec_u8ZPeerHandleErrorZ_OK : Result_CVec_u8ZPeerHandleErrorZ {
                public readonly byte[] res;
                internal Result_CVec_u8ZPeerHandleErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult_CVec_u8ZPeerHandleErrorZ_get_ok(ptr);
+                       long res = bindings.CResult_CVec_u8ZPeerHandleErrorZ_get_ok(ptr);
+                       byte[] res_conv = InternalUtils.decodeUint8Array(res);
+                       this.res = res_conv;
                }
        }
 
@@ -39,7 +41,7 @@ public class Result_CVec_u8ZPeerHandleErrorZ : CommonBase {
         * Creates a new CResult_CVec_u8ZPeerHandleErrorZ in the success state.
         */
        public static Result_CVec_u8ZPeerHandleErrorZ ok(byte[] o) {
-               long ret = bindings.CResult_CVec_u8ZPeerHandleErrorZ_ok(o);
+               long ret = bindings.CResult_CVec_u8ZPeerHandleErrorZ_ok(InternalUtils.encodeUint8Array(o));
                GC.KeepAlive(o);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_CVec_u8ZPeerHandleErrorZ ret_hu_conv = Result_CVec_u8ZPeerHandleErrorZ.constr_from_ptr(ret);
diff --git a/c_sharp/src/org/ldk/structs/Result_ChannelDerivationParametersDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_ChannelDerivationParametersDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..63e2dcd
--- /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_ChannelDerivationParametersDecodeErrorZ : CommonBase {
+       Result_ChannelDerivationParametersDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_ChannelDerivationParametersDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_ChannelDerivationParametersDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_ChannelDerivationParametersDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_ChannelDerivationParametersDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_ChannelDerivationParametersDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_ChannelDerivationParametersDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_ChannelDerivationParametersDecodeErrorZ_OK : Result_ChannelDerivationParametersDecodeErrorZ {
+               public readonly ChannelDerivationParameters res;
+               internal Result_ChannelDerivationParametersDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_ChannelDerivationParametersDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.ChannelDerivationParameters res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.ChannelDerivationParameters(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_ChannelDerivationParametersDecodeErrorZ_Err : Result_ChannelDerivationParametersDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_ChannelDerivationParametersDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_ChannelDerivationParametersDecodeErrorZ_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_ChannelDerivationParametersDecodeErrorZ in the success state.
+        */
+       public static Result_ChannelDerivationParametersDecodeErrorZ ok(org.ldk.structs.ChannelDerivationParameters o) {
+               long ret = bindings.CResult_ChannelDerivationParametersDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ChannelDerivationParametersDecodeErrorZ ret_hu_conv = Result_ChannelDerivationParametersDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_ChannelDerivationParametersDecodeErrorZ in the error state.
+        */
+       public static Result_ChannelDerivationParametersDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_ChannelDerivationParametersDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ChannelDerivationParametersDecodeErrorZ ret_hu_conv = Result_ChannelDerivationParametersDecodeErrorZ.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_ChannelDerivationParametersDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_ChannelDerivationParametersDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_ChannelDerivationParametersDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_ChannelDerivationParametersDecodeErrorZ clone() {
+               long ret = bindings.CResult_ChannelDerivationParametersDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ChannelDerivationParametersDecodeErrorZ ret_hu_conv = Result_ChannelDerivationParametersDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_ChannelMonitorUpdateStatusNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_ChannelMonitorUpdateStatusNoneZ.cs
new file mode 100644 (file)
index 0000000..6180f6f
--- /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 {
+
+public class Result_ChannelMonitorUpdateStatusNoneZ : CommonBase {
+       Result_ChannelMonitorUpdateStatusNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_ChannelMonitorUpdateStatusNoneZ() {
+               if (ptr != 0) { bindings.CResult_ChannelMonitorUpdateStatusNoneZ_free(ptr); }
+       }
+
+       internal static Result_ChannelMonitorUpdateStatusNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_ChannelMonitorUpdateStatusNoneZ_is_ok(ptr)) {
+                       return new Result_ChannelMonitorUpdateStatusNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_ChannelMonitorUpdateStatusNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_ChannelMonitorUpdateStatusNoneZ_OK : Result_ChannelMonitorUpdateStatusNoneZ {
+               public readonly ChannelMonitorUpdateStatus res;
+               internal Result_ChannelMonitorUpdateStatusNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       this.res = bindings.CResult_ChannelMonitorUpdateStatusNoneZ_get_ok(ptr);
+               }
+       }
+
+       public class Result_ChannelMonitorUpdateStatusNoneZ_Err : Result_ChannelMonitorUpdateStatusNoneZ {
+               internal Result_ChannelMonitorUpdateStatusNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_ChannelMonitorUpdateStatusNoneZ in the success state.
+        */
+       public static Result_ChannelMonitorUpdateStatusNoneZ ok(ChannelMonitorUpdateStatus o) {
+               long ret = bindings.CResult_ChannelMonitorUpdateStatusNoneZ_ok(o);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ChannelMonitorUpdateStatusNoneZ ret_hu_conv = Result_ChannelMonitorUpdateStatusNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_ChannelMonitorUpdateStatusNoneZ in the error state.
+        */
+       public static Result_ChannelMonitorUpdateStatusNoneZ err() {
+               long ret = bindings.CResult_ChannelMonitorUpdateStatusNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ChannelMonitorUpdateStatusNoneZ ret_hu_conv = Result_ChannelMonitorUpdateStatusNoneZ.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_ChannelMonitorUpdateStatusNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_ChannelMonitorUpdateStatusNoneZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_ChannelMonitorUpdateStatusNoneZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_ChannelMonitorUpdateStatusNoneZ clone() {
+               long ret = bindings.CResult_ChannelMonitorUpdateStatusNoneZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ChannelMonitorUpdateStatusNoneZ ret_hu_conv = Result_ChannelMonitorUpdateStatusNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_ClaimedHTLCDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_ClaimedHTLCDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..4e3cf9a
--- /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_ClaimedHTLCDecodeErrorZ : CommonBase {
+       Result_ClaimedHTLCDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_ClaimedHTLCDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_ClaimedHTLCDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_ClaimedHTLCDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_ClaimedHTLCDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_ClaimedHTLCDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_ClaimedHTLCDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_ClaimedHTLCDecodeErrorZ_OK : Result_ClaimedHTLCDecodeErrorZ {
+               public readonly ClaimedHTLC res;
+               internal Result_ClaimedHTLCDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_ClaimedHTLCDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.ClaimedHTLC res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.ClaimedHTLC(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_ClaimedHTLCDecodeErrorZ_Err : Result_ClaimedHTLCDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_ClaimedHTLCDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_ClaimedHTLCDecodeErrorZ_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_ClaimedHTLCDecodeErrorZ in the success state.
+        */
+       public static Result_ClaimedHTLCDecodeErrorZ ok(org.ldk.structs.ClaimedHTLC o) {
+               long ret = bindings.CResult_ClaimedHTLCDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ClaimedHTLCDecodeErrorZ ret_hu_conv = Result_ClaimedHTLCDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_ClaimedHTLCDecodeErrorZ in the error state.
+        */
+       public static Result_ClaimedHTLCDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_ClaimedHTLCDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ClaimedHTLCDecodeErrorZ ret_hu_conv = Result_ClaimedHTLCDecodeErrorZ.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_ClaimedHTLCDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_ClaimedHTLCDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_ClaimedHTLCDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_ClaimedHTLCDecodeErrorZ clone() {
+               long ret = bindings.CResult_ClaimedHTLCDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ClaimedHTLCDecodeErrorZ ret_hu_conv = Result_ClaimedHTLCDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_ECDSASignatureNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_ECDSASignatureNoneZ.cs
new file mode 100644 (file)
index 0000000..168829d
--- /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_ECDSASignatureNoneZ : CommonBase {
+       Result_ECDSASignatureNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_ECDSASignatureNoneZ() {
+               if (ptr != 0) { bindings.CResult_ECDSASignatureNoneZ_free(ptr); }
+       }
+
+       internal static Result_ECDSASignatureNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_ECDSASignatureNoneZ_is_ok(ptr)) {
+                       return new Result_ECDSASignatureNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_ECDSASignatureNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_ECDSASignatureNoneZ_OK : Result_ECDSASignatureNoneZ {
+               public readonly byte[] res;
+               internal Result_ECDSASignatureNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_ECDSASignatureNoneZ_get_ok(ptr);
+                       byte[] res_conv = InternalUtils.decodeUint8Array(res);
+                       this.res = res_conv;
+               }
+       }
+
+       public class Result_ECDSASignatureNoneZ_Err : Result_ECDSASignatureNoneZ {
+               internal Result_ECDSASignatureNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_ECDSASignatureNoneZ in the success state.
+        */
+       public static Result_ECDSASignatureNoneZ ok(byte[] o) {
+               long ret = bindings.CResult_ECDSASignatureNoneZ_ok(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(o, 64)));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ECDSASignatureNoneZ ret_hu_conv = Result_ECDSASignatureNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_ECDSASignatureNoneZ in the error state.
+        */
+       public static Result_ECDSASignatureNoneZ err() {
+               long ret = bindings.CResult_ECDSASignatureNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ECDSASignatureNoneZ ret_hu_conv = Result_ECDSASignatureNoneZ.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_ECDSASignatureNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_ECDSASignatureNoneZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_ECDSASignatureNoneZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_ECDSASignatureNoneZ clone() {
+               long ret = bindings.CResult_ECDSASignatureNoneZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ECDSASignatureNoneZ ret_hu_conv = Result_ECDSASignatureNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_HTLCDescriptorDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_HTLCDescriptorDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..c946833
--- /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_HTLCDescriptorDecodeErrorZ : CommonBase {
+       Result_HTLCDescriptorDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_HTLCDescriptorDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_HTLCDescriptorDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_HTLCDescriptorDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_HTLCDescriptorDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_HTLCDescriptorDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_HTLCDescriptorDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_HTLCDescriptorDecodeErrorZ_OK : Result_HTLCDescriptorDecodeErrorZ {
+               public readonly HTLCDescriptor res;
+               internal Result_HTLCDescriptorDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_HTLCDescriptorDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.HTLCDescriptor res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.HTLCDescriptor(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_HTLCDescriptorDecodeErrorZ_Err : Result_HTLCDescriptorDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_HTLCDescriptorDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_HTLCDescriptorDecodeErrorZ_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_HTLCDescriptorDecodeErrorZ in the success state.
+        */
+       public static Result_HTLCDescriptorDecodeErrorZ ok(org.ldk.structs.HTLCDescriptor o) {
+               long ret = bindings.CResult_HTLCDescriptorDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_HTLCDescriptorDecodeErrorZ ret_hu_conv = Result_HTLCDescriptorDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_HTLCDescriptorDecodeErrorZ in the error state.
+        */
+       public static Result_HTLCDescriptorDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_HTLCDescriptorDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_HTLCDescriptorDecodeErrorZ ret_hu_conv = Result_HTLCDescriptorDecodeErrorZ.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_HTLCDescriptorDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_HTLCDescriptorDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_HTLCDescriptorDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_HTLCDescriptorDecodeErrorZ clone() {
+               long ret = bindings.CResult_HTLCDescriptorDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_HTLCDescriptorDecodeErrorZ ret_hu_conv = Result_HTLCDescriptorDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_NetAddressDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_NetAddressDecodeErrorZ.cs
deleted file mode 100644 (file)
index 7acd3ed..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_NetAddressDecodeErrorZ : CommonBase {
-       Result_NetAddressDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_NetAddressDecodeErrorZ() {
-               if (ptr != 0) { bindings.CResult_NetAddressDecodeErrorZ_free(ptr); }
-       }
-
-       internal static Result_NetAddressDecodeErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_NetAddressDecodeErrorZ_is_ok(ptr)) {
-                       return new Result_NetAddressDecodeErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_NetAddressDecodeErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_NetAddressDecodeErrorZ_OK : Result_NetAddressDecodeErrorZ {
-               public readonly NetAddress res;
-               internal Result_NetAddressDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long res = bindings.CResult_NetAddressDecodeErrorZ_get_ok(ptr);
-                       org.ldk.structs.NetAddress res_hu_conv = org.ldk.structs.NetAddress.constr_from_ptr(res);
-                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
-                       this.res = res_hu_conv;
-               }
-       }
-
-       public class Result_NetAddressDecodeErrorZ_Err : Result_NetAddressDecodeErrorZ {
-               public readonly DecodeError err;
-               internal Result_NetAddressDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long err = bindings.CResult_NetAddressDecodeErrorZ_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_NetAddressDecodeErrorZ in the success state.
-        */
-       public static Result_NetAddressDecodeErrorZ ok(org.ldk.structs.NetAddress o) {
-               long ret = bindings.CResult_NetAddressDecodeErrorZ_ok(o.ptr);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NetAddressDecodeErrorZ ret_hu_conv = Result_NetAddressDecodeErrorZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_NetAddressDecodeErrorZ in the error state.
-        */
-       public static Result_NetAddressDecodeErrorZ err(org.ldk.structs.DecodeError e) {
-               long ret = bindings.CResult_NetAddressDecodeErrorZ_err(e.ptr);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NetAddressDecodeErrorZ ret_hu_conv = Result_NetAddressDecodeErrorZ.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_NetAddressDecodeErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_NetAddressDecodeErrorZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_NetAddressDecodeErrorZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_NetAddressDecodeErrorZ clone() {
-               long ret = bindings.CResult_NetAddressDecodeErrorZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NetAddressDecodeErrorZ ret_hu_conv = Result_NetAddressDecodeErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_NoneBolt12SemanticErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_NoneBolt12SemanticErrorZ.cs
new file mode 100644 (file)
index 0000000..21c5d2b
--- /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 {
+
+public class Result_NoneBolt12SemanticErrorZ : CommonBase {
+       Result_NoneBolt12SemanticErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_NoneBolt12SemanticErrorZ() {
+               if (ptr != 0) { bindings.CResult_NoneBolt12SemanticErrorZ_free(ptr); }
+       }
+
+       internal static Result_NoneBolt12SemanticErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_NoneBolt12SemanticErrorZ_is_ok(ptr)) {
+                       return new Result_NoneBolt12SemanticErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_NoneBolt12SemanticErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_NoneBolt12SemanticErrorZ_OK : Result_NoneBolt12SemanticErrorZ {
+               internal Result_NoneBolt12SemanticErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       public class Result_NoneBolt12SemanticErrorZ_Err : Result_NoneBolt12SemanticErrorZ {
+               public readonly Bolt12SemanticError err;
+               internal Result_NoneBolt12SemanticErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       this.err = bindings.CResult_NoneBolt12SemanticErrorZ_get_err(ptr);
+               }
+       }
+
+       /**
+        * Creates a new CResult_NoneBolt12SemanticErrorZ in the success state.
+        */
+       public static Result_NoneBolt12SemanticErrorZ ok() {
+               long ret = bindings.CResult_NoneBolt12SemanticErrorZ_ok();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneBolt12SemanticErrorZ ret_hu_conv = Result_NoneBolt12SemanticErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_NoneBolt12SemanticErrorZ in the error state.
+        */
+       public static Result_NoneBolt12SemanticErrorZ err(Bolt12SemanticError e) {
+               long ret = bindings.CResult_NoneBolt12SemanticErrorZ_err(e);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneBolt12SemanticErrorZ ret_hu_conv = Result_NoneBolt12SemanticErrorZ.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_NoneBolt12SemanticErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_NoneBolt12SemanticErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_NoneBolt12SemanticErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_NoneBolt12SemanticErrorZ clone() {
+               long ret = bindings.CResult_NoneBolt12SemanticErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneBolt12SemanticErrorZ ret_hu_conv = Result_NoneBolt12SemanticErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_NoneErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_NoneErrorZ.cs
deleted file mode 100644 (file)
index b47b2b3..0000000
+++ /dev/null
@@ -1,82 +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_NoneErrorZ : CommonBase {
-       Result_NoneErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_NoneErrorZ() {
-               if (ptr != 0) { bindings.CResult_NoneErrorZ_free(ptr); }
-       }
-
-       internal static Result_NoneErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_NoneErrorZ_is_ok(ptr)) {
-                       return new Result_NoneErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_NoneErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_NoneErrorZ_OK : Result_NoneErrorZ {
-               internal Result_NoneErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-               }
-       }
-
-       public class Result_NoneErrorZ_Err : Result_NoneErrorZ {
-               public readonly IOError err;
-               internal Result_NoneErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.err = bindings.CResult_NoneErrorZ_get_err(ptr);
-               }
-       }
-
-       /**
-        * Creates a new CResult_NoneErrorZ in the success state.
-        */
-       public static Result_NoneErrorZ ok() {
-               long ret = bindings.CResult_NoneErrorZ_ok();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NoneErrorZ ret_hu_conv = Result_NoneErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_NoneErrorZ in the error state.
-        */
-       public static Result_NoneErrorZ err(IOError e) {
-               long ret = bindings.CResult_NoneErrorZ_err(e);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NoneErrorZ ret_hu_conv = Result_NoneErrorZ.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_NoneErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_NoneErrorZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_NoneErrorZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_NoneErrorZ clone() {
-               long ret = bindings.CResult_NoneErrorZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NoneErrorZ ret_hu_conv = Result_NoneErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_NoneIOErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_NoneIOErrorZ.cs
new file mode 100644 (file)
index 0000000..1544dc2
--- /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 {
+
+public class Result_NoneIOErrorZ : CommonBase {
+       Result_NoneIOErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_NoneIOErrorZ() {
+               if (ptr != 0) { bindings.CResult_NoneIOErrorZ_free(ptr); }
+       }
+
+       internal static Result_NoneIOErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_NoneIOErrorZ_is_ok(ptr)) {
+                       return new Result_NoneIOErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_NoneIOErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_NoneIOErrorZ_OK : Result_NoneIOErrorZ {
+               internal Result_NoneIOErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       public class Result_NoneIOErrorZ_Err : Result_NoneIOErrorZ {
+               public readonly IOError err;
+               internal Result_NoneIOErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       this.err = bindings.CResult_NoneIOErrorZ_get_err(ptr);
+               }
+       }
+
+       /**
+        * Creates a new CResult_NoneIOErrorZ in the success state.
+        */
+       public static Result_NoneIOErrorZ ok() {
+               long ret = bindings.CResult_NoneIOErrorZ_ok();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneIOErrorZ ret_hu_conv = Result_NoneIOErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_NoneIOErrorZ in the error state.
+        */
+       public static Result_NoneIOErrorZ err(IOError e) {
+               long ret = bindings.CResult_NoneIOErrorZ_err(e);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneIOErrorZ ret_hu_conv = Result_NoneIOErrorZ.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_NoneIOErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_NoneIOErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_NoneIOErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_NoneIOErrorZ clone() {
+               long ret = bindings.CResult_NoneIOErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneIOErrorZ ret_hu_conv = Result_NoneIOErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_PartiallySignedTransactionNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_PartiallySignedTransactionNoneZ.cs
deleted file mode 100644 (file)
index cf54d80..0000000
+++ /dev/null
@@ -1,82 +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_PartiallySignedTransactionNoneZ : CommonBase {
-       Result_PartiallySignedTransactionNoneZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_PartiallySignedTransactionNoneZ() {
-               if (ptr != 0) { bindings.CResult_PartiallySignedTransactionNoneZ_free(ptr); }
-       }
-
-       internal static Result_PartiallySignedTransactionNoneZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_PartiallySignedTransactionNoneZ_is_ok(ptr)) {
-                       return new Result_PartiallySignedTransactionNoneZ_OK(null, ptr);
-               } else {
-                       return new Result_PartiallySignedTransactionNoneZ_Err(null, ptr);
-               }
-       }
-       public class Result_PartiallySignedTransactionNoneZ_OK : Result_PartiallySignedTransactionNoneZ {
-               public readonly byte[] res;
-               internal Result_PartiallySignedTransactionNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult_PartiallySignedTransactionNoneZ_get_ok(ptr);
-               }
-       }
-
-       public class Result_PartiallySignedTransactionNoneZ_Err : Result_PartiallySignedTransactionNoneZ {
-               internal Result_PartiallySignedTransactionNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-               }
-       }
-
-       /**
-        * Creates a new CResult_PartiallySignedTransactionNoneZ in the success state.
-        */
-       public static Result_PartiallySignedTransactionNoneZ ok(byte[] o) {
-               long ret = bindings.CResult_PartiallySignedTransactionNoneZ_ok(o);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PartiallySignedTransactionNoneZ ret_hu_conv = Result_PartiallySignedTransactionNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_PartiallySignedTransactionNoneZ in the error state.
-        */
-       public static Result_PartiallySignedTransactionNoneZ err() {
-               long ret = bindings.CResult_PartiallySignedTransactionNoneZ_err();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PartiallySignedTransactionNoneZ ret_hu_conv = Result_PartiallySignedTransactionNoneZ.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_PartiallySignedTransactionNoneZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_PartiallySignedTransactionNoneZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_PartiallySignedTransactionNoneZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_PartiallySignedTransactionNoneZ clone() {
-               long ret = bindings.CResult_PartiallySignedTransactionNoneZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PartiallySignedTransactionNoneZ ret_hu_conv = Result_PartiallySignedTransactionNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_PayeePubKeyErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_PayeePubKeyErrorZ.cs
deleted file mode 100644 (file)
index 59ad747..0000000
+++ /dev/null
@@ -1,89 +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_PayeePubKeyErrorZ : CommonBase {
-       Result_PayeePubKeyErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_PayeePubKeyErrorZ() {
-               if (ptr != 0) { bindings.CResult_PayeePubKeyErrorZ_free(ptr); }
-       }
-
-       internal static Result_PayeePubKeyErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_PayeePubKeyErrorZ_is_ok(ptr)) {
-                       return new Result_PayeePubKeyErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_PayeePubKeyErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_PayeePubKeyErrorZ_OK : Result_PayeePubKeyErrorZ {
-               public readonly PayeePubKey res;
-               internal Result_PayeePubKeyErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long res = bindings.CResult_PayeePubKeyErrorZ_get_ok(ptr);
-                       org.ldk.structs.PayeePubKey res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.PayeePubKey(null, res); }
-                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
-                       this.res = res_hu_conv;
-               }
-       }
-
-       public class Result_PayeePubKeyErrorZ_Err : Result_PayeePubKeyErrorZ {
-               public readonly Secp256k1Error err;
-               internal Result_PayeePubKeyErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.err = bindings.CResult_PayeePubKeyErrorZ_get_err(ptr);
-               }
-       }
-
-       /**
-        * Creates a new CResult_PayeePubKeyErrorZ in the success state.
-        */
-       public static Result_PayeePubKeyErrorZ ok(org.ldk.structs.PayeePubKey o) {
-               long ret = bindings.CResult_PayeePubKeyErrorZ_ok(o == null ? 0 : o.ptr);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PayeePubKeyErrorZ ret_hu_conv = Result_PayeePubKeyErrorZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_PayeePubKeyErrorZ in the error state.
-        */
-       public static Result_PayeePubKeyErrorZ err(Secp256k1Error e) {
-               long ret = bindings.CResult_PayeePubKeyErrorZ_err(e);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PayeePubKeyErrorZ ret_hu_conv = Result_PayeePubKeyErrorZ.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_PayeePubKeyErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_PayeePubKeyErrorZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_PayeePubKeyErrorZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_PayeePubKeyErrorZ clone() {
-               long ret = bindings.CResult_PayeePubKeyErrorZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PayeePubKeyErrorZ ret_hu_conv = Result_PayeePubKeyErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_PayeePubKeySecp256k1ErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_PayeePubKeySecp256k1ErrorZ.cs
new file mode 100644 (file)
index 0000000..e56a62c
--- /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_PayeePubKeySecp256k1ErrorZ : CommonBase {
+       Result_PayeePubKeySecp256k1ErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_PayeePubKeySecp256k1ErrorZ() {
+               if (ptr != 0) { bindings.CResult_PayeePubKeySecp256k1ErrorZ_free(ptr); }
+       }
+
+       internal static Result_PayeePubKeySecp256k1ErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_PayeePubKeySecp256k1ErrorZ_is_ok(ptr)) {
+                       return new Result_PayeePubKeySecp256k1ErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_PayeePubKeySecp256k1ErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_PayeePubKeySecp256k1ErrorZ_OK : Result_PayeePubKeySecp256k1ErrorZ {
+               public readonly PayeePubKey res;
+               internal Result_PayeePubKeySecp256k1ErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_PayeePubKeySecp256k1ErrorZ_get_ok(ptr);
+                       org.ldk.structs.PayeePubKey res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.PayeePubKey(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_PayeePubKeySecp256k1ErrorZ_Err : Result_PayeePubKeySecp256k1ErrorZ {
+               public readonly Secp256k1Error err;
+               internal Result_PayeePubKeySecp256k1ErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       this.err = bindings.CResult_PayeePubKeySecp256k1ErrorZ_get_err(ptr);
+               }
+       }
+
+       /**
+        * Creates a new CResult_PayeePubKeySecp256k1ErrorZ in the success state.
+        */
+       public static Result_PayeePubKeySecp256k1ErrorZ ok(org.ldk.structs.PayeePubKey o) {
+               long ret = bindings.CResult_PayeePubKeySecp256k1ErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PayeePubKeySecp256k1ErrorZ ret_hu_conv = Result_PayeePubKeySecp256k1ErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_PayeePubKeySecp256k1ErrorZ in the error state.
+        */
+       public static Result_PayeePubKeySecp256k1ErrorZ err(Secp256k1Error e) {
+               long ret = bindings.CResult_PayeePubKeySecp256k1ErrorZ_err(e);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PayeePubKeySecp256k1ErrorZ ret_hu_conv = Result_PayeePubKeySecp256k1ErrorZ.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_PayeePubKeySecp256k1ErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_PayeePubKeySecp256k1ErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_PayeePubKeySecp256k1ErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_PayeePubKeySecp256k1ErrorZ clone() {
+               long ret = bindings.CResult_PayeePubKeySecp256k1ErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PayeePubKeySecp256k1ErrorZ ret_hu_conv = Result_PayeePubKeySecp256k1ErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_PaymentConstraintsDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_PaymentConstraintsDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..fc1beb5
--- /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_PaymentConstraintsDecodeErrorZ : CommonBase {
+       Result_PaymentConstraintsDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_PaymentConstraintsDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_PaymentConstraintsDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_PaymentConstraintsDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_PaymentConstraintsDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_PaymentConstraintsDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_PaymentConstraintsDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_PaymentConstraintsDecodeErrorZ_OK : Result_PaymentConstraintsDecodeErrorZ {
+               public readonly PaymentConstraints res;
+               internal Result_PaymentConstraintsDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_PaymentConstraintsDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.PaymentConstraints res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.PaymentConstraints(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_PaymentConstraintsDecodeErrorZ_Err : Result_PaymentConstraintsDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_PaymentConstraintsDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_PaymentConstraintsDecodeErrorZ_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_PaymentConstraintsDecodeErrorZ in the success state.
+        */
+       public static Result_PaymentConstraintsDecodeErrorZ ok(org.ldk.structs.PaymentConstraints o) {
+               long ret = bindings.CResult_PaymentConstraintsDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PaymentConstraintsDecodeErrorZ ret_hu_conv = Result_PaymentConstraintsDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_PaymentConstraintsDecodeErrorZ in the error state.
+        */
+       public static Result_PaymentConstraintsDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_PaymentConstraintsDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PaymentConstraintsDecodeErrorZ ret_hu_conv = Result_PaymentConstraintsDecodeErrorZ.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_PaymentConstraintsDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_PaymentConstraintsDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_PaymentConstraintsDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_PaymentConstraintsDecodeErrorZ clone() {
+               long ret = bindings.CResult_PaymentConstraintsDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PaymentConstraintsDecodeErrorZ ret_hu_conv = Result_PaymentConstraintsDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_PaymentHashPaymentSendFailureZ.cs b/c_sharp/src/org/ldk/structs/Result_PaymentHashPaymentSendFailureZ.cs
deleted file mode 100644 (file)
index 49989fb..0000000
+++ /dev/null
@@ -1,89 +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_PaymentHashPaymentSendFailureZ : CommonBase {
-       Result_PaymentHashPaymentSendFailureZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_PaymentHashPaymentSendFailureZ() {
-               if (ptr != 0) { bindings.CResult_PaymentHashPaymentSendFailureZ_free(ptr); }
-       }
-
-       internal static Result_PaymentHashPaymentSendFailureZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_PaymentHashPaymentSendFailureZ_is_ok(ptr)) {
-                       return new Result_PaymentHashPaymentSendFailureZ_OK(null, ptr);
-               } else {
-                       return new Result_PaymentHashPaymentSendFailureZ_Err(null, ptr);
-               }
-       }
-       public class Result_PaymentHashPaymentSendFailureZ_OK : Result_PaymentHashPaymentSendFailureZ {
-               public readonly byte[] res;
-               internal Result_PaymentHashPaymentSendFailureZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult_PaymentHashPaymentSendFailureZ_get_ok(ptr);
-               }
-       }
-
-       public class Result_PaymentHashPaymentSendFailureZ_Err : Result_PaymentHashPaymentSendFailureZ {
-               public readonly PaymentSendFailure err;
-               internal Result_PaymentHashPaymentSendFailureZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long err = bindings.CResult_PaymentHashPaymentSendFailureZ_get_err(ptr);
-                       org.ldk.structs.PaymentSendFailure err_hu_conv = org.ldk.structs.PaymentSendFailure.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_PaymentHashPaymentSendFailureZ in the success state.
-        */
-       public static Result_PaymentHashPaymentSendFailureZ ok(byte[] o) {
-               long ret = bindings.CResult_PaymentHashPaymentSendFailureZ_ok(InternalUtils.check_arr_len(o, 32));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentHashPaymentSendFailureZ ret_hu_conv = Result_PaymentHashPaymentSendFailureZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_PaymentHashPaymentSendFailureZ in the error state.
-        */
-       public static Result_PaymentHashPaymentSendFailureZ err(org.ldk.structs.PaymentSendFailure e) {
-               long ret = bindings.CResult_PaymentHashPaymentSendFailureZ_err(e.ptr);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentHashPaymentSendFailureZ ret_hu_conv = Result_PaymentHashPaymentSendFailureZ.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_PaymentHashPaymentSendFailureZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_PaymentHashPaymentSendFailureZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_PaymentHashPaymentSendFailureZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_PaymentHashPaymentSendFailureZ clone() {
-               long ret = bindings.CResult_PaymentHashPaymentSendFailureZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentHashPaymentSendFailureZ ret_hu_conv = Result_PaymentHashPaymentSendFailureZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_PaymentHashRetryableSendFailureZ.cs b/c_sharp/src/org/ldk/structs/Result_PaymentHashRetryableSendFailureZ.cs
deleted file mode 100644 (file)
index a3a69ff..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_PaymentHashRetryableSendFailureZ : CommonBase {
-       Result_PaymentHashRetryableSendFailureZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_PaymentHashRetryableSendFailureZ() {
-               if (ptr != 0) { bindings.CResult_PaymentHashRetryableSendFailureZ_free(ptr); }
-       }
-
-       internal static Result_PaymentHashRetryableSendFailureZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_PaymentHashRetryableSendFailureZ_is_ok(ptr)) {
-                       return new Result_PaymentHashRetryableSendFailureZ_OK(null, ptr);
-               } else {
-                       return new Result_PaymentHashRetryableSendFailureZ_Err(null, ptr);
-               }
-       }
-       public class Result_PaymentHashRetryableSendFailureZ_OK : Result_PaymentHashRetryableSendFailureZ {
-               public readonly byte[] res;
-               internal Result_PaymentHashRetryableSendFailureZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult_PaymentHashRetryableSendFailureZ_get_ok(ptr);
-               }
-       }
-
-       public class Result_PaymentHashRetryableSendFailureZ_Err : Result_PaymentHashRetryableSendFailureZ {
-               public readonly RetryableSendFailure err;
-               internal Result_PaymentHashRetryableSendFailureZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.err = bindings.CResult_PaymentHashRetryableSendFailureZ_get_err(ptr);
-               }
-       }
-
-       /**
-        * Creates a new CResult_PaymentHashRetryableSendFailureZ in the success state.
-        */
-       public static Result_PaymentHashRetryableSendFailureZ ok(byte[] o) {
-               long ret = bindings.CResult_PaymentHashRetryableSendFailureZ_ok(InternalUtils.check_arr_len(o, 32));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentHashRetryableSendFailureZ ret_hu_conv = Result_PaymentHashRetryableSendFailureZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_PaymentHashRetryableSendFailureZ in the error state.
-        */
-       public static Result_PaymentHashRetryableSendFailureZ err(RetryableSendFailure e) {
-               long ret = bindings.CResult_PaymentHashRetryableSendFailureZ_err(e);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentHashRetryableSendFailureZ ret_hu_conv = Result_PaymentHashRetryableSendFailureZ.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_PaymentHashRetryableSendFailureZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_PaymentHashRetryableSendFailureZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_PaymentHashRetryableSendFailureZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_PaymentHashRetryableSendFailureZ clone() {
-               long ret = bindings.CResult_PaymentHashRetryableSendFailureZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentHashRetryableSendFailureZ ret_hu_conv = Result_PaymentHashRetryableSendFailureZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_PaymentIdPaymentErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_PaymentIdPaymentErrorZ.cs
deleted file mode 100644 (file)
index 1acf00d..0000000
+++ /dev/null
@@ -1,89 +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_PaymentIdPaymentErrorZ : CommonBase {
-       Result_PaymentIdPaymentErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_PaymentIdPaymentErrorZ() {
-               if (ptr != 0) { bindings.CResult_PaymentIdPaymentErrorZ_free(ptr); }
-       }
-
-       internal static Result_PaymentIdPaymentErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_PaymentIdPaymentErrorZ_is_ok(ptr)) {
-                       return new Result_PaymentIdPaymentErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_PaymentIdPaymentErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_PaymentIdPaymentErrorZ_OK : Result_PaymentIdPaymentErrorZ {
-               public readonly byte[] res;
-               internal Result_PaymentIdPaymentErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult_PaymentIdPaymentErrorZ_get_ok(ptr);
-               }
-       }
-
-       public class Result_PaymentIdPaymentErrorZ_Err : Result_PaymentIdPaymentErrorZ {
-               public readonly PaymentError err;
-               internal Result_PaymentIdPaymentErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long err = bindings.CResult_PaymentIdPaymentErrorZ_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_PaymentIdPaymentErrorZ in the success state.
-        */
-       public static Result_PaymentIdPaymentErrorZ ok(byte[] o) {
-               long ret = bindings.CResult_PaymentIdPaymentErrorZ_ok(InternalUtils.check_arr_len(o, 32));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentIdPaymentErrorZ ret_hu_conv = Result_PaymentIdPaymentErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_PaymentIdPaymentErrorZ in the error state.
-        */
-       public static Result_PaymentIdPaymentErrorZ err(org.ldk.structs.PaymentError e) {
-               long ret = bindings.CResult_PaymentIdPaymentErrorZ_err(e.ptr);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentIdPaymentErrorZ ret_hu_conv = Result_PaymentIdPaymentErrorZ.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_PaymentIdPaymentErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_PaymentIdPaymentErrorZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_PaymentIdPaymentErrorZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_PaymentIdPaymentErrorZ clone() {
-               long ret = bindings.CResult_PaymentIdPaymentErrorZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentIdPaymentErrorZ ret_hu_conv = Result_PaymentIdPaymentErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_PaymentPreimageAPIErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_PaymentPreimageAPIErrorZ.cs
deleted file mode 100644 (file)
index c3d1a27..0000000
+++ /dev/null
@@ -1,89 +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_PaymentPreimageAPIErrorZ : CommonBase {
-       Result_PaymentPreimageAPIErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_PaymentPreimageAPIErrorZ() {
-               if (ptr != 0) { bindings.CResult_PaymentPreimageAPIErrorZ_free(ptr); }
-       }
-
-       internal static Result_PaymentPreimageAPIErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_PaymentPreimageAPIErrorZ_is_ok(ptr)) {
-                       return new Result_PaymentPreimageAPIErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_PaymentPreimageAPIErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_PaymentPreimageAPIErrorZ_OK : Result_PaymentPreimageAPIErrorZ {
-               public readonly byte[] res;
-               internal Result_PaymentPreimageAPIErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult_PaymentPreimageAPIErrorZ_get_ok(ptr);
-               }
-       }
-
-       public class Result_PaymentPreimageAPIErrorZ_Err : Result_PaymentPreimageAPIErrorZ {
-               public readonly APIError err;
-               internal Result_PaymentPreimageAPIErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long err = bindings.CResult_PaymentPreimageAPIErrorZ_get_err(ptr);
-                       org.ldk.structs.APIError err_hu_conv = org.ldk.structs.APIError.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_PaymentPreimageAPIErrorZ in the success state.
-        */
-       public static Result_PaymentPreimageAPIErrorZ ok(byte[] o) {
-               long ret = bindings.CResult_PaymentPreimageAPIErrorZ_ok(InternalUtils.check_arr_len(o, 32));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentPreimageAPIErrorZ ret_hu_conv = Result_PaymentPreimageAPIErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_PaymentPreimageAPIErrorZ in the error state.
-        */
-       public static Result_PaymentPreimageAPIErrorZ err(org.ldk.structs.APIError e) {
-               long ret = bindings.CResult_PaymentPreimageAPIErrorZ_err(e.ptr);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentPreimageAPIErrorZ ret_hu_conv = Result_PaymentPreimageAPIErrorZ.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_PaymentPreimageAPIErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_PaymentPreimageAPIErrorZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_PaymentPreimageAPIErrorZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_PaymentPreimageAPIErrorZ clone() {
-               long ret = bindings.CResult_PaymentPreimageAPIErrorZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentPreimageAPIErrorZ ret_hu_conv = Result_PaymentPreimageAPIErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_PaymentRelayDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_PaymentRelayDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..fbc7f87
--- /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_PaymentRelayDecodeErrorZ : CommonBase {
+       Result_PaymentRelayDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_PaymentRelayDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_PaymentRelayDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_PaymentRelayDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_PaymentRelayDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_PaymentRelayDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_PaymentRelayDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_PaymentRelayDecodeErrorZ_OK : Result_PaymentRelayDecodeErrorZ {
+               public readonly PaymentRelay res;
+               internal Result_PaymentRelayDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_PaymentRelayDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.PaymentRelay res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.PaymentRelay(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_PaymentRelayDecodeErrorZ_Err : Result_PaymentRelayDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_PaymentRelayDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_PaymentRelayDecodeErrorZ_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_PaymentRelayDecodeErrorZ in the success state.
+        */
+       public static Result_PaymentRelayDecodeErrorZ ok(org.ldk.structs.PaymentRelay o) {
+               long ret = bindings.CResult_PaymentRelayDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PaymentRelayDecodeErrorZ ret_hu_conv = Result_PaymentRelayDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_PaymentRelayDecodeErrorZ in the error state.
+        */
+       public static Result_PaymentRelayDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_PaymentRelayDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PaymentRelayDecodeErrorZ ret_hu_conv = Result_PaymentRelayDecodeErrorZ.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_PaymentRelayDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_PaymentRelayDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_PaymentRelayDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_PaymentRelayDecodeErrorZ clone() {
+               long ret = bindings.CResult_PaymentRelayDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PaymentRelayDecodeErrorZ ret_hu_conv = Result_PaymentRelayDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_PaymentSecretNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_PaymentSecretNoneZ.cs
deleted file mode 100644 (file)
index 8703dfe..0000000
+++ /dev/null
@@ -1,82 +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_PaymentSecretNoneZ : CommonBase {
-       Result_PaymentSecretNoneZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_PaymentSecretNoneZ() {
-               if (ptr != 0) { bindings.CResult_PaymentSecretNoneZ_free(ptr); }
-       }
-
-       internal static Result_PaymentSecretNoneZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_PaymentSecretNoneZ_is_ok(ptr)) {
-                       return new Result_PaymentSecretNoneZ_OK(null, ptr);
-               } else {
-                       return new Result_PaymentSecretNoneZ_Err(null, ptr);
-               }
-       }
-       public class Result_PaymentSecretNoneZ_OK : Result_PaymentSecretNoneZ {
-               public readonly byte[] res;
-               internal Result_PaymentSecretNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult_PaymentSecretNoneZ_get_ok(ptr);
-               }
-       }
-
-       public class Result_PaymentSecretNoneZ_Err : Result_PaymentSecretNoneZ {
-               internal Result_PaymentSecretNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-               }
-       }
-
-       /**
-        * Creates a new CResult_PaymentSecretNoneZ in the success state.
-        */
-       public static Result_PaymentSecretNoneZ ok(byte[] o) {
-               long ret = bindings.CResult_PaymentSecretNoneZ_ok(InternalUtils.check_arr_len(o, 32));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentSecretNoneZ ret_hu_conv = Result_PaymentSecretNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_PaymentSecretNoneZ in the error state.
-        */
-       public static Result_PaymentSecretNoneZ err() {
-               long ret = bindings.CResult_PaymentSecretNoneZ_err();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentSecretNoneZ ret_hu_conv = Result_PaymentSecretNoneZ.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_PaymentSecretNoneZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_PaymentSecretNoneZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_PaymentSecretNoneZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_PaymentSecretNoneZ clone() {
-               long ret = bindings.CResult_PaymentSecretNoneZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentSecretNoneZ ret_hu_conv = Result_PaymentSecretNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_PeeledOnionNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_PeeledOnionNoneZ.cs
new file mode 100644 (file)
index 0000000..176dd41
--- /dev/null
@@ -0,0 +1,68 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_PeeledOnionNoneZ : CommonBase {
+       Result_PeeledOnionNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_PeeledOnionNoneZ() {
+               if (ptr != 0) { bindings.CResult_PeeledOnionNoneZ_free(ptr); }
+       }
+
+       internal static Result_PeeledOnionNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_PeeledOnionNoneZ_is_ok(ptr)) {
+                       return new Result_PeeledOnionNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_PeeledOnionNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_PeeledOnionNoneZ_OK : Result_PeeledOnionNoneZ {
+               public readonly PeeledOnion res;
+               internal Result_PeeledOnionNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_PeeledOnionNoneZ_get_ok(ptr);
+                       org.ldk.structs.PeeledOnion res_hu_conv = org.ldk.structs.PeeledOnion.constr_from_ptr(res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_PeeledOnionNoneZ_Err : Result_PeeledOnionNoneZ {
+               internal Result_PeeledOnionNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_PeeledOnionNoneZ in the success state.
+        */
+       public static Result_PeeledOnionNoneZ ok(org.ldk.structs.PeeledOnion o) {
+               long ret = bindings.CResult_PeeledOnionNoneZ_ok(o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PeeledOnionNoneZ ret_hu_conv = Result_PeeledOnionNoneZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_PeeledOnionNoneZ in the error state.
+        */
+       public static Result_PeeledOnionNoneZ err() {
+               long ret = bindings.CResult_PeeledOnionNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PeeledOnionNoneZ ret_hu_conv = Result_PeeledOnionNoneZ.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_PeeledOnionNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_PublicKeyErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_PublicKeyErrorZ.cs
deleted file mode 100644 (file)
index a8d116e..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_PublicKeyErrorZ : CommonBase {
-       Result_PublicKeyErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_PublicKeyErrorZ() {
-               if (ptr != 0) { bindings.CResult_PublicKeyErrorZ_free(ptr); }
-       }
-
-       internal static Result_PublicKeyErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_PublicKeyErrorZ_is_ok(ptr)) {
-                       return new Result_PublicKeyErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_PublicKeyErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_PublicKeyErrorZ_OK : Result_PublicKeyErrorZ {
-               public readonly byte[] res;
-               internal Result_PublicKeyErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult_PublicKeyErrorZ_get_ok(ptr);
-               }
-       }
-
-       public class Result_PublicKeyErrorZ_Err : Result_PublicKeyErrorZ {
-               public readonly Secp256k1Error err;
-               internal Result_PublicKeyErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.err = bindings.CResult_PublicKeyErrorZ_get_err(ptr);
-               }
-       }
-
-       /**
-        * Creates a new CResult_PublicKeyErrorZ in the success state.
-        */
-       public static Result_PublicKeyErrorZ ok(byte[] o) {
-               long ret = bindings.CResult_PublicKeyErrorZ_ok(InternalUtils.check_arr_len(o, 33));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PublicKeyErrorZ ret_hu_conv = Result_PublicKeyErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_PublicKeyErrorZ in the error state.
-        */
-       public static Result_PublicKeyErrorZ err(Secp256k1Error e) {
-               long ret = bindings.CResult_PublicKeyErrorZ_err(e);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PublicKeyErrorZ ret_hu_conv = Result_PublicKeyErrorZ.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_PublicKeyErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_PublicKeyErrorZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_PublicKeyErrorZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_PublicKeyErrorZ clone() {
-               long ret = bindings.CResult_PublicKeyErrorZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PublicKeyErrorZ ret_hu_conv = Result_PublicKeyErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
index 4ba3b85340ac57af8fad0d9c098c364a73badbce..709b856ac7944b9b408222ff0bbe6fcbfb4247e6 100644 (file)
@@ -21,7 +21,9 @@ public class Result_PublicKeyNoneZ : CommonBase {
        public class Result_PublicKeyNoneZ_OK : Result_PublicKeyNoneZ {
                public readonly byte[] res;
                internal Result_PublicKeyNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult_PublicKeyNoneZ_get_ok(ptr);
+                       long res = bindings.CResult_PublicKeyNoneZ_get_ok(ptr);
+                       byte[] res_conv = InternalUtils.decodeUint8Array(res);
+                       this.res = res_conv;
                }
        }
 
@@ -34,7 +36,7 @@ public class Result_PublicKeyNoneZ : CommonBase {
         * Creates a new CResult_PublicKeyNoneZ in the success state.
         */
        public static Result_PublicKeyNoneZ ok(byte[] o) {
-               long ret = bindings.CResult_PublicKeyNoneZ_ok(InternalUtils.check_arr_len(o, 33));
+               long ret = bindings.CResult_PublicKeyNoneZ_ok(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(o, 33)));
                GC.KeepAlive(o);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_PublicKeyNoneZ ret_hu_conv = Result_PublicKeyNoneZ.constr_from_ptr(ret);
diff --git a/c_sharp/src/org/ldk/structs/Result_PublicKeySecp256k1ErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_PublicKeySecp256k1ErrorZ.cs
new file mode 100644 (file)
index 0000000..3ad8879
--- /dev/null
@@ -0,0 +1,87 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_PublicKeySecp256k1ErrorZ : CommonBase {
+       Result_PublicKeySecp256k1ErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_PublicKeySecp256k1ErrorZ() {
+               if (ptr != 0) { bindings.CResult_PublicKeySecp256k1ErrorZ_free(ptr); }
+       }
+
+       internal static Result_PublicKeySecp256k1ErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_PublicKeySecp256k1ErrorZ_is_ok(ptr)) {
+                       return new Result_PublicKeySecp256k1ErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_PublicKeySecp256k1ErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_PublicKeySecp256k1ErrorZ_OK : Result_PublicKeySecp256k1ErrorZ {
+               public readonly byte[] res;
+               internal Result_PublicKeySecp256k1ErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_PublicKeySecp256k1ErrorZ_get_ok(ptr);
+                       byte[] res_conv = InternalUtils.decodeUint8Array(res);
+                       this.res = res_conv;
+               }
+       }
+
+       public class Result_PublicKeySecp256k1ErrorZ_Err : Result_PublicKeySecp256k1ErrorZ {
+               public readonly Secp256k1Error err;
+               internal Result_PublicKeySecp256k1ErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       this.err = bindings.CResult_PublicKeySecp256k1ErrorZ_get_err(ptr);
+               }
+       }
+
+       /**
+        * Creates a new CResult_PublicKeySecp256k1ErrorZ in the success state.
+        */
+       public static Result_PublicKeySecp256k1ErrorZ ok(byte[] o) {
+               long ret = bindings.CResult_PublicKeySecp256k1ErrorZ_ok(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(o, 33)));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PublicKeySecp256k1ErrorZ ret_hu_conv = Result_PublicKeySecp256k1ErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_PublicKeySecp256k1ErrorZ in the error state.
+        */
+       public static Result_PublicKeySecp256k1ErrorZ err(Secp256k1Error e) {
+               long ret = bindings.CResult_PublicKeySecp256k1ErrorZ_err(e);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PublicKeySecp256k1ErrorZ ret_hu_conv = Result_PublicKeySecp256k1ErrorZ.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_PublicKeySecp256k1ErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_PublicKeySecp256k1ErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_PublicKeySecp256k1ErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_PublicKeySecp256k1ErrorZ clone() {
+               long ret = bindings.CResult_PublicKeySecp256k1ErrorZ_clone(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;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_ReceiveTlvsDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_ReceiveTlvsDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..47e6f89
--- /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_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_RecipientOnionFieldsNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_RecipientOnionFieldsNoneZ.cs
new file mode 100644 (file)
index 0000000..3dfe1b7
--- /dev/null
@@ -0,0 +1,86 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_RecipientOnionFieldsNoneZ : CommonBase {
+       Result_RecipientOnionFieldsNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_RecipientOnionFieldsNoneZ() {
+               if (ptr != 0) { bindings.CResult_RecipientOnionFieldsNoneZ_free(ptr); }
+       }
+
+       internal static Result_RecipientOnionFieldsNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_RecipientOnionFieldsNoneZ_is_ok(ptr)) {
+                       return new Result_RecipientOnionFieldsNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_RecipientOnionFieldsNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_RecipientOnionFieldsNoneZ_OK : Result_RecipientOnionFieldsNoneZ {
+               public readonly RecipientOnionFields res;
+               internal Result_RecipientOnionFieldsNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_RecipientOnionFieldsNoneZ_get_ok(ptr);
+                       org.ldk.structs.RecipientOnionFields res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.RecipientOnionFields(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_RecipientOnionFieldsNoneZ_Err : Result_RecipientOnionFieldsNoneZ {
+               internal Result_RecipientOnionFieldsNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_RecipientOnionFieldsNoneZ in the success state.
+        */
+       public static Result_RecipientOnionFieldsNoneZ ok(org.ldk.structs.RecipientOnionFields o) {
+               long ret = bindings.CResult_RecipientOnionFieldsNoneZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_RecipientOnionFieldsNoneZ ret_hu_conv = Result_RecipientOnionFieldsNoneZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_RecipientOnionFieldsNoneZ in the error state.
+        */
+       public static Result_RecipientOnionFieldsNoneZ err() {
+               long ret = bindings.CResult_RecipientOnionFieldsNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_RecipientOnionFieldsNoneZ ret_hu_conv = Result_RecipientOnionFieldsNoneZ.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_RecipientOnionFieldsNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_RecipientOnionFieldsNoneZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_RecipientOnionFieldsNoneZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_RecipientOnionFieldsNoneZ clone() {
+               long ret = bindings.CResult_RecipientOnionFieldsNoneZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_RecipientOnionFieldsNoneZ ret_hu_conv = Result_RecipientOnionFieldsNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
index d6e6f3e324cfcd25c217deb3b0a22bac56ee94d4..fb71b63a6cace0b9c9323f0cb102a03756164f4a 100644 (file)
@@ -21,7 +21,9 @@ public class Result_RecoverableSignatureNoneZ : CommonBase {
        public class Result_RecoverableSignatureNoneZ_OK : Result_RecoverableSignatureNoneZ {
                public readonly byte[] res;
                internal Result_RecoverableSignatureNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult_RecoverableSignatureNoneZ_get_ok(ptr);
+                       long res = bindings.CResult_RecoverableSignatureNoneZ_get_ok(ptr);
+                       byte[] res_conv = InternalUtils.decodeUint8Array(res);
+                       this.res = res_conv;
                }
        }
 
@@ -34,7 +36,7 @@ public class Result_RecoverableSignatureNoneZ : CommonBase {
         * Creates a new CResult_RecoverableSignatureNoneZ in the success state.
         */
        public static Result_RecoverableSignatureNoneZ ok(byte[] o) {
-               long ret = bindings.CResult_RecoverableSignatureNoneZ_ok(InternalUtils.check_arr_len(o, 68));
+               long ret = bindings.CResult_RecoverableSignatureNoneZ_ok(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(o, 68)));
                GC.KeepAlive(o);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_RecoverableSignatureNoneZ ret_hu_conv = Result_RecoverableSignatureNoneZ.constr_from_ptr(ret);
diff --git a/c_sharp/src/org/ldk/structs/Result_RetryDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_RetryDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..db35a4d
--- /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_RetryDecodeErrorZ : CommonBase {
+       Result_RetryDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_RetryDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_RetryDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_RetryDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_RetryDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_RetryDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_RetryDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_RetryDecodeErrorZ_OK : Result_RetryDecodeErrorZ {
+               public readonly Retry res;
+               internal Result_RetryDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_RetryDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.Retry res_hu_conv = org.ldk.structs.Retry.constr_from_ptr(res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_RetryDecodeErrorZ_Err : Result_RetryDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_RetryDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_RetryDecodeErrorZ_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_RetryDecodeErrorZ in the success state.
+        */
+       public static Result_RetryDecodeErrorZ ok(org.ldk.structs.Retry o) {
+               long ret = bindings.CResult_RetryDecodeErrorZ_ok(o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_RetryDecodeErrorZ ret_hu_conv = Result_RetryDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_RetryDecodeErrorZ in the error state.
+        */
+       public static Result_RetryDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_RetryDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_RetryDecodeErrorZ ret_hu_conv = Result_RetryDecodeErrorZ.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_RetryDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_RetryDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_RetryDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_RetryDecodeErrorZ clone() {
+               long ret = bindings.CResult_RetryDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_RetryDecodeErrorZ ret_hu_conv = Result_RetryDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_SchnorrSignatureNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_SchnorrSignatureNoneZ.cs
new file mode 100644 (file)
index 0000000..0742fb2
--- /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_SchnorrSignatureNoneZ : CommonBase {
+       Result_SchnorrSignatureNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_SchnorrSignatureNoneZ() {
+               if (ptr != 0) { bindings.CResult_SchnorrSignatureNoneZ_free(ptr); }
+       }
+
+       internal static Result_SchnorrSignatureNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_SchnorrSignatureNoneZ_is_ok(ptr)) {
+                       return new Result_SchnorrSignatureNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_SchnorrSignatureNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_SchnorrSignatureNoneZ_OK : Result_SchnorrSignatureNoneZ {
+               public readonly byte[] res;
+               internal Result_SchnorrSignatureNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_SchnorrSignatureNoneZ_get_ok(ptr);
+                       byte[] res_conv = InternalUtils.decodeUint8Array(res);
+                       this.res = res_conv;
+               }
+       }
+
+       public class Result_SchnorrSignatureNoneZ_Err : Result_SchnorrSignatureNoneZ {
+               internal Result_SchnorrSignatureNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_SchnorrSignatureNoneZ in the success state.
+        */
+       public static Result_SchnorrSignatureNoneZ ok(byte[] o) {
+               long ret = bindings.CResult_SchnorrSignatureNoneZ_ok(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(o, 64)));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SchnorrSignatureNoneZ ret_hu_conv = Result_SchnorrSignatureNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_SchnorrSignatureNoneZ in the error state.
+        */
+       public static Result_SchnorrSignatureNoneZ err() {
+               long ret = bindings.CResult_SchnorrSignatureNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SchnorrSignatureNoneZ ret_hu_conv = Result_SchnorrSignatureNoneZ.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_SchnorrSignatureNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_SchnorrSignatureNoneZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_SchnorrSignatureNoneZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_SchnorrSignatureNoneZ clone() {
+               long ret = bindings.CResult_SchnorrSignatureNoneZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SchnorrSignatureNoneZ ret_hu_conv = Result_SchnorrSignatureNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_ScriptNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_ScriptNoneZ.cs
deleted file mode 100644 (file)
index 0d3637d..0000000
+++ /dev/null
@@ -1,82 +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_ScriptNoneZ : CommonBase {
-       Result_ScriptNoneZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_ScriptNoneZ() {
-               if (ptr != 0) { bindings.CResult_ScriptNoneZ_free(ptr); }
-       }
-
-       internal static Result_ScriptNoneZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_ScriptNoneZ_is_ok(ptr)) {
-                       return new Result_ScriptNoneZ_OK(null, ptr);
-               } else {
-                       return new Result_ScriptNoneZ_Err(null, ptr);
-               }
-       }
-       public class Result_ScriptNoneZ_OK : Result_ScriptNoneZ {
-               public readonly byte[] res;
-               internal Result_ScriptNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult_ScriptNoneZ_get_ok(ptr);
-               }
-       }
-
-       public class Result_ScriptNoneZ_Err : Result_ScriptNoneZ {
-               internal Result_ScriptNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-               }
-       }
-
-       /**
-        * Creates a new CResult_ScriptNoneZ in the success state.
-        */
-       public static Result_ScriptNoneZ ok(byte[] o) {
-               long ret = bindings.CResult_ScriptNoneZ_ok(o);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_ScriptNoneZ ret_hu_conv = Result_ScriptNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_ScriptNoneZ in the error state.
-        */
-       public static Result_ScriptNoneZ err() {
-               long ret = bindings.CResult_ScriptNoneZ_err();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_ScriptNoneZ ret_hu_conv = Result_ScriptNoneZ.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_ScriptNoneZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_ScriptNoneZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_ScriptNoneZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_ScriptNoneZ clone() {
-               long ret = bindings.CResult_ScriptNoneZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_ScriptNoneZ ret_hu_conv = Result_ScriptNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_SharedSecretNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_SharedSecretNoneZ.cs
deleted file mode 100644 (file)
index 2cca4f4..0000000
+++ /dev/null
@@ -1,82 +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_SharedSecretNoneZ : CommonBase {
-       Result_SharedSecretNoneZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_SharedSecretNoneZ() {
-               if (ptr != 0) { bindings.CResult_SharedSecretNoneZ_free(ptr); }
-       }
-
-       internal static Result_SharedSecretNoneZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_SharedSecretNoneZ_is_ok(ptr)) {
-                       return new Result_SharedSecretNoneZ_OK(null, ptr);
-               } else {
-                       return new Result_SharedSecretNoneZ_Err(null, ptr);
-               }
-       }
-       public class Result_SharedSecretNoneZ_OK : Result_SharedSecretNoneZ {
-               public readonly byte[] res;
-               internal Result_SharedSecretNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult_SharedSecretNoneZ_get_ok(ptr);
-               }
-       }
-
-       public class Result_SharedSecretNoneZ_Err : Result_SharedSecretNoneZ {
-               internal Result_SharedSecretNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-               }
-       }
-
-       /**
-        * Creates a new CResult_SharedSecretNoneZ in the success state.
-        */
-       public static Result_SharedSecretNoneZ ok(byte[] o) {
-               long ret = bindings.CResult_SharedSecretNoneZ_ok(InternalUtils.check_arr_len(o, 32));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_SharedSecretNoneZ ret_hu_conv = Result_SharedSecretNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_SharedSecretNoneZ in the error state.
-        */
-       public static Result_SharedSecretNoneZ err() {
-               long ret = bindings.CResult_SharedSecretNoneZ_err();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_SharedSecretNoneZ ret_hu_conv = Result_SharedSecretNoneZ.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_SharedSecretNoneZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_SharedSecretNoneZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_SharedSecretNoneZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_SharedSecretNoneZ clone() {
-               long ret = bindings.CResult_SharedSecretNoneZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_SharedSecretNoneZ ret_hu_conv = Result_SharedSecretNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_SignatureNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_SignatureNoneZ.cs
deleted file mode 100644 (file)
index 31a1931..0000000
+++ /dev/null
@@ -1,82 +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_SignatureNoneZ : CommonBase {
-       Result_SignatureNoneZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_SignatureNoneZ() {
-               if (ptr != 0) { bindings.CResult_SignatureNoneZ_free(ptr); }
-       }
-
-       internal static Result_SignatureNoneZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_SignatureNoneZ_is_ok(ptr)) {
-                       return new Result_SignatureNoneZ_OK(null, ptr);
-               } else {
-                       return new Result_SignatureNoneZ_Err(null, ptr);
-               }
-       }
-       public class Result_SignatureNoneZ_OK : Result_SignatureNoneZ {
-               public readonly byte[] res;
-               internal Result_SignatureNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult_SignatureNoneZ_get_ok(ptr);
-               }
-       }
-
-       public class Result_SignatureNoneZ_Err : Result_SignatureNoneZ {
-               internal Result_SignatureNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-               }
-       }
-
-       /**
-        * Creates a new CResult_SignatureNoneZ in the success state.
-        */
-       public static Result_SignatureNoneZ ok(byte[] o) {
-               long ret = bindings.CResult_SignatureNoneZ_ok(InternalUtils.check_arr_len(o, 64));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_SignatureNoneZ ret_hu_conv = Result_SignatureNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_SignatureNoneZ in the error state.
-        */
-       public static Result_SignatureNoneZ err() {
-               long ret = bindings.CResult_SignatureNoneZ_err();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_SignatureNoneZ ret_hu_conv = Result_SignatureNoneZ.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_SignatureNoneZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_SignatureNoneZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_SignatureNoneZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_SignatureNoneZ clone() {
-               long ret = bindings.CResult_SignatureNoneZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_SignatureNoneZ ret_hu_conv = Result_SignatureNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_SocketAddressDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_SocketAddressDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..4752af6
--- /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_SocketAddressDecodeErrorZ : CommonBase {
+       Result_SocketAddressDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_SocketAddressDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_SocketAddressDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_SocketAddressDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_SocketAddressDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_SocketAddressDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_SocketAddressDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_SocketAddressDecodeErrorZ_OK : Result_SocketAddressDecodeErrorZ {
+               public readonly SocketAddress res;
+               internal Result_SocketAddressDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_SocketAddressDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.SocketAddress res_hu_conv = org.ldk.structs.SocketAddress.constr_from_ptr(res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_SocketAddressDecodeErrorZ_Err : Result_SocketAddressDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_SocketAddressDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_SocketAddressDecodeErrorZ_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_SocketAddressDecodeErrorZ in the success state.
+        */
+       public static Result_SocketAddressDecodeErrorZ ok(org.ldk.structs.SocketAddress o) {
+               long ret = bindings.CResult_SocketAddressDecodeErrorZ_ok(o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SocketAddressDecodeErrorZ ret_hu_conv = Result_SocketAddressDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_SocketAddressDecodeErrorZ in the error state.
+        */
+       public static Result_SocketAddressDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_SocketAddressDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SocketAddressDecodeErrorZ ret_hu_conv = Result_SocketAddressDecodeErrorZ.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_SocketAddressDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_SocketAddressDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_SocketAddressDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_SocketAddressDecodeErrorZ clone() {
+               long ret = bindings.CResult_SocketAddressDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SocketAddressDecodeErrorZ ret_hu_conv = Result_SocketAddressDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_SocketAddressSocketAddressParseErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_SocketAddressSocketAddressParseErrorZ.cs
new file mode 100644 (file)
index 0000000..6972f8c
--- /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_SocketAddressSocketAddressParseErrorZ : CommonBase {
+       Result_SocketAddressSocketAddressParseErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_SocketAddressSocketAddressParseErrorZ() {
+               if (ptr != 0) { bindings.CResult_SocketAddressSocketAddressParseErrorZ_free(ptr); }
+       }
+
+       internal static Result_SocketAddressSocketAddressParseErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_SocketAddressSocketAddressParseErrorZ_is_ok(ptr)) {
+                       return new Result_SocketAddressSocketAddressParseErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_SocketAddressSocketAddressParseErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_SocketAddressSocketAddressParseErrorZ_OK : Result_SocketAddressSocketAddressParseErrorZ {
+               public readonly SocketAddress res;
+               internal Result_SocketAddressSocketAddressParseErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_SocketAddressSocketAddressParseErrorZ_get_ok(ptr);
+                       org.ldk.structs.SocketAddress res_hu_conv = org.ldk.structs.SocketAddress.constr_from_ptr(res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_SocketAddressSocketAddressParseErrorZ_Err : Result_SocketAddressSocketAddressParseErrorZ {
+               public readonly SocketAddressParseError err;
+               internal Result_SocketAddressSocketAddressParseErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       this.err = bindings.CResult_SocketAddressSocketAddressParseErrorZ_get_err(ptr);
+               }
+       }
+
+       /**
+        * Creates a new CResult_SocketAddressSocketAddressParseErrorZ in the success state.
+        */
+       public static Result_SocketAddressSocketAddressParseErrorZ ok(org.ldk.structs.SocketAddress o) {
+               long ret = bindings.CResult_SocketAddressSocketAddressParseErrorZ_ok(o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SocketAddressSocketAddressParseErrorZ ret_hu_conv = Result_SocketAddressSocketAddressParseErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_SocketAddressSocketAddressParseErrorZ in the error state.
+        */
+       public static Result_SocketAddressSocketAddressParseErrorZ err(SocketAddressParseError e) {
+               long ret = bindings.CResult_SocketAddressSocketAddressParseErrorZ_err(e);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SocketAddressSocketAddressParseErrorZ ret_hu_conv = Result_SocketAddressSocketAddressParseErrorZ.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_SocketAddressSocketAddressParseErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_SocketAddressSocketAddressParseErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_SocketAddressSocketAddressParseErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_SocketAddressSocketAddressParseErrorZ clone() {
+               long ret = bindings.CResult_SocketAddressSocketAddressParseErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SocketAddressSocketAddressParseErrorZ ret_hu_conv = Result_SocketAddressSocketAddressParseErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_StrSecp256k1ErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_StrSecp256k1ErrorZ.cs
new file mode 100644 (file)
index 0000000..421ccb3
--- /dev/null
@@ -0,0 +1,87 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_StrSecp256k1ErrorZ : CommonBase {
+       Result_StrSecp256k1ErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_StrSecp256k1ErrorZ() {
+               if (ptr != 0) { bindings.CResult_StrSecp256k1ErrorZ_free(ptr); }
+       }
+
+       internal static Result_StrSecp256k1ErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_StrSecp256k1ErrorZ_is_ok(ptr)) {
+                       return new Result_StrSecp256k1ErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_StrSecp256k1ErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_StrSecp256k1ErrorZ_OK : Result_StrSecp256k1ErrorZ {
+               public readonly string res;
+               internal Result_StrSecp256k1ErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_StrSecp256k1ErrorZ_get_ok(ptr);
+                       string res_conv = InternalUtils.decodeString(res);
+                       this.res = res_conv;
+               }
+       }
+
+       public class Result_StrSecp256k1ErrorZ_Err : Result_StrSecp256k1ErrorZ {
+               public readonly Secp256k1Error err;
+               internal Result_StrSecp256k1ErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       this.err = bindings.CResult_StrSecp256k1ErrorZ_get_err(ptr);
+               }
+       }
+
+       /**
+        * Creates a new CResult_StrSecp256k1ErrorZ in the success state.
+        */
+       public static Result_StrSecp256k1ErrorZ ok(string o) {
+               long ret = bindings.CResult_StrSecp256k1ErrorZ_ok(InternalUtils.encodeString(o));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_StrSecp256k1ErrorZ ret_hu_conv = Result_StrSecp256k1ErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_StrSecp256k1ErrorZ in the error state.
+        */
+       public static Result_StrSecp256k1ErrorZ err(Secp256k1Error e) {
+               long ret = bindings.CResult_StrSecp256k1ErrorZ_err(e);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_StrSecp256k1ErrorZ ret_hu_conv = Result_StrSecp256k1ErrorZ.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_StrSecp256k1ErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_StrSecp256k1ErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_StrSecp256k1ErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_StrSecp256k1ErrorZ clone() {
+               long ret = bindings.CResult_StrSecp256k1ErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_StrSecp256k1ErrorZ ret_hu_conv = Result_StrSecp256k1ErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_StringErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_StringErrorZ.cs
deleted file mode 100644 (file)
index fb46905..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_StringErrorZ : CommonBase {
-       Result_StringErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_StringErrorZ() {
-               if (ptr != 0) { bindings.CResult_StringErrorZ_free(ptr); }
-       }
-
-       internal static Result_StringErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_StringErrorZ_is_ok(ptr)) {
-                       return new Result_StringErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_StringErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_StringErrorZ_OK : Result_StringErrorZ {
-               public readonly string res;
-               internal Result_StringErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult_StringErrorZ_get_ok(ptr);
-               }
-       }
-
-       public class Result_StringErrorZ_Err : Result_StringErrorZ {
-               public readonly Secp256k1Error err;
-               internal Result_StringErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.err = bindings.CResult_StringErrorZ_get_err(ptr);
-               }
-       }
-
-       /**
-        * Creates a new CResult_StringErrorZ in the success state.
-        */
-       public static Result_StringErrorZ ok(string o) {
-               long ret = bindings.CResult_StringErrorZ_ok(o);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_StringErrorZ ret_hu_conv = Result_StringErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_StringErrorZ in the error state.
-        */
-       public static Result_StringErrorZ err(Secp256k1Error e) {
-               long ret = bindings.CResult_StringErrorZ_err(e);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_StringErrorZ ret_hu_conv = Result_StringErrorZ.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_StringErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_StringErrorZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_StringErrorZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_StringErrorZ clone() {
-               long ret = bindings.CResult_StringErrorZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_StringErrorZ ret_hu_conv = Result_StringErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_ThirtyTwoBytesAPIErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_ThirtyTwoBytesAPIErrorZ.cs
new file mode 100644 (file)
index 0000000..44bfed1
--- /dev/null
@@ -0,0 +1,91 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_ThirtyTwoBytesAPIErrorZ : CommonBase {
+       Result_ThirtyTwoBytesAPIErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_ThirtyTwoBytesAPIErrorZ() {
+               if (ptr != 0) { bindings.CResult_ThirtyTwoBytesAPIErrorZ_free(ptr); }
+       }
+
+       internal static Result_ThirtyTwoBytesAPIErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_ThirtyTwoBytesAPIErrorZ_is_ok(ptr)) {
+                       return new Result_ThirtyTwoBytesAPIErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_ThirtyTwoBytesAPIErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_ThirtyTwoBytesAPIErrorZ_OK : Result_ThirtyTwoBytesAPIErrorZ {
+               public readonly byte[] res;
+               internal Result_ThirtyTwoBytesAPIErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_ThirtyTwoBytesAPIErrorZ_get_ok(ptr);
+                       byte[] res_conv = InternalUtils.decodeUint8Array(res);
+                       this.res = res_conv;
+               }
+       }
+
+       public class Result_ThirtyTwoBytesAPIErrorZ_Err : Result_ThirtyTwoBytesAPIErrorZ {
+               public readonly APIError err;
+               internal Result_ThirtyTwoBytesAPIErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_ThirtyTwoBytesAPIErrorZ_get_err(ptr);
+                       org.ldk.structs.APIError err_hu_conv = org.ldk.structs.APIError.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_ThirtyTwoBytesAPIErrorZ in the success state.
+        */
+       public static Result_ThirtyTwoBytesAPIErrorZ ok(byte[] o) {
+               long ret = bindings.CResult_ThirtyTwoBytesAPIErrorZ_ok(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(o, 32)));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ThirtyTwoBytesAPIErrorZ ret_hu_conv = Result_ThirtyTwoBytesAPIErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_ThirtyTwoBytesAPIErrorZ in the error state.
+        */
+       public static Result_ThirtyTwoBytesAPIErrorZ err(org.ldk.structs.APIError e) {
+               long ret = bindings.CResult_ThirtyTwoBytesAPIErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ThirtyTwoBytesAPIErrorZ ret_hu_conv = Result_ThirtyTwoBytesAPIErrorZ.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_ThirtyTwoBytesAPIErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_ThirtyTwoBytesAPIErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_ThirtyTwoBytesAPIErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_ThirtyTwoBytesAPIErrorZ clone() {
+               long ret = bindings.CResult_ThirtyTwoBytesAPIErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ThirtyTwoBytesAPIErrorZ ret_hu_conv = Result_ThirtyTwoBytesAPIErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_ThirtyTwoBytesNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_ThirtyTwoBytesNoneZ.cs
new file mode 100644 (file)
index 0000000..f60ea01
--- /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_ThirtyTwoBytesNoneZ : CommonBase {
+       Result_ThirtyTwoBytesNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_ThirtyTwoBytesNoneZ() {
+               if (ptr != 0) { bindings.CResult_ThirtyTwoBytesNoneZ_free(ptr); }
+       }
+
+       internal static Result_ThirtyTwoBytesNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_ThirtyTwoBytesNoneZ_is_ok(ptr)) {
+                       return new Result_ThirtyTwoBytesNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_ThirtyTwoBytesNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_ThirtyTwoBytesNoneZ_OK : Result_ThirtyTwoBytesNoneZ {
+               public readonly byte[] res;
+               internal Result_ThirtyTwoBytesNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_ThirtyTwoBytesNoneZ_get_ok(ptr);
+                       byte[] res_conv = InternalUtils.decodeUint8Array(res);
+                       this.res = res_conv;
+               }
+       }
+
+       public class Result_ThirtyTwoBytesNoneZ_Err : Result_ThirtyTwoBytesNoneZ {
+               internal Result_ThirtyTwoBytesNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_ThirtyTwoBytesNoneZ in the success state.
+        */
+       public static Result_ThirtyTwoBytesNoneZ ok(byte[] o) {
+               long ret = bindings.CResult_ThirtyTwoBytesNoneZ_ok(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(o, 32)));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ThirtyTwoBytesNoneZ ret_hu_conv = Result_ThirtyTwoBytesNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_ThirtyTwoBytesNoneZ in the error state.
+        */
+       public static Result_ThirtyTwoBytesNoneZ err() {
+               long ret = bindings.CResult_ThirtyTwoBytesNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ThirtyTwoBytesNoneZ ret_hu_conv = Result_ThirtyTwoBytesNoneZ.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_ThirtyTwoBytesNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_ThirtyTwoBytesNoneZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_ThirtyTwoBytesNoneZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_ThirtyTwoBytesNoneZ clone() {
+               long ret = bindings.CResult_ThirtyTwoBytesNoneZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ThirtyTwoBytesNoneZ ret_hu_conv = Result_ThirtyTwoBytesNoneZ.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
new file mode 100644 (file)
index 0000000..2b15ab1
--- /dev/null
@@ -0,0 +1,91 @@
+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_ThirtyTwoBytesPaymentSendFailureZ.cs b/c_sharp/src/org/ldk/structs/Result_ThirtyTwoBytesPaymentSendFailureZ.cs
new file mode 100644 (file)
index 0000000..f3869ba
--- /dev/null
@@ -0,0 +1,91 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_ThirtyTwoBytesPaymentSendFailureZ : CommonBase {
+       Result_ThirtyTwoBytesPaymentSendFailureZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_ThirtyTwoBytesPaymentSendFailureZ() {
+               if (ptr != 0) { bindings.CResult_ThirtyTwoBytesPaymentSendFailureZ_free(ptr); }
+       }
+
+       internal static Result_ThirtyTwoBytesPaymentSendFailureZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_ThirtyTwoBytesPaymentSendFailureZ_is_ok(ptr)) {
+                       return new Result_ThirtyTwoBytesPaymentSendFailureZ_OK(null, ptr);
+               } else {
+                       return new Result_ThirtyTwoBytesPaymentSendFailureZ_Err(null, ptr);
+               }
+       }
+       public class Result_ThirtyTwoBytesPaymentSendFailureZ_OK : Result_ThirtyTwoBytesPaymentSendFailureZ {
+               public readonly byte[] res;
+               internal Result_ThirtyTwoBytesPaymentSendFailureZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_ThirtyTwoBytesPaymentSendFailureZ_get_ok(ptr);
+                       byte[] res_conv = InternalUtils.decodeUint8Array(res);
+                       this.res = res_conv;
+               }
+       }
+
+       public class Result_ThirtyTwoBytesPaymentSendFailureZ_Err : Result_ThirtyTwoBytesPaymentSendFailureZ {
+               public readonly PaymentSendFailure err;
+               internal Result_ThirtyTwoBytesPaymentSendFailureZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_ThirtyTwoBytesPaymentSendFailureZ_get_err(ptr);
+                       org.ldk.structs.PaymentSendFailure err_hu_conv = org.ldk.structs.PaymentSendFailure.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_ThirtyTwoBytesPaymentSendFailureZ in the success state.
+        */
+       public static Result_ThirtyTwoBytesPaymentSendFailureZ ok(byte[] o) {
+               long ret = bindings.CResult_ThirtyTwoBytesPaymentSendFailureZ_ok(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(o, 32)));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ThirtyTwoBytesPaymentSendFailureZ ret_hu_conv = Result_ThirtyTwoBytesPaymentSendFailureZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_ThirtyTwoBytesPaymentSendFailureZ in the error state.
+        */
+       public static Result_ThirtyTwoBytesPaymentSendFailureZ err(org.ldk.structs.PaymentSendFailure e) {
+               long ret = bindings.CResult_ThirtyTwoBytesPaymentSendFailureZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ThirtyTwoBytesPaymentSendFailureZ ret_hu_conv = Result_ThirtyTwoBytesPaymentSendFailureZ.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_ThirtyTwoBytesPaymentSendFailureZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_ThirtyTwoBytesPaymentSendFailureZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_ThirtyTwoBytesPaymentSendFailureZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_ThirtyTwoBytesPaymentSendFailureZ clone() {
+               long ret = bindings.CResult_ThirtyTwoBytesPaymentSendFailureZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ThirtyTwoBytesPaymentSendFailureZ ret_hu_conv = Result_ThirtyTwoBytesPaymentSendFailureZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_ThirtyTwoBytesRetryableSendFailureZ.cs b/c_sharp/src/org/ldk/structs/Result_ThirtyTwoBytesRetryableSendFailureZ.cs
new file mode 100644 (file)
index 0000000..3a8da70
--- /dev/null
@@ -0,0 +1,87 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_ThirtyTwoBytesRetryableSendFailureZ : CommonBase {
+       Result_ThirtyTwoBytesRetryableSendFailureZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_ThirtyTwoBytesRetryableSendFailureZ() {
+               if (ptr != 0) { bindings.CResult_ThirtyTwoBytesRetryableSendFailureZ_free(ptr); }
+       }
+
+       internal static Result_ThirtyTwoBytesRetryableSendFailureZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_ThirtyTwoBytesRetryableSendFailureZ_is_ok(ptr)) {
+                       return new Result_ThirtyTwoBytesRetryableSendFailureZ_OK(null, ptr);
+               } else {
+                       return new Result_ThirtyTwoBytesRetryableSendFailureZ_Err(null, ptr);
+               }
+       }
+       public class Result_ThirtyTwoBytesRetryableSendFailureZ_OK : Result_ThirtyTwoBytesRetryableSendFailureZ {
+               public readonly byte[] res;
+               internal Result_ThirtyTwoBytesRetryableSendFailureZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_ThirtyTwoBytesRetryableSendFailureZ_get_ok(ptr);
+                       byte[] res_conv = InternalUtils.decodeUint8Array(res);
+                       this.res = res_conv;
+               }
+       }
+
+       public class Result_ThirtyTwoBytesRetryableSendFailureZ_Err : Result_ThirtyTwoBytesRetryableSendFailureZ {
+               public readonly RetryableSendFailure err;
+               internal Result_ThirtyTwoBytesRetryableSendFailureZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       this.err = bindings.CResult_ThirtyTwoBytesRetryableSendFailureZ_get_err(ptr);
+               }
+       }
+
+       /**
+        * Creates a new CResult_ThirtyTwoBytesRetryableSendFailureZ in the success state.
+        */
+       public static Result_ThirtyTwoBytesRetryableSendFailureZ ok(byte[] o) {
+               long ret = bindings.CResult_ThirtyTwoBytesRetryableSendFailureZ_ok(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(o, 32)));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ThirtyTwoBytesRetryableSendFailureZ ret_hu_conv = Result_ThirtyTwoBytesRetryableSendFailureZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_ThirtyTwoBytesRetryableSendFailureZ in the error state.
+        */
+       public static Result_ThirtyTwoBytesRetryableSendFailureZ err(RetryableSendFailure e) {
+               long ret = bindings.CResult_ThirtyTwoBytesRetryableSendFailureZ_err(e);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ThirtyTwoBytesRetryableSendFailureZ ret_hu_conv = Result_ThirtyTwoBytesRetryableSendFailureZ.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_ThirtyTwoBytesRetryableSendFailureZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_ThirtyTwoBytesRetryableSendFailureZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_ThirtyTwoBytesRetryableSendFailureZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_ThirtyTwoBytesRetryableSendFailureZ clone() {
+               long ret = bindings.CResult_ThirtyTwoBytesRetryableSendFailureZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ThirtyTwoBytesRetryableSendFailureZ ret_hu_conv = Result_ThirtyTwoBytesRetryableSendFailureZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 9c45658d92225404383cead9afdb580207951c12..16f65acf4c9ddf75b53b5fdc52b2955cd34f016d 100644 (file)
@@ -21,7 +21,9 @@ public class Result_TransactionNoneZ : CommonBase {
        public class Result_TransactionNoneZ_OK : Result_TransactionNoneZ {
                public readonly byte[] res;
                internal Result_TransactionNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult_TransactionNoneZ_get_ok(ptr);
+                       long res = bindings.CResult_TransactionNoneZ_get_ok(ptr);
+                       byte[] res_conv = InternalUtils.decodeUint8Array(res);
+                       this.res = res_conv;
                }
        }
 
@@ -34,7 +36,7 @@ public class Result_TransactionNoneZ : CommonBase {
         * Creates a new CResult_TransactionNoneZ in the success state.
         */
        public static Result_TransactionNoneZ ok(byte[] o) {
-               long ret = bindings.CResult_TransactionNoneZ_ok(o);
+               long ret = bindings.CResult_TransactionNoneZ_ok(InternalUtils.encodeUint8Array(o));
                GC.KeepAlive(o);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_TransactionNoneZ ret_hu_conv = Result_TransactionNoneZ.constr_from_ptr(ret);
diff --git a/c_sharp/src/org/ldk/structs/Result_VerifiedInvoiceRequestNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_VerifiedInvoiceRequestNoneZ.cs
new file mode 100644 (file)
index 0000000..b108f12
--- /dev/null
@@ -0,0 +1,86 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_VerifiedInvoiceRequestNoneZ : CommonBase {
+       Result_VerifiedInvoiceRequestNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_VerifiedInvoiceRequestNoneZ() {
+               if (ptr != 0) { bindings.CResult_VerifiedInvoiceRequestNoneZ_free(ptr); }
+       }
+
+       internal static Result_VerifiedInvoiceRequestNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_VerifiedInvoiceRequestNoneZ_is_ok(ptr)) {
+                       return new Result_VerifiedInvoiceRequestNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_VerifiedInvoiceRequestNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_VerifiedInvoiceRequestNoneZ_OK : Result_VerifiedInvoiceRequestNoneZ {
+               public readonly VerifiedInvoiceRequest res;
+               internal Result_VerifiedInvoiceRequestNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_VerifiedInvoiceRequestNoneZ_get_ok(ptr);
+                       org.ldk.structs.VerifiedInvoiceRequest res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.VerifiedInvoiceRequest(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_VerifiedInvoiceRequestNoneZ_Err : Result_VerifiedInvoiceRequestNoneZ {
+               internal Result_VerifiedInvoiceRequestNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_VerifiedInvoiceRequestNoneZ in the success state.
+        */
+       public static Result_VerifiedInvoiceRequestNoneZ ok(org.ldk.structs.VerifiedInvoiceRequest o) {
+               long ret = bindings.CResult_VerifiedInvoiceRequestNoneZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_VerifiedInvoiceRequestNoneZ ret_hu_conv = Result_VerifiedInvoiceRequestNoneZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_VerifiedInvoiceRequestNoneZ in the error state.
+        */
+       public static Result_VerifiedInvoiceRequestNoneZ err() {
+               long ret = bindings.CResult_VerifiedInvoiceRequestNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_VerifiedInvoiceRequestNoneZ ret_hu_conv = Result_VerifiedInvoiceRequestNoneZ.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_VerifiedInvoiceRequestNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_VerifiedInvoiceRequestNoneZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_VerifiedInvoiceRequestNoneZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_VerifiedInvoiceRequestNoneZ clone() {
+               long ret = bindings.CResult_VerifiedInvoiceRequestNoneZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_VerifiedInvoiceRequestNoneZ ret_hu_conv = Result_VerifiedInvoiceRequestNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result__u832APIErrorZ.cs b/c_sharp/src/org/ldk/structs/Result__u832APIErrorZ.cs
deleted file mode 100644 (file)
index c497bb0..0000000
+++ /dev/null
@@ -1,89 +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__u832APIErrorZ : CommonBase {
-       Result__u832APIErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result__u832APIErrorZ() {
-               if (ptr != 0) { bindings.CResult__u832APIErrorZ_free(ptr); }
-       }
-
-       internal static Result__u832APIErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult__u832APIErrorZ_is_ok(ptr)) {
-                       return new Result__u832APIErrorZ_OK(null, ptr);
-               } else {
-                       return new Result__u832APIErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result__u832APIErrorZ_OK : Result__u832APIErrorZ {
-               public readonly byte[] res;
-               internal Result__u832APIErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       this.res = bindings.CResult__u832APIErrorZ_get_ok(ptr);
-               }
-       }
-
-       public class Result__u832APIErrorZ_Err : Result__u832APIErrorZ {
-               public readonly APIError err;
-               internal Result__u832APIErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long err = bindings.CResult__u832APIErrorZ_get_err(ptr);
-                       org.ldk.structs.APIError err_hu_conv = org.ldk.structs.APIError.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__u832APIErrorZ in the success state.
-        */
-       public static Result__u832APIErrorZ ok(byte[] o) {
-               long ret = bindings.CResult__u832APIErrorZ_ok(InternalUtils.check_arr_len(o, 32));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result__u832APIErrorZ ret_hu_conv = Result__u832APIErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult__u832APIErrorZ in the error state.
-        */
-       public static Result__u832APIErrorZ err(org.ldk.structs.APIError e) {
-               long ret = bindings.CResult__u832APIErrorZ_err(e.ptr);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result__u832APIErrorZ ret_hu_conv = Result__u832APIErrorZ.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__u832APIErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult__u832APIErrorZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult__u832APIErrorZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result__u832APIErrorZ clone() {
-               long ret = bindings.CResult__u832APIErrorZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result__u832APIErrorZ ret_hu_conv = Result__u832APIErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
index 2759d32a5cdc5c50ddb738c06ae0b66b184df605..9051ae53b489b7baec55e40e89798686f06bd479 100644 (file)
@@ -26,7 +26,7 @@ public class Retry : CommonBase {
 
        /** A Retry of type Attempts */
        public class Retry_Attempts : Retry {
-               public long attempts;
+               public int attempts;
                internal Retry_Attempts(long ptr) : base(null, ptr) {
                        this.attempts = bindings.LDKRetry_Attempts_get_attempts(ptr);
                }
@@ -59,7 +59,7 @@ public class Retry : CommonBase {
        /**
         * Utility method to constructs a new Attempts-variant Retry
         */
-       public static Retry attempts(long a) {
+       public static Retry attempts(int a) {
                long ret = bindings.Retry_attempts(a);
                GC.KeepAlive(a);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -107,5 +107,27 @@ public class Retry : CommonBase {
        public override int GetHashCode() {
                return (int)this.hash();
        }
+       /**
+        * Serialize the Retry object into a byte array which can be read by Retry_read
+        */
+       public byte[] write() {
+               long ret = bindings.Retry_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a Retry from a byte array, created by Retry_write
+        */
+       public static Result_RetryDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.Retry_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_RetryDecodeErrorZ ret_hu_conv = Result_RetryDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
 }
 } } }
index 9e49d2a75629ff4fe7b8007c9a206b7dee0f8d0b..36647945cbfeae387bb27cfe75e2bf6e352b5771 100644 (file)
@@ -21,16 +21,18 @@ public class RevokeAndACK : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.RevokeAndACK_get_channel_id(this.ptr);
+               long ret = bindings.RevokeAndACK_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.RevokeAndACK_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.RevokeAndACK_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -39,16 +41,18 @@ public class RevokeAndACK : CommonBase {
         * The secret corresponding to the per-commitment point
         */
        public byte[] get_per_commitment_secret() {
-               byte[] ret = bindings.RevokeAndACK_get_per_commitment_secret(this.ptr);
+               long ret = bindings.RevokeAndACK_get_per_commitment_secret(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The secret corresponding to the per-commitment point
         */
        public void set_per_commitment_secret(byte[] val) {
-               bindings.RevokeAndACK_set_per_commitment_secret(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.RevokeAndACK_set_per_commitment_secret(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -57,16 +61,18 @@ public class RevokeAndACK : CommonBase {
         * The next sender-broadcast commitment transaction's per-commitment point
         */
        public byte[] get_next_per_commitment_point() {
-               byte[] ret = bindings.RevokeAndACK_get_next_per_commitment_point(this.ptr);
+               long ret = bindings.RevokeAndACK_get_next_per_commitment_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The next sender-broadcast commitment transaction's per-commitment point
         */
        public void set_next_per_commitment_point(byte[] val) {
-               bindings.RevokeAndACK_set_next_per_commitment_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.RevokeAndACK_set_next_per_commitment_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -75,7 +81,7 @@ public class RevokeAndACK : CommonBase {
         * Constructs a new RevokeAndACK given each field
         */
        public static RevokeAndACK of(byte[] channel_id_arg, byte[] per_commitment_secret_arg, byte[] next_per_commitment_point_arg) {
-               long ret = bindings.RevokeAndACK_new(InternalUtils.check_arr_len(channel_id_arg, 32), InternalUtils.check_arr_len(per_commitment_secret_arg, 32), InternalUtils.check_arr_len(next_per_commitment_point_arg, 33));
+               long ret = bindings.RevokeAndACK_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_secret_arg, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(next_per_commitment_point_arg, 33)));
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(per_commitment_secret_arg);
                GC.KeepAlive(next_per_commitment_point_arg);
@@ -124,16 +130,18 @@ public class RevokeAndACK : CommonBase {
         * Serialize the RevokeAndACK object into a byte array which can be read by RevokeAndACK_read
         */
        public byte[] write() {
-               byte[] ret = bindings.RevokeAndACK_write(this.ptr);
+               long ret = bindings.RevokeAndACK_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a RevokeAndACK from a byte array, created by RevokeAndACK_write
         */
        public static Result_RevokeAndACKDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.RevokeAndACK_read(ser);
+               long ret = bindings.RevokeAndACK_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_RevokeAndACKDecodeErrorZ ret_hu_conv = Result_RevokeAndACKDecodeErrorZ.constr_from_ptr(ret);
index a13f5e08d3fe2cd0f79f8e6d8d99caa21c2a6ffb..666b6dfbb414ebd11375242d80f03d1ddbcaff2e 100644 (file)
@@ -22,16 +22,18 @@ public class Route : CommonBase {
         * the same.
         */
        public Path[] get_paths() {
-               long[] ret = bindings.Route_get_paths(this.ptr);
+               long ret = bindings.Route_get_paths(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_6_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_6_len = InternalUtils.getArrayLength(ret);
                Path[] ret_conv_6_arr = new Path[ret_conv_6_len];
                for (int g = 0; g < ret_conv_6_len; g++) {
-                       long ret_conv_6 = ret[g];
+                       long ret_conv_6 = InternalUtils.getU64ArrayElem(ret, g);
                        org.ldk.structs.Path ret_conv_6_hu_conv = null; if (ret_conv_6 < 0 || ret_conv_6 > 4096) { ret_conv_6_hu_conv = new org.ldk.structs.Path(null, ret_conv_6); }
                        if (ret_conv_6_hu_conv != null) { ret_conv_6_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_6_arr[g] = ret_conv_6_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_6_arr;
        }
 
@@ -41,37 +43,41 @@ public class Route : CommonBase {
         * the same.
         */
        public void set_paths(Path[] val) {
-               bindings.Route_set_paths(this.ptr, val != null ? InternalUtils.mapArray(val, val_conv_6 => val_conv_6 == null ? 0 : val_conv_6.ptr) : null);
+               bindings.Route_set_paths(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(val, val_conv_6 => val_conv_6 == null ? 0 : val_conv_6.ptr)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
                foreach (Path val_conv_6 in val) { if (this != null) { this.ptrs_to.AddLast(val_conv_6); }; };
        }
 
        /**
-        * The `payment_params` parameter passed via [`RouteParameters`] to [`find_route`].
+        * The `route_params` parameter passed to [`find_route`].
         * 
         * This is used by `ChannelManager` to track information which may be required for retries.
         * 
+        * Will be `None` for objects serialized with LDK versions prior to 0.0.117.
+        * 
         * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
-       public PaymentParameters get_payment_params() {
-               long ret = bindings.Route_get_payment_params(this.ptr);
+       public RouteParameters get_route_params() {
+               long ret = bindings.Route_get_route_params(this.ptr);
                GC.KeepAlive(this);
                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); }
+               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;
        }
 
        /**
-        * The `payment_params` parameter passed via [`RouteParameters`] to [`find_route`].
+        * The `route_params` parameter passed to [`find_route`].
         * 
         * This is used by `ChannelManager` to track information which may be required for retries.
         * 
+        * Will be `None` for objects serialized with LDK versions prior to 0.0.117.
+        * 
         * Note that val (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
-       public void set_payment_params(org.ldk.structs.PaymentParameters val) {
-               bindings.Route_set_payment_params(this.ptr, val == null ? 0 : val.ptr);
+       public void set_route_params(org.ldk.structs.RouteParameters val) {
+               bindings.Route_set_route_params(this.ptr, val == null ? 0 : val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
                if (this != null) { this.ptrs_to.AddLast(val); };
@@ -79,16 +85,18 @@ public class Route : CommonBase {
 
        /**
         * Constructs a new Route given each field
+        * 
+        * Note that route_params_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
-       public static Route of(Path[] paths_arg, org.ldk.structs.PaymentParameters payment_params_arg) {
-               long ret = bindings.Route_new(paths_arg != null ? InternalUtils.mapArray(paths_arg, paths_arg_conv_6 => paths_arg_conv_6 == null ? 0 : paths_arg_conv_6.ptr) : null, payment_params_arg == null ? 0 : payment_params_arg.ptr);
+       public static Route of(Path[] paths_arg, org.ldk.structs.RouteParameters route_params_arg) {
+               long ret = bindings.Route_new(InternalUtils.encodeUint64Array(InternalUtils.mapArray(paths_arg, paths_arg_conv_6 => paths_arg_conv_6 == null ? 0 : paths_arg_conv_6.ptr)), route_params_arg == null ? 0 : route_params_arg.ptr);
                GC.KeepAlive(paths_arg);
-               GC.KeepAlive(payment_params_arg);
+               GC.KeepAlive(route_params_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.Route ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Route(null, ret); }
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
                foreach (Path paths_arg_conv_6 in paths_arg) { if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(paths_arg_conv_6); }; };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(payment_params_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(route_params_arg); };
                return ret_hu_conv;
        }
 
@@ -142,8 +150,11 @@ public class Route : CommonBase {
        /**
         * Returns the total amount of fees paid on this [`Route`].
         * 
-        * This doesn't include any extra payment made to the recipient, which can happen in excess of
-        * the amount passed to [`find_route`]'s `route_params.final_value_msat`.
+        * For objects serialized with LDK 0.0.117 and after, this includes any extra payment made to
+        * the recipient, which can happen in excess of the amount passed to [`find_route`] via
+        * [`RouteParameters::final_value_msat`], if we had to reach the [`htlc_minimum_msat`] limits.
+        * 
+        * [`htlc_minimum_msat`]: https://github.com/lightning/bolts/blob/master/07-routing-gossip.md#the-channel_update-message
         */
        public long get_total_fees() {
                long ret = bindings.Route_get_total_fees(this.ptr);
@@ -152,8 +163,12 @@ public class Route : CommonBase {
        }
 
        /**
-        * Returns the total amount paid on this [`Route`], excluding the fees. Might be more than
-        * requested if we had to reach htlc_minimum_msat.
+        * Returns the total amount paid on this [`Route`], excluding the fees.
+        * 
+        * Might be more than requested as part of the given [`RouteParameters::final_value_msat`] if
+        * we had to reach the [`htlc_minimum_msat`] limits.
+        * 
+        * [`htlc_minimum_msat`]: https://github.com/lightning/bolts/blob/master/07-routing-gossip.md#the-channel_update-message
         */
        public long get_total_amount() {
                long ret = bindings.Route_get_total_amount(this.ptr);
@@ -165,16 +180,18 @@ public class Route : CommonBase {
         * Serialize the Route object into a byte array which can be read by Route_read
         */
        public byte[] write() {
-               byte[] ret = bindings.Route_write(this.ptr);
+               long ret = bindings.Route_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a Route from a byte array, created by Route_write
         */
        public static Result_RouteDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.Route_read(ser);
+               long ret = bindings.Route_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_RouteDecodeErrorZ ret_hu_conv = Result_RouteDecodeErrorZ.constr_from_ptr(ret);
index 962cb0d4ae749322378028a7a6d2d28d49070529..d98719d93bcb7dba69df630f62dbc8630205423b 100644 (file)
@@ -16,21 +16,23 @@ public class RouteHint : CommonBase {
        }
 
        public RouteHintHop[] get_a() {
-               long[] ret = bindings.RouteHint_get_a(this.ptr);
+               long ret = bindings.RouteHint_get_a(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_14_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_14_len = InternalUtils.getArrayLength(ret);
                RouteHintHop[] ret_conv_14_arr = new RouteHintHop[ret_conv_14_len];
                for (int o = 0; o < ret_conv_14_len; o++) {
-                       long ret_conv_14 = ret[o];
+                       long ret_conv_14 = InternalUtils.getU64ArrayElem(ret, o);
                        org.ldk.structs.RouteHintHop ret_conv_14_hu_conv = null; if (ret_conv_14 < 0 || ret_conv_14 > 4096) { ret_conv_14_hu_conv = new org.ldk.structs.RouteHintHop(null, ret_conv_14); }
                        if (ret_conv_14_hu_conv != null) { ret_conv_14_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_14_arr[o] = ret_conv_14_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_14_arr;
        }
 
        public void set_a(RouteHintHop[] val) {
-               bindings.RouteHint_set_a(this.ptr, val != null ? InternalUtils.mapArray(val, val_conv_14 => val_conv_14 == null ? 0 : val_conv_14.ptr) : null);
+               bindings.RouteHint_set_a(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(val, val_conv_14 => val_conv_14 == null ? 0 : val_conv_14.ptr)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
                foreach (RouteHintHop val_conv_14 in val) { if (this != null) { this.ptrs_to.AddLast(val_conv_14); }; };
@@ -40,7 +42,7 @@ public class RouteHint : CommonBase {
         * Constructs a new RouteHint given each field
         */
        public static RouteHint of(RouteHintHop[] a_arg) {
-               long ret = bindings.RouteHint_new(a_arg != null ? InternalUtils.mapArray(a_arg, a_arg_conv_14 => a_arg_conv_14 == null ? 0 : a_arg_conv_14.ptr) : null);
+               long ret = bindings.RouteHint_new(InternalUtils.encodeUint64Array(InternalUtils.mapArray(a_arg, a_arg_conv_14 => a_arg_conv_14 == null ? 0 : a_arg_conv_14.ptr)));
                GC.KeepAlive(a_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.RouteHint ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.RouteHint(null, ret); }
@@ -100,16 +102,18 @@ public class RouteHint : CommonBase {
         * Serialize the RouteHint object into a byte array which can be read by RouteHint_read
         */
        public byte[] write() {
-               byte[] ret = bindings.RouteHint_write(this.ptr);
+               long ret = bindings.RouteHint_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a RouteHint from a byte array, created by RouteHint_write
         */
        public static Result_RouteHintDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.RouteHint_read(ser);
+               long ret = bindings.RouteHint_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_RouteHintDecodeErrorZ ret_hu_conv = Result_RouteHintDecodeErrorZ.constr_from_ptr(ret);
index f8f17a9c4d88e3e973a0f8925f814a903f0962a5..9a47ac3ec583d159cec6295fff07462b185c4878 100644 (file)
@@ -19,16 +19,18 @@ public class RouteHintHop : CommonBase {
         * The node_id of the non-target end of the route
         */
        public byte[] get_src_node_id() {
-               byte[] ret = bindings.RouteHintHop_get_src_node_id(this.ptr);
+               long ret = bindings.RouteHintHop_get_src_node_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The node_id of the non-target end of the route
         */
        public void set_src_node_id(byte[] val) {
-               bindings.RouteHintHop_set_src_node_id(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.RouteHintHop_set_src_node_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -139,7 +141,7 @@ public class RouteHintHop : CommonBase {
         * Constructs a new RouteHintHop given each field
         */
        public static RouteHintHop of(byte[] src_node_id_arg, long short_channel_id_arg, org.ldk.structs.RoutingFees fees_arg, short cltv_expiry_delta_arg, org.ldk.structs.Option_u64Z htlc_minimum_msat_arg, org.ldk.structs.Option_u64Z htlc_maximum_msat_arg) {
-               long ret = bindings.RouteHintHop_new(InternalUtils.check_arr_len(src_node_id_arg, 33), short_channel_id_arg, fees_arg == null ? 0 : fees_arg.ptr, cltv_expiry_delta_arg, htlc_minimum_msat_arg.ptr, htlc_maximum_msat_arg.ptr);
+               long ret = bindings.RouteHintHop_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(src_node_id_arg, 33)), short_channel_id_arg, fees_arg == null ? 0 : fees_arg.ptr, cltv_expiry_delta_arg, htlc_minimum_msat_arg.ptr, htlc_maximum_msat_arg.ptr);
                GC.KeepAlive(src_node_id_arg);
                GC.KeepAlive(short_channel_id_arg);
                GC.KeepAlive(fees_arg);
@@ -206,16 +208,18 @@ public class RouteHintHop : CommonBase {
         * Serialize the RouteHintHop object into a byte array which can be read by RouteHintHop_read
         */
        public byte[] write() {
-               byte[] ret = bindings.RouteHintHop_write(this.ptr);
+               long ret = bindings.RouteHintHop_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a RouteHintHop from a byte array, created by RouteHintHop_write
         */
        public static Result_RouteHintHopDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.RouteHintHop_read(ser);
+               long ret = bindings.RouteHintHop_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_RouteHintHopDecodeErrorZ ret_hu_conv = Result_RouteHintHopDecodeErrorZ.constr_from_ptr(ret);
index d6c2933564ec8bde8a5ff3d40707964455942d36..b15e8d418aa35bd9526a851da5feeac92015caa1 100644 (file)
@@ -20,16 +20,18 @@ public class RouteHop : CommonBase {
         * The node_id of the node at this hop.
         */
        public byte[] get_pubkey() {
-               byte[] ret = bindings.RouteHop_get_pubkey(this.ptr);
+               long ret = bindings.RouteHop_get_pubkey(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The node_id of the node at this hop.
         */
        public void set_pubkey(byte[] val) {
-               bindings.RouteHop_set_pubkey(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.RouteHop_set_pubkey(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -156,17 +158,50 @@ public class RouteHop : CommonBase {
                GC.KeepAlive(val);
        }
 
+       /**
+        * Indicates whether this hop is possibly announced in the public network graph.
+        * 
+        * Will be `true` if there is a possibility that the channel is publicly known, i.e., if we
+        * either know for sure it's announced in the public graph, or if any public channels exist
+        * for which the given `short_channel_id` could be an alias for. Will be `false` if we believe
+        * the channel to be unannounced.
+        * 
+        * Will be `true` for objects serialized with LDK version 0.0.116 and before.
+        */
+       public bool get_maybe_announced_channel() {
+               bool ret = bindings.RouteHop_get_maybe_announced_channel(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Indicates whether this hop is possibly announced in the public network graph.
+        * 
+        * Will be `true` if there is a possibility that the channel is publicly known, i.e., if we
+        * either know for sure it's announced in the public graph, or if any public channels exist
+        * for which the given `short_channel_id` could be an alias for. Will be `false` if we believe
+        * the channel to be unannounced.
+        * 
+        * Will be `true` for objects serialized with LDK version 0.0.116 and before.
+        */
+       public void set_maybe_announced_channel(bool val) {
+               bindings.RouteHop_set_maybe_announced_channel(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
        /**
         * Constructs a new RouteHop given each field
         */
-       public static RouteHop of(byte[] pubkey_arg, org.ldk.structs.NodeFeatures node_features_arg, long short_channel_id_arg, org.ldk.structs.ChannelFeatures channel_features_arg, long fee_msat_arg, int cltv_expiry_delta_arg) {
-               long ret = bindings.RouteHop_new(InternalUtils.check_arr_len(pubkey_arg, 33), node_features_arg == null ? 0 : node_features_arg.ptr, short_channel_id_arg, channel_features_arg == null ? 0 : channel_features_arg.ptr, fee_msat_arg, cltv_expiry_delta_arg);
+       public static RouteHop of(byte[] pubkey_arg, org.ldk.structs.NodeFeatures node_features_arg, long short_channel_id_arg, org.ldk.structs.ChannelFeatures channel_features_arg, long fee_msat_arg, int cltv_expiry_delta_arg, bool maybe_announced_channel_arg) {
+               long ret = bindings.RouteHop_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(pubkey_arg, 33)), node_features_arg == null ? 0 : node_features_arg.ptr, short_channel_id_arg, channel_features_arg == null ? 0 : channel_features_arg.ptr, fee_msat_arg, cltv_expiry_delta_arg, maybe_announced_channel_arg);
                GC.KeepAlive(pubkey_arg);
                GC.KeepAlive(node_features_arg);
                GC.KeepAlive(short_channel_id_arg);
                GC.KeepAlive(channel_features_arg);
                GC.KeepAlive(fee_msat_arg);
                GC.KeepAlive(cltv_expiry_delta_arg);
+               GC.KeepAlive(maybe_announced_channel_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.RouteHop ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.RouteHop(null, ret); }
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
@@ -226,16 +261,18 @@ public class RouteHop : CommonBase {
         * Serialize the RouteHop object into a byte array which can be read by RouteHop_read
         */
        public byte[] write() {
-               byte[] ret = bindings.RouteHop_write(this.ptr);
+               long ret = bindings.RouteHop_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a RouteHop from a byte array, created by RouteHop_write
         */
        public static Result_RouteHopDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.RouteHop_read(ser);
+               long ret = bindings.RouteHop_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_RouteHopDecodeErrorZ ret_hu_conv = Result_RouteHopDecodeErrorZ.constr_from_ptr(ret);
index 35c04630acba2b25284177eb671f411eac43bc92..de9e018afa451aaad697350d9355fb240ac4573b 100644 (file)
@@ -57,17 +57,51 @@ public class RouteParameters : CommonBase {
                GC.KeepAlive(val);
        }
 
+       /**
+        * The maximum total fees, in millisatoshi, that may accrue during route finding.
+        * 
+        * This limit also applies to the total fees that may arise while retrying failed payment
+        * paths.
+        * 
+        * Note that values below a few sats may result in some paths being spuriously ignored.
+        */
+       public Option_u64Z get_max_total_routing_fee_msat() {
+               long ret = bindings.RouteParameters_get_max_total_routing_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 maximum total fees, in millisatoshi, that may accrue during route finding.
+        * 
+        * This limit also applies to the total fees that may arise while retrying failed payment
+        * paths.
+        * 
+        * Note that values below a few sats may result in some paths being spuriously ignored.
+        */
+       public void set_max_total_routing_fee_msat(org.ldk.structs.Option_u64Z val) {
+               bindings.RouteParameters_set_max_total_routing_fee_msat(this.ptr, val.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
+       }
+
        /**
         * Constructs a new RouteParameters given each field
         */
-       public static RouteParameters of(org.ldk.structs.PaymentParameters payment_params_arg, long final_value_msat_arg) {
-               long ret = bindings.RouteParameters_new(payment_params_arg == null ? 0 : payment_params_arg.ptr, final_value_msat_arg);
+       public static RouteParameters of(org.ldk.structs.PaymentParameters payment_params_arg, long final_value_msat_arg, org.ldk.structs.Option_u64Z max_total_routing_fee_msat_arg) {
+               long ret = bindings.RouteParameters_new(payment_params_arg == null ? 0 : payment_params_arg.ptr, final_value_msat_arg, max_total_routing_fee_msat_arg.ptr);
                GC.KeepAlive(payment_params_arg);
                GC.KeepAlive(final_value_msat_arg);
+               GC.KeepAlive(max_total_routing_fee_msat_arg);
                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(ret_hu_conv); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(payment_params_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(max_total_routing_fee_msat_arg); };
                return ret_hu_conv;
        }
 
@@ -89,6 +123,18 @@ public class RouteParameters : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the RouteParameters.
+        */
+       public long hash() {
+               long ret = bindings.RouteParameters_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two RouteParameterss contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
@@ -106,20 +152,38 @@ public class RouteParameters : CommonBase {
                if (!(o is RouteParameters)) return false;
                return this.eq((RouteParameters)o);
        }
+       /**
+        * Constructs [`RouteParameters`] from the given [`PaymentParameters`] and a payment amount.
+        * 
+        * [`Self::max_total_routing_fee_msat`] defaults to 1% of the payment amount + 50 sats
+        */
+       public static RouteParameters from_payment_params_and_value(org.ldk.structs.PaymentParameters payment_params, long final_value_msat) {
+               long ret = bindings.RouteParameters_from_payment_params_and_value(payment_params == null ? 0 : payment_params.ptr, final_value_msat);
+               GC.KeepAlive(payment_params);
+               GC.KeepAlive(final_value_msat);
+               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(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(payment_params); };
+               return ret_hu_conv;
+       }
+
        /**
         * Serialize the RouteParameters object into a byte array which can be read by RouteParameters_read
         */
        public byte[] write() {
-               byte[] ret = bindings.RouteParameters_write(this.ptr);
+               long ret = bindings.RouteParameters_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a RouteParameters from a byte array, created by RouteParameters_write
         */
        public static Result_RouteParametersDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.RouteParameters_read(ser);
+               long ret = bindings.RouteParameters_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_RouteParametersDecodeErrorZ ret_hu_conv = Result_RouteParametersDecodeErrorZ.constr_from_ptr(ret);
index 32c60514176fb7661143bb71420ec87310ca8d69..a8dbb2a54f6eb012bdabfbb1bb7896585367436f 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,92 +6,106 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of Router */
+public interface RouterInterface {
+       /**Finds a [`Route`] for a payment between the given `payer` and a payee.
+        * 
+        * The `payee` and the payment's value are given in [`RouteParameters::payment_params`]
+        * and [`RouteParameters::final_value_msat`], respectively.
+        * 
+        * Note that first_hops (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       Result_RouteLightningErrorZ find_route(byte[] payer, RouteParameters route_params, ChannelDetails[] first_hops, InFlightHtlcs inflight_htlcs);
+       /**Finds a [`Route`] for a payment between the given `payer` and a payee.
+        * 
+        * The `payee` and the payment's value are given in [`RouteParameters::payment_params`]
+        * and [`RouteParameters::final_value_msat`], respectively.
+        * 
+        * Includes a [`PaymentHash`] and a [`PaymentId`] to be able to correlate the request with a specific
+        * payment.
+        * 
+        * 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);
+}
+
 /**
  * A trait defining behavior for routing a payment.
  */
 public class Router : CommonBase {
-       internal readonly bindings.LDKRouter bindings_instance;
+       internal bindings.LDKRouter bindings_instance;
+       internal long instance_idx;
+
        internal Router(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private Router(bindings.LDKRouter arg) : base(bindings.LDKRouter_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~Router() {
                if (ptr != 0) { bindings.Router_free(ptr); }
        }
 
-       public interface RouterInterface {
-               /**
-                * Finds a [`Route`] for a payment between the given `payer` and a payee.
-                * 
-                * The `payee` and the payment's value are given in [`RouteParameters::payment_params`]
-                * and [`RouteParameters::final_value_msat`], respectively.
-                * 
-                * Note that first_hops (or a relevant inner pointer) may be NULL or all-0s to represent None
-                */
-               Result_RouteLightningErrorZ find_route(byte[] _payer, RouteParameters _route_params, ChannelDetails[] _first_hops, InFlightHtlcs _inflight_htlcs);
-               /**
-                * Finds a [`Route`] for a payment between the given `payer` and a payee.
-                * 
-                * The `payee` and the payment's value are given in [`RouteParameters::payment_params`]
-                * and [`RouteParameters::final_value_msat`], respectively.
-                * 
-                * Includes a [`PaymentHash`] and a [`PaymentId`] to be able to correlate the request with a specific
-                * payment.
-                * 
-                * 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);
-       }
        private class LDKRouterHolder { internal Router held; }
        private class LDKRouterImpl : bindings.LDKRouter {
                internal LDKRouterImpl(RouterInterface arg, LDKRouterHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private RouterInterface arg;
                private LDKRouterHolder impl_holder;
-               public long find_route(byte[] _payer, long _route_params, long[] _first_hops, long _inflight_htlcs) {
+               public long find_route(long _payer, long _route_params, long _first_hops, long _inflight_htlcs) {
+                       byte[] _payer_conv = InternalUtils.decodeUint8Array(_payer);
                        org.ldk.structs.RouteParameters _route_params_hu_conv = null; if (_route_params < 0 || _route_params > 4096) { _route_params_hu_conv = new org.ldk.structs.RouteParameters(null, _route_params); }
-                       int _first_hops_conv_16_len = _first_hops.Length;
+                       int _first_hops_conv_16_len = InternalUtils.getArrayLength(_first_hops);
                        ChannelDetails[] _first_hops_conv_16_arr = new ChannelDetails[_first_hops_conv_16_len];
                        if (_first_hops != null) {
                                for (int q = 0; q < _first_hops_conv_16_len; q++) {
-                                       long _first_hops_conv_16 = _first_hops[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.InFlightHtlcs _inflight_htlcs_hu_conv = null; if (_inflight_htlcs < 0 || _inflight_htlcs > 4096) { _inflight_htlcs_hu_conv = new org.ldk.structs.InFlightHtlcs(null, _inflight_htlcs); }
                        if (_inflight_htlcs_hu_conv != null) { _inflight_htlcs_hu_conv.ptrs_to.AddLast(this); };
-                       Result_RouteLightningErrorZ ret = arg.find_route(_payer, _route_params_hu_conv, _first_hops_conv_16_arr, _inflight_htlcs_hu_conv);
+                       Result_RouteLightningErrorZ ret = arg.find_route(_payer_conv, _route_params_hu_conv, _first_hops_conv_16_arr, _inflight_htlcs_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long find_route_with_id(byte[] _payer, long _route_params, long[] _first_hops, long _inflight_htlcs, byte[] __payment_hash, byte[] __payment_id) {
+               public long find_route_with_id(long _payer, long _route_params, long _first_hops, long _inflight_htlcs, long __payment_hash, long __payment_id) {
+                       byte[] _payer_conv = InternalUtils.decodeUint8Array(_payer);
                        org.ldk.structs.RouteParameters _route_params_hu_conv = null; if (_route_params < 0 || _route_params > 4096) { _route_params_hu_conv = new org.ldk.structs.RouteParameters(null, _route_params); }
-                       int _first_hops_conv_16_len = _first_hops.Length;
+                       int _first_hops_conv_16_len = InternalUtils.getArrayLength(_first_hops);
                        ChannelDetails[] _first_hops_conv_16_arr = new ChannelDetails[_first_hops_conv_16_len];
                        if (_first_hops != null) {
                                for (int q = 0; q < _first_hops_conv_16_len; q++) {
-                                       long _first_hops_conv_16 = _first_hops[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.InFlightHtlcs _inflight_htlcs_hu_conv = null; if (_inflight_htlcs < 0 || _inflight_htlcs > 4096) { _inflight_htlcs_hu_conv = new org.ldk.structs.InFlightHtlcs(null, _inflight_htlcs); }
                        if (_inflight_htlcs_hu_conv != null) { _inflight_htlcs_hu_conv.ptrs_to.AddLast(this); };
-                       Result_RouteLightningErrorZ ret = arg.find_route_with_id(_payer, _route_params_hu_conv, _first_hops_conv_16_arr, _inflight_htlcs_hu_conv, __payment_hash, __payment_id);
+                       byte[] __payment_hash_conv = InternalUtils.decodeUint8Array(__payment_hash);
+                       byte[] __payment_id_conv = InternalUtils.decodeUint8Array(__payment_id);
+                       Result_RouteLightningErrorZ ret = arg.find_route_with_id(_payer_conv, _route_params_hu_conv, _first_hops_conv_16_arr, _inflight_htlcs_hu_conv, __payment_hash_conv, __payment_id_conv);
                                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) {
                LDKRouterHolder impl_holder = new LDKRouterHolder();
-               impl_holder.held = new Router(new LDKRouterImpl(arg, impl_holder));
+               LDKRouterImpl impl = new LDKRouterImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKRouter_new(impl);
+
+               impl_holder.held = new Router(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Finds a [`Route`] for a payment between the given `payer` and a payee.
         * 
@@ -100,7 +115,7 @@ public class Router : CommonBase {
         * Note that first_hops (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public Result_RouteLightningErrorZ find_route(byte[] payer, org.ldk.structs.RouteParameters route_params, ChannelDetails[] first_hops, org.ldk.structs.InFlightHtlcs inflight_htlcs) {
-               long ret = bindings.Router_find_route(this.ptr, InternalUtils.check_arr_len(payer, 33), route_params == null ? 0 : route_params.ptr, first_hops != null ? InternalUtils.mapArray(first_hops, first_hops_conv_16 => first_hops_conv_16 == null ? 0 : first_hops_conv_16.ptr) : null, inflight_htlcs == null ? 0 : inflight_htlcs.ptr);
+               long ret = bindings.Router_find_route(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payer, 33)), route_params == null ? 0 : route_params.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(first_hops, first_hops_conv_16 => first_hops_conv_16 == null ? 0 : first_hops_conv_16.ptr)), inflight_htlcs == null ? 0 : inflight_htlcs.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(payer);
                GC.KeepAlive(route_params);
@@ -126,7 +141,7 @@ public class Router : CommonBase {
         * Note that first_hops (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public Result_RouteLightningErrorZ find_route_with_id(byte[] payer, org.ldk.structs.RouteParameters route_params, ChannelDetails[] first_hops, org.ldk.structs.InFlightHtlcs inflight_htlcs, byte[] _payment_hash, byte[] _payment_id) {
-               long ret = bindings.Router_find_route_with_id(this.ptr, InternalUtils.check_arr_len(payer, 33), route_params == null ? 0 : route_params.ptr, first_hops != null ? InternalUtils.mapArray(first_hops, first_hops_conv_16 => first_hops_conv_16 == null ? 0 : first_hops_conv_16.ptr) : null, inflight_htlcs == null ? 0 : inflight_htlcs.ptr, InternalUtils.check_arr_len(_payment_hash, 32), InternalUtils.check_arr_len(_payment_id, 32));
+               long ret = bindings.Router_find_route_with_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payer, 33)), route_params == null ? 0 : route_params.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(first_hops, first_hops_conv_16 => first_hops_conv_16 == null ? 0 : first_hops_conv_16.ptr)), inflight_htlcs == null ? 0 : inflight_htlcs.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(_payment_hash, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(_payment_id, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(payer);
                GC.KeepAlive(route_params);
index 087d9562a987f1dc41fad30ab93277bef3737178..d296f2851d2da8ad74d4d0cad601d566cebd22b9 100644 (file)
@@ -117,16 +117,18 @@ public class RoutingFees : CommonBase {
         * Serialize the RoutingFees object into a byte array which can be read by RoutingFees_read
         */
        public byte[] write() {
-               byte[] ret = bindings.RoutingFees_write(this.ptr);
+               long ret = bindings.RoutingFees_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a RoutingFees from a byte array, created by RoutingFees_write
         */
        public static Result_RoutingFeesDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.RoutingFees_read(ser);
+               long ret = bindings.RoutingFees_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_RoutingFeesDecodeErrorZ ret_hu_conv = Result_RoutingFeesDecodeErrorZ.constr_from_ptr(ret);
index 574d2c990bf6213ade297327ee72d103642e476b..278d0881d1a1bfac9e7dec8b4e073051542705f5 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,6 +6,84 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of RoutingMessageHandler */
+public interface RoutingMessageHandlerInterface {
+       /**Handle an incoming `node_announcement` message, returning `true` if it should be forwarded on,
+        * `false` or returning an `Err` otherwise.
+        */
+       Result_boolLightningErrorZ handle_node_announcement(NodeAnnouncement msg);
+       /**Handle a `channel_announcement` message, returning `true` if it should be forwarded on, `false`
+        * or returning an `Err` otherwise.
+        */
+       Result_boolLightningErrorZ handle_channel_announcement(ChannelAnnouncement msg);
+       /**Handle an incoming `channel_update` message, returning true if it should be forwarded on,
+        * `false` or returning an `Err` otherwise.
+        */
+       Result_boolLightningErrorZ handle_channel_update(ChannelUpdate msg);
+       /**Gets channel announcements and updates required to dump our routing table to a remote node,
+        * starting at the `short_channel_id` indicated by `starting_point` and including announcements
+        * for a single channel.
+        */
+       Option_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ get_next_channel_announcement(long starting_point);
+       /**Gets a node announcement required to dump our routing table to a remote node, starting at
+        * the node *after* the provided pubkey and including up to one announcement immediately
+        * higher (as defined by `<PublicKey as Ord>::cmp`) than `starting_point`.
+        * If `None` is provided for `starting_point`, we start at the first node.
+        * 
+        * Note that starting_point (or a relevant inner pointer) may be NULL or all-0s to represent None
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       NodeAnnouncement get_next_node_announcement(NodeId starting_point);
+       /**Called when a connection is established with a peer. This can be used to
+        * perform routing table synchronization using a strategy defined by the
+        * implementor.
+        * 
+        * May return an `Err(())` if the features the peer supports are not sufficient to communicate
+        * with us. Implementors should be somewhat conservative about doing so, however, as other
+        * message handlers may still wish to communicate with this peer.
+        */
+       Result_NoneNoneZ peer_connected(byte[] their_node_id, Init init, bool inbound);
+       /**Handles the reply of a query we initiated to learn about channels
+        * for a given range of blocks. We can expect to receive one or more
+        * replies to a single query.
+        */
+       Result_NoneLightningErrorZ handle_reply_channel_range(byte[] their_node_id, ReplyChannelRange msg);
+       /**Handles the reply of a query we initiated asking for routing gossip
+        * messages for a list of channels. We should receive this message when
+        * a node has completed its best effort to send us the pertaining routing
+        * gossip messages.
+        */
+       Result_NoneLightningErrorZ handle_reply_short_channel_ids_end(byte[] their_node_id, ReplyShortChannelIdsEnd msg);
+       /**Handles when a peer asks us to send a list of `short_channel_id`s
+        * for the requested range of blocks.
+        */
+       Result_NoneLightningErrorZ handle_query_channel_range(byte[] their_node_id, QueryChannelRange msg);
+       /**Handles when a peer asks us to send routing gossip messages for a
+        * list of `short_channel_id`s.
+        */
+       Result_NoneLightningErrorZ handle_query_short_channel_ids(byte[] their_node_id, QueryShortChannelIds msg);
+       /**Indicates that there are a large number of [`ChannelAnnouncement`] (or other) messages
+        * pending some async action. While there is no guarantee of the rate of future messages, the
+        * caller should seek to reduce the rate of new gossip messages handled, especially
+        * [`ChannelAnnouncement`]s.
+        */
+       bool processing_queue_high();
+       /**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.
+        */
+       NodeFeatures provided_node_features();
+       /**Gets the init feature flags which should be sent to the given peer. All available handlers
+        * are queried similarly and their feature flags are OR'd together to form the [`InitFeatures`]
+        * which are sent in our [`Init`] message.
+        * 
+        * Note that this method is called before [`Self::peer_connected`].
+        */
+       InitFeatures provided_init_features(byte[] their_node_id);
+}
+
 /**
  * A trait to describe an object which can receive routing messages.
  * 
@@ -15,104 +94,14 @@ namespace org { namespace ldk { namespace structs {
  * repeated disk I/O for queries accessing different parts of the network graph.
  */
 public class RoutingMessageHandler : CommonBase {
-       internal readonly bindings.LDKRoutingMessageHandler bindings_instance;
+       internal bindings.LDKRoutingMessageHandler bindings_instance;
+       internal long instance_idx;
+
        internal RoutingMessageHandler(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private RoutingMessageHandler(bindings.LDKRoutingMessageHandler arg, bindings.LDKMessageSendEventsProvider MessageSendEventsProvider) : base(bindings.LDKRoutingMessageHandler_new(arg, MessageSendEventsProvider)) {
-               this.ptrs_to.AddLast(arg);
-               this.ptrs_to.AddLast(MessageSendEventsProvider);
-               this.bindings_instance = arg;
-       }
        ~RoutingMessageHandler() {
                if (ptr != 0) { bindings.RoutingMessageHandler_free(ptr); }
        }
 
-       public interface RoutingMessageHandlerInterface {
-               /**
-                * Handle an incoming `node_announcement` message, returning `true` if it should be forwarded on,
-                * `false` or returning an `Err` otherwise.
-                */
-               Result_boolLightningErrorZ handle_node_announcement(NodeAnnouncement _msg);
-               /**
-                * Handle a `channel_announcement` message, returning `true` if it should be forwarded on, `false`
-                * or returning an `Err` otherwise.
-                */
-               Result_boolLightningErrorZ handle_channel_announcement(ChannelAnnouncement _msg);
-               /**
-                * Handle an incoming `channel_update` message, returning true if it should be forwarded on,
-                * `false` or returning an `Err` otherwise.
-                */
-               Result_boolLightningErrorZ handle_channel_update(ChannelUpdate _msg);
-               /**
-                * Gets channel announcements and updates required to dump our routing table to a remote node,
-                * starting at the `short_channel_id` indicated by `starting_point` and including announcements
-                * for a single channel.
-                */
-               Option_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ get_next_channel_announcement(long _starting_point);
-               /**
-                * Gets a node announcement required to dump our routing table to a remote node, starting at
-                * the node *after* the provided pubkey and including up to one announcement immediately
-                * higher (as defined by `<PublicKey as Ord>::cmp`) than `starting_point`.
-                * If `None` is provided for `starting_point`, we start at the first node.
-                * 
-                * Note that starting_point (or a relevant inner pointer) may be NULL or all-0s to represent None
-                * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
-                */
-               NodeAnnouncement get_next_node_announcement(NodeId _starting_point);
-               /**
-                * Called when a connection is established with a peer. This can be used to
-                * perform routing table synchronization using a strategy defined by the
-                * implementor.
-                * 
-                * May return an `Err(())` if the features the peer supports are not sufficient to communicate
-                * with us. Implementors should be somewhat conservative about doing so, however, as other
-                * message handlers may still wish to communicate with this peer.
-                */
-               Result_NoneNoneZ peer_connected(byte[] _their_node_id, Init _init, bool _inbound);
-               /**
-                * Handles the reply of a query we initiated to learn about channels
-                * for a given range of blocks. We can expect to receive one or more
-                * replies to a single query.
-                */
-               Result_NoneLightningErrorZ handle_reply_channel_range(byte[] _their_node_id, ReplyChannelRange _msg);
-               /**
-                * Handles the reply of a query we initiated asking for routing gossip
-                * messages for a list of channels. We should receive this message when
-                * a node has completed its best effort to send us the pertaining routing
-                * gossip messages.
-                */
-               Result_NoneLightningErrorZ handle_reply_short_channel_ids_end(byte[] _their_node_id, ReplyShortChannelIdsEnd _msg);
-               /**
-                * Handles when a peer asks us to send a list of `short_channel_id`s
-                * for the requested range of blocks.
-                */
-               Result_NoneLightningErrorZ handle_query_channel_range(byte[] _their_node_id, QueryChannelRange _msg);
-               /**
-                * Handles when a peer asks us to send routing gossip messages for a
-                * list of `short_channel_id`s.
-                */
-               Result_NoneLightningErrorZ handle_query_short_channel_ids(byte[] _their_node_id, QueryShortChannelIds _msg);
-               /**
-                * Indicates that there are a large number of [`ChannelAnnouncement`] (or other) messages
-                * pending some async action. While there is no guarantee of the rate of future messages, the
-                * caller should seek to reduce the rate of new gossip messages handled, especially
-                * [`ChannelAnnouncement`]s.
-                */
-               bool processing_queue_high();
-               /**
-                * 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.
-                */
-               NodeFeatures provided_node_features();
-               /**
-                * Gets the init feature flags which should be sent to the given peer. All available handlers
-                * are queried similarly and their feature flags are OR'd together to form the [`InitFeatures`]
-                * which are sent in our [`Init`] message.
-                * 
-                * Note that this method is called before [`Self::peer_connected`].
-                */
-               InitFeatures provided_init_features(byte[] _their_node_id);
-       }
        private class LDKRoutingMessageHandlerHolder { internal RoutingMessageHandler held; }
        private class LDKRoutingMessageHandlerImpl : bindings.LDKRoutingMessageHandler {
                internal LDKRoutingMessageHandlerImpl(RoutingMessageHandlerInterface arg, LDKRoutingMessageHandlerHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
@@ -154,41 +143,46 @@ public class RoutingMessageHandler : CommonBase {
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long peer_connected(byte[] _their_node_id, long _init, bool _inbound) {
+               public long peer_connected(long _their_node_id, long _init, bool _inbound) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.Init _init_hu_conv = null; if (_init < 0 || _init > 4096) { _init_hu_conv = new org.ldk.structs.Init(null, _init); }
-                       Result_NoneNoneZ ret = arg.peer_connected(_their_node_id, _init_hu_conv, _inbound);
+                       Result_NoneNoneZ ret = arg.peer_connected(_their_node_id_conv, _init_hu_conv, _inbound);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long handle_reply_channel_range(byte[] _their_node_id, long _msg) {
+               public long handle_reply_channel_range(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.ReplyChannelRange _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.ReplyChannelRange(null, _msg); }
                        if (_msg_hu_conv != null) { _msg_hu_conv.ptrs_to.AddLast(this); };
-                       Result_NoneLightningErrorZ ret = arg.handle_reply_channel_range(_their_node_id, _msg_hu_conv);
+                       Result_NoneLightningErrorZ ret = arg.handle_reply_channel_range(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long handle_reply_short_channel_ids_end(byte[] _their_node_id, long _msg) {
+               public long handle_reply_short_channel_ids_end(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.ReplyShortChannelIdsEnd _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.ReplyShortChannelIdsEnd(null, _msg); }
                        if (_msg_hu_conv != null) { _msg_hu_conv.ptrs_to.AddLast(this); };
-                       Result_NoneLightningErrorZ ret = arg.handle_reply_short_channel_ids_end(_their_node_id, _msg_hu_conv);
+                       Result_NoneLightningErrorZ ret = arg.handle_reply_short_channel_ids_end(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long handle_query_channel_range(byte[] _their_node_id, long _msg) {
+               public long handle_query_channel_range(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.QueryChannelRange _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.QueryChannelRange(null, _msg); }
                        if (_msg_hu_conv != null) { _msg_hu_conv.ptrs_to.AddLast(this); };
-                       Result_NoneLightningErrorZ ret = arg.handle_query_channel_range(_their_node_id, _msg_hu_conv);
+                       Result_NoneLightningErrorZ ret = arg.handle_query_channel_range(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long handle_query_short_channel_ids(byte[] _their_node_id, long _msg) {
+               public long handle_query_short_channel_ids(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.QueryShortChannelIds _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.QueryShortChannelIds(null, _msg); }
                        if (_msg_hu_conv != null) { _msg_hu_conv.ptrs_to.AddLast(this); };
-                       Result_NoneLightningErrorZ ret = arg.handle_query_short_channel_ids(_their_node_id, _msg_hu_conv);
+                       Result_NoneLightningErrorZ ret = arg.handle_query_short_channel_ids(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
@@ -204,26 +198,27 @@ public class RoutingMessageHandler : CommonBase {
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long provided_init_features(byte[] _their_node_id) {
-                       InitFeatures ret = arg.provided_init_features(_their_node_id);
+               public long provided_init_features(long _their_node_id) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
+                       InitFeatures ret = arg.provided_init_features(_their_node_id_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
        }
-       public static RoutingMessageHandler new_impl(RoutingMessageHandlerInterface arg, MessageSendEventsProvider.MessageSendEventsProviderInterface MessageSendEventsProvider_impl) {
+
+       /** Creates a new instance of RoutingMessageHandler from a given implementation */
+       public static RoutingMessageHandler new_impl(RoutingMessageHandlerInterface arg, MessageSendEventsProviderInterface messageSendEventsProvider_impl) {
                LDKRoutingMessageHandlerHolder impl_holder = new LDKRoutingMessageHandlerHolder();
-               impl_holder.held = new RoutingMessageHandler(new LDKRoutingMessageHandlerImpl(arg, impl_holder), MessageSendEventsProvider.new_impl(MessageSendEventsProvider_impl).bindings_instance);
-               return impl_holder.held;
-       }
+               LDKRoutingMessageHandlerImpl impl = new LDKRoutingMessageHandlerImpl(arg, impl_holder);
+               MessageSendEventsProvider messageSendEventsProvider = MessageSendEventsProvider.new_impl(messageSendEventsProvider_impl);
+               long[] ptr_idx = bindings.LDKRoutingMessageHandler_new(impl, messageSendEventsProvider.instance_idx);
 
-       /**
-        * Gets the underlying MessageSendEventsProvider.
-        */
-       public MessageSendEventsProvider get_message_send_events_provider() {
-               MessageSendEventsProvider res = new MessageSendEventsProvider(null, bindings.LDKRoutingMessageHandler_get_MessageSendEventsProvider(this.ptr));
-               this.ptrs_to.AddLast(res);
-               return res;
+               impl_holder.held = new RoutingMessageHandler(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
+               impl_holder.held.ptrs_to.AddLast(messageSendEventsProvider);
+               return impl_holder.held;
        }
 
        /**
@@ -313,7 +308,7 @@ public class RoutingMessageHandler : CommonBase {
         * message handlers may still wish to communicate with this peer.
         */
        public Result_NoneNoneZ peer_connected(byte[] their_node_id, org.ldk.structs.Init init, bool inbound) {
-               long ret = bindings.RoutingMessageHandler_peer_connected(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), init == null ? 0 : init.ptr, inbound);
+               long ret = bindings.RoutingMessageHandler_peer_connected(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_node_id, 33)), init == null ? 0 : init.ptr, inbound);
                GC.KeepAlive(this);
                GC.KeepAlive(their_node_id);
                GC.KeepAlive(init);
@@ -330,7 +325,7 @@ public class RoutingMessageHandler : CommonBase {
         * replies to a single query.
         */
        public Result_NoneLightningErrorZ handle_reply_channel_range(byte[] their_node_id, org.ldk.structs.ReplyChannelRange msg) {
-               long ret = bindings.RoutingMessageHandler_handle_reply_channel_range(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.RoutingMessageHandler_handle_reply_channel_range(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);
@@ -347,7 +342,7 @@ public class RoutingMessageHandler : CommonBase {
         * gossip messages.
         */
        public Result_NoneLightningErrorZ handle_reply_short_channel_ids_end(byte[] their_node_id, org.ldk.structs.ReplyShortChannelIdsEnd msg) {
-               long ret = bindings.RoutingMessageHandler_handle_reply_short_channel_ids_end(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.RoutingMessageHandler_handle_reply_short_channel_ids_end(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);
@@ -362,7 +357,7 @@ public class RoutingMessageHandler : CommonBase {
         * for the requested range of blocks.
         */
        public Result_NoneLightningErrorZ handle_query_channel_range(byte[] their_node_id, org.ldk.structs.QueryChannelRange msg) {
-               long ret = bindings.RoutingMessageHandler_handle_query_channel_range(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.RoutingMessageHandler_handle_query_channel_range(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);
@@ -377,7 +372,7 @@ public class RoutingMessageHandler : CommonBase {
         * list of `short_channel_id`s.
         */
        public Result_NoneLightningErrorZ handle_query_short_channel_ids(byte[] their_node_id, org.ldk.structs.QueryShortChannelIds msg) {
-               long ret = bindings.RoutingMessageHandler_handle_query_short_channel_ids(this.ptr, InternalUtils.check_arr_len(their_node_id, 33), msg == null ? 0 : msg.ptr);
+               long ret = bindings.RoutingMessageHandler_handle_query_short_channel_ids(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);
@@ -421,7 +416,7 @@ public class RoutingMessageHandler : CommonBase {
         * Note that this method is called before [`Self::peer_connected`].
         */
        public InitFeatures provided_init_features(byte[] their_node_id) {
-               long ret = bindings.RoutingMessageHandler_provided_init_features(this.ptr, InternalUtils.check_arr_len(their_node_id, 33));
+               long ret = bindings.RoutingMessageHandler_provided_init_features(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_node_id, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(their_node_id);
                if (ret >= 0 && ret <= 4096) { return null; }
index fb5de89ab29ceae3b99ef3a5e0cf047006571509..467b8f3445584305456eb7a12733894647b439c7 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,175 +6,70 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of Score */
+public interface ScoreInterface {
+       /**Serialize the object into a byte array
+        */
+       byte[] write();
+}
+
 /**
- * An interface used to score payment channels for path finding.
+ * A trait which can both lookup and update routing channel penalty scores.
  * 
- * \tScoring is in terms of fees willing to be paid in order to avoid routing through a channel.
+ * This is used in places where both bounds are required and implemented for all types which
+ * implement [`ScoreLookUp`] and [`ScoreUpdate`].
+ * 
+ * Bindings users may need to manually implement this for their custom scoring implementations.
  */
 public class Score : CommonBase {
-       internal readonly bindings.LDKScore bindings_instance;
+       internal bindings.LDKScore bindings_instance;
+       internal long instance_idx;
+
        internal Score(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private Score(bindings.LDKScore arg) : base(bindings.LDKScore_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~Score() {
                if (ptr != 0) { bindings.Score_free(ptr); }
        }
 
-       public interface ScoreInterface {
-               /**
-                * Returns the fee in msats willing to be paid to avoid routing `send_amt_msat` through the
-                * given channel in the direction from `source` to `target`.
-                * 
-                * The channel's capacity (less any other MPP parts that are also being considered for use in
-                * the same payment) is given by `capacity_msat`. It may be determined from various sources
-                * such as a chain data, network gossip, or invoice hints. For invoice hints, a capacity near
-                * [`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);
-               /**
-                * Handles updating channel penalties after failing to route through a channel.
-                */
-               void payment_path_failed(Path _path, long _short_channel_id);
-               /**
-                * Handles updating channel penalties after successfully routing along a path.
-                */
-               void payment_path_successful(Path _path);
-               /**
-                * Handles updating channel penalties after a probe over the given path failed.
-                */
-               void probe_failed(Path _path, long _short_channel_id);
-               /**
-                * Handles updating channel penalties after a probe over the given path succeeded.
-                */
-               void probe_successful(Path _path);
-               /**
-                * Serialize the object into a byte array
-                */
-               byte[] write();
-       }
        private class LDKScoreHolder { internal Score held; }
        private class LDKScoreImpl : bindings.LDKScore {
                internal LDKScoreImpl(ScoreInterface arg, LDKScoreHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private ScoreInterface arg;
                private LDKScoreHolder 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); }
-                       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);
-                               GC.KeepAlive(arg);
-                       return ret;
-               }
-               public void payment_path_failed(long _path, long _short_channel_id) {
-                       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);
-                               GC.KeepAlive(arg);
-               }
-               public void payment_path_successful(long _path) {
-                       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);
-                               GC.KeepAlive(arg);
-               }
-               public void probe_failed(long _path, long _short_channel_id) {
-                       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);
-                               GC.KeepAlive(arg);
-               }
-               public void probe_successful(long _path) {
-                       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);
-                               GC.KeepAlive(arg);
-               }
-               public byte[] write() {
+               public long write() {
                        byte[] ret = arg.write();
                                GC.KeepAlive(arg);
-                       return ret;
+                       long result = InternalUtils.encodeUint8Array(ret);
+                       return result;
                }
        }
-       public static Score new_impl(ScoreInterface arg) {
-               LDKScoreHolder impl_holder = new LDKScoreHolder();
-               impl_holder.held = new Score(new LDKScoreImpl(arg, impl_holder));
-               return impl_holder.held;
-       }
-       /**
-        * Returns the fee in msats willing to be paid to avoid routing `send_amt_msat` through the
-        * given channel in the direction from `source` to `target`.
-        * 
-        * The channel's capacity (less any other MPP parts that are also being considered for use in
-        * the same payment) is given by `capacity_msat`. It may be determined from various sources
-        * such as a chain data, network gossip, or invoice hints. For invoice hints, a capacity near
-        * [`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.Score_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);
-               GC.KeepAlive(this);
-               GC.KeepAlive(short_channel_id);
-               GC.KeepAlive(source);
-               GC.KeepAlive(target);
-               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;
-       }
-
-       /**
-        * 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.Score_payment_path_failed(this.ptr, path == null ? 0 : path.ptr, short_channel_id);
-               GC.KeepAlive(this);
-               GC.KeepAlive(path);
-               GC.KeepAlive(short_channel_id);
-               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.Score_payment_path_successful(this.ptr, path == null ? 0 : path.ptr);
-               GC.KeepAlive(this);
-               GC.KeepAlive(path);
-               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.Score_probe_failed(this.ptr, path == null ? 0 : path.ptr, short_channel_id);
-               GC.KeepAlive(this);
-               GC.KeepAlive(path);
-               GC.KeepAlive(short_channel_id);
-               if (this != null) { this.ptrs_to.AddLast(path); };
-       }
+       /** Creates a new instance of Score from a given implementation */
+       public static Score new_impl(ScoreInterface arg, ScoreLookUpInterface scoreLookUp_impl, ScoreUpdateInterface scoreUpdate_impl) {
+               LDKScoreHolder impl_holder = new LDKScoreHolder();
+               LDKScoreImpl impl = new LDKScoreImpl(arg, impl_holder);
+               ScoreLookUp scoreLookUp = ScoreLookUp.new_impl(scoreLookUp_impl);
+               ScoreUpdate scoreUpdate = ScoreUpdate.new_impl(scoreUpdate_impl);
+               long[] ptr_idx = bindings.LDKScore_new(impl, scoreLookUp.instance_idx, scoreUpdate.instance_idx);
 
-       /**
-        * Handles updating channel penalties after a probe over the given path succeeded.
-        */
-       public void probe_successful(org.ldk.structs.Path path) {
-               bindings.Score_probe_successful(this.ptr, path == null ? 0 : path.ptr);
-               GC.KeepAlive(this);
-               GC.KeepAlive(path);
-               if (this != null) { this.ptrs_to.AddLast(path); };
+               impl_holder.held = new Score(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
+               impl_holder.held.ptrs_to.AddLast(scoreLookUp);
+               impl_holder.held.ptrs_to.AddLast(scoreUpdate);
+               return impl_holder.held;
        }
 
        /**
         * Serialize the object into a byte array
         */
        public byte[] write() {
-               byte[] ret = bindings.Score_write(this.ptr);
+               long ret = bindings.Score_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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/ScoreLookUp.cs b/c_sharp/src/org/ldk/structs/ScoreLookUp.cs
new file mode 100644 (file)
index 0000000..42310a5
--- /dev/null
@@ -0,0 +1,96 @@
+
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+
+/** An implementation of ScoreLookUp */
+public interface ScoreLookUpInterface {
+       /**Returns the fee in msats willing to be paid to avoid routing `send_amt_msat` through the
+        * given channel in the direction from `source` to `target`.
+        * 
+        * The channel's capacity (less any other MPP parts that are also being considered for use in
+        * the same payment) is given by `capacity_msat`. It may be determined from various sources
+        * such as a chain data, network gossip, or invoice hints. For invoice hints, a capacity near
+        * [`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);
+}
+
+/**
+ * An interface used to score payment channels for path finding.
+ * 
+ * `ScoreLookUp` is used to determine the penalty for a given channel.
+ * 
+ * Scoring is in terms of fees willing to be paid in order to avoid routing through a channel.
+ */
+public class ScoreLookUp : CommonBase {
+       internal bindings.LDKScoreLookUp bindings_instance;
+       internal long instance_idx;
+
+       internal ScoreLookUp(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
+       ~ScoreLookUp() {
+               if (ptr != 0) { bindings.ScoreLookUp_free(ptr); }
+       }
+
+       private class LDKScoreLookUpHolder { internal ScoreLookUp held; }
+       private class LDKScoreLookUpImpl : bindings.LDKScoreLookUp {
+               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); }
+                       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);
+                               GC.KeepAlive(arg);
+                       return ret;
+               }
+       }
+
+       /** Creates a new instance of ScoreLookUp from a given implementation */
+       public static ScoreLookUp new_impl(ScoreLookUpInterface arg) {
+               LDKScoreLookUpHolder impl_holder = new LDKScoreLookUpHolder();
+               LDKScoreLookUpImpl impl = new LDKScoreLookUpImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKScoreLookUp_new(impl);
+
+               impl_holder.held = new ScoreLookUp(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
+               return impl_holder.held;
+       }
+
+       /**
+        * Returns the fee in msats willing to be paid to avoid routing `send_amt_msat` through the
+        * given channel in the direction from `source` to `target`.
+        * 
+        * The channel's capacity (less any other MPP parts that are also being considered for use in
+        * the same payment) is given by `capacity_msat`. It may be determined from various sources
+        * such as a chain data, network gossip, or invoice hints. For invoice hints, a capacity near
+        * [`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);
+               GC.KeepAlive(this);
+               GC.KeepAlive(short_channel_id);
+               GC.KeepAlive(source);
+               GC.KeepAlive(target);
+               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;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/ScoreUpdate.cs b/c_sharp/src/org/ldk/structs/ScoreUpdate.cs
new file mode 100644 (file)
index 0000000..936d57a
--- /dev/null
@@ -0,0 +1,121 @@
+
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+
+/** An implementation of ScoreUpdate */
+public interface ScoreUpdateInterface {
+       /**Handles updating channel penalties after failing to route through a channel.
+        */
+       void payment_path_failed(Path path, long short_channel_id);
+       /**Handles updating channel penalties after successfully routing along a path.
+        */
+       void payment_path_successful(Path path);
+       /**Handles updating channel penalties after a probe over the given path failed.
+        */
+       void probe_failed(Path path, long short_channel_id);
+       /**Handles updating channel penalties after a probe over the given path succeeded.
+        */
+       void probe_successful(Path path);
+}
+
+/**
+ * `ScoreUpdate` is used to update the scorer's internal state after a payment attempt.
+ */
+public class ScoreUpdate : CommonBase {
+       internal bindings.LDKScoreUpdate bindings_instance;
+       internal long instance_idx;
+
+       internal ScoreUpdate(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
+       ~ScoreUpdate() {
+               if (ptr != 0) { bindings.ScoreUpdate_free(ptr); }
+       }
+
+       private class LDKScoreUpdateHolder { internal ScoreUpdate held; }
+       private class LDKScoreUpdateImpl : bindings.LDKScoreUpdate {
+               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) {
+                       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);
+                               GC.KeepAlive(arg);
+               }
+               public void payment_path_successful(long _path) {
+                       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);
+                               GC.KeepAlive(arg);
+               }
+               public void probe_failed(long _path, long _short_channel_id) {
+                       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);
+                               GC.KeepAlive(arg);
+               }
+               public void probe_successful(long _path) {
+                       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);
+                               GC.KeepAlive(arg);
+               }
+       }
+
+       /** Creates a new instance of ScoreUpdate from a given implementation */
+       public static ScoreUpdate new_impl(ScoreUpdateInterface arg) {
+               LDKScoreUpdateHolder impl_holder = new LDKScoreUpdateHolder();
+               LDKScoreUpdateImpl impl = new LDKScoreUpdateImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKScoreUpdate_new(impl);
+
+               impl_holder.held = new ScoreUpdate(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
+               return impl_holder.held;
+       }
+
+       /**
+        * 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);
+               GC.KeepAlive(this);
+               GC.KeepAlive(path);
+               GC.KeepAlive(short_channel_id);
+               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);
+               GC.KeepAlive(this);
+               GC.KeepAlive(path);
+               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);
+               GC.KeepAlive(this);
+               GC.KeepAlive(path);
+               GC.KeepAlive(short_channel_id);
+               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);
+               GC.KeepAlive(this);
+               GC.KeepAlive(path);
+               if (this != null) { this.ptrs_to.AddLast(path); };
+       }
+
+}
+} } }
index ea8ffc5389d4b026fd24415aa124900abec4236f..add28b36884da95303dc6a526326bce748ff1a98 100644 (file)
@@ -7,12 +7,12 @@ namespace org { namespace ldk { namespace structs {
 
 
 /**
- * [`Score`] implementation that factors in in-flight HTLC liquidity.
+ * [`ScoreLookUp`] implementation that factors in in-flight HTLC liquidity.
  * 
- * Useful for custom [`Router`] implementations to wrap their [`Score`] on-the-fly when calling
+ * Useful for custom [`Router`] implementations to wrap their [`ScoreLookUp`] on-the-fly when calling
  * [`find_route`].
  * 
- * [`Score`]: crate::routing::scoring::Score
+ * [`ScoreLookUp`]: crate::routing::scoring::ScoreLookUp
  */
 public class ScorerAccountingForInFlightHtlcs : CommonBase {
        internal ScorerAccountingForInFlightHtlcs(object _dummy, long ptr) : base(ptr) { }
@@ -23,7 +23,7 @@ public class ScorerAccountingForInFlightHtlcs : CommonBase {
        /**
         * Initialize a new `ScorerAccountingForInFlightHtlcs`.
         */
-       public static ScorerAccountingForInFlightHtlcs of(org.ldk.structs.Score scorer, org.ldk.structs.InFlightHtlcs inflight_htlcs) {
+       public static ScorerAccountingForInFlightHtlcs of(org.ldk.structs.ScoreLookUp scorer, org.ldk.structs.InFlightHtlcs inflight_htlcs) {
                long ret = bindings.ScorerAccountingForInFlightHtlcs_new(scorer.ptr, inflight_htlcs == null ? 0 : inflight_htlcs.ptr);
                GC.KeepAlive(scorer);
                GC.KeepAlive(inflight_htlcs);
@@ -36,23 +36,14 @@ public class ScorerAccountingForInFlightHtlcs : CommonBase {
        }
 
        /**
-        * Serialize the ScorerAccountingForInFlightHtlcs object into a byte array which can be read by ScorerAccountingForInFlightHtlcs_read
+        * Constructs a new ScoreLookUp which calls the relevant methods on this_arg.
+        * This copies the `inner` pointer in this_arg and thus the returned ScoreLookUp must be freed before this_arg is
         */
-       public byte[] write() {
-               byte[] ret = bindings.ScorerAccountingForInFlightHtlcs_write(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Constructs a new Score which calls the relevant methods on this_arg.
-        * This copies the `inner` pointer in this_arg and thus the returned Score must be freed before this_arg is
-        */
-       public Score as_Score() {
-               long ret = bindings.ScorerAccountingForInFlightHtlcs_as_Score(this.ptr);
+       public ScoreLookUp as_ScoreLookUp() {
+               long ret = bindings.ScorerAccountingForInFlightHtlcs_as_ScoreLookUp(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Score ret_hu_conv = new Score(null, ret);
+               ScoreLookUp ret_hu_conv = new ScoreLookUp(null, ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
                return ret_hu_conv;
        }
index 274000f43322a265c5ffe6af5599a6f5f0e132a1..48cbe06ea63f22a9386cb21612761cb340a6c2d7 100644 (file)
@@ -67,7 +67,7 @@ public class Sha256 : CommonBase {
         * single sha256 hash.
         */
        public static Sha256 from_bytes(byte[] bytes) {
-               long ret = bindings.Sha256_from_bytes(InternalUtils.check_arr_len(bytes, 32));
+               long ret = bindings.Sha256_from_bytes(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(bytes, 32)));
                GC.KeepAlive(bytes);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.Sha256 ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Sha256(null, ret); }
index 9b1b7d4d3fd115fe9834fc22df134f70c2fbea15..a7ea3d7840743587b7a036a6025f384f512c9b66 100644 (file)
@@ -21,16 +21,18 @@ public class Shutdown : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.Shutdown_get_channel_id(this.ptr);
+               long ret = bindings.Shutdown_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.Shutdown_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.Shutdown_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -41,9 +43,11 @@ public class Shutdown : CommonBase {
         * Must be in one of these forms: P2PKH, P2SH, P2WPKH, P2WSH, P2TR.
         */
        public byte[] get_scriptpubkey() {
-               byte[] ret = bindings.Shutdown_get_scriptpubkey(this.ptr);
+               long ret = bindings.Shutdown_get_scriptpubkey(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -52,7 +56,7 @@ public class Shutdown : CommonBase {
         * Must be in one of these forms: P2PKH, P2SH, P2WPKH, P2WSH, P2TR.
         */
        public void set_scriptpubkey(byte[] val) {
-               bindings.Shutdown_set_scriptpubkey(this.ptr, val);
+               bindings.Shutdown_set_scriptpubkey(this.ptr, InternalUtils.encodeUint8Array(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -61,7 +65,7 @@ public class Shutdown : CommonBase {
         * Constructs a new Shutdown given each field
         */
        public static Shutdown of(byte[] channel_id_arg, byte[] scriptpubkey_arg) {
-               long ret = bindings.Shutdown_new(InternalUtils.check_arr_len(channel_id_arg, 32), scriptpubkey_arg);
+               long ret = bindings.Shutdown_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), InternalUtils.encodeUint8Array(scriptpubkey_arg));
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(scriptpubkey_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -109,16 +113,18 @@ public class Shutdown : CommonBase {
         * Serialize the Shutdown object into a byte array which can be read by Shutdown_read
         */
        public byte[] write() {
-               byte[] ret = bindings.Shutdown_write(this.ptr);
+               long ret = bindings.Shutdown_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a Shutdown from a byte array, created by Shutdown_write
         */
        public static Result_ShutdownDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.Shutdown_read(ser);
+               long ret = bindings.Shutdown_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ShutdownDecodeErrorZ ret_hu_conv = Result_ShutdownDecodeErrorZ.constr_from_ptr(ret);
index 9ecc27e720c9298b9057112dfdb726ae1ee4dd27..30bf39a305b7cb48c3d98b37e01021916836f939 100644 (file)
@@ -56,16 +56,18 @@ public class ShutdownScript : CommonBase {
         * Serialize the ShutdownScript object into a byte array which can be read by ShutdownScript_read
         */
        public byte[] write() {
-               byte[] ret = bindings.ShutdownScript_write(this.ptr);
+               long ret = bindings.ShutdownScript_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a ShutdownScript from a byte array, created by ShutdownScript_write
         */
        public static Result_ShutdownScriptDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ShutdownScript_read(ser);
+               long ret = bindings.ShutdownScript_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ShutdownScriptDecodeErrorZ ret_hu_conv = Result_ShutdownScriptDecodeErrorZ.constr_from_ptr(ret);
@@ -76,7 +78,7 @@ public class ShutdownScript : CommonBase {
         * Generates a P2WPKH script pubkey from the given [`WPubkeyHash`].
         */
        public static ShutdownScript new_p2wpkh(byte[] pubkey_hash) {
-               long ret = bindings.ShutdownScript_new_p2wpkh(InternalUtils.check_arr_len(pubkey_hash, 20));
+               long ret = bindings.ShutdownScript_new_p2wpkh(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(pubkey_hash, 20)));
                GC.KeepAlive(pubkey_hash);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.ShutdownScript ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ShutdownScript(null, ret); }
@@ -88,7 +90,7 @@ public class ShutdownScript : CommonBase {
         * Generates a P2WSH script pubkey from the given [`WScriptHash`].
         */
        public static ShutdownScript new_p2wsh(byte[] script_hash) {
-               long ret = bindings.ShutdownScript_new_p2wsh(InternalUtils.check_arr_len(script_hash, 32));
+               long ret = bindings.ShutdownScript_new_p2wsh(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(script_hash, 32)));
                GC.KeepAlive(script_hash);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.ShutdownScript ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ShutdownScript(null, ret); }
@@ -107,7 +109,7 @@ 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(), program);
+               long ret = bindings.ShutdownScript_new_witness_program(version.getVal(), InternalUtils.encodeUint8Array(program));
                GC.KeepAlive(version);
                GC.KeepAlive(program);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -119,10 +121,12 @@ public class ShutdownScript : CommonBase {
         * Converts the shutdown script into the underlying [`Script`].
         */
        public byte[] into_inner() {
-               byte[] ret = bindings.ShutdownScript_into_inner(this.ptr);
+               long ret = bindings.ShutdownScript_into_inner(this.ptr);
                GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
                if (this != null) { this.ptrs_to.AddLast(this); };
-               return ret;
+               return ret_conv;
        }
 
        /**
@@ -131,9 +135,11 @@ public class ShutdownScript : CommonBase {
         * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        public byte[] as_legacy_pubkey() {
-               byte[] ret = bindings.ShutdownScript_as_legacy_pubkey(this.ptr);
+               long ret = bindings.ShutdownScript_as_legacy_pubkey(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
index a077e98688c82517cbff7f1019269d14ef22ad78..f030d2dda2ddf22351d0142fd99bd485b50be883 100644 (file)
@@ -97,9 +97,11 @@ public class SignOrCreationError : CommonBase {
         * Get the string representation of a SignOrCreationError object
         */
        public string to_str() {
-               string ret = bindings.SignOrCreationError_to_str(this.ptr);
+               long ret = bindings.SignOrCreationError_to_str(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
        }
 
 }
index 8953c5eee22a411ca1552ea7dd2abd3aac2cbebe..ad14e6b2d461a8cd7f3a405bcb2b87fb8277a216 100644 (file)
@@ -98,9 +98,11 @@ public class SignedRawBolt11Invoice : CommonBase {
         * The hash of the [`RawBolt11Invoice`] that was signed.
         */
        public byte[] signable_hash() {
-               byte[] ret = bindings.SignedRawBolt11Invoice_signable_hash(this.ptr);
+               long ret = bindings.SignedRawBolt11Invoice_signable_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -118,11 +120,11 @@ public class SignedRawBolt11Invoice : CommonBase {
        /**
         * Recovers the public key used for signing the invoice from the recoverable signature.
         */
-       public Result_PayeePubKeyErrorZ recover_payee_pub_key() {
+       public Result_PayeePubKeySecp256k1ErrorZ recover_payee_pub_key() {
                long ret = bindings.SignedRawBolt11Invoice_recover_payee_pub_key(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PayeePubKeyErrorZ ret_hu_conv = Result_PayeePubKeyErrorZ.constr_from_ptr(ret);
+               Result_PayeePubKeySecp256k1ErrorZ ret_hu_conv = Result_PayeePubKeySecp256k1ErrorZ.constr_from_ptr(ret);
                return ret_hu_conv;
        }
 
@@ -140,7 +142,7 @@ public class SignedRawBolt11Invoice : CommonBase {
         * Read a SignedRawBolt11Invoice object from a string
         */
        public static Result_SignedRawBolt11InvoiceBolt11ParseErrorZ from_str(string s) {
-               long ret = bindings.SignedRawBolt11Invoice_from_str(s);
+               long ret = bindings.SignedRawBolt11Invoice_from_str(InternalUtils.encodeString(s));
                GC.KeepAlive(s);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_SignedRawBolt11InvoiceBolt11ParseErrorZ ret_hu_conv = Result_SignedRawBolt11InvoiceBolt11ParseErrorZ.constr_from_ptr(ret);
@@ -151,9 +153,11 @@ public class SignedRawBolt11Invoice : CommonBase {
         * Get the string representation of a SignedRawBolt11Invoice object
         */
        public string to_str() {
-               string ret = bindings.SignedRawBolt11Invoice_to_str(this.ptr);
+               long ret = bindings.SignedRawBolt11Invoice_to_str(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
        }
 
 }
index 5de97acd4fcc4e7bbea49edc9bb04d1b1090f632..9396d02fde4186899e7709a5add452c27b39e372 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,103 +6,102 @@ using System;
 
 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
+        * [`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`.
+        * 
+        * This method must return a different value each time it is called.
+        */
+       byte[] generate_channel_keys_id(bool inbound, long channel_value_satoshis, UInt128 user_channel_id);
+       /**Derives the private key material backing a `Signer`.
+        * 
+        * To derive a new `Signer`, a fresh `channel_keys_id` should be obtained through
+        * [`SignerProvider::generate_channel_keys_id`]. Otherwise, an existing `Signer` can be
+        * re-derived from its `channel_keys_id`, which can be obtained through its trait method
+        * [`ChannelSigner::channel_keys_id`].
+        */
+       WriteableEcdsaChannelSigner derive_channel_signer(long channel_value_satoshis, byte[] channel_keys_id);
+       /**Reads a [`Signer`] for this [`SignerProvider`] from the given input stream.
+        * This is only called during deserialization of other objects which contain
+        * [`WriteableEcdsaChannelSigner`]-implementing objects (i.e., [`ChannelMonitor`]s and [`ChannelManager`]s).
+        * The bytes are exactly those which `<Self::Signer as Writeable>::write()` writes, and
+        * contain no versioning scheme. You may wish to include your own version prefix and ensure
+        * you've read all of the provided bytes to ensure no corruption occurred.
+        * 
+        * 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
+        * [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor
+        * [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
+        */
+       Result_WriteableEcdsaChannelSignerDecodeErrorZ read_chan_signer(byte[] reader);
+       /**Get a script pubkey which we send funds to when claiming on-chain contestable outputs.
+        * 
+        * 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.
+        */
+       Result_CVec_u8ZNoneZ get_destination_script();
+       /**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.
+        * In the event of a failure when the counterparty is initiating a close, this can result in a
+        * channel force close.
+        * 
+        * 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.
+        */
+       Result_ShutdownScriptNoneZ get_shutdown_scriptpubkey();
+}
+
 /**
  * A trait that can return signer instances for individual channels.
  */
 public class SignerProvider : CommonBase {
-       internal readonly bindings.LDKSignerProvider bindings_instance;
+       internal bindings.LDKSignerProvider bindings_instance;
+       internal long instance_idx;
+
        internal SignerProvider(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private SignerProvider(bindings.LDKSignerProvider arg) : base(bindings.LDKSignerProvider_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~SignerProvider() {
                if (ptr != 0) { bindings.SignerProvider_free(ptr); }
        }
 
-       public interface SignerProviderInterface {
-               /**
-                * Generates a unique `channel_keys_id` that can be used to obtain a [`Self::Signer`] 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`.
-                * 
-                * This method must return a different value each time it is called.
-                */
-               byte[] generate_channel_keys_id(bool _inbound, long _channel_value_satoshis, UInt128 _user_channel_id);
-               /**
-                * Derives the private key material backing a `Signer`.
-                * 
-                * To derive a new `Signer`, a fresh `channel_keys_id` should be obtained through
-                * [`SignerProvider::generate_channel_keys_id`]. Otherwise, an existing `Signer` can be
-                * re-derived from its `channel_keys_id`, which can be obtained through its trait method
-                * [`ChannelSigner::channel_keys_id`].
-                */
-               WriteableEcdsaChannelSigner derive_channel_signer(long _channel_value_satoshis, byte[] _channel_keys_id);
-               /**
-                * Reads a [`Signer`] for this [`SignerProvider`] from the given input stream.
-                * This is only called during deserialization of other objects which contain
-                * [`WriteableEcdsaChannelSigner`]-implementing objects (i.e., [`ChannelMonitor`]s and [`ChannelManager`]s).
-                * The bytes are exactly those which `<Self::Signer as Writeable>::write()` writes, and
-                * contain no versioning scheme. You may wish to include your own version prefix and ensure
-                * you've read all of the provided bytes to ensure no corruption occurred.
-                * 
-                * 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
-                * [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor
-                * [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
-                */
-               Result_WriteableEcdsaChannelSignerDecodeErrorZ read_chan_signer(byte[] _reader);
-               /**
-                * Get a script pubkey which we send funds to when claiming on-chain contestable outputs.
-                * 
-                * 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.
-                */
-               Result_ScriptNoneZ get_destination_script();
-               /**
-                * 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.
-                * In the event of a failure when the counterparty is initiating a close, this can result in a
-                * channel force close.
-                * 
-                * 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.
-                */
-               Result_ShutdownScriptNoneZ get_shutdown_scriptpubkey();
-       }
        private class LDKSignerProviderHolder { internal SignerProvider held; }
        private class LDKSignerProviderImpl : bindings.LDKSignerProvider {
                internal LDKSignerProviderImpl(SignerProviderInterface arg, LDKSignerProviderHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private SignerProviderInterface arg;
                private LDKSignerProviderHolder impl_holder;
-               public byte[] generate_channel_keys_id(bool _inbound, long _channel_value_satoshis, byte[] _user_channel_id) {
+               public long generate_channel_keys_id(bool _inbound, long _channel_value_satoshis, long _user_channel_id) {
                        org.ldk.util.UInt128 _user_channel_id_conv = new org.ldk.util.UInt128(_user_channel_id);
                        byte[] ret = arg.generate_channel_keys_id(_inbound, _channel_value_satoshis, _user_channel_id_conv);
                                GC.KeepAlive(arg);
-                       byte[] result = InternalUtils.check_arr_len(ret, 32);
+                       long result = InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(ret, 32));
                        return result;
                }
-               public long derive_channel_signer(long _channel_value_satoshis, byte[] _channel_keys_id) {
-                       WriteableEcdsaChannelSigner ret = arg.derive_channel_signer(_channel_value_satoshis, _channel_keys_id);
+               public long derive_channel_signer(long _channel_value_satoshis, long _channel_keys_id) {
+                       byte[] _channel_keys_id_conv = InternalUtils.decodeUint8Array(_channel_keys_id);
+                       WriteableEcdsaChannelSigner ret = arg.derive_channel_signer(_channel_value_satoshis, _channel_keys_id_conv);
                                GC.KeepAlive(arg);
                        long result = ret.clone_ptr();
                        if (impl_holder.held != null) { impl_holder.held.ptrs_to.AddLast(ret); };
                        return result;
                }
-               public long read_chan_signer(byte[] _reader) {
-                       Result_WriteableEcdsaChannelSignerDecodeErrorZ ret = arg.read_chan_signer(_reader);
+               public long read_chan_signer(long _reader) {
+                       byte[] _reader_conv = InternalUtils.decodeUint8Array(_reader);
+                       Result_WriteableEcdsaChannelSignerDecodeErrorZ ret = arg.read_chan_signer(_reader_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
                public long get_destination_script() {
-                       Result_ScriptNoneZ ret = arg.get_destination_script();
+                       Result_CVec_u8ZNoneZ ret = arg.get_destination_script();
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
@@ -113,11 +113,19 @@ public class SignerProvider : CommonBase {
                        return result;
                }
        }
+
+       /** Creates a new instance of SignerProvider from a given implementation */
        public static SignerProvider new_impl(SignerProviderInterface arg) {
                LDKSignerProviderHolder impl_holder = new LDKSignerProviderHolder();
-               impl_holder.held = new SignerProvider(new LDKSignerProviderImpl(arg, impl_holder));
+               LDKSignerProviderImpl impl = new LDKSignerProviderImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKSignerProvider_new(impl);
+
+               impl_holder.held = new SignerProvider(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Generates a unique `channel_keys_id` that can be used to obtain a [`Self::Signer`] through
         * [`SignerProvider::derive_channel_signer`]. The `user_channel_id` is provided to allow
@@ -127,12 +135,14 @@ public class SignerProvider : CommonBase {
         * This method must return a different value each time it is called.
         */
        public byte[] generate_channel_keys_id(bool inbound, long channel_value_satoshis, org.ldk.util.UInt128 user_channel_id) {
-               byte[] ret = bindings.SignerProvider_generate_channel_keys_id(this.ptr, inbound, channel_value_satoshis, user_channel_id.getLEBytes());
+               long ret = bindings.SignerProvider_generate_channel_keys_id(this.ptr, inbound, channel_value_satoshis, InternalUtils.encodeUint8Array(user_channel_id.getLEBytes()));
                GC.KeepAlive(this);
                GC.KeepAlive(inbound);
                GC.KeepAlive(channel_value_satoshis);
                GC.KeepAlive(user_channel_id);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -144,7 +154,7 @@ public class SignerProvider : CommonBase {
         * [`ChannelSigner::channel_keys_id`].
         */
        public WriteableEcdsaChannelSigner derive_channel_signer(long channel_value_satoshis, byte[] channel_keys_id) {
-               long ret = bindings.SignerProvider_derive_channel_signer(this.ptr, channel_value_satoshis, InternalUtils.check_arr_len(channel_keys_id, 32));
+               long ret = bindings.SignerProvider_derive_channel_signer(this.ptr, channel_value_satoshis, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_keys_id, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(channel_value_satoshis);
                GC.KeepAlive(channel_keys_id);
@@ -170,7 +180,7 @@ public class SignerProvider : CommonBase {
         * [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
         */
        public Result_WriteableEcdsaChannelSignerDecodeErrorZ read_chan_signer(byte[] reader) {
-               long ret = bindings.SignerProvider_read_chan_signer(this.ptr, reader);
+               long ret = bindings.SignerProvider_read_chan_signer(this.ptr, InternalUtils.encodeUint8Array(reader));
                GC.KeepAlive(this);
                GC.KeepAlive(reader);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -186,11 +196,11 @@ public class SignerProvider : CommonBase {
         * 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.
         */
-       public Result_ScriptNoneZ get_destination_script() {
+       public Result_CVec_u8ZNoneZ get_destination_script() {
                long ret = bindings.SignerProvider_get_destination_script(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_ScriptNoneZ ret_hu_conv = Result_ScriptNoneZ.constr_from_ptr(ret);
+               Result_CVec_u8ZNoneZ ret_hu_conv = Result_CVec_u8ZNoneZ.constr_from_ptr(ret);
                return ret_hu_conv;
        }
 
index 348a692d57728b254f4cec150f0e34f8ac8077be..ae04a4b07ac6b0c1fec7c9035f88904bfd45dc29 100644 (file)
@@ -48,7 +48,7 @@ public class Sleeper : CommonBase {
         * Constructs a new sleeper on many futures, allowing blocking on all at once.
         */
        public static Sleeper of(Future[] futures) {
-               long ret = bindings.Sleeper_new(futures != null ? InternalUtils.mapArray(futures, futures_conv_8 => futures_conv_8 == null ? 0 : futures_conv_8.ptr) : null);
+               long ret = bindings.Sleeper_new(InternalUtils.encodeUint64Array(InternalUtils.mapArray(futures, futures_conv_8 => futures_conv_8 == null ? 0 : futures_conv_8.ptr)));
                GC.KeepAlive(futures);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.Sleeper ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Sleeper(null, ret); }
diff --git a/c_sharp/src/org/ldk/structs/SocketAddress.cs b/c_sharp/src/org/ldk/structs/SocketAddress.cs
new file mode 100644 (file)
index 0000000..42abb61
--- /dev/null
@@ -0,0 +1,263 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+/**
+ * An address which can be used to connect to a remote peer.
+ */
+public class SocketAddress : CommonBase {
+       protected SocketAddress(object _dummy, long ptr) : base(ptr) { }
+       ~SocketAddress() {
+               if (ptr != 0) { bindings.SocketAddress_free(ptr); }
+       }
+
+       internal static SocketAddress constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKSocketAddress_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new SocketAddress_TcpIpV4(ptr);
+                       case 1: return new SocketAddress_TcpIpV6(ptr);
+                       case 2: return new SocketAddress_OnionV2(ptr);
+                       case 3: return new SocketAddress_OnionV3(ptr);
+                       case 4: return new SocketAddress_Hostname(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A SocketAddress of type TcpIpV4 */
+       public class SocketAddress_TcpIpV4 : SocketAddress {
+               /**
+                * The 4-byte IPv4 address
+                */
+               public byte[] addr;
+               /**
+                * The port on which the node is listening
+                */
+               public short port;
+               internal SocketAddress_TcpIpV4(long ptr) : base(null, ptr) {
+                       long addr = bindings.LDKSocketAddress_TcpIpV4_get_addr(ptr);
+                       byte[] addr_conv = InternalUtils.decodeUint8Array(addr);
+                       this.addr = addr_conv;
+                       this.port = bindings.LDKSocketAddress_TcpIpV4_get_port(ptr);
+               }
+       }
+       /** A SocketAddress of type TcpIpV6 */
+       public class SocketAddress_TcpIpV6 : SocketAddress {
+               /**
+                * The 16-byte IPv6 address
+                */
+               public byte[] addr;
+               /**
+                * The port on which the node is listening
+                */
+               public short port;
+               internal SocketAddress_TcpIpV6(long ptr) : base(null, ptr) {
+                       long addr = bindings.LDKSocketAddress_TcpIpV6_get_addr(ptr);
+                       byte[] addr_conv = InternalUtils.decodeUint8Array(addr);
+                       this.addr = addr_conv;
+                       this.port = bindings.LDKSocketAddress_TcpIpV6_get_port(ptr);
+               }
+       }
+       /** A SocketAddress of type OnionV2 */
+       public class SocketAddress_OnionV2 : SocketAddress {
+               public byte[] onion_v2;
+               internal SocketAddress_OnionV2(long ptr) : base(null, ptr) {
+                       long onion_v2 = bindings.LDKSocketAddress_OnionV2_get_onion_v2(ptr);
+                       byte[] onion_v2_conv = InternalUtils.decodeUint8Array(onion_v2);
+                       this.onion_v2 = onion_v2_conv;
+               }
+       }
+       /** A SocketAddress of type OnionV3 */
+       public class SocketAddress_OnionV3 : SocketAddress {
+               /**
+                * The ed25519 long-term public key of the peer
+                */
+               public byte[] ed25519_pubkey;
+               /**
+                * The checksum of the pubkey and version, as included in the onion address
+                */
+               public short checksum;
+               /**
+                * The version byte, as defined by the Tor Onion v3 spec.
+                */
+               public byte version;
+               /**
+                * The port on which the node is listening
+                */
+               public short port;
+               internal SocketAddress_OnionV3(long ptr) : base(null, ptr) {
+                       long ed25519_pubkey = bindings.LDKSocketAddress_OnionV3_get_ed25519_pubkey(ptr);
+                       byte[] ed25519_pubkey_conv = InternalUtils.decodeUint8Array(ed25519_pubkey);
+                       this.ed25519_pubkey = ed25519_pubkey_conv;
+                       this.checksum = bindings.LDKSocketAddress_OnionV3_get_checksum(ptr);
+                       this.version = bindings.LDKSocketAddress_OnionV3_get_version(ptr);
+                       this.port = bindings.LDKSocketAddress_OnionV3_get_port(ptr);
+               }
+       }
+       /** A SocketAddress of type Hostname */
+       public class SocketAddress_Hostname : SocketAddress {
+               /**
+                * The hostname on which the node is listening.
+                */
+               public Hostname hostname;
+               /**
+                * The port on which the node is listening.
+                */
+               public short port;
+               internal SocketAddress_Hostname(long ptr) : base(null, ptr) {
+                       long hostname = bindings.LDKSocketAddress_Hostname_get_hostname(ptr);
+                       org.ldk.structs.Hostname hostname_hu_conv = null; if (hostname < 0 || hostname > 4096) { hostname_hu_conv = new org.ldk.structs.Hostname(null, hostname); }
+                       if (hostname_hu_conv != null) { hostname_hu_conv.ptrs_to.AddLast(this); };
+                       this.hostname = hostname_hu_conv;
+                       this.port = bindings.LDKSocketAddress_Hostname_get_port(ptr);
+               }
+       }
+       internal long clone_ptr() {
+               long ret = bindings.SocketAddress_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the SocketAddress
+        */
+       public SocketAddress clone() {
+               long ret = bindings.SocketAddress_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.SocketAddress ret_hu_conv = org.ldk.structs.SocketAddress.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 TcpIpV4-variant SocketAddress
+        */
+       public static SocketAddress tcp_ip_v4(byte[] addr, short port) {
+               long ret = bindings.SocketAddress_tcp_ip_v4(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(addr, 4)), port);
+               GC.KeepAlive(addr);
+               GC.KeepAlive(port);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.SocketAddress ret_hu_conv = org.ldk.structs.SocketAddress.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 TcpIpV6-variant SocketAddress
+        */
+       public static SocketAddress tcp_ip_v6(byte[] addr, short port) {
+               long ret = bindings.SocketAddress_tcp_ip_v6(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(addr, 16)), port);
+               GC.KeepAlive(addr);
+               GC.KeepAlive(port);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.SocketAddress ret_hu_conv = org.ldk.structs.SocketAddress.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 OnionV2-variant SocketAddress
+        */
+       public static SocketAddress onion_v2(byte[] a) {
+               long ret = bindings.SocketAddress_onion_v2(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 12)));
+               GC.KeepAlive(a);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.SocketAddress ret_hu_conv = org.ldk.structs.SocketAddress.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 OnionV3-variant SocketAddress
+        */
+       public static SocketAddress onion_v3(byte[] ed25519_pubkey, short checksum, byte version, short port) {
+               long ret = bindings.SocketAddress_onion_v3(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(ed25519_pubkey, 32)), checksum, version, port);
+               GC.KeepAlive(ed25519_pubkey);
+               GC.KeepAlive(checksum);
+               GC.KeepAlive(version);
+               GC.KeepAlive(port);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.SocketAddress ret_hu_conv = org.ldk.structs.SocketAddress.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 Hostname-variant SocketAddress
+        */
+       public static SocketAddress hostname(org.ldk.structs.Hostname hostname, short port) {
+               long ret = bindings.SocketAddress_hostname(hostname == null ? 0 : hostname.ptr, port);
+               GC.KeepAlive(hostname);
+               GC.KeepAlive(port);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.SocketAddress ret_hu_conv = org.ldk.structs.SocketAddress.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(hostname); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if two SocketAddresss contain equal inner contents.
+        * This ignores pointers and is_owned flags and looks at the values in fields.
+        */
+       public bool eq(org.ldk.structs.SocketAddress b) {
+               bool ret = bindings.SocketAddress_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 SocketAddress)) return false;
+               return this.eq((SocketAddress)o);
+       }
+       /**
+        * Serialize the SocketAddress object into a byte array which can be read by SocketAddress_read
+        */
+       public byte[] write() {
+               long ret = bindings.SocketAddress_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a SocketAddress from a byte array, created by SocketAddress_write
+        */
+       public static Result_SocketAddressDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.SocketAddress_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SocketAddressDecodeErrorZ ret_hu_conv = Result_SocketAddressDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Get the string representation of a SocketAddress object
+        */
+       public string to_str() {
+               long ret = bindings.SocketAddress_to_str(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a SocketAddress object from a string
+        */
+       public static Result_SocketAddressSocketAddressParseErrorZ from_str(string s) {
+               long ret = bindings.SocketAddress_from_str(InternalUtils.encodeString(s));
+               GC.KeepAlive(s);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SocketAddressSocketAddressParseErrorZ ret_hu_conv = Result_SocketAddressSocketAddressParseErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 3dead289d3204258b358371f748cc524419e6ba9..76549b18a059522bac8651738af8a9c940321b1a 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,6 +6,44 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of SocketDescriptor */
+public interface SocketDescriptorInterface {
+       /**Attempts to send some data from the given slice to the peer.
+        * 
+        * Returns the amount of data which was sent, possibly 0 if the socket has since disconnected.
+        * Note that in the disconnected case, [`PeerManager::socket_disconnected`] must still be
+        * called and further write attempts may occur until that time.
+        * 
+        * If the returned size is smaller than `data.len()`, a
+        * [`PeerManager::write_buffer_space_avail`] call must be made the next time more data can be
+        * written. Additionally, until a `send_data` event completes fully, no further
+        * [`PeerManager::read_event`] calls should be made for the same peer! Because this is to
+        * prevent denial-of-service issues, you should not read or buffer any data from the socket
+        * until then.
+        * 
+        * If a [`PeerManager::read_event`] call on this descriptor had previously returned true
+        * (indicating that read events should be paused to prevent DoS in the send buffer),
+        * `resume_read` may be set indicating that read events on this descriptor should resume. A
+        * `resume_read` of false carries no meaning, and should not cause any action.
+        */
+       long send_data(byte[] data, bool resume_read);
+       /**Disconnect the socket pointed to by this SocketDescriptor.
+        * 
+        * You do *not* need to call [`PeerManager::socket_disconnected`] with this socket after this
+        * call (doing so is a noop).
+        */
+       void disconnect_socket();
+       /**Checks if two objects are equal given this object's this_arg pointer and another object.
+        */
+       bool eq(SocketDescriptor other_arg);
+       /**Calculate a succinct non-cryptographic hash for an object given its this_arg pointer.
+        * This is used, for example, for inclusion of this object in a hash map.
+        */
+       long hash();
+}
+
 /**
  * Provides an object which can be used to send data to and which uniquely identifies a connection
  * to a remote host. You will need to be able to generate multiple of these which meet Eq and
@@ -20,61 +59,22 @@ namespace org { namespace ldk { namespace structs {
  * to simply use another value which is guaranteed to be globally unique instead.
  */
 public class SocketDescriptor : CommonBase {
-       internal readonly bindings.LDKSocketDescriptor bindings_instance;
+       internal bindings.LDKSocketDescriptor bindings_instance;
+       internal long instance_idx;
+
        internal SocketDescriptor(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private SocketDescriptor(bindings.LDKSocketDescriptor arg) : base(bindings.LDKSocketDescriptor_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~SocketDescriptor() {
                if (ptr != 0) { bindings.SocketDescriptor_free(ptr); }
        }
 
-       public interface SocketDescriptorInterface {
-               /**
-                * Attempts to send some data from the given slice to the peer.
-                * 
-                * Returns the amount of data which was sent, possibly 0 if the socket has since disconnected.
-                * Note that in the disconnected case, [`PeerManager::socket_disconnected`] must still be
-                * called and further write attempts may occur until that time.
-                * 
-                * If the returned size is smaller than `data.len()`, a
-                * [`PeerManager::write_buffer_space_avail`] call must be made the next time more data can be
-                * written. Additionally, until a `send_data` event completes fully, no further
-                * [`PeerManager::read_event`] calls should be made for the same peer! Because this is to
-                * prevent denial-of-service issues, you should not read or buffer any data from the socket
-                * until then.
-                * 
-                * If a [`PeerManager::read_event`] call on this descriptor had previously returned true
-                * (indicating that read events should be paused to prevent DoS in the send buffer),
-                * `resume_read` may be set indicating that read events on this descriptor should resume. A
-                * `resume_read` of false carries no meaning, and should not cause any action.
-                */
-               long send_data(byte[] _data, bool _resume_read);
-               /**
-                * Disconnect the socket pointed to by this SocketDescriptor.
-                * 
-                * You do *not* need to call [`PeerManager::socket_disconnected`] with this socket after this
-                * call (doing so is a noop).
-                */
-               void disconnect_socket();
-               /**
-                * Checks if two objects are equal given this object's this_arg pointer and another object.
-                */
-               bool eq(SocketDescriptor _other_arg);
-               /**
-                * Calculate a succinct non-cryptographic hash for an object given its this_arg pointer.
-                * This is used, for example, for inclusion of this object in a hash map.
-                */
-               long hash();
-       }
        private class LDKSocketDescriptorHolder { internal SocketDescriptor held; }
        private class LDKSocketDescriptorImpl : bindings.LDKSocketDescriptor {
                internal LDKSocketDescriptorImpl(SocketDescriptorInterface arg, LDKSocketDescriptorHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private SocketDescriptorInterface arg;
                private LDKSocketDescriptorHolder impl_holder;
-               public long send_data(byte[] _data, bool _resume_read) {
-                       long ret = arg.send_data(_data, _resume_read);
+               public long send_data(long _data, bool _resume_read) {
+                       byte[] _data_conv = InternalUtils.decodeUint8Array(_data);
+                       long ret = arg.send_data(_data_conv, _resume_read);
                                GC.KeepAlive(arg);
                        return ret;
                }
@@ -95,11 +95,19 @@ public class SocketDescriptor : CommonBase {
                        return ret;
                }
        }
+
+       /** Creates a new instance of SocketDescriptor from a given implementation */
        public static SocketDescriptor new_impl(SocketDescriptorInterface arg) {
                LDKSocketDescriptorHolder impl_holder = new LDKSocketDescriptorHolder();
-               impl_holder.held = new SocketDescriptor(new LDKSocketDescriptorImpl(arg, impl_holder));
+               LDKSocketDescriptorImpl impl = new LDKSocketDescriptorImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKSocketDescriptor_new(impl);
+
+               impl_holder.held = new SocketDescriptor(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Attempts to send some data from the given slice to the peer.
         * 
@@ -120,7 +128,7 @@ public class SocketDescriptor : CommonBase {
         * `resume_read` of false carries no meaning, and should not cause any action.
         */
        public long send_data(byte[] data, bool resume_read) {
-               long ret = bindings.SocketDescriptor_send_data(this.ptr, data, resume_read);
+               long ret = bindings.SocketDescriptor_send_data(this.ptr, InternalUtils.encodeUint8Array(data), resume_read);
                GC.KeepAlive(this);
                GC.KeepAlive(data);
                GC.KeepAlive(resume_read);
index 54bdbb22be36c747e4999119f7cacbf0c047ea67..dc8ca432fe2861217e25ea90f909aa10284bf0a9 100644 (file)
@@ -131,6 +131,18 @@ public class SpendableOutputDescriptor : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the SpendableOutputDescriptor.
+        */
+       public long hash() {
+               long ret = bindings.SpendableOutputDescriptor_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two SpendableOutputDescriptors contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
@@ -150,16 +162,18 @@ public class SpendableOutputDescriptor : CommonBase {
         * Serialize the SpendableOutputDescriptor object into a byte array which can be read by SpendableOutputDescriptor_read
         */
        public byte[] write() {
-               byte[] ret = bindings.SpendableOutputDescriptor_write(this.ptr);
+               long ret = bindings.SpendableOutputDescriptor_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a SpendableOutputDescriptor from a byte array, created by SpendableOutputDescriptor_write
         */
        public static Result_SpendableOutputDescriptorDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.SpendableOutputDescriptor_read(ser);
+               long ret = bindings.SpendableOutputDescriptor_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_SpendableOutputDescriptorDecodeErrorZ ret_hu_conv = Result_SpendableOutputDescriptorDecodeErrorZ.constr_from_ptr(ret);
index b302baa194002726f4723887ff39f1fb11b176be..e1bf7359796220da7bc48dd7f15baa399976909e 100644 (file)
@@ -64,9 +64,11 @@ public class StaticPaymentOutputDescriptor : CommonBase {
         * This may be useful in re-deriving keys used in the channel to spend the output.
         */
        public byte[] get_channel_keys_id() {
-               byte[] ret = bindings.StaticPaymentOutputDescriptor_get_channel_keys_id(this.ptr);
+               long ret = bindings.StaticPaymentOutputDescriptor_get_channel_keys_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -74,7 +76,7 @@ public class StaticPaymentOutputDescriptor : CommonBase {
         * This may be useful in re-deriving keys used in the channel to spend the output.
         */
        public void set_channel_keys_id(byte[] val) {
-               bindings.StaticPaymentOutputDescriptor_set_channel_keys_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.StaticPaymentOutputDescriptor_set_channel_keys_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -97,19 +99,55 @@ public class StaticPaymentOutputDescriptor : CommonBase {
                GC.KeepAlive(val);
        }
 
+       /**
+        * The necessary channel parameters that need to be provided to the re-derived signer through
+        * [`ChannelSigner::provide_channel_parameters`].
+        * 
+        * Added as optional, but always `Some` if the descriptor was produced in v0.0.117 or later.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public ChannelTransactionParameters get_channel_transaction_parameters() {
+               long ret = bindings.StaticPaymentOutputDescriptor_get_channel_transaction_parameters(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ChannelTransactionParameters ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ChannelTransactionParameters(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The necessary channel parameters that need to be provided to the re-derived signer through
+        * [`ChannelSigner::provide_channel_parameters`].
+        * 
+        * Added as optional, but always `Some` if the descriptor was produced in v0.0.117 or later.
+        * 
+        * Note that val (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public void set_channel_transaction_parameters(org.ldk.structs.ChannelTransactionParameters val) {
+               bindings.StaticPaymentOutputDescriptor_set_channel_transaction_parameters(this.ptr, val == null ? 0 : val.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
+       }
+
        /**
         * Constructs a new StaticPaymentOutputDescriptor given each field
+        * 
+        * Note that channel_transaction_parameters_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
-       public static StaticPaymentOutputDescriptor of(org.ldk.structs.OutPoint outpoint_arg, org.ldk.structs.TxOut output_arg, byte[] channel_keys_id_arg, long channel_value_satoshis_arg) {
-               long ret = bindings.StaticPaymentOutputDescriptor_new(outpoint_arg == null ? 0 : outpoint_arg.ptr, output_arg.ptr, InternalUtils.check_arr_len(channel_keys_id_arg, 32), channel_value_satoshis_arg);
+       public static StaticPaymentOutputDescriptor of(org.ldk.structs.OutPoint outpoint_arg, org.ldk.structs.TxOut output_arg, byte[] channel_keys_id_arg, long channel_value_satoshis_arg, org.ldk.structs.ChannelTransactionParameters channel_transaction_parameters_arg) {
+               long ret = bindings.StaticPaymentOutputDescriptor_new(outpoint_arg == null ? 0 : outpoint_arg.ptr, output_arg.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_keys_id_arg, 32)), channel_value_satoshis_arg, channel_transaction_parameters_arg == null ? 0 : channel_transaction_parameters_arg.ptr);
                GC.KeepAlive(outpoint_arg);
                GC.KeepAlive(output_arg);
                GC.KeepAlive(channel_keys_id_arg);
                GC.KeepAlive(channel_value_satoshis_arg);
+               GC.KeepAlive(channel_transaction_parameters_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.StaticPaymentOutputDescriptor ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.StaticPaymentOutputDescriptor(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(channel_transaction_parameters_arg); };
                return ret_hu_conv;
        }
 
@@ -131,6 +169,18 @@ public class StaticPaymentOutputDescriptor : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the StaticPaymentOutputDescriptor.
+        */
+       public long hash() {
+               long ret = bindings.StaticPaymentOutputDescriptor_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two StaticPaymentOutputDescriptors contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
@@ -148,20 +198,48 @@ public class StaticPaymentOutputDescriptor : CommonBase {
                if (!(o is StaticPaymentOutputDescriptor)) return false;
                return this.eq((StaticPaymentOutputDescriptor)o);
        }
+       /**
+        * Returns the `witness_script` of the spendable output.
+        * 
+        * Note that this will only return `Some` for [`StaticPaymentOutputDescriptor`]s that
+        * originated from an anchor outputs channel, as they take the form of a P2WSH script.
+        */
+       public Option_CVec_u8ZZ witness_script() {
+               long ret = bindings.StaticPaymentOutputDescriptor_witness_script(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_CVec_u8ZZ ret_hu_conv = org.ldk.structs.Option_CVec_u8ZZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The maximum length a well-formed witness spending one of these should have.
+        * Note: If you have the grind_signatures feature enabled, this will be at least 1 byte
+        * shorter.
+        */
+       public long max_witness_length() {
+               long ret = bindings.StaticPaymentOutputDescriptor_max_witness_length(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
        /**
         * Serialize the StaticPaymentOutputDescriptor object into a byte array which can be read by StaticPaymentOutputDescriptor_read
         */
        public byte[] write() {
-               byte[] ret = bindings.StaticPaymentOutputDescriptor_write(this.ptr);
+               long ret = bindings.StaticPaymentOutputDescriptor_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a StaticPaymentOutputDescriptor from a byte array, created by StaticPaymentOutputDescriptor_write
         */
        public static Result_StaticPaymentOutputDescriptorDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.StaticPaymentOutputDescriptor_read(ser);
+               long ret = bindings.StaticPaymentOutputDescriptor_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_StaticPaymentOutputDescriptorDecodeErrorZ ret_hu_conv = Result_StaticPaymentOutputDescriptorDecodeErrorZ.constr_from_ptr(ret);
diff --git a/c_sharp/src/org/ldk/structs/TaggedHash.cs b/c_sharp/src/org/ldk/structs/TaggedHash.cs
new file mode 100644 (file)
index 0000000..5a1e192
--- /dev/null
@@ -0,0 +1,23 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A hash for use in a specific context by tweaking with a context-dependent tag as per [BIP 340]
+ * and computed over the merkle root of a TLV stream to sign as defined in [BOLT 12].
+ * 
+ * [BIP 340]: https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
+ * [BOLT 12]: https://github.com/rustyrussell/lightning-rfc/blob/guilt/offers/12-offer-encoding.md#signature-calculation
+ */
+public class TaggedHash : CommonBase {
+       internal TaggedHash(object _dummy, long ptr) : base(ptr) { }
+       ~TaggedHash() {
+               if (ptr != 0) { bindings.TaggedHash_free(ptr); }
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/ThreeTuple_OffersMessageDestinationBlindedPathZ.cs b/c_sharp/src/org/ldk/structs/ThreeTuple_OffersMessageDestinationBlindedPathZ.cs
new file mode 100644 (file)
index 0000000..8882a93
--- /dev/null
@@ -0,0 +1,91 @@
+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_OffersMessageDestinationBlindedPathZ : CommonBase {
+       internal ThreeTuple_OffersMessageDestinationBlindedPathZ(object _dummy, long ptr) : base(ptr) { }
+       ~ThreeTuple_OffersMessageDestinationBlindedPathZ() {
+               if (ptr != 0) { bindings.C3Tuple_OffersMessageDestinationBlindedPathZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public OffersMessage get_a() {
+               long ret = bindings.C3Tuple_OffersMessageDestinationBlindedPathZ_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.OffersMessage ret_hu_conv = org.ldk.structs.OffersMessage.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * 
+        */
+       public Destination get_b() {
+               long ret = bindings.C3Tuple_OffersMessageDestinationBlindedPathZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Destination ret_hu_conv = org.ldk.structs.Destination.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * 
+        */
+       public BlindedPath get_c() {
+               long ret = bindings.C3Tuple_OffersMessageDestinationBlindedPathZ_get_c(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.BlindedPath ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.BlindedPath(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_OffersMessageDestinationBlindedPathZ_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_OffersMessageDestinationBlindedPathZ clone() {
+               long ret = bindings.C3Tuple_OffersMessageDestinationBlindedPathZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               ThreeTuple_OffersMessageDestinationBlindedPathZ ret_hu_conv = new ThreeTuple_OffersMessageDestinationBlindedPathZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C3Tuple_OffersMessageDestinationBlindedPathZ from the contained elements.
+        */
+       public static ThreeTuple_OffersMessageDestinationBlindedPathZ of(org.ldk.structs.OffersMessage a, org.ldk.structs.Destination b, org.ldk.structs.BlindedPath c) {
+               long ret = bindings.C3Tuple_OffersMessageDestinationBlindedPathZ_new(a.ptr, b.ptr, c == null ? 0 : c.ptr);
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               GC.KeepAlive(c);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               ThreeTuple_OffersMessageDestinationBlindedPathZ ret_hu_conv = new ThreeTuple_OffersMessageDestinationBlindedPathZ(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(a); };
+               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_OnionMessageContentsDestinationBlindedPathZ.cs b/c_sharp/src/org/ldk/structs/ThreeTuple_OnionMessageContentsDestinationBlindedPathZ.cs
new file mode 100644 (file)
index 0000000..5365c86
--- /dev/null
@@ -0,0 +1,91 @@
+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_OnionMessageContentsDestinationBlindedPathZ : CommonBase {
+       internal ThreeTuple_OnionMessageContentsDestinationBlindedPathZ(object _dummy, long ptr) : base(ptr) { }
+       ~ThreeTuple_OnionMessageContentsDestinationBlindedPathZ() {
+               if (ptr != 0) { bindings.C3Tuple_OnionMessageContentsDestinationBlindedPathZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public OnionMessageContents get_a() {
+               long ret = bindings.C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_a(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;
+       }
+
+       /**
+        * 
+        */
+       public Destination get_b() {
+               long ret = bindings.C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Destination ret_hu_conv = org.ldk.structs.Destination.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * 
+        */
+       public BlindedPath get_c() {
+               long ret = bindings.C3Tuple_OnionMessageContentsDestinationBlindedPathZ_get_c(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.BlindedPath ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.BlindedPath(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_OnionMessageContentsDestinationBlindedPathZ_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_OnionMessageContentsDestinationBlindedPathZ clone() {
+               long ret = bindings.C3Tuple_OnionMessageContentsDestinationBlindedPathZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               ThreeTuple_OnionMessageContentsDestinationBlindedPathZ ret_hu_conv = new ThreeTuple_OnionMessageContentsDestinationBlindedPathZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C3Tuple_OnionMessageContentsDestinationBlindedPathZ from the contained elements.
+        */
+       public static ThreeTuple_OnionMessageContentsDestinationBlindedPathZ of(org.ldk.structs.OnionMessageContents a, org.ldk.structs.Destination b, org.ldk.structs.BlindedPath c) {
+               long ret = bindings.C3Tuple_OnionMessageContentsDestinationBlindedPathZ_new(a.ptr, b.ptr, c == null ? 0 : c.ptr);
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               GC.KeepAlive(c);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               ThreeTuple_OnionMessageContentsDestinationBlindedPathZ ret_hu_conv = new ThreeTuple_OnionMessageContentsDestinationBlindedPathZ(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(a); };
+               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;
+       }
+
+}
+} } }
index b99b2910bca6426416d8f0c521676f9ec1d0fd9a..c747b1590a6b27d00ed46ecffbe027627f755b5e 100644 (file)
@@ -31,16 +31,18 @@ public class ThreeTuple_OutPointCVec_MonitorEventZPublicKeyZ : CommonBase {
         * 
         */
        public MonitorEvent[] get_b() {
-               long[] ret = bindings.C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_b(this.ptr);
+               long ret = bindings.C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_b(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_14_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_14_len = InternalUtils.getArrayLength(ret);
                MonitorEvent[] ret_conv_14_arr = new MonitorEvent[ret_conv_14_len];
                for (int o = 0; o < ret_conv_14_len; o++) {
-                       long ret_conv_14 = ret[o];
+                       long ret_conv_14 = InternalUtils.getU64ArrayElem(ret, o);
                        org.ldk.structs.MonitorEvent ret_conv_14_hu_conv = org.ldk.structs.MonitorEvent.constr_from_ptr(ret_conv_14);
                        if (ret_conv_14_hu_conv != null) { ret_conv_14_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_14_arr[o] = ret_conv_14_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_14_arr;
        }
 
@@ -48,9 +50,11 @@ public class ThreeTuple_OutPointCVec_MonitorEventZPublicKeyZ : CommonBase {
         * 
         */
        public byte[] get_c() {
-               byte[] ret = bindings.C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_c(this.ptr);
+               long ret = bindings.C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_get_c(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        internal long clone_ptr() {
@@ -76,7 +80,7 @@ public class ThreeTuple_OutPointCVec_MonitorEventZPublicKeyZ : CommonBase {
         * Creates a new C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ from the contained elements.
         */
        public static ThreeTuple_OutPointCVec_MonitorEventZPublicKeyZ of(org.ldk.structs.OutPoint a, MonitorEvent[] b, byte[] c) {
-               long ret = bindings.C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_new(a == null ? 0 : a.ptr, b != null ? InternalUtils.mapArray(b, b_conv_14 => b_conv_14.ptr) : null, InternalUtils.check_arr_len(c, 33));
+               long ret = bindings.C3Tuple_OutPointCVec_MonitorEventZPublicKeyZ_new(a == null ? 0 : a.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(b, b_conv_14 => b_conv_14.ptr)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(c, 33)));
                GC.KeepAlive(a);
                GC.KeepAlive(b);
                GC.KeepAlive(c);
index dfaa86e3ba7bafb52e8bee70294f1e029a1746ea..d05692096d881c6b91b73fdd17bbf1994d679a98 100644 (file)
@@ -31,9 +31,11 @@ public class ThreeTuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ : CommonBas
         * 
         */
        public byte[] get_b() {
-               byte[] ret = bindings.C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_b(this.ptr);
+               long ret = bindings.C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_get_b(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -71,7 +73,7 @@ public class ThreeTuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ : CommonBas
         * Creates a new C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ from the contained elements.
         */
        public static ThreeTuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ of(org.ldk.structs.RawBolt11Invoice a, byte[] b, org.ldk.structs.Bolt11InvoiceSignature c) {
-               long ret = bindings.C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_new(a == null ? 0 : a.ptr, InternalUtils.check_arr_len(b, 32), c == null ? 0 : c.ptr);
+               long ret = bindings.C3Tuple_RawBolt11Invoice_u832Bolt11InvoiceSignatureZ_new(a == null ? 0 : a.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(b, 32)), c == null ? 0 : c.ptr);
                GC.KeepAlive(a);
                GC.KeepAlive(b);
                GC.KeepAlive(c);
index a22f14798d73eabd7cad28d2d933594d14fa02f4..afba6556ff15acdd6be1723e36be5dae1872f043 100644 (file)
@@ -58,7 +58,7 @@ public class TransactionU16LenLimited : CommonBase {
         * serialized length is <= u16::MAX.
         */
        public static Result_TransactionU16LenLimitedNoneZ of(byte[] transaction) {
-               long ret = bindings.TransactionU16LenLimited_new(transaction);
+               long ret = bindings.TransactionU16LenLimited_new(InternalUtils.encodeUint8Array(transaction));
                GC.KeepAlive(transaction);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_TransactionU16LenLimitedNoneZ ret_hu_conv = Result_TransactionU16LenLimitedNoneZ.constr_from_ptr(ret);
@@ -69,26 +69,30 @@ public class TransactionU16LenLimited : CommonBase {
         * Consumes this `TransactionU16LenLimited` and returns its contained `Transaction`.
         */
        public byte[] into_transaction() {
-               byte[] ret = bindings.TransactionU16LenLimited_into_transaction(this.ptr);
+               long ret = bindings.TransactionU16LenLimited_into_transaction(this.ptr);
                GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
                if (this != null) { this.ptrs_to.AddLast(this); };
-               return ret;
+               return ret_conv;
        }
 
        /**
         * Serialize the TransactionU16LenLimited object into a byte array which can be read by TransactionU16LenLimited_read
         */
        public byte[] write() {
-               byte[] ret = bindings.TransactionU16LenLimited_write(this.ptr);
+               long ret = bindings.TransactionU16LenLimited_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a TransactionU16LenLimited from a byte array, created by TransactionU16LenLimited_write
         */
        public static Result_TransactionU16LenLimitedDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.TransactionU16LenLimited_read(ser);
+               long ret = bindings.TransactionU16LenLimited_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_TransactionU16LenLimitedDecodeErrorZ ret_hu_conv = Result_TransactionU16LenLimitedDecodeErrorZ.constr_from_ptr(ret);
index 9a3ff3eef6816608d380bdaacf7daa07e32ed345..3cdf82c730f0b8e8d7717ac257b1efa9b7684e88 100644 (file)
@@ -24,9 +24,11 @@ public class TrustedClosingTransaction : CommonBase {
         * The pre-built Bitcoin commitment transaction
         */
        public byte[] built_transaction() {
-               byte[] ret = bindings.TrustedClosingTransaction_built_transaction(this.ptr);
+               long ret = bindings.TrustedClosingTransaction_built_transaction(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -35,11 +37,13 @@ public class TrustedClosingTransaction : CommonBase {
         * This can be used to verify a signature.
         */
        public byte[] get_sighash_all(byte[] funding_redeemscript, long channel_value_satoshis) {
-               byte[] ret = bindings.TrustedClosingTransaction_get_sighash_all(this.ptr, funding_redeemscript, channel_value_satoshis);
+               long ret = bindings.TrustedClosingTransaction_get_sighash_all(this.ptr, InternalUtils.encodeUint8Array(funding_redeemscript), channel_value_satoshis);
                GC.KeepAlive(this);
                GC.KeepAlive(funding_redeemscript);
                GC.KeepAlive(channel_value_satoshis);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -47,12 +51,14 @@ public class TrustedClosingTransaction : CommonBase {
         * because we are about to broadcast a holder transaction.
         */
        public byte[] sign(byte[] funding_key, byte[] funding_redeemscript, long channel_value_satoshis) {
-               byte[] ret = bindings.TrustedClosingTransaction_sign(this.ptr, InternalUtils.check_arr_len(funding_key, 32), funding_redeemscript, channel_value_satoshis);
+               long ret = bindings.TrustedClosingTransaction_sign(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(funding_key, 32)), InternalUtils.encodeUint8Array(funding_redeemscript), channel_value_satoshis);
                GC.KeepAlive(this);
                GC.KeepAlive(funding_key);
                GC.KeepAlive(funding_redeemscript);
                GC.KeepAlive(channel_value_satoshis);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index 638e16f326677d3a5b223452a6ea9808d7dad7c8..0f81c2feadc14e9054a96c425b437e8fec2070ef 100644 (file)
@@ -24,9 +24,11 @@ public class TrustedCommitmentTransaction : CommonBase {
         * The transaction ID of the built Bitcoin transaction
         */
        public byte[] txid() {
-               byte[] ret = bindings.TrustedCommitmentTransaction_txid(this.ptr);
+               long ret = bindings.TrustedCommitmentTransaction_txid(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -73,18 +75,61 @@ public class TrustedCommitmentTransaction : CommonBase {
         * 
         * This function is only valid in the holder commitment context, it always uses EcdsaSighashType::All.
         */
-       public Result_CVec_SignatureZNoneZ get_htlc_sigs(byte[] htlc_base_key, org.ldk.structs.DirectedChannelTransactionParameters channel_parameters, org.ldk.structs.EntropySource entropy_source) {
-               long ret = bindings.TrustedCommitmentTransaction_get_htlc_sigs(this.ptr, InternalUtils.check_arr_len(htlc_base_key, 32), channel_parameters == null ? 0 : channel_parameters.ptr, entropy_source.ptr);
+       public Result_CVec_ECDSASignatureZNoneZ get_htlc_sigs(byte[] htlc_base_key, org.ldk.structs.DirectedChannelTransactionParameters channel_parameters, org.ldk.structs.EntropySource entropy_source) {
+               long ret = bindings.TrustedCommitmentTransaction_get_htlc_sigs(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(htlc_base_key, 32)), channel_parameters == null ? 0 : channel_parameters.ptr, entropy_source.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(htlc_base_key);
                GC.KeepAlive(channel_parameters);
                GC.KeepAlive(entropy_source);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_SignatureZNoneZ ret_hu_conv = Result_CVec_SignatureZNoneZ.constr_from_ptr(ret);
+               Result_CVec_ECDSASignatureZNoneZ ret_hu_conv = Result_CVec_ECDSASignatureZNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(channel_parameters); };
                if (this != null) { this.ptrs_to.AddLast(entropy_source); };
                return ret_hu_conv;
        }
 
+       /**
+        * Returns the index of the revokeable output, i.e. the `to_local` output sending funds to
+        * the broadcaster, in the built transaction, if any exists.
+        * 
+        * There are two cases where this may return `None`:
+        * - The balance of the revokeable output is below the dust limit (only found on commitments
+        * early in the channel's lifetime, i.e. before the channel reserve is met).
+        * - This commitment was created before LDK 0.0.117. In this case, the
+        * commitment transaction previously didn't contain enough information to locate the
+        * revokeable output.
+        */
+       public Option_usizeZ revokeable_output_index() {
+               long ret = bindings.TrustedCommitmentTransaction_revokeable_output_index(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_usizeZ ret_hu_conv = org.ldk.structs.Option_usizeZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Helper method to build an unsigned justice transaction spending the revokeable
+        * `to_local` output to a destination script. Fee estimation accounts for the expected
+        * revocation witness data that will be added when signed.
+        * 
+        * This method will error if the given fee rate results in a fee greater than the value
+        * of the output being spent, or if there exists no revokeable `to_local` output on this
+        * commitment transaction. See [`Self::revokeable_output_index`] for more details.
+        * 
+        * The built transaction will allow fee bumping with RBF, and this method takes
+        * `feerate_per_kw` as an input such that multiple copies of a justice transaction at different
+        * fee rates may be built.
+        */
+       public Result_TransactionNoneZ build_to_local_justice_tx(long feerate_per_kw, byte[] destination_script) {
+               long ret = bindings.TrustedCommitmentTransaction_build_to_local_justice_tx(this.ptr, feerate_per_kw, InternalUtils.encodeUint8Array(destination_script));
+               GC.KeepAlive(this);
+               GC.KeepAlive(feerate_per_kw);
+               GC.KeepAlive(destination_script);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_TransactionNoneZ ret_hu_conv = Result_TransactionNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
 }
 } } }
diff --git a/c_sharp/src/org/ldk/structs/TwoTuple_BlockHashChannelManagerZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_BlockHashChannelManagerZ.cs
deleted file mode 100644 (file)
index 8267f20..0000000
+++ /dev/null
@@ -1,73 +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_BlockHashChannelManagerZ : CommonBase {
-       internal TwoTuple_BlockHashChannelManagerZ(object _dummy, long ptr) : base(ptr) { }
-       ~TwoTuple_BlockHashChannelManagerZ() {
-               if (ptr != 0) { bindings.C2Tuple_BlockHashChannelManagerZ_free(ptr); }
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_a() {
-               byte[] ret = bindings.C2Tuple_BlockHashChannelManagerZ_get_a(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * 
-        */
-       public ChannelManager get_b() {
-               long ret = bindings.C2Tuple_BlockHashChannelManagerZ_get_b(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.ChannelManager ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ChannelManager(null, ret); }
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new C2Tuple_BlockHashChannelManagerZ from the contained elements.
-        */
-       public static TwoTuple_BlockHashChannelManagerZ of(byte[] a, FeeEstimator b_fee_est, Watch b_chain_monitor, BroadcasterInterface b_tx_broadcaster, Router b_router, Logger b_logger, EntropySource b_entropy_source, NodeSigner b_node_signer, SignerProvider b_signer_provider, UserConfig b_config, ChainParameters b_params, int b_current_timestamp) {
-               long ret = bindings.C2Tuple_BlockHashChannelManagerZ_new(InternalUtils.check_arr_len(a, 32), bindings.ChannelManager_new(b_fee_est.ptr, b_chain_monitor.ptr, b_tx_broadcaster.ptr, b_router.ptr, b_logger.ptr, b_entropy_source.ptr, b_node_signer.ptr, b_signer_provider.ptr, b_config == null ? 0 : b_config.ptr, b_params == null ? 0 : b_params.ptr, b_current_timestamp));
-               GC.KeepAlive(a);
-               GC.KeepAlive(b_fee_est);
-               GC.KeepAlive(b_chain_monitor);
-               GC.KeepAlive(b_tx_broadcaster);
-               GC.KeepAlive(b_router);
-               GC.KeepAlive(b_logger);
-               GC.KeepAlive(b_entropy_source);
-               GC.KeepAlive(b_node_signer);
-               GC.KeepAlive(b_signer_provider);
-               GC.KeepAlive(b_config);
-               GC.KeepAlive(b_params);
-               GC.KeepAlive(b_current_timestamp);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_BlockHashChannelManagerZ ret_hu_conv = new TwoTuple_BlockHashChannelManagerZ(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_fee_est); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_chain_monitor); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_tx_broadcaster); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_router); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_logger); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_entropy_source); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_node_signer); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_signer_provider); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_config); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_params); };
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/TwoTuple_BlockHashChannelMonitorZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_BlockHashChannelMonitorZ.cs
deleted file mode 100644 (file)
index f9f8f24..0000000
+++ /dev/null
@@ -1,73 +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_BlockHashChannelMonitorZ : CommonBase {
-       internal TwoTuple_BlockHashChannelMonitorZ(object _dummy, long ptr) : base(ptr) { }
-       ~TwoTuple_BlockHashChannelMonitorZ() {
-               if (ptr != 0) { bindings.C2Tuple_BlockHashChannelMonitorZ_free(ptr); }
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_a() {
-               byte[] ret = bindings.C2Tuple_BlockHashChannelMonitorZ_get_a(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * 
-        */
-       public ChannelMonitor get_b() {
-               long ret = bindings.C2Tuple_BlockHashChannelMonitorZ_get_b(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.ChannelMonitor ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ChannelMonitor(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_BlockHashChannelMonitorZ_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_BlockHashChannelMonitorZ clone() {
-               long ret = bindings.C2Tuple_BlockHashChannelMonitorZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_BlockHashChannelMonitorZ ret_hu_conv = new TwoTuple_BlockHashChannelMonitorZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new C2Tuple_BlockHashChannelMonitorZ from the contained elements.
-        */
-       public static TwoTuple_BlockHashChannelMonitorZ of(byte[] a, org.ldk.structs.ChannelMonitor b) {
-               long ret = bindings.C2Tuple_BlockHashChannelMonitorZ_new(InternalUtils.check_arr_len(a, 32), b == null ? 0 : b.ptr);
-               GC.KeepAlive(a);
-               GC.KeepAlive(b);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_BlockHashChannelMonitorZ ret_hu_conv = new TwoTuple_BlockHashChannelMonitorZ(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_CVec_u8ZusizeZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_CVec_u8ZusizeZ.cs
new file mode 100644 (file)
index 0000000..4a31f4a
--- /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_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_ECDSASignatureCVec_ECDSASignatureZZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_ECDSASignatureCVec_ECDSASignatureZZ.cs
new file mode 100644 (file)
index 0000000..85092ab
--- /dev/null
@@ -0,0 +1,80 @@
+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_ECDSASignatureCVec_ECDSASignatureZZ : CommonBase {
+       internal TwoTuple_ECDSASignatureCVec_ECDSASignatureZZ(object _dummy, long ptr) : base(ptr) { }
+       ~TwoTuple_ECDSASignatureCVec_ECDSASignatureZZ() {
+               if (ptr != 0) { bindings.C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_a() {
+               long ret = bindings.C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * 
+        */
+       public byte[][] get_b() {
+               long ret = bindings.C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_8_len = InternalUtils.getArrayLength(ret);
+               byte[][] ret_conv_8_arr = new byte[ret_conv_8_len][];
+               for (int i = 0; i < ret_conv_8_len; i++) {
+                       long ret_conv_8 = InternalUtils.getU64ArrayElem(ret, i);
+                       byte[] ret_conv_8_conv = InternalUtils.decodeUint8Array(ret_conv_8);
+                       ret_conv_8_arr[i] = ret_conv_8_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_8_arr;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_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_ECDSASignatureCVec_ECDSASignatureZZ clone() {
+               long ret = bindings.C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_ECDSASignatureCVec_ECDSASignatureZZ ret_hu_conv = new TwoTuple_ECDSASignatureCVec_ECDSASignatureZZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ from the contained elements.
+        */
+       public static TwoTuple_ECDSASignatureCVec_ECDSASignatureZZ of(byte[] a, byte[][] b) {
+               long ret = bindings.C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 64)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(b, b_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(b_conv_8, 64)))));
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_ECDSASignatureCVec_ECDSASignatureZZ ret_hu_conv = new TwoTuple_ECDSASignatureCVec_ECDSASignatureZZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index d8c626a331f66b7da0157f360ffabe9d580e5207..55915cda3b2b9ff0e030da58c15e652610180689 100644 (file)
@@ -31,16 +31,18 @@ public class TwoTuple_OutPointCVec_MonitorUpdateIdZZ : CommonBase {
         * 
         */
        public MonitorUpdateId[] get_b() {
-               long[] ret = bindings.C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_b(this.ptr);
+               long ret = bindings.C2Tuple_OutPointCVec_MonitorUpdateIdZZ_get_b(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_17_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_17_len = InternalUtils.getArrayLength(ret);
                MonitorUpdateId[] ret_conv_17_arr = new MonitorUpdateId[ret_conv_17_len];
                for (int r = 0; r < ret_conv_17_len; r++) {
-                       long ret_conv_17 = ret[r];
+                       long ret_conv_17 = InternalUtils.getU64ArrayElem(ret, r);
                        org.ldk.structs.MonitorUpdateId ret_conv_17_hu_conv = null; if (ret_conv_17 < 0 || ret_conv_17 > 4096) { ret_conv_17_hu_conv = new org.ldk.structs.MonitorUpdateId(null, ret_conv_17); }
                        if (ret_conv_17_hu_conv != null) { ret_conv_17_hu_conv.ptrs_to.AddLast(this); };
                        ret_conv_17_arr[r] = ret_conv_17_hu_conv;
                }
+               bindings.free_buffer(ret);
                return ret_conv_17_arr;
        }
 
@@ -67,7 +69,7 @@ public class TwoTuple_OutPointCVec_MonitorUpdateIdZZ : CommonBase {
         * Creates a new C2Tuple_OutPointCVec_MonitorUpdateIdZZ from the contained elements.
         */
        public static TwoTuple_OutPointCVec_MonitorUpdateIdZZ of(org.ldk.structs.OutPoint a, MonitorUpdateId[] b) {
-               long ret = bindings.C2Tuple_OutPointCVec_MonitorUpdateIdZZ_new(a == null ? 0 : a.ptr, b != null ? InternalUtils.mapArray(b, b_conv_17 => b_conv_17 == null ? 0 : b_conv_17.ptr) : null);
+               long ret = bindings.C2Tuple_OutPointCVec_MonitorUpdateIdZZ_new(a == null ? 0 : a.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(b, b_conv_17 => b_conv_17 == null ? 0 : b_conv_17.ptr)));
                GC.KeepAlive(a);
                GC.KeepAlive(b);
                if (ret >= 0 && ret <= 4096) { return null; }
diff --git a/c_sharp/src/org/ldk/structs/TwoTuple_OutPointCVec_u8ZZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_OutPointCVec_u8ZZ.cs
new file mode 100644 (file)
index 0000000..38f599a
--- /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 {
+
+
+/**
+ * A Tuple
+ */
+public class TwoTuple_OutPointCVec_u8ZZ : CommonBase {
+       internal TwoTuple_OutPointCVec_u8ZZ(object _dummy, long ptr) : base(ptr) { }
+       ~TwoTuple_OutPointCVec_u8ZZ() {
+               if (ptr != 0) { bindings.C2Tuple_OutPointCVec_u8ZZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public OutPoint get_a() {
+               long ret = bindings.C2Tuple_OutPointCVec_u8ZZ_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.OutPoint ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.OutPoint(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_b() {
+               long ret = bindings.C2Tuple_OutPointCVec_u8ZZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.C2Tuple_OutPointCVec_u8ZZ_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_OutPointCVec_u8ZZ clone() {
+               long ret = bindings.C2Tuple_OutPointCVec_u8ZZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_OutPointCVec_u8ZZ ret_hu_conv = new TwoTuple_OutPointCVec_u8ZZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C2Tuple_OutPointCVec_u8ZZ from the contained elements.
+        */
+       public static TwoTuple_OutPointCVec_u8ZZ of(org.ldk.structs.OutPoint a, byte[] b) {
+               long ret = bindings.C2Tuple_OutPointCVec_u8ZZ_new(a == null ? 0 : a.ptr, InternalUtils.encodeUint8Array(b));
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_OutPointCVec_u8ZZ ret_hu_conv = new TwoTuple_OutPointCVec_u8ZZ(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(a); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/TwoTuple_OutPointScriptZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_OutPointScriptZ.cs
deleted file mode 100644 (file)
index 641d570..0000000
+++ /dev/null
@@ -1,73 +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_OutPointScriptZ : CommonBase {
-       internal TwoTuple_OutPointScriptZ(object _dummy, long ptr) : base(ptr) { }
-       ~TwoTuple_OutPointScriptZ() {
-               if (ptr != 0) { bindings.C2Tuple_OutPointScriptZ_free(ptr); }
-       }
-
-       /**
-        * 
-        */
-       public OutPoint get_a() {
-               long ret = bindings.C2Tuple_OutPointScriptZ_get_a(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.OutPoint ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.OutPoint(null, ret); }
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_b() {
-               byte[] ret = bindings.C2Tuple_OutPointScriptZ_get_b(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.C2Tuple_OutPointScriptZ_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_OutPointScriptZ clone() {
-               long ret = bindings.C2Tuple_OutPointScriptZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_OutPointScriptZ ret_hu_conv = new TwoTuple_OutPointScriptZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new C2Tuple_OutPointScriptZ from the contained elements.
-        */
-       public static TwoTuple_OutPointScriptZ of(org.ldk.structs.OutPoint a, byte[] b) {
-               long ret = bindings.C2Tuple_OutPointScriptZ_new(a == null ? 0 : a.ptr, b);
-               GC.KeepAlive(a);
-               GC.KeepAlive(b);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_OutPointScriptZ ret_hu_conv = new TwoTuple_OutPointScriptZ(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(a); };
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/TwoTuple_PartiallySignedTransactionusizeZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_PartiallySignedTransactionusizeZ.cs
deleted file mode 100644 (file)
index b2b3bb3..0000000
+++ /dev/null
@@ -1,69 +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_PartiallySignedTransactionusizeZ : CommonBase {
-       internal TwoTuple_PartiallySignedTransactionusizeZ(object _dummy, long ptr) : base(ptr) { }
-       ~TwoTuple_PartiallySignedTransactionusizeZ() {
-               if (ptr != 0) { bindings.C2Tuple_PartiallySignedTransactionusizeZ_free(ptr); }
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_a() {
-               byte[] ret = bindings.C2Tuple_PartiallySignedTransactionusizeZ_get_a(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * 
-        */
-       public long get_b() {
-               long ret = bindings.C2Tuple_PartiallySignedTransactionusizeZ_get_b(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.C2Tuple_PartiallySignedTransactionusizeZ_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_PartiallySignedTransactionusizeZ clone() {
-               long ret = bindings.C2Tuple_PartiallySignedTransactionusizeZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_PartiallySignedTransactionusizeZ ret_hu_conv = new TwoTuple_PartiallySignedTransactionusizeZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new C2Tuple_PartiallySignedTransactionusizeZ from the contained elements.
-        */
-       public static TwoTuple_PartiallySignedTransactionusizeZ of(byte[] a, long b) {
-               long ret = bindings.C2Tuple_PartiallySignedTransactionusizeZ_new(a, b);
-               GC.KeepAlive(a);
-               GC.KeepAlive(b);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_PartiallySignedTransactionusizeZ ret_hu_conv = new TwoTuple_PartiallySignedTransactionusizeZ(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_PaymentHashPaymentIdZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_PaymentHashPaymentIdZ.cs
deleted file mode 100644 (file)
index 7791e0a..0000000
+++ /dev/null
@@ -1,69 +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_PaymentHashPaymentIdZ : CommonBase {
-       internal TwoTuple_PaymentHashPaymentIdZ(object _dummy, long ptr) : base(ptr) { }
-       ~TwoTuple_PaymentHashPaymentIdZ() {
-               if (ptr != 0) { bindings.C2Tuple_PaymentHashPaymentIdZ_free(ptr); }
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_a() {
-               byte[] ret = bindings.C2Tuple_PaymentHashPaymentIdZ_get_a(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_b() {
-               byte[] ret = bindings.C2Tuple_PaymentHashPaymentIdZ_get_b(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.C2Tuple_PaymentHashPaymentIdZ_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_PaymentHashPaymentIdZ clone() {
-               long ret = bindings.C2Tuple_PaymentHashPaymentIdZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_PaymentHashPaymentIdZ ret_hu_conv = new TwoTuple_PaymentHashPaymentIdZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new C2Tuple_PaymentHashPaymentIdZ from the contained elements.
-        */
-       public static TwoTuple_PaymentHashPaymentIdZ of(byte[] a, byte[] b) {
-               long ret = bindings.C2Tuple_PaymentHashPaymentIdZ_new(InternalUtils.check_arr_len(a, 32), InternalUtils.check_arr_len(b, 32));
-               GC.KeepAlive(a);
-               GC.KeepAlive(b);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_PaymentHashPaymentIdZ ret_hu_conv = new TwoTuple_PaymentHashPaymentIdZ(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_PaymentHashPaymentSecretZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_PaymentHashPaymentSecretZ.cs
deleted file mode 100644 (file)
index 55c9890..0000000
+++ /dev/null
@@ -1,69 +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_PaymentHashPaymentSecretZ : CommonBase {
-       internal TwoTuple_PaymentHashPaymentSecretZ(object _dummy, long ptr) : base(ptr) { }
-       ~TwoTuple_PaymentHashPaymentSecretZ() {
-               if (ptr != 0) { bindings.C2Tuple_PaymentHashPaymentSecretZ_free(ptr); }
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_a() {
-               byte[] ret = bindings.C2Tuple_PaymentHashPaymentSecretZ_get_a(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_b() {
-               byte[] ret = bindings.C2Tuple_PaymentHashPaymentSecretZ_get_b(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.C2Tuple_PaymentHashPaymentSecretZ_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_PaymentHashPaymentSecretZ clone() {
-               long ret = bindings.C2Tuple_PaymentHashPaymentSecretZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_PaymentHashPaymentSecretZ ret_hu_conv = new TwoTuple_PaymentHashPaymentSecretZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new C2Tuple_PaymentHashPaymentSecretZ from the contained elements.
-        */
-       public static TwoTuple_PaymentHashPaymentSecretZ of(byte[] a, byte[] b) {
-               long ret = bindings.C2Tuple_PaymentHashPaymentSecretZ_new(InternalUtils.check_arr_len(a, 32), InternalUtils.check_arr_len(b, 32));
-               GC.KeepAlive(a);
-               GC.KeepAlive(b);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_PaymentHashPaymentSecretZ ret_hu_conv = new TwoTuple_PaymentHashPaymentSecretZ(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_PublicKeyCOption_NetAddressZZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_PublicKeyCOption_NetAddressZZ.cs
deleted file mode 100644 (file)
index 299f4f0..0000000
+++ /dev/null
@@ -1,73 +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_PublicKeyCOption_NetAddressZZ : CommonBase {
-       internal TwoTuple_PublicKeyCOption_NetAddressZZ(object _dummy, long ptr) : base(ptr) { }
-       ~TwoTuple_PublicKeyCOption_NetAddressZZ() {
-               if (ptr != 0) { bindings.C2Tuple_PublicKeyCOption_NetAddressZZ_free(ptr); }
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_a() {
-               byte[] ret = bindings.C2Tuple_PublicKeyCOption_NetAddressZZ_get_a(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * 
-        */
-       public Option_NetAddressZ get_b() {
-               long ret = bindings.C2Tuple_PublicKeyCOption_NetAddressZZ_get_b(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_NetAddressZ ret_hu_conv = org.ldk.structs.Option_NetAddressZ.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_PublicKeyCOption_NetAddressZZ_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_PublicKeyCOption_NetAddressZZ clone() {
-               long ret = bindings.C2Tuple_PublicKeyCOption_NetAddressZZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_PublicKeyCOption_NetAddressZZ ret_hu_conv = new TwoTuple_PublicKeyCOption_NetAddressZZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new C2Tuple_PublicKeyCOption_NetAddressZZ from the contained elements.
-        */
-       public static TwoTuple_PublicKeyCOption_NetAddressZZ of(byte[] a, org.ldk.structs.Option_NetAddressZ b) {
-               long ret = bindings.C2Tuple_PublicKeyCOption_NetAddressZZ_new(InternalUtils.check_arr_len(a, 33), b.ptr);
-               GC.KeepAlive(a);
-               GC.KeepAlive(b);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_PublicKeyCOption_NetAddressZZ ret_hu_conv = new TwoTuple_PublicKeyCOption_NetAddressZZ(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_PublicKeyCOption_SocketAddressZZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_PublicKeyCOption_SocketAddressZZ.cs
new file mode 100644 (file)
index 0000000..213544a
--- /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 {
+
+
+/**
+ * A Tuple
+ */
+public class TwoTuple_PublicKeyCOption_SocketAddressZZ : CommonBase {
+       internal TwoTuple_PublicKeyCOption_SocketAddressZZ(object _dummy, long ptr) : base(ptr) { }
+       ~TwoTuple_PublicKeyCOption_SocketAddressZZ() {
+               if (ptr != 0) { bindings.C2Tuple_PublicKeyCOption_SocketAddressZZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_a() {
+               long ret = bindings.C2Tuple_PublicKeyCOption_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 Option_SocketAddressZ get_b() {
+               long ret = bindings.C2Tuple_PublicKeyCOption_SocketAddressZZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_SocketAddressZ ret_hu_conv = org.ldk.structs.Option_SocketAddressZ.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_PublicKeyCOption_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_PublicKeyCOption_SocketAddressZZ clone() {
+               long ret = bindings.C2Tuple_PublicKeyCOption_SocketAddressZZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_PublicKeyCOption_SocketAddressZZ ret_hu_conv = new TwoTuple_PublicKeyCOption_SocketAddressZZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C2Tuple_PublicKeyCOption_SocketAddressZZ from the contained elements.
+        */
+       public static TwoTuple_PublicKeyCOption_SocketAddressZZ of(byte[] a, org.ldk.structs.Option_SocketAddressZ b) {
+               long ret = bindings.C2Tuple_PublicKeyCOption_SocketAddressZZ_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 33)), b.ptr);
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_PublicKeyCOption_SocketAddressZZ ret_hu_conv = new TwoTuple_PublicKeyCOption_SocketAddressZZ(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_PublicKeyOnionMessageZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_PublicKeyOnionMessageZ.cs
new file mode 100644 (file)
index 0000000..0b47eda
--- /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 {
+
+
+/**
+ * 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;
+       }
+
+}
+} } }
index 4c3352fd4a5f7a9ef83de2c32aa75efe69b5792f..812bfe86f74fd0ecf7e8c403e4c566e2b41352ef 100644 (file)
@@ -19,9 +19,11 @@ public class TwoTuple_PublicKeyTypeZ : CommonBase {
         * 
         */
        public byte[] get_a() {
-               byte[] ret = bindings.C2Tuple_PublicKeyTypeZ_get_a(this.ptr);
+               long ret = bindings.C2Tuple_PublicKeyTypeZ_get_a(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -59,7 +61,7 @@ public class TwoTuple_PublicKeyTypeZ : CommonBase {
         * Creates a new C2Tuple_PublicKeyTypeZ from the contained elements.
         */
        public static TwoTuple_PublicKeyTypeZ of(byte[] a, org.ldk.structs.Type b) {
-               long ret = bindings.C2Tuple_PublicKeyTypeZ_new(InternalUtils.check_arr_len(a, 33), b.ptr);
+               long ret = bindings.C2Tuple_PublicKeyTypeZ_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 33)), b.ptr);
                GC.KeepAlive(a);
                GC.KeepAlive(b);
                if (ret >= 0 && ret <= 4096) { return null; }
diff --git a/c_sharp/src/org/ldk/structs/TwoTuple_SignatureCVec_SignatureZZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_SignatureCVec_SignatureZZ.cs
deleted file mode 100644 (file)
index 2131305..0000000
+++ /dev/null
@@ -1,69 +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_SignatureCVec_SignatureZZ : CommonBase {
-       internal TwoTuple_SignatureCVec_SignatureZZ(object _dummy, long ptr) : base(ptr) { }
-       ~TwoTuple_SignatureCVec_SignatureZZ() {
-               if (ptr != 0) { bindings.C2Tuple_SignatureCVec_SignatureZZ_free(ptr); }
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_a() {
-               byte[] ret = bindings.C2Tuple_SignatureCVec_SignatureZZ_get_a(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * 
-        */
-       public byte[][] get_b() {
-               byte[][] ret = bindings.C2Tuple_SignatureCVec_SignatureZZ_get_b(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.C2Tuple_SignatureCVec_SignatureZZ_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_SignatureCVec_SignatureZZ clone() {
-               long ret = bindings.C2Tuple_SignatureCVec_SignatureZZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_SignatureCVec_SignatureZZ ret_hu_conv = new TwoTuple_SignatureCVec_SignatureZZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new C2Tuple_SignatureCVec_SignatureZZ from the contained elements.
-        */
-       public static TwoTuple_SignatureCVec_SignatureZZ of(byte[] a, byte[][] b) {
-               long ret = bindings.C2Tuple_SignatureCVec_SignatureZZ_new(InternalUtils.check_arr_len(a, 64), b != null ? InternalUtils.mapArray(b, b_conv_8 => InternalUtils.check_arr_len(b_conv_8, 64)) : null);
-               GC.KeepAlive(a);
-               GC.KeepAlive(b);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_SignatureCVec_SignatureZZ ret_hu_conv = new TwoTuple_SignatureCVec_SignatureZZ(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_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ.cs
new file mode 100644 (file)
index 0000000..ea6dfcf
--- /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 {
+
+
+/**
+ * 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_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ.cs
new file mode 100644 (file)
index 0000000..7eddc36
--- /dev/null
@@ -0,0 +1,81 @@
+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_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ : CommonBase {
+       internal TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ(object _dummy, long ptr) : base(ptr) { }
+       ~TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ() {
+               if (ptr != 0) { bindings.C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_a() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * 
+        */
+       public TwoTuple_u32CVec_u8ZZ[] get_b() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_23_len = InternalUtils.getArrayLength(ret);
+               TwoTuple_u32CVec_u8ZZ[] ret_conv_23_arr = new TwoTuple_u32CVec_u8ZZ[ret_conv_23_len];
+               for (int x = 0; x < ret_conv_23_len; x++) {
+                       long ret_conv_23 = InternalUtils.getU64ArrayElem(ret, x);
+                       TwoTuple_u32CVec_u8ZZ ret_conv_23_hu_conv = new TwoTuple_u32CVec_u8ZZ(null, ret_conv_23);
+                       if (ret_conv_23_hu_conv != null) { ret_conv_23_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_23_arr[x] = ret_conv_23_hu_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_23_arr;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_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_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ clone() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ ret_hu_conv = new TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ from the contained elements.
+        */
+       public static TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ of(byte[] a, TwoTuple_u32CVec_u8ZZ[] b) {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 32)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(b, b_conv_23 => b_conv_23 != null ? b_conv_23.ptr : 0)));
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ ret_hu_conv = new TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZ(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_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ.cs
new file mode 100644 (file)
index 0000000..60bdb6b
--- /dev/null
@@ -0,0 +1,81 @@
+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_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ : CommonBase {
+       internal TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ(object _dummy, long ptr) : base(ptr) { }
+       ~TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ() {
+               if (ptr != 0) { bindings.C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_a() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * 
+        */
+       public TwoTuple_u32TxOutZ[] get_b() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_20_len = InternalUtils.getArrayLength(ret);
+               TwoTuple_u32TxOutZ[] ret_conv_20_arr = new TwoTuple_u32TxOutZ[ret_conv_20_len];
+               for (int u = 0; u < ret_conv_20_len; u++) {
+                       long ret_conv_20 = InternalUtils.getU64ArrayElem(ret, u);
+                       TwoTuple_u32TxOutZ ret_conv_20_hu_conv = new TwoTuple_u32TxOutZ(null, ret_conv_20);
+                       if (ret_conv_20_hu_conv != null) { ret_conv_20_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_20_arr[u] = ret_conv_20_hu_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_20_arr;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_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_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ clone() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ ret_hu_conv = new TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ from the contained elements.
+        */
+       public static TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ of(byte[] a, TwoTuple_u32TxOutZ[] b) {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 32)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(b, b_conv_20 => b_conv_20 != null ? b_conv_20.ptr : 0)));
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ ret_hu_conv = new TwoTuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ(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_ThirtyTwoBytesChannelManagerZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesChannelManagerZ.cs
new file mode 100644 (file)
index 0000000..9a04bb1
--- /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 {
+
+
+/**
+ * A Tuple
+ */
+public class TwoTuple_ThirtyTwoBytesChannelManagerZ : CommonBase {
+       internal TwoTuple_ThirtyTwoBytesChannelManagerZ(object _dummy, long ptr) : base(ptr) { }
+       ~TwoTuple_ThirtyTwoBytesChannelManagerZ() {
+               if (ptr != 0) { bindings.C2Tuple_ThirtyTwoBytesChannelManagerZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_a() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesChannelManagerZ_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * 
+        */
+       public ChannelManager get_b() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesChannelManagerZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ChannelManager ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ChannelManager(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C2Tuple_ThirtyTwoBytesChannelManagerZ from the contained elements.
+        */
+       public static TwoTuple_ThirtyTwoBytesChannelManagerZ of(byte[] a, FeeEstimator b_fee_est, Watch b_chain_monitor, BroadcasterInterface b_tx_broadcaster, Router b_router, Logger b_logger, EntropySource b_entropy_source, NodeSigner b_node_signer, SignerProvider b_signer_provider, UserConfig b_config, ChainParameters b_params, int b_current_timestamp) {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesChannelManagerZ_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 32)), bindings.ChannelManager_new(b_fee_est.ptr, b_chain_monitor.ptr, b_tx_broadcaster.ptr, b_router.ptr, b_logger.ptr, b_entropy_source.ptr, b_node_signer.ptr, b_signer_provider.ptr, b_config == null ? 0 : b_config.ptr, b_params == null ? 0 : b_params.ptr, b_current_timestamp));
+               GC.KeepAlive(a);
+               GC.KeepAlive(b_fee_est);
+               GC.KeepAlive(b_chain_monitor);
+               GC.KeepAlive(b_tx_broadcaster);
+               GC.KeepAlive(b_router);
+               GC.KeepAlive(b_logger);
+               GC.KeepAlive(b_entropy_source);
+               GC.KeepAlive(b_node_signer);
+               GC.KeepAlive(b_signer_provider);
+               GC.KeepAlive(b_config);
+               GC.KeepAlive(b_params);
+               GC.KeepAlive(b_current_timestamp);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_ThirtyTwoBytesChannelManagerZ ret_hu_conv = new TwoTuple_ThirtyTwoBytesChannelManagerZ(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_fee_est); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_chain_monitor); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_tx_broadcaster); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_router); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_logger); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_entropy_source); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_node_signer); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_signer_provider); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_config); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_params); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesChannelMonitorZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesChannelMonitorZ.cs
new file mode 100644 (file)
index 0000000..822a90b
--- /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 {
+
+
+/**
+ * A Tuple
+ */
+public class TwoTuple_ThirtyTwoBytesChannelMonitorZ : CommonBase {
+       internal TwoTuple_ThirtyTwoBytesChannelMonitorZ(object _dummy, long ptr) : base(ptr) { }
+       ~TwoTuple_ThirtyTwoBytesChannelMonitorZ() {
+               if (ptr != 0) { bindings.C2Tuple_ThirtyTwoBytesChannelMonitorZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_a() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * 
+        */
+       public ChannelMonitor get_b() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesChannelMonitorZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.ChannelMonitor ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ChannelMonitor(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_ThirtyTwoBytesChannelMonitorZ_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_ThirtyTwoBytesChannelMonitorZ clone() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesChannelMonitorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_ThirtyTwoBytesChannelMonitorZ ret_hu_conv = new TwoTuple_ThirtyTwoBytesChannelMonitorZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C2Tuple_ThirtyTwoBytesChannelMonitorZ from the contained elements.
+        */
+       public static TwoTuple_ThirtyTwoBytesChannelMonitorZ of(byte[] a, org.ldk.structs.ChannelMonitor b) {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesChannelMonitorZ_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 32)), b == null ? 0 : b.ptr);
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_ThirtyTwoBytesChannelMonitorZ ret_hu_conv = new TwoTuple_ThirtyTwoBytesChannelMonitorZ(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_ThirtyTwoBytesPublicKeyZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesPublicKeyZ.cs
new file mode 100644 (file)
index 0000000..b7874e4
--- /dev/null
@@ -0,0 +1,73 @@
+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_ThirtyTwoBytesPublicKeyZ : CommonBase {
+       internal TwoTuple_ThirtyTwoBytesPublicKeyZ(object _dummy, long ptr) : base(ptr) { }
+       ~TwoTuple_ThirtyTwoBytesPublicKeyZ() {
+               if (ptr != 0) { bindings.C2Tuple_ThirtyTwoBytesPublicKeyZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_a() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesPublicKeyZ_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_b() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesPublicKeyZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesPublicKeyZ_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_ThirtyTwoBytesPublicKeyZ clone() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesPublicKeyZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_ThirtyTwoBytesPublicKeyZ ret_hu_conv = new TwoTuple_ThirtyTwoBytesPublicKeyZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C2Tuple_ThirtyTwoBytesPublicKeyZ from the contained elements.
+        */
+       public static TwoTuple_ThirtyTwoBytesPublicKeyZ of(byte[] a, byte[] b) {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesPublicKeyZ_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(b, 33)));
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_ThirtyTwoBytesPublicKeyZ ret_hu_conv = new TwoTuple_ThirtyTwoBytesPublicKeyZ(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_ThirtyTwoBytesThirtyTwoBytesZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ.cs
new file mode 100644 (file)
index 0000000..8c7076e
--- /dev/null
@@ -0,0 +1,73 @@
+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_ThirtyTwoBytesThirtyTwoBytesZ : CommonBase {
+       internal TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ(object _dummy, long ptr) : base(ptr) { }
+       ~TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ() {
+               if (ptr != 0) { bindings.C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_a() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_b() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_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_ThirtyTwoBytesThirtyTwoBytesZ clone() {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ ret_hu_conv = new TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ from the contained elements.
+        */
+       public static TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ of(byte[] a, byte[] b) {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(b, 32)));
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ ret_hu_conv = new TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ(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_TxidCOption_BlockHashZZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_TxidCOption_BlockHashZZ.cs
deleted file mode 100644 (file)
index 7e92273..0000000
+++ /dev/null
@@ -1,73 +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_TxidCOption_BlockHashZZ : CommonBase {
-       internal TwoTuple_TxidCOption_BlockHashZZ(object _dummy, long ptr) : base(ptr) { }
-       ~TwoTuple_TxidCOption_BlockHashZZ() {
-               if (ptr != 0) { bindings.C2Tuple_TxidCOption_BlockHashZZ_free(ptr); }
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_a() {
-               byte[] ret = bindings.C2Tuple_TxidCOption_BlockHashZZ_get_a(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * 
-        */
-       public Option_BlockHashZ get_b() {
-               long ret = bindings.C2Tuple_TxidCOption_BlockHashZZ_get_b(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_BlockHashZ ret_hu_conv = org.ldk.structs.Option_BlockHashZ.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_TxidCOption_BlockHashZZ_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_TxidCOption_BlockHashZZ clone() {
-               long ret = bindings.C2Tuple_TxidCOption_BlockHashZZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_TxidCOption_BlockHashZZ ret_hu_conv = new TwoTuple_TxidCOption_BlockHashZZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new C2Tuple_TxidCOption_BlockHashZZ from the contained elements.
-        */
-       public static TwoTuple_TxidCOption_BlockHashZZ of(byte[] a, org.ldk.structs.Option_BlockHashZ b) {
-               long ret = bindings.C2Tuple_TxidCOption_BlockHashZZ_new(InternalUtils.check_arr_len(a, 32), b.ptr);
-               GC.KeepAlive(a);
-               GC.KeepAlive(b);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_TxidCOption_BlockHashZZ ret_hu_conv = new TwoTuple_TxidCOption_BlockHashZZ(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_TxidCVec_C2Tuple_u32ScriptZZZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_TxidCVec_C2Tuple_u32ScriptZZZ.cs
deleted file mode 100644 (file)
index 42e1ac0..0000000
+++ /dev/null
@@ -1,77 +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_TxidCVec_C2Tuple_u32ScriptZZZ : CommonBase {
-       internal TwoTuple_TxidCVec_C2Tuple_u32ScriptZZZ(object _dummy, long ptr) : base(ptr) { }
-       ~TwoTuple_TxidCVec_C2Tuple_u32ScriptZZZ() {
-               if (ptr != 0) { bindings.C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_free(ptr); }
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_a() {
-               byte[] ret = bindings.C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_get_a(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * 
-        */
-       public TwoTuple_u32ScriptZ[] get_b() {
-               long[] ret = bindings.C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_get_b(this.ptr);
-               GC.KeepAlive(this);
-               int ret_conv_21_len = ret.Length;
-               TwoTuple_u32ScriptZ[] ret_conv_21_arr = new TwoTuple_u32ScriptZ[ret_conv_21_len];
-               for (int v = 0; v < ret_conv_21_len; v++) {
-                       long ret_conv_21 = ret[v];
-                       TwoTuple_u32ScriptZ ret_conv_21_hu_conv = new TwoTuple_u32ScriptZ(null, ret_conv_21);
-                       if (ret_conv_21_hu_conv != null) { ret_conv_21_hu_conv.ptrs_to.AddLast(this); };
-                       ret_conv_21_arr[v] = ret_conv_21_hu_conv;
-               }
-               return ret_conv_21_arr;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_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_TxidCVec_C2Tuple_u32ScriptZZZ clone() {
-               long ret = bindings.C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_TxidCVec_C2Tuple_u32ScriptZZZ ret_hu_conv = new TwoTuple_TxidCVec_C2Tuple_u32ScriptZZZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ from the contained elements.
-        */
-       public static TwoTuple_TxidCVec_C2Tuple_u32ScriptZZZ of(byte[] a, TwoTuple_u32ScriptZ[] b) {
-               long ret = bindings.C2Tuple_TxidCVec_C2Tuple_u32ScriptZZZ_new(InternalUtils.check_arr_len(a, 32), b != null ? InternalUtils.mapArray(b, b_conv_21 => b_conv_21 != null ? b_conv_21.ptr : 0) : null);
-               GC.KeepAlive(a);
-               GC.KeepAlive(b);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_TxidCVec_C2Tuple_u32ScriptZZZ ret_hu_conv = new TwoTuple_TxidCVec_C2Tuple_u32ScriptZZZ(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_TxidCVec_C2Tuple_u32TxOutZZZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ.cs
deleted file mode 100644 (file)
index d715dac..0000000
+++ /dev/null
@@ -1,77 +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_TxidCVec_C2Tuple_u32TxOutZZZ : CommonBase {
-       internal TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ(object _dummy, long ptr) : base(ptr) { }
-       ~TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ() {
-               if (ptr != 0) { bindings.C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_free(ptr); }
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_a() {
-               byte[] ret = bindings.C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_get_a(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * 
-        */
-       public TwoTuple_u32TxOutZ[] get_b() {
-               long[] ret = bindings.C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_get_b(this.ptr);
-               GC.KeepAlive(this);
-               int ret_conv_20_len = ret.Length;
-               TwoTuple_u32TxOutZ[] ret_conv_20_arr = new TwoTuple_u32TxOutZ[ret_conv_20_len];
-               for (int u = 0; u < ret_conv_20_len; u++) {
-                       long ret_conv_20 = ret[u];
-                       TwoTuple_u32TxOutZ ret_conv_20_hu_conv = new TwoTuple_u32TxOutZ(null, ret_conv_20);
-                       if (ret_conv_20_hu_conv != null) { ret_conv_20_hu_conv.ptrs_to.AddLast(this); };
-                       ret_conv_20_arr[u] = ret_conv_20_hu_conv;
-               }
-               return ret_conv_20_arr;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_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_TxidCVec_C2Tuple_u32TxOutZZZ clone() {
-               long ret = bindings.C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ ret_hu_conv = new TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ from the contained elements.
-        */
-       public static TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ of(byte[] a, TwoTuple_u32TxOutZ[] b) {
-               long ret = bindings.C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_new(InternalUtils.check_arr_len(a, 32), b != null ? InternalUtils.mapArray(b, b_conv_20 => b_conv_20 != null ? b_conv_20.ptr : 0) : null);
-               GC.KeepAlive(a);
-               GC.KeepAlive(b);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ ret_hu_conv = new TwoTuple_TxidCVec_C2Tuple_u32TxOutZZZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-}
-} } }
index d87410d82aac43766013a776cb2336a9dc3352f5..692cc20098f60be5050b9c223bbc54b38e32458c 100644 (file)
@@ -19,44 +19,29 @@ public class TwoTuple_Z : CommonBase {
         * 
         */
        public short[] get_a() {
-               short[] ret = bindings.C2Tuple_Z_get_a(this.ptr);
+               long ret = bindings.C2Tuple_Z_get_a(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               short[] ret_conv = InternalUtils.decodeUint16Array(ret);
+               return ret_conv;
        }
 
        /**
         * 
         */
        public short[] get_b() {
-               short[] ret = bindings.C2Tuple_Z_get_b(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.C2Tuple_Z_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_Z clone() {
-               long ret = bindings.C2Tuple_Z_clone(this.ptr);
+               long ret = bindings.C2Tuple_Z_get_b(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_Z ret_hu_conv = new TwoTuple_Z(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
+               short[] ret_conv = InternalUtils.decodeUint16Array(ret);
+               return ret_conv;
        }
 
        /**
         * Creates a new C2Tuple_Z from the contained elements.
         */
        public static TwoTuple_Z of(short[] a, short[] b) {
-               long ret = bindings.C2Tuple_Z_new(InternalUtils.check_arr_len(a, 8), InternalUtils.check_arr_len(b, 8));
+               long ret = bindings.C2Tuple_Z_new(InternalUtils.encodeUint16Array(InternalUtils.check_arr_len(a, 32)), InternalUtils.encodeUint16Array(InternalUtils.check_arr_len(b, 32)));
                GC.KeepAlive(a);
                GC.KeepAlive(b);
                if (ret >= 0 && ret <= 4096) { return null; }
diff --git a/c_sharp/src/org/ldk/structs/TwoTuple__u1632_u1632Z.cs b/c_sharp/src/org/ldk/structs/TwoTuple__u1632_u1632Z.cs
new file mode 100644 (file)
index 0000000..e9237b7
--- /dev/null
@@ -0,0 +1,54 @@
+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__u1632_u1632Z : CommonBase {
+       internal TwoTuple__u1632_u1632Z(object _dummy, long ptr) : base(ptr) { }
+       ~TwoTuple__u1632_u1632Z() {
+               if (ptr != 0) { bindings.C2Tuple__u1632_u1632Z_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public short[] get_a() {
+               long ret = bindings.C2Tuple__u1632_u1632Z_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               short[] ret_conv = InternalUtils.decodeUint16Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * 
+        */
+       public short[] get_b() {
+               long ret = bindings.C2Tuple__u1632_u1632Z_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               short[] ret_conv = InternalUtils.decodeUint16Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Creates a new C2Tuple__u1632_u1632Z from the contained elements.
+        */
+       public static TwoTuple__u1632_u1632Z of(short[] a, short[] b) {
+               long ret = bindings.C2Tuple__u1632_u1632Z_new(InternalUtils.encodeUint16Array(InternalUtils.check_arr_len(a, 32)), InternalUtils.encodeUint16Array(InternalUtils.check_arr_len(b, 32)));
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple__u1632_u1632Z ret_hu_conv = new TwoTuple__u1632_u1632Z(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__u168_u168Z.cs b/c_sharp/src/org/ldk/structs/TwoTuple__u168_u168Z.cs
deleted file mode 100644 (file)
index 3687af3..0000000
+++ /dev/null
@@ -1,69 +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__u168_u168Z : CommonBase {
-       internal TwoTuple__u168_u168Z(object _dummy, long ptr) : base(ptr) { }
-       ~TwoTuple__u168_u168Z() {
-               if (ptr != 0) { bindings.C2Tuple__u168_u168Z_free(ptr); }
-       }
-
-       /**
-        * 
-        */
-       public short[] get_a() {
-               short[] ret = bindings.C2Tuple__u168_u168Z_get_a(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * 
-        */
-       public short[] get_b() {
-               short[] ret = bindings.C2Tuple__u168_u168Z_get_b(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.C2Tuple__u168_u168Z_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__u168_u168Z clone() {
-               long ret = bindings.C2Tuple__u168_u168Z_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple__u168_u168Z ret_hu_conv = new TwoTuple__u168_u168Z(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new C2Tuple__u168_u168Z from the contained elements.
-        */
-       public static TwoTuple__u168_u168Z of(short[] a, short[] b) {
-               long ret = bindings.C2Tuple__u168_u168Z_new(InternalUtils.check_arr_len(a, 8), InternalUtils.check_arr_len(b, 8));
-               GC.KeepAlive(a);
-               GC.KeepAlive(b);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple__u168_u168Z ret_hu_conv = new TwoTuple__u168_u168Z(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_u32CVec_u8ZZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_u32CVec_u8ZZ.cs
new file mode 100644 (file)
index 0000000..02d0eda
--- /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_u32CVec_u8ZZ : CommonBase {
+       internal TwoTuple_u32CVec_u8ZZ(object _dummy, long ptr) : base(ptr) { }
+       ~TwoTuple_u32CVec_u8ZZ() {
+               if (ptr != 0) { bindings.C2Tuple_u32CVec_u8ZZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public int get_a() {
+               int ret = bindings.C2Tuple_u32CVec_u8ZZ_get_a(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_b() {
+               long ret = bindings.C2Tuple_u32CVec_u8ZZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.C2Tuple_u32CVec_u8ZZ_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_u32CVec_u8ZZ clone() {
+               long ret = bindings.C2Tuple_u32CVec_u8ZZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_u32CVec_u8ZZ ret_hu_conv = new TwoTuple_u32CVec_u8ZZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C2Tuple_u32CVec_u8ZZ from the contained elements.
+        */
+       public static TwoTuple_u32CVec_u8ZZ of(int a, byte[] b) {
+               long ret = bindings.C2Tuple_u32CVec_u8ZZ_new(a, InternalUtils.encodeUint8Array(b));
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_u32CVec_u8ZZ ret_hu_conv = new TwoTuple_u32CVec_u8ZZ(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_u32ScriptZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_u32ScriptZ.cs
deleted file mode 100644 (file)
index d39d535..0000000
+++ /dev/null
@@ -1,69 +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_u32ScriptZ : CommonBase {
-       internal TwoTuple_u32ScriptZ(object _dummy, long ptr) : base(ptr) { }
-       ~TwoTuple_u32ScriptZ() {
-               if (ptr != 0) { bindings.C2Tuple_u32ScriptZ_free(ptr); }
-       }
-
-       /**
-        * 
-        */
-       public int get_a() {
-               int ret = bindings.C2Tuple_u32ScriptZ_get_a(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_b() {
-               byte[] ret = bindings.C2Tuple_u32ScriptZ_get_b(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.C2Tuple_u32ScriptZ_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_u32ScriptZ clone() {
-               long ret = bindings.C2Tuple_u32ScriptZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_u32ScriptZ ret_hu_conv = new TwoTuple_u32ScriptZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new C2Tuple_u32ScriptZ from the contained elements.
-        */
-       public static TwoTuple_u32ScriptZ of(int a, byte[] b) {
-               long ret = bindings.C2Tuple_u32ScriptZ_new(a, b);
-               GC.KeepAlive(a);
-               GC.KeepAlive(b);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_u32ScriptZ ret_hu_conv = new TwoTuple_u32ScriptZ(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_u64CVec_u8ZZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_u64CVec_u8ZZ.cs
new file mode 100644 (file)
index 0000000..89da18d
--- /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_u64CVec_u8ZZ : CommonBase {
+       internal TwoTuple_u64CVec_u8ZZ(object _dummy, long ptr) : base(ptr) { }
+       ~TwoTuple_u64CVec_u8ZZ() {
+               if (ptr != 0) { bindings.C2Tuple_u64CVec_u8ZZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public long get_a() {
+               long ret = bindings.C2Tuple_u64CVec_u8ZZ_get_a(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_b() {
+               long ret = bindings.C2Tuple_u64CVec_u8ZZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.C2Tuple_u64CVec_u8ZZ_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_u64CVec_u8ZZ clone() {
+               long ret = bindings.C2Tuple_u64CVec_u8ZZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_u64CVec_u8ZZ ret_hu_conv = new TwoTuple_u64CVec_u8ZZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C2Tuple_u64CVec_u8ZZ from the contained elements.
+        */
+       public static TwoTuple_u64CVec_u8ZZ of(long a, byte[] b) {
+               long ret = bindings.C2Tuple_u64CVec_u8ZZ_new(a, InternalUtils.encodeUint8Array(b));
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_u64CVec_u8ZZ ret_hu_conv = new TwoTuple_u64CVec_u8ZZ(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_u64u16Z.cs b/c_sharp/src/org/ldk/structs/TwoTuple_u64u16Z.cs
new file mode 100644 (file)
index 0000000..d227a01
--- /dev/null
@@ -0,0 +1,69 @@
+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_u64u16Z : CommonBase {
+       internal TwoTuple_u64u16Z(object _dummy, long ptr) : base(ptr) { }
+       ~TwoTuple_u64u16Z() {
+               if (ptr != 0) { bindings.C2Tuple_u64u16Z_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public long get_a() {
+               long ret = bindings.C2Tuple_u64u16Z_get_a(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * 
+        */
+       public short get_b() {
+               short ret = bindings.C2Tuple_u64u16Z_get_b(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.C2Tuple_u64u16Z_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_u64u16Z clone() {
+               long ret = bindings.C2Tuple_u64u16Z_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_u64u16Z ret_hu_conv = new TwoTuple_u64u16Z(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C2Tuple_u64u16Z from the contained elements.
+        */
+       public static TwoTuple_u64u16Z of(long a, short b) {
+               long ret = bindings.C2Tuple_u64u16Z_new(a, b);
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_u64u16Z ret_hu_conv = new TwoTuple_u64u16Z(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index dac87d2ded9024b86d9666feca2bf1e83a350337..5ca0200e53ebae2f77c23c9633393090ac51cbae 100644 (file)
@@ -28,9 +28,11 @@ public class TwoTuple_usizeTransactionZ : CommonBase {
         * 
         */
        public byte[] get_b() {
-               byte[] ret = bindings.C2Tuple_usizeTransactionZ_get_b(this.ptr);
+               long ret = bindings.C2Tuple_usizeTransactionZ_get_b(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        internal long clone_ptr() {
@@ -56,7 +58,7 @@ public class TwoTuple_usizeTransactionZ : CommonBase {
         * Creates a new C2Tuple_usizeTransactionZ from the contained elements.
         */
        public static TwoTuple_usizeTransactionZ of(long a, byte[] b) {
-               long ret = bindings.C2Tuple_usizeTransactionZ_new(a, b);
+               long ret = bindings.C2Tuple_usizeTransactionZ_new(a, InternalUtils.encodeUint8Array(b));
                GC.KeepAlive(a);
                GC.KeepAlive(b);
                if (ret >= 0 && ret <= 4096) { return null; }
index f526bfe297f8b7b3b5fcb7b8b6b756e16ee43612..24502ba3162fbcf89ab628a645cd6381853a337f 100644 (file)
@@ -19,16 +19,18 @@ public class TxAbort : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.TxAbort_get_channel_id(this.ptr);
+               long ret = bindings.TxAbort_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.TxAbort_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.TxAbort_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -39,16 +41,18 @@ public class TxAbort : CommonBase {
         * Returns a copy of the field.
         */
        public byte[] get_data() {
-               byte[] ret = bindings.TxAbort_get_data(this.ptr);
+               long ret = bindings.TxAbort_get_data(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Message data
         */
        public void set_data(byte[] val) {
-               bindings.TxAbort_set_data(this.ptr, val);
+               bindings.TxAbort_set_data(this.ptr, InternalUtils.encodeUint8Array(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -57,7 +61,7 @@ public class TxAbort : CommonBase {
         * Constructs a new TxAbort given each field
         */
        public static TxAbort of(byte[] channel_id_arg, byte[] data_arg) {
-               long ret = bindings.TxAbort_new(InternalUtils.check_arr_len(channel_id_arg, 32), data_arg);
+               long ret = bindings.TxAbort_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), InternalUtils.encodeUint8Array(data_arg));
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(data_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -105,16 +109,18 @@ public class TxAbort : CommonBase {
         * Serialize the TxAbort object into a byte array which can be read by TxAbort_read
         */
        public byte[] write() {
-               byte[] ret = bindings.TxAbort_write(this.ptr);
+               long ret = bindings.TxAbort_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a TxAbort from a byte array, created by TxAbort_write
         */
        public static Result_TxAbortDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.TxAbort_read(ser);
+               long ret = bindings.TxAbort_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_TxAbortDecodeErrorZ ret_hu_conv = Result_TxAbortDecodeErrorZ.constr_from_ptr(ret);
index 42811918f71422e7783c54fce65732bf940356e7..970a533432e150f4291e0a34e2d079c776dfbec6 100644 (file)
@@ -20,16 +20,18 @@ public class TxAckRbf : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.TxAckRbf_get_channel_id(this.ptr);
+               long ret = bindings.TxAckRbf_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.TxAckRbf_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.TxAckRbf_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -62,7 +64,7 @@ public class TxAckRbf : CommonBase {
         * Constructs a new TxAckRbf given each field
         */
        public static TxAckRbf of(byte[] channel_id_arg, org.ldk.structs.Option_i64Z funding_output_contribution_arg) {
-               long ret = bindings.TxAckRbf_new(InternalUtils.check_arr_len(channel_id_arg, 32), funding_output_contribution_arg.ptr);
+               long ret = bindings.TxAckRbf_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), funding_output_contribution_arg.ptr);
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(funding_output_contribution_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -111,16 +113,18 @@ public class TxAckRbf : CommonBase {
         * Serialize the TxAckRbf object into a byte array which can be read by TxAckRbf_read
         */
        public byte[] write() {
-               byte[] ret = bindings.TxAckRbf_write(this.ptr);
+               long ret = bindings.TxAckRbf_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a TxAckRbf from a byte array, created by TxAckRbf_write
         */
        public static Result_TxAckRbfDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.TxAckRbf_read(ser);
+               long ret = bindings.TxAckRbf_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_TxAckRbfDecodeErrorZ ret_hu_conv = Result_TxAckRbfDecodeErrorZ.constr_from_ptr(ret);
index 6ee743b12b30fc30c4b43ff04519d4a588d6e257..8bc30bba78ef8779d1869e903168836822d706cc 100644 (file)
@@ -19,16 +19,18 @@ public class TxAddInput : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.TxAddInput_get_channel_id(this.ptr);
+               long ret = bindings.TxAddInput_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.TxAddInput_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.TxAddInput_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -117,7 +119,7 @@ public class TxAddInput : CommonBase {
         * Constructs a new TxAddInput given each field
         */
        public static TxAddInput of(byte[] channel_id_arg, long serial_id_arg, org.ldk.structs.TransactionU16LenLimited prevtx_arg, int prevtx_out_arg, int sequence_arg) {
-               long ret = bindings.TxAddInput_new(InternalUtils.check_arr_len(channel_id_arg, 32), serial_id_arg, prevtx_arg == null ? 0 : prevtx_arg.ptr, prevtx_out_arg, sequence_arg);
+               long ret = bindings.TxAddInput_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), serial_id_arg, prevtx_arg == null ? 0 : prevtx_arg.ptr, prevtx_out_arg, sequence_arg);
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(serial_id_arg);
                GC.KeepAlive(prevtx_arg);
@@ -169,16 +171,18 @@ public class TxAddInput : CommonBase {
         * Serialize the TxAddInput object into a byte array which can be read by TxAddInput_read
         */
        public byte[] write() {
-               byte[] ret = bindings.TxAddInput_write(this.ptr);
+               long ret = bindings.TxAddInput_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a TxAddInput from a byte array, created by TxAddInput_write
         */
        public static Result_TxAddInputDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.TxAddInput_read(ser);
+               long ret = bindings.TxAddInput_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_TxAddInputDecodeErrorZ ret_hu_conv = Result_TxAddInputDecodeErrorZ.constr_from_ptr(ret);
index 7b31d9e145c7c6d788a579c9007372c6f33a09d6..be541edbcd41d917d83a95a73009f7e54b540614 100644 (file)
@@ -19,16 +19,18 @@ public class TxAddOutput : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.TxAddOutput_get_channel_id(this.ptr);
+               long ret = bindings.TxAddOutput_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.TxAddOutput_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.TxAddOutput_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -75,16 +77,18 @@ public class TxAddOutput : CommonBase {
         * The scriptPubKey for the output
         */
        public byte[] get_script() {
-               byte[] ret = bindings.TxAddOutput_get_script(this.ptr);
+               long ret = bindings.TxAddOutput_get_script(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The scriptPubKey for the output
         */
        public void set_script(byte[] val) {
-               bindings.TxAddOutput_set_script(this.ptr, val);
+               bindings.TxAddOutput_set_script(this.ptr, InternalUtils.encodeUint8Array(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -93,7 +97,7 @@ public class TxAddOutput : CommonBase {
         * Constructs a new TxAddOutput given each field
         */
        public static TxAddOutput of(byte[] channel_id_arg, long serial_id_arg, long sats_arg, byte[] script_arg) {
-               long ret = bindings.TxAddOutput_new(InternalUtils.check_arr_len(channel_id_arg, 32), serial_id_arg, sats_arg, script_arg);
+               long ret = bindings.TxAddOutput_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), serial_id_arg, sats_arg, InternalUtils.encodeUint8Array(script_arg));
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(serial_id_arg);
                GC.KeepAlive(sats_arg);
@@ -143,16 +147,18 @@ public class TxAddOutput : CommonBase {
         * Serialize the TxAddOutput object into a byte array which can be read by TxAddOutput_read
         */
        public byte[] write() {
-               byte[] ret = bindings.TxAddOutput_write(this.ptr);
+               long ret = bindings.TxAddOutput_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a TxAddOutput from a byte array, created by TxAddOutput_write
         */
        public static Result_TxAddOutputDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.TxAddOutput_read(ser);
+               long ret = bindings.TxAddOutput_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_TxAddOutputDecodeErrorZ ret_hu_conv = Result_TxAddOutputDecodeErrorZ.constr_from_ptr(ret);
index 3cc12feb1554378e75ffcd6f77eb85aa238efda4..bcd8814cc3a80893e9e1cf9f4eadabad3b80da04 100644 (file)
@@ -20,16 +20,18 @@ public class TxComplete : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.TxComplete_get_channel_id(this.ptr);
+               long ret = bindings.TxComplete_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.TxComplete_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.TxComplete_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -38,7 +40,7 @@ public class TxComplete : CommonBase {
         * Constructs a new TxComplete given each field
         */
        public static TxComplete of(byte[] channel_id_arg) {
-               long ret = bindings.TxComplete_new(InternalUtils.check_arr_len(channel_id_arg, 32));
+               long ret = bindings.TxComplete_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.TxComplete ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.TxComplete(null, ret); }
@@ -85,16 +87,18 @@ public class TxComplete : CommonBase {
         * Serialize the TxComplete object into a byte array which can be read by TxComplete_read
         */
        public byte[] write() {
-               byte[] ret = bindings.TxComplete_write(this.ptr);
+               long ret = bindings.TxComplete_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a TxComplete from a byte array, created by TxComplete_write
         */
        public static Result_TxCompleteDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.TxComplete_read(ser);
+               long ret = bindings.TxComplete_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_TxCompleteDecodeErrorZ ret_hu_conv = Result_TxCompleteDecodeErrorZ.constr_from_ptr(ret);
index b46cfdefed35244fed1941ae602f51518a3fff3e..ba7ab4e14c5942ee3b445d00c10d447926236281 100644 (file)
@@ -29,16 +29,18 @@ public class TxCreationKeys : CommonBase {
         * The broadcaster's per-commitment public key which was used to derive the other keys.
         */
        public byte[] get_per_commitment_point() {
-               byte[] ret = bindings.TxCreationKeys_get_per_commitment_point(this.ptr);
+               long ret = bindings.TxCreationKeys_get_per_commitment_point(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The broadcaster's per-commitment public key which was used to derive the other keys.
         */
        public void set_per_commitment_point(byte[] val) {
-               bindings.TxCreationKeys_set_per_commitment_point(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.TxCreationKeys_set_per_commitment_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -49,9 +51,11 @@ public class TxCreationKeys : CommonBase {
         * an old state.
         */
        public byte[] get_revocation_key() {
-               byte[] ret = bindings.TxCreationKeys_get_revocation_key(this.ptr);
+               long ret = bindings.TxCreationKeys_get_revocation_key(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -60,7 +64,7 @@ public class TxCreationKeys : CommonBase {
         * an old state.
         */
        public void set_revocation_key(byte[] val) {
-               bindings.TxCreationKeys_set_revocation_key(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.TxCreationKeys_set_revocation_key(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -69,16 +73,18 @@ public class TxCreationKeys : CommonBase {
         * Broadcaster's HTLC Key
         */
        public byte[] get_broadcaster_htlc_key() {
-               byte[] ret = bindings.TxCreationKeys_get_broadcaster_htlc_key(this.ptr);
+               long ret = bindings.TxCreationKeys_get_broadcaster_htlc_key(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Broadcaster's HTLC Key
         */
        public void set_broadcaster_htlc_key(byte[] val) {
-               bindings.TxCreationKeys_set_broadcaster_htlc_key(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.TxCreationKeys_set_broadcaster_htlc_key(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -87,16 +93,18 @@ public class TxCreationKeys : CommonBase {
         * Countersignatory's HTLC Key
         */
        public byte[] get_countersignatory_htlc_key() {
-               byte[] ret = bindings.TxCreationKeys_get_countersignatory_htlc_key(this.ptr);
+               long ret = bindings.TxCreationKeys_get_countersignatory_htlc_key(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Countersignatory's HTLC Key
         */
        public void set_countersignatory_htlc_key(byte[] val) {
-               bindings.TxCreationKeys_set_countersignatory_htlc_key(this.ptr, InternalUtils.check_arr_len(val, 33));
+               bindings.TxCreationKeys_set_countersignatory_htlc_key(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -105,16 +113,18 @@ public class TxCreationKeys : CommonBase {
         * Broadcaster's Payment Key (which isn't allowed to be spent from for some delay)
         */
        public byte[] get_broadcaster_delayed_payment_key() {
-               byte[] ret = bindings.TxCreationKeys_get_broadcaster_delayed_payment_key(this.ptr);
+               long ret = bindings.TxCreationKeys_get_broadcaster_delayed_payment_key(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_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.check_arr_len(val, 33));
+               bindings.TxCreationKeys_set_broadcaster_delayed_payment_key(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -123,7 +133,7 @@ public class TxCreationKeys : CommonBase {
         * 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.check_arr_len(per_commitment_point_arg, 33), InternalUtils.check_arr_len(revocation_key_arg, 33), InternalUtils.check_arr_len(broadcaster_htlc_key_arg, 33), InternalUtils.check_arr_len(countersignatory_htlc_key_arg, 33), InternalUtils.check_arr_len(broadcaster_delayed_payment_key_arg, 33));
+               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)));
                GC.KeepAlive(per_commitment_point_arg);
                GC.KeepAlive(revocation_key_arg);
                GC.KeepAlive(broadcaster_htlc_key_arg);
@@ -174,16 +184,18 @@ public class TxCreationKeys : CommonBase {
         * Serialize the TxCreationKeys object into a byte array which can be read by TxCreationKeys_read
         */
        public byte[] write() {
-               byte[] ret = bindings.TxCreationKeys_write(this.ptr);
+               long ret = bindings.TxCreationKeys_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a TxCreationKeys from a byte array, created by TxCreationKeys_write
         */
        public static Result_TxCreationKeysDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.TxCreationKeys_read(ser);
+               long ret = bindings.TxCreationKeys_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_TxCreationKeysDecodeErrorZ ret_hu_conv = Result_TxCreationKeysDecodeErrorZ.constr_from_ptr(ret);
@@ -195,7 +207,7 @@ public class TxCreationKeys : CommonBase {
         * 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.check_arr_len(per_commitment_point, 33), InternalUtils.check_arr_len(broadcaster_delayed_payment_base, 33), InternalUtils.check_arr_len(broadcaster_htlc_base, 33), InternalUtils.check_arr_len(countersignatory_revocation_base, 33), InternalUtils.check_arr_len(countersignatory_htlc_base, 33));
+               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)));
                GC.KeepAlive(per_commitment_point);
                GC.KeepAlive(broadcaster_delayed_payment_base);
                GC.KeepAlive(broadcaster_htlc_base);
@@ -212,7 +224,7 @@ public class TxCreationKeys : CommonBase {
         * Key set is asymmetric and can't be used as part of counter-signatory set of transactions.
         */
        public static TxCreationKeys from_channel_static_keys(byte[] per_commitment_point, org.ldk.structs.ChannelPublicKeys broadcaster_keys, org.ldk.structs.ChannelPublicKeys countersignatory_keys) {
-               long ret = bindings.TxCreationKeys_from_channel_static_keys(InternalUtils.check_arr_len(per_commitment_point, 33), broadcaster_keys == null ? 0 : broadcaster_keys.ptr, countersignatory_keys == null ? 0 : countersignatory_keys.ptr);
+               long ret = bindings.TxCreationKeys_from_channel_static_keys(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_point, 33)), broadcaster_keys == null ? 0 : broadcaster_keys.ptr, countersignatory_keys == null ? 0 : countersignatory_keys.ptr);
                GC.KeepAlive(per_commitment_point);
                GC.KeepAlive(broadcaster_keys);
                GC.KeepAlive(countersignatory_keys);
index 08e10a78a269510d095426609c6928d965742a72..604c428f5773f1692832ad195bd3a8442eef1777 100644 (file)
@@ -18,14 +18,14 @@ public class TxIn : CommonBase {
        public readonly int previous_vout;
 
        internal TxIn(object _dummy, long ptr) : base(ptr) {
-               this.witness = bindings.TxIn_get_witness(ptr);
-               this.script_sig = bindings.TxIn_get_script_sig(ptr);
+               this.witness = InternalUtils.decodeUint8Array(bindings.TxIn_get_witness(ptr));
+               this.script_sig = InternalUtils.decodeUint8Array(bindings.TxIn_get_script_sig(ptr));
                this.sequence = bindings.TxIn_get_sequence(ptr);
-               this.previous_txid = bindings.TxIn_get_previous_txid(ptr);
+               this.previous_txid = InternalUtils.decodeUint8Array(bindings.TxIn_get_previous_txid(ptr));
                this.previous_vout = bindings.TxIn_get_previous_vout(ptr);
        }
        public TxIn(byte[] witness, byte[] script_sig, int sequence, byte[] previous_txid, int previous_vout)
-       : this(null, bindings.TxIn_new(witness, script_sig, sequence, previous_txid, previous_vout)) {}
+       : this(null, bindings.TxIn_new(InternalUtils.encodeUint8Array(witness), InternalUtils.encodeUint8Array(script_sig), sequence, InternalUtils.encodeUint8Array(previous_txid), previous_vout)) {}
 
        ~TxIn() {
                if (ptr != 0) { bindings.TxIn_free(ptr); }
index cb62c65ea35f58881a78817d1cd33231916ace39..35e50a7a1534633f9e9d3efde2489f62f3cd25cf 100644 (file)
@@ -20,16 +20,18 @@ public class TxInitRbf : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.TxInitRbf_get_channel_id(this.ptr);
+               long ret = bindings.TxInitRbf_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.TxInitRbf_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.TxInitRbf_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -98,7 +100,7 @@ public class TxInitRbf : CommonBase {
         * Constructs a new TxInitRbf given each field
         */
        public static TxInitRbf of(byte[] channel_id_arg, int locktime_arg, int feerate_sat_per_1000_weight_arg, org.ldk.structs.Option_i64Z funding_output_contribution_arg) {
-               long ret = bindings.TxInitRbf_new(InternalUtils.check_arr_len(channel_id_arg, 32), locktime_arg, feerate_sat_per_1000_weight_arg, funding_output_contribution_arg.ptr);
+               long ret = bindings.TxInitRbf_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), locktime_arg, feerate_sat_per_1000_weight_arg, funding_output_contribution_arg.ptr);
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(locktime_arg);
                GC.KeepAlive(feerate_sat_per_1000_weight_arg);
@@ -149,16 +151,18 @@ public class TxInitRbf : CommonBase {
         * Serialize the TxInitRbf object into a byte array which can be read by TxInitRbf_read
         */
        public byte[] write() {
-               byte[] ret = bindings.TxInitRbf_write(this.ptr);
+               long ret = bindings.TxInitRbf_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a TxInitRbf from a byte array, created by TxInitRbf_write
         */
        public static Result_TxInitRbfDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.TxInitRbf_read(ser);
+               long ret = bindings.TxInitRbf_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_TxInitRbfDecodeErrorZ ret_hu_conv = Result_TxInitRbfDecodeErrorZ.constr_from_ptr(ret);
index 5df7f3f75b9725f589f35ce8bf1f9e5a5055f491..bafa5ae430c3ca5f952a6daa7570610b98796c2a 100644 (file)
@@ -12,10 +12,10 @@ public class TxOut : CommonBase {
        public readonly long value;
 
     internal TxOut(object _dummy, long ptr) : base(ptr) {
-               this.script_pubkey = bindings.TxOut_get_script_pubkey(ptr);
+               this.script_pubkey = InternalUtils.decodeUint8Array(bindings.TxOut_get_script_pubkey(ptr));
                this.value = bindings.TxOut_get_value(ptr);
        }
-    public TxOut(long value, byte[] script_pubkey) : this(null, bindings.TxOut_new(script_pubkey, value)) {}
+    public TxOut(long value, byte[] script_pubkey) : this(null, bindings.TxOut_new(InternalUtils.encodeUint8Array(script_pubkey), value)) {}
 
        ~TxOut() {
                if (ptr != 0) { bindings.TxOut_free(ptr); }
index 6855aa259d82792e557def2f0e7dc9369d1e8dfe..3ee52bdcdd1411b719a640703707420a393789c5 100644 (file)
@@ -19,16 +19,18 @@ public class TxRemoveInput : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.TxRemoveInput_get_channel_id(this.ptr);
+               long ret = bindings.TxRemoveInput_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.TxRemoveInput_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.TxRemoveInput_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -55,7 +57,7 @@ public class TxRemoveInput : CommonBase {
         * Constructs a new TxRemoveInput given each field
         */
        public static TxRemoveInput of(byte[] channel_id_arg, long serial_id_arg) {
-               long ret = bindings.TxRemoveInput_new(InternalUtils.check_arr_len(channel_id_arg, 32), serial_id_arg);
+               long ret = bindings.TxRemoveInput_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), serial_id_arg);
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(serial_id_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -103,16 +105,18 @@ public class TxRemoveInput : CommonBase {
         * Serialize the TxRemoveInput object into a byte array which can be read by TxRemoveInput_read
         */
        public byte[] write() {
-               byte[] ret = bindings.TxRemoveInput_write(this.ptr);
+               long ret = bindings.TxRemoveInput_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a TxRemoveInput from a byte array, created by TxRemoveInput_write
         */
        public static Result_TxRemoveInputDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.TxRemoveInput_read(ser);
+               long ret = bindings.TxRemoveInput_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_TxRemoveInputDecodeErrorZ ret_hu_conv = Result_TxRemoveInputDecodeErrorZ.constr_from_ptr(ret);
index 469983e8dd46c1c2d5f04695e7200db056072e1a..e229b274d932c5ffd58dc55c1b41dc2f29703fef 100644 (file)
@@ -19,16 +19,18 @@ public class TxRemoveOutput : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.TxRemoveOutput_get_channel_id(this.ptr);
+               long ret = bindings.TxRemoveOutput_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.TxRemoveOutput_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.TxRemoveOutput_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -55,7 +57,7 @@ public class TxRemoveOutput : CommonBase {
         * Constructs a new TxRemoveOutput given each field
         */
        public static TxRemoveOutput of(byte[] channel_id_arg, long serial_id_arg) {
-               long ret = bindings.TxRemoveOutput_new(InternalUtils.check_arr_len(channel_id_arg, 32), serial_id_arg);
+               long ret = bindings.TxRemoveOutput_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), serial_id_arg);
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(serial_id_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -103,16 +105,18 @@ public class TxRemoveOutput : CommonBase {
         * Serialize the TxRemoveOutput object into a byte array which can be read by TxRemoveOutput_read
         */
        public byte[] write() {
-               byte[] ret = bindings.TxRemoveOutput_write(this.ptr);
+               long ret = bindings.TxRemoveOutput_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a TxRemoveOutput from a byte array, created by TxRemoveOutput_write
         */
        public static Result_TxRemoveOutputDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.TxRemoveOutput_read(ser);
+               long ret = bindings.TxRemoveOutput_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_TxRemoveOutputDecodeErrorZ ret_hu_conv = Result_TxRemoveOutputDecodeErrorZ.constr_from_ptr(ret);
index b2210bfe00cfe1a95e5027fccc5e18274c21ae5f..246ee29b976c186544c7b8cf1a5d1c839e3191c1 100644 (file)
@@ -20,16 +20,18 @@ public class TxSignatures : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.TxSignatures_get_channel_id(this.ptr);
+               long ret = bindings.TxSignatures_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.TxSignatures_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.TxSignatures_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -38,16 +40,18 @@ public class TxSignatures : CommonBase {
         * The TXID
         */
        public byte[] get_tx_hash() {
-               byte[] ret = bindings.TxSignatures_get_tx_hash(this.ptr);
+               long ret = bindings.TxSignatures_get_tx_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The TXID
         */
        public void set_tx_hash(byte[] val) {
-               bindings.TxSignatures_set_tx_hash(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.TxSignatures_set_tx_hash(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -58,16 +62,25 @@ public class TxSignatures : CommonBase {
         * Returns a copy of the field.
         */
        public byte[][] get_witnesses() {
-               byte[][] ret = bindings.TxSignatures_get_witnesses(this.ptr);
+               long ret = bindings.TxSignatures_get_witnesses(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_8_len = InternalUtils.getArrayLength(ret);
+               byte[][] ret_conv_8_arr = new byte[ret_conv_8_len][];
+               for (int i = 0; i < ret_conv_8_len; i++) {
+                       long ret_conv_8 = InternalUtils.getU64ArrayElem(ret, i);
+                       byte[] ret_conv_8_conv = InternalUtils.decodeUint8Array(ret_conv_8);
+                       ret_conv_8_arr[i] = ret_conv_8_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_8_arr;
        }
 
        /**
         * The list of witnesses
         */
        public void set_witnesses(byte[][] val) {
-               bindings.TxSignatures_set_witnesses(this.ptr, val);
+               bindings.TxSignatures_set_witnesses(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(val, val_conv_8 => InternalUtils.encodeUint8Array(val_conv_8))));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -76,7 +89,7 @@ public class TxSignatures : CommonBase {
         * Constructs a new TxSignatures given each field
         */
        public static TxSignatures of(byte[] channel_id_arg, byte[] tx_hash_arg, byte[][] witnesses_arg) {
-               long ret = bindings.TxSignatures_new(InternalUtils.check_arr_len(channel_id_arg, 32), InternalUtils.check_arr_len(tx_hash_arg, 32), witnesses_arg);
+               long ret = bindings.TxSignatures_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(tx_hash_arg, 32)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(witnesses_arg, witnesses_arg_conv_8 => InternalUtils.encodeUint8Array(witnesses_arg_conv_8))));
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(tx_hash_arg);
                GC.KeepAlive(witnesses_arg);
@@ -125,16 +138,18 @@ public class TxSignatures : CommonBase {
         * Serialize the TxSignatures object into a byte array which can be read by TxSignatures_read
         */
        public byte[] write() {
-               byte[] ret = bindings.TxSignatures_write(this.ptr);
+               long ret = bindings.TxSignatures_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a TxSignatures from a byte array, created by TxSignatures_write
         */
        public static Result_TxSignaturesDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.TxSignatures_read(ser);
+               long ret = bindings.TxSignatures_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_TxSignaturesDecodeErrorZ ret_hu_conv = Result_TxSignaturesDecodeErrorZ.constr_from_ptr(ret);
index 20799363b7ff28b691bdea7ebda6066d7de58a5c..c4769c098b7f7ecbc40c31bf14d674d51d4621b0 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,36 +6,35 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of Type */
+public interface TypeInterface {
+       /**Returns the type identifying the message payload.
+        */
+       short type_id();
+       /**Return a human-readable "debug" string describing this object
+        */
+       string debug_str();
+       /**Serialize the object into a byte array
+        */
+       byte[] write();
+}
+
 /**
  * Defines a type identifier for sending messages over the wire.
  * 
  * Messages implementing this trait specify a type and must be [`Writeable`].
  */
 public class Type : CommonBase {
-       internal readonly bindings.LDKType bindings_instance;
+       internal bindings.LDKType bindings_instance;
+       internal long instance_idx;
+
        internal Type(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private Type(bindings.LDKType arg) : base(bindings.LDKType_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~Type() {
                if (ptr != 0) { bindings.Type_free(ptr); }
        }
 
-       public interface TypeInterface {
-               /**
-                * Returns the type identifying the message payload.
-                */
-               short type_id();
-               /**
-                * Return a human-readable "debug" string describing this object
-                */
-               string debug_str();
-               /**
-                * Serialize the object into a byte array
-                */
-               byte[] write();
-       }
        private class LDKTypeHolder { internal Type held; }
        private class LDKTypeImpl : bindings.LDKType {
                internal LDKTypeImpl(TypeInterface arg, LDKTypeHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
@@ -45,22 +45,32 @@ public class Type : CommonBase {
                                GC.KeepAlive(arg);
                        return ret;
                }
-               public string debug_str() {
+               public long debug_str() {
                        string ret = arg.debug_str();
                                GC.KeepAlive(arg);
-                       return ret;
+                       long result = InternalUtils.encodeString(ret);
+                       return result;
                }
-               public byte[] write() {
+               public long write() {
                        byte[] ret = arg.write();
                                GC.KeepAlive(arg);
-                       return ret;
+                       long result = InternalUtils.encodeUint8Array(ret);
+                       return result;
                }
        }
+
+       /** Creates a new instance of Type from a given implementation */
        public static Type new_impl(TypeInterface arg) {
                LDKTypeHolder impl_holder = new LDKTypeHolder();
-               impl_holder.held = new Type(new LDKTypeImpl(arg, impl_holder));
+               LDKTypeImpl impl = new LDKTypeImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKType_new(impl);
+
+               impl_holder.held = new Type(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Returns the type identifying the message payload.
         */
@@ -74,18 +84,22 @@ public class Type : CommonBase {
         * Return a human-readable "debug" string describing this object
         */
        public string debug_str() {
-               string ret = bindings.Type_debug_str(this.ptr);
+               long ret = bindings.Type_debug_str(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
        }
 
        /**
         * Serialize the object into a byte array
         */
        public byte[] write() {
-               byte[] ret = bindings.Type_write(this.ptr);
+               long ret = bindings.Type_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        internal long clone_ptr() {
index f9855541e546d6cf17ee5e37d5ba505686cb64dc..7e653a62d574eee8ef373fcd0ccdafe3b81822bf 100644 (file)
@@ -8,6 +8,11 @@ namespace org { namespace ldk { namespace structs {
 
 /**
  * A semantically valid [`Bolt12Invoice`] that hasn't been signed.
+ * 
+ * # Serialization
+ * 
+ * This is serialized as a TLV stream, which includes TLV records from the originating message. As
+ * such, it may include unknown, odd TLV records.
  */
 public class UnsignedBolt12Invoice : CommonBase {
        internal UnsignedBolt12Invoice(object _dummy, long ptr) : base(ptr) { }
@@ -16,13 +21,352 @@ public class UnsignedBolt12Invoice : CommonBase {
        }
 
        /**
-        * The public key corresponding to the key needed to sign the invoice.
+        * Returns the [`TaggedHash`] of the invoice to sign.
         */
-       public byte[] signing_pubkey() {
-               byte[] ret = bindings.UnsignedBolt12Invoice_signing_pubkey(this.ptr);
+       public TaggedHash tagged_hash() {
+               long ret = bindings.UnsignedBolt12Invoice_tagged_hash(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;
+       }
+
+       /**
+        * The chains that may be used when paying a requested invoice.
+        * 
+        * From [`Offer::chains`]; `None` if the invoice was created in response to a [`Refund`].
+        * 
+        * [`Offer::chains`]: crate::offers::offer::Offer::chains
+        */
+       public Option_CVec_ThirtyTwoBytesZZ offer_chains() {
+               long ret = bindings.UnsignedBolt12Invoice_offer_chains(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_CVec_ThirtyTwoBytesZZ ret_hu_conv = org.ldk.structs.Option_CVec_ThirtyTwoBytesZZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The chain that must be used when paying the invoice; selected from [`offer_chains`] if the
+        * invoice originated from an offer.
+        * 
+        * From [`InvoiceRequest::chain`] or [`Refund::chain`].
+        * 
+        * [`offer_chains`]: Self::offer_chains
+        * [`InvoiceRequest::chain`]: crate::offers::invoice_request::InvoiceRequest::chain
+        */
+       public byte[] chain() {
+               long ret = bindings.UnsignedBolt12Invoice_chain(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Opaque bytes set by the originating [`Offer`].
+        * 
+        * From [`Offer::metadata`]; `None` if the invoice was created in response to a [`Refund`] or
+        * if the [`Offer`] did not set it.
+        * 
+        * [`Offer`]: crate::offers::offer::Offer
+        * [`Offer::metadata`]: crate::offers::offer::Offer::metadata
+        */
+       public Option_CVec_u8ZZ metadata() {
+               long ret = bindings.UnsignedBolt12Invoice_metadata(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_CVec_u8ZZ ret_hu_conv = org.ldk.structs.Option_CVec_u8ZZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The minimum amount required for a successful payment of a single item.
+        * 
+        * From [`Offer::amount`]; `None` if the invoice was created in response to a [`Refund`] or if
+        * the [`Offer`] did not set it.
+        * 
+        * [`Offer`]: crate::offers::offer::Offer
+        * [`Offer::amount`]: crate::offers::offer::Offer::amount
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public Amount amount() {
+               long ret = bindings.UnsignedBolt12Invoice_amount(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Amount ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Amount(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Features pertaining to the originating [`Offer`].
+        * 
+        * From [`Offer::offer_features`]; `None` if the invoice was created in response to a
+        * [`Refund`].
+        * 
+        * [`Offer`]: crate::offers::offer::Offer
+        * [`Offer::offer_features`]: crate::offers::offer::Offer::offer_features
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public OfferFeatures offer_features() {
+               long ret = bindings.UnsignedBolt12Invoice_offer_features(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.OfferFeatures ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.OfferFeatures(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * A complete description of the purpose of the originating offer or refund.
+        * 
+        * From [`Offer::description`] or [`Refund::description`].
+        * 
+        * [`Offer::description`]: crate::offers::offer::Offer::description
+        */
+       public PrintableString description() {
+               long ret = bindings.UnsignedBolt12Invoice_description(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PrintableString ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PrintableString(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Duration since the Unix epoch when an invoice should no longer be requested.
+        * 
+        * From [`Offer::absolute_expiry`] or [`Refund::absolute_expiry`].
+        * 
+        * [`Offer::absolute_expiry`]: crate::offers::offer::Offer::absolute_expiry
+        */
+       public Option_u64Z absolute_expiry() {
+               long ret = bindings.UnsignedBolt12Invoice_absolute_expiry(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 issuer of the offer or refund.
+        * 
+        * From [`Offer::issuer`] or [`Refund::issuer`].
+        * 
+        * [`Offer::issuer`]: crate::offers::offer::Offer::issuer
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public PrintableString issuer() {
+               long ret = bindings.UnsignedBolt12Invoice_issuer(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PrintableString ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PrintableString(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Paths to the recipient originating from publicly reachable nodes.
+        * 
+        * From [`Offer::paths`] or [`Refund::paths`].
+        * 
+        * [`Offer::paths`]: crate::offers::offer::Offer::paths
+        */
+       public BlindedPath[] message_paths() {
+               long ret = bindings.UnsignedBolt12Invoice_message_paths(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_13_len = InternalUtils.getArrayLength(ret);
+               BlindedPath[] ret_conv_13_arr = new BlindedPath[ret_conv_13_len];
+               for (int n = 0; n < ret_conv_13_len; n++) {
+                       long ret_conv_13 = InternalUtils.getU64ArrayElem(ret, n);
+                       org.ldk.structs.BlindedPath ret_conv_13_hu_conv = null; if (ret_conv_13 < 0 || ret_conv_13 > 4096) { ret_conv_13_hu_conv = new org.ldk.structs.BlindedPath(null, ret_conv_13); }
+                       if (ret_conv_13_hu_conv != null) { ret_conv_13_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_13_arr[n] = ret_conv_13_hu_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_13_arr;
+       }
+
+       /**
+        * The quantity of items supported.
+        * 
+        * From [`Offer::supported_quantity`]; `None` if the invoice was created in response to a
+        * [`Refund`].
+        * 
+        * [`Offer::supported_quantity`]: crate::offers::offer::Offer::supported_quantity
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public Quantity supported_quantity() {
+               long ret = bindings.UnsignedBolt12Invoice_supported_quantity(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Quantity ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Quantity(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * An unpredictable series of bytes from the payer.
+        * 
+        * From [`InvoiceRequest::payer_metadata`] or [`Refund::payer_metadata`].
+        */
+       public byte[] payer_metadata() {
+               long ret = bindings.UnsignedBolt12Invoice_payer_metadata(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Features pertaining to requesting an invoice.
+        * 
+        * From [`InvoiceRequest::invoice_request_features`] or [`Refund::features`].
+        */
+       public InvoiceRequestFeatures invoice_request_features() {
+               long ret = bindings.UnsignedBolt12Invoice_invoice_request_features(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.InvoiceRequestFeatures ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.InvoiceRequestFeatures(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The quantity of items requested or refunded for.
+        * 
+        * From [`InvoiceRequest::quantity`] or [`Refund::quantity`].
+        */
+       public Option_u64Z quantity() {
+               long ret = bindings.UnsignedBolt12Invoice_quantity(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;
+       }
+
+       /**
+        * A possibly transient pubkey used to sign the invoice request or to send an invoice for a
+        * refund in case there are no [`message_paths`].
+        * 
+        * [`message_paths`]: Self::message_paths
+        */
+       public byte[] payer_id() {
+               long ret = bindings.UnsignedBolt12Invoice_payer_id(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * A payer-provided note reflected back in the invoice.
+        * 
+        * From [`InvoiceRequest::payer_note`] or [`Refund::payer_note`].
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public PrintableString payer_note() {
+               long ret = bindings.UnsignedBolt12Invoice_payer_note(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PrintableString ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PrintableString(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Duration since the Unix epoch when the invoice was created.
+        */
+       public long created_at() {
+               long ret = bindings.UnsignedBolt12Invoice_created_at(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Duration since [`Bolt12Invoice::created_at`] when the invoice has expired and therefore
+        * should no longer be paid.
+        */
+       public long relative_expiry() {
+               long ret = bindings.UnsignedBolt12Invoice_relative_expiry(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Whether the invoice has expired.
+        */
+       public bool is_expired() {
+               bool ret = bindings.UnsignedBolt12Invoice_is_expired(this.ptr);
                GC.KeepAlive(this);
                return ret;
        }
 
+       /**
+        * SHA256 hash of the payment preimage that will be given in return for paying the invoice.
+        */
+       public byte[] payment_hash() {
+               long ret = bindings.UnsignedBolt12Invoice_payment_hash(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The minimum amount required for a successful payment of the invoice.
+        */
+       public long amount_msats() {
+               long ret = bindings.UnsignedBolt12Invoice_amount_msats(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Features pertaining to paying an invoice.
+        */
+       public Bolt12InvoiceFeatures invoice_features() {
+               long ret = bindings.UnsignedBolt12Invoice_invoice_features(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Bolt12InvoiceFeatures ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Bolt12InvoiceFeatures(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The public key corresponding to the key used to sign the invoice.
+        */
+       public byte[] signing_pubkey() {
+               long ret = bindings.UnsignedBolt12Invoice_signing_pubkey(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Serialize the UnsignedBolt12Invoice object into a byte array which can be read by UnsignedBolt12Invoice_read
+        */
+       public byte[] write() {
+               long ret = bindings.UnsignedBolt12Invoice_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
 }
 } } }
index 89308cb8a07c4bfde8cb430468d16e6dfeb7de4f..8c1880053960affaed391f9e8510640927b80ac4 100644 (file)
@@ -43,16 +43,18 @@ public class UnsignedChannelAnnouncement : CommonBase {
         * The genesis hash of the blockchain where the channel is to be opened
         */
        public byte[] get_chain_hash() {
-               byte[] ret = bindings.UnsignedChannelAnnouncement_get_chain_hash(this.ptr);
+               long ret = bindings.UnsignedChannelAnnouncement_get_chain_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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 to be opened
         */
        public void set_chain_hash(byte[] val) {
-               bindings.UnsignedChannelAnnouncement_set_chain_hash(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.UnsignedChannelAnnouncement_set_chain_hash(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -163,6 +165,58 @@ public class UnsignedChannelAnnouncement : CommonBase {
                if (this != null) { this.ptrs_to.AddLast(val); };
        }
 
+       /**
+        * Excess data which was signed as a part of the message which we do not (yet) understand how
+        * to decode.
+        * 
+        * This is stored to ensure forward-compatibility as new fields are added to the lightning gossip protocol.
+        * 
+        * Returns a copy of the field.
+        */
+       public byte[] get_excess_data() {
+               long ret = bindings.UnsignedChannelAnnouncement_get_excess_data(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Excess data which was signed as a part of the message which we do not (yet) understand how
+        * to decode.
+        * 
+        * This is stored to ensure forward-compatibility as new fields are added to the lightning gossip protocol.
+        */
+       public void set_excess_data(byte[] val) {
+               bindings.UnsignedChannelAnnouncement_set_excess_data(this.ptr, InternalUtils.encodeUint8Array(val));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new UnsignedChannelAnnouncement given each field
+        */
+       public static UnsignedChannelAnnouncement of(org.ldk.structs.ChannelFeatures features_arg, byte[] chain_hash_arg, long short_channel_id_arg, org.ldk.structs.NodeId node_id_1_arg, org.ldk.structs.NodeId node_id_2_arg, org.ldk.structs.NodeId bitcoin_key_1_arg, org.ldk.structs.NodeId bitcoin_key_2_arg, byte[] excess_data_arg) {
+               long ret = bindings.UnsignedChannelAnnouncement_new(features_arg == null ? 0 : features_arg.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(chain_hash_arg, 32)), short_channel_id_arg, node_id_1_arg == null ? 0 : node_id_1_arg.ptr, node_id_2_arg == null ? 0 : node_id_2_arg.ptr, bitcoin_key_1_arg == null ? 0 : bitcoin_key_1_arg.ptr, bitcoin_key_2_arg == null ? 0 : bitcoin_key_2_arg.ptr, InternalUtils.encodeUint8Array(excess_data_arg));
+               GC.KeepAlive(features_arg);
+               GC.KeepAlive(chain_hash_arg);
+               GC.KeepAlive(short_channel_id_arg);
+               GC.KeepAlive(node_id_1_arg);
+               GC.KeepAlive(node_id_2_arg);
+               GC.KeepAlive(bitcoin_key_1_arg);
+               GC.KeepAlive(bitcoin_key_2_arg);
+               GC.KeepAlive(excess_data_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.UnsignedChannelAnnouncement ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.UnsignedChannelAnnouncement(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(features_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(node_id_1_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(node_id_2_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(bitcoin_key_1_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(bitcoin_key_2_arg); };
+               return ret_hu_conv;
+       }
+
        internal long clone_ptr() {
                long ret = bindings.UnsignedChannelAnnouncement_clone_ptr(this.ptr);
                GC.KeepAlive(this);
@@ -202,16 +256,18 @@ public class UnsignedChannelAnnouncement : CommonBase {
         * Serialize the UnsignedChannelAnnouncement object into a byte array which can be read by UnsignedChannelAnnouncement_read
         */
        public byte[] write() {
-               byte[] ret = bindings.UnsignedChannelAnnouncement_write(this.ptr);
+               long ret = bindings.UnsignedChannelAnnouncement_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a UnsignedChannelAnnouncement from a byte array, created by UnsignedChannelAnnouncement_write
         */
        public static Result_UnsignedChannelAnnouncementDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.UnsignedChannelAnnouncement_read(ser);
+               long ret = bindings.UnsignedChannelAnnouncement_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_UnsignedChannelAnnouncementDecodeErrorZ ret_hu_conv = Result_UnsignedChannelAnnouncementDecodeErrorZ.constr_from_ptr(ret);
index 41705bea2e7f48bfb9590ad1c6af947d9ddb65bf..c9ce57728e3a889f719d9fc48836aa981b82b72f 100644 (file)
@@ -21,16 +21,18 @@ public class UnsignedChannelUpdate : CommonBase {
         * The genesis hash of the blockchain where the channel is to be opened
         */
        public byte[] get_chain_hash() {
-               byte[] ret = bindings.UnsignedChannelUpdate_get_chain_hash(this.ptr);
+               long ret = bindings.UnsignedChannelUpdate_get_chain_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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 to be opened
         */
        public void set_chain_hash(byte[] val) {
-               bindings.UnsignedChannelUpdate_set_chain_hash(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.UnsignedChannelUpdate_set_chain_hash(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -206,9 +208,11 @@ public class UnsignedChannelUpdate : CommonBase {
         * Returns a copy of the field.
         */
        public byte[] get_excess_data() {
-               byte[] ret = bindings.UnsignedChannelUpdate_get_excess_data(this.ptr);
+               long ret = bindings.UnsignedChannelUpdate_get_excess_data(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -218,7 +222,7 @@ public class UnsignedChannelUpdate : CommonBase {
         * This is stored to ensure forward-compatibility as new fields are added to the lightning gossip protocol.
         */
        public void set_excess_data(byte[] val) {
-               bindings.UnsignedChannelUpdate_set_excess_data(this.ptr, val);
+               bindings.UnsignedChannelUpdate_set_excess_data(this.ptr, InternalUtils.encodeUint8Array(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -227,7 +231,7 @@ public class UnsignedChannelUpdate : CommonBase {
         * Constructs a new UnsignedChannelUpdate given each field
         */
        public static UnsignedChannelUpdate of(byte[] chain_hash_arg, long short_channel_id_arg, int timestamp_arg, byte flags_arg, short cltv_expiry_delta_arg, long htlc_minimum_msat_arg, long htlc_maximum_msat_arg, int fee_base_msat_arg, int fee_proportional_millionths_arg, byte[] excess_data_arg) {
-               long ret = bindings.UnsignedChannelUpdate_new(InternalUtils.check_arr_len(chain_hash_arg, 32), short_channel_id_arg, timestamp_arg, flags_arg, cltv_expiry_delta_arg, htlc_minimum_msat_arg, htlc_maximum_msat_arg, fee_base_msat_arg, fee_proportional_millionths_arg, excess_data_arg);
+               long ret = bindings.UnsignedChannelUpdate_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(chain_hash_arg, 32)), short_channel_id_arg, timestamp_arg, flags_arg, cltv_expiry_delta_arg, htlc_minimum_msat_arg, htlc_maximum_msat_arg, fee_base_msat_arg, fee_proportional_millionths_arg, InternalUtils.encodeUint8Array(excess_data_arg));
                GC.KeepAlive(chain_hash_arg);
                GC.KeepAlive(short_channel_id_arg);
                GC.KeepAlive(timestamp_arg);
@@ -283,16 +287,18 @@ public class UnsignedChannelUpdate : CommonBase {
         * Serialize the UnsignedChannelUpdate object into a byte array which can be read by UnsignedChannelUpdate_read
         */
        public byte[] write() {
-               byte[] ret = bindings.UnsignedChannelUpdate_write(this.ptr);
+               long ret = bindings.UnsignedChannelUpdate_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a UnsignedChannelUpdate from a byte array, created by UnsignedChannelUpdate_write
         */
        public static Result_UnsignedChannelUpdateDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.UnsignedChannelUpdate_read(ser);
+               long ret = bindings.UnsignedChannelUpdate_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_UnsignedChannelUpdateDecodeErrorZ ret_hu_conv = Result_UnsignedChannelUpdateDecodeErrorZ.constr_from_ptr(ret);
index 1b6990bd07961e0c3b5fe40ecfb29098ef531148..ff59a12d10a2c0da130002c589c9e673c449e7de 100644 (file)
@@ -116,9 +116,11 @@ public class UnsignedGossipMessage : CommonBase {
         * Serialize the UnsignedGossipMessage object into a byte array which can be read by UnsignedGossipMessage_read
         */
        public byte[] write() {
-               byte[] ret = bindings.UnsignedGossipMessage_write(this.ptr);
+               long ret = bindings.UnsignedGossipMessage_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index e212cadc4ef85d6389d5f39e2af62e04297803a2..1c33d54dad3d3e47d7cb222baf64c1497bd7b6ee 100644 (file)
@@ -8,6 +8,11 @@ namespace org { namespace ldk { namespace structs {
 
 /**
  * A semantically valid [`InvoiceRequest`] that hasn't been signed.
+ * 
+ * # Serialization
+ * 
+ * This is serialized as a TLV stream, which includes TLV records from the originating message. As
+ * such, it may include unknown, odd TLV records.
  */
 public class UnsignedInvoiceRequest : CommonBase {
        internal UnsignedInvoiceRequest(object _dummy, long ptr) : base(ptr) { }
@@ -15,5 +20,262 @@ public class UnsignedInvoiceRequest : CommonBase {
                if (ptr != 0) { bindings.UnsignedInvoiceRequest_free(ptr); }
        }
 
+       /**
+        * Returns the [`TaggedHash`] of the invoice to sign.
+        */
+       public TaggedHash tagged_hash() {
+               long ret = bindings.UnsignedInvoiceRequest_tagged_hash(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;
+       }
+
+       /**
+        * The chains that may be used when paying a requested invoice (e.g., bitcoin mainnet).
+        * Payments must be denominated in units of the minimal lightning-payable unit (e.g., msats)
+        * for the selected chain.
+        */
+       public byte[][] chains() {
+               long ret = bindings.UnsignedInvoiceRequest_chains(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_8_len = InternalUtils.getArrayLength(ret);
+               byte[][] ret_conv_8_arr = new byte[ret_conv_8_len][];
+               for (int i = 0; i < ret_conv_8_len; i++) {
+                       long ret_conv_8 = InternalUtils.getU64ArrayElem(ret, i);
+                       byte[] ret_conv_8_conv = InternalUtils.decodeUint8Array(ret_conv_8);
+                       ret_conv_8_arr[i] = ret_conv_8_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_8_arr;
+       }
+
+       /**
+        * Opaque bytes set by the originator. Useful for authentication and validating fields since it
+        * is reflected in `invoice_request` messages along with all the other fields from the `offer`.
+        */
+       public Option_CVec_u8ZZ metadata() {
+               long ret = bindings.UnsignedInvoiceRequest_metadata(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_CVec_u8ZZ ret_hu_conv = org.ldk.structs.Option_CVec_u8ZZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The minimum amount required for a successful payment of a single item.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public Amount amount() {
+               long ret = bindings.UnsignedInvoiceRequest_amount(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Amount ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Amount(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * A complete description of the purpose of the payment. Intended to be displayed to the user
+        * but with the caveat that it has not been verified in any way.
+        */
+       public PrintableString description() {
+               long ret = bindings.UnsignedInvoiceRequest_description(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PrintableString ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PrintableString(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Features pertaining to the offer.
+        */
+       public OfferFeatures offer_features() {
+               long ret = bindings.UnsignedInvoiceRequest_offer_features(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.OfferFeatures ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.OfferFeatures(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Duration since the Unix epoch when an invoice should no longer be requested.
+        * 
+        * If `None`, the offer does not expire.
+        */
+       public Option_u64Z absolute_expiry() {
+               long ret = bindings.UnsignedInvoiceRequest_absolute_expiry(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 issuer of the offer, 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.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public PrintableString issuer() {
+               long ret = bindings.UnsignedInvoiceRequest_issuer(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PrintableString ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PrintableString(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Paths to the recipient originating from publicly reachable nodes. Blinded paths provide
+        * recipient privacy by obfuscating its node id.
+        */
+       public BlindedPath[] paths() {
+               long ret = bindings.UnsignedInvoiceRequest_paths(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_13_len = InternalUtils.getArrayLength(ret);
+               BlindedPath[] ret_conv_13_arr = new BlindedPath[ret_conv_13_len];
+               for (int n = 0; n < ret_conv_13_len; n++) {
+                       long ret_conv_13 = InternalUtils.getU64ArrayElem(ret, n);
+                       org.ldk.structs.BlindedPath ret_conv_13_hu_conv = null; if (ret_conv_13 < 0 || ret_conv_13 > 4096) { ret_conv_13_hu_conv = new org.ldk.structs.BlindedPath(null, ret_conv_13); }
+                       if (ret_conv_13_hu_conv != null) { ret_conv_13_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_13_arr[n] = ret_conv_13_hu_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_13_arr;
+       }
+
+       /**
+        * The quantity of items supported.
+        */
+       public Quantity supported_quantity() {
+               long ret = bindings.UnsignedInvoiceRequest_supported_quantity(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Quantity ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Quantity(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The public key used by the recipient to sign invoices.
+        */
+       public byte[] signing_pubkey() {
+               long ret = bindings.UnsignedInvoiceRequest_signing_pubkey(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * An unpredictable series of bytes, typically containing information about the derivation of
+        * [`payer_id`].
+        * 
+        * [`payer_id`]: Self::payer_id
+        */
+       public byte[] payer_metadata() {
+               long ret = bindings.UnsignedInvoiceRequest_payer_metadata(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * A chain from [`Offer::chains`] that the offer is valid for.
+        */
+       public byte[] chain() {
+               long ret = bindings.UnsignedInvoiceRequest_chain(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The amount to pay in msats (i.e., the minimum lightning-payable unit for [`chain`]), which
+        * must be greater than or equal to [`Offer::amount`], converted if necessary.
+        * 
+        * [`chain`]: Self::chain
+        */
+       public Option_u64Z amount_msats() {
+               long ret = bindings.UnsignedInvoiceRequest_amount_msats(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;
+       }
+
+       /**
+        * Features pertaining to requesting an invoice.
+        */
+       public InvoiceRequestFeatures invoice_request_features() {
+               long ret = bindings.UnsignedInvoiceRequest_invoice_request_features(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.InvoiceRequestFeatures ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.InvoiceRequestFeatures(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The quantity of the offer's item conforming to [`Offer::is_valid_quantity`].
+        */
+       public Option_u64Z quantity() {
+               long ret = bindings.UnsignedInvoiceRequest_quantity(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;
+       }
+
+       /**
+        * A possibly transient pubkey used to sign the invoice request.
+        */
+       public byte[] payer_id() {
+               long ret = bindings.UnsignedInvoiceRequest_payer_id(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * A payer-provided note which will be seen by the recipient and reflected back in the invoice
+        * response.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public PrintableString payer_note() {
+               long ret = bindings.UnsignedInvoiceRequest_payer_note(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PrintableString ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PrintableString(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Serialize the UnsignedInvoiceRequest object into a byte array which can be read by UnsignedInvoiceRequest_read
+        */
+       public byte[] write() {
+               long ret = bindings.UnsignedInvoiceRequest_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
 }
 } } }
index 73a8a133861fd8aa14b4616f7724f3565f99d883..5d5efc127fdeb22af189d60e18ae740e1c925aba 100644 (file)
@@ -85,16 +85,18 @@ public class UnsignedNodeAnnouncement : CommonBase {
         * An RGB color for UI purposes
         */
        public byte[] get_rgb() {
-               byte[] ret = bindings.UnsignedNodeAnnouncement_get_rgb(this.ptr);
+               long ret = bindings.UnsignedNodeAnnouncement_get_rgb(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * An RGB color for UI purposes
         */
        public void set_rgb(byte[] val) {
-               bindings.UnsignedNodeAnnouncement_set_rgb(this.ptr, InternalUtils.check_arr_len(val, 3));
+               bindings.UnsignedNodeAnnouncement_set_rgb(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 3)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -130,28 +132,30 @@ public class UnsignedNodeAnnouncement : CommonBase {
         * 
         * Returns a copy of the field.
         */
-       public NetAddress[] get_addresses() {
-               long[] ret = bindings.UnsignedNodeAnnouncement_get_addresses(this.ptr);
+       public SocketAddress[] get_addresses() {
+               long ret = bindings.UnsignedNodeAnnouncement_get_addresses(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_12_len = ret.Length;
-               NetAddress[] ret_conv_12_arr = new NetAddress[ret_conv_12_len];
-               for (int m = 0; m < ret_conv_12_len; m++) {
-                       long ret_conv_12 = ret[m];
-                       org.ldk.structs.NetAddress ret_conv_12_hu_conv = org.ldk.structs.NetAddress.constr_from_ptr(ret_conv_12);
-                       if (ret_conv_12_hu_conv != null) { ret_conv_12_hu_conv.ptrs_to.AddLast(this); };
-                       ret_conv_12_arr[m] = ret_conv_12_hu_conv;
+               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;
                }
-               return ret_conv_12_arr;
+               bindings.free_buffer(ret);
+               return ret_conv_15_arr;
        }
 
        /**
         * List of addresses on which this node is reachable
         */
-       public void set_addresses(NetAddress[] val) {
-               bindings.UnsignedNodeAnnouncement_set_addresses(this.ptr, val != null ? InternalUtils.mapArray(val, val_conv_12 => val_conv_12.ptr) : null);
+       public void set_addresses(SocketAddress[] val) {
+               bindings.UnsignedNodeAnnouncement_set_addresses(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(val, val_conv_15 => val_conv_15.ptr)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
-               foreach (NetAddress val_conv_12 in val) { if (this != null) { this.ptrs_to.AddLast(val_conv_12); }; };
+               foreach (SocketAddress val_conv_15 in val) { if (this != null) { this.ptrs_to.AddLast(val_conv_15); }; };
        }
 
        internal long clone_ptr() {
@@ -193,16 +197,18 @@ public class UnsignedNodeAnnouncement : CommonBase {
         * Serialize the UnsignedNodeAnnouncement object into a byte array which can be read by UnsignedNodeAnnouncement_read
         */
        public byte[] write() {
-               byte[] ret = bindings.UnsignedNodeAnnouncement_write(this.ptr);
+               long ret = bindings.UnsignedNodeAnnouncement_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a UnsignedNodeAnnouncement from a byte array, created by UnsignedNodeAnnouncement_write
         */
        public static Result_UnsignedNodeAnnouncementDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.UnsignedNodeAnnouncement_read(ser);
+               long ret = bindings.UnsignedNodeAnnouncement_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_UnsignedNodeAnnouncementDecodeErrorZ ret_hu_conv = Result_UnsignedNodeAnnouncementDecodeErrorZ.constr_from_ptr(ret);
index 93ed1c5b6edcaeb4b2338de5001fd719cbfca1ab..72ba39859dbee952f92eea6761fadb60a5bc359b 100644 (file)
@@ -16,13 +16,15 @@ public class UntrustedString : CommonBase {
        }
 
        public string get_a() {
-               string ret = bindings.UntrustedString_get_a(this.ptr);
+               long ret = bindings.UntrustedString_get_a(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
        }
 
        public void set_a(string val) {
-               bindings.UntrustedString_set_a(this.ptr, val);
+               bindings.UntrustedString_set_a(this.ptr, InternalUtils.encodeString(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -31,7 +33,7 @@ public class UntrustedString : CommonBase {
         * Constructs a new UntrustedString given each field
         */
        public static UntrustedString of(string a_arg) {
-               long ret = bindings.UntrustedString_new(a_arg);
+               long ret = bindings.UntrustedString_new(InternalUtils.encodeString(a_arg));
                GC.KeepAlive(a_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.UntrustedString ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.UntrustedString(null, ret); }
@@ -78,16 +80,18 @@ public class UntrustedString : CommonBase {
         * Serialize the UntrustedString object into a byte array which can be read by UntrustedString_read
         */
        public byte[] write() {
-               byte[] ret = bindings.UntrustedString_write(this.ptr);
+               long ret = bindings.UntrustedString_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a UntrustedString from a byte array, created by UntrustedString_write
         */
        public static Result_UntrustedStringDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.UntrustedString_read(ser);
+               long ret = bindings.UntrustedString_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_UntrustedStringDecodeErrorZ ret_hu_conv = Result_UntrustedStringDecodeErrorZ.constr_from_ptr(ret);
index 9b7e8db6de2c5a1b06a287e15267dc470f19d58b..f108706c2c65e07307277af514d45a343c7ff688 100644 (file)
@@ -21,16 +21,18 @@ public class UpdateAddHTLC : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.UpdateAddHTLC_get_channel_id(this.ptr);
+               long ret = bindings.UpdateAddHTLC_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.UpdateAddHTLC_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.UpdateAddHTLC_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -75,16 +77,18 @@ public class UpdateAddHTLC : CommonBase {
         * The payment hash, the pre-image of which controls HTLC redemption
         */
        public byte[] get_payment_hash() {
-               byte[] ret = bindings.UpdateAddHTLC_get_payment_hash(this.ptr);
+               long ret = bindings.UpdateAddHTLC_get_payment_hash(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The payment hash, the pre-image of which controls HTLC redemption
         */
        public void set_payment_hash(byte[] val) {
-               bindings.UpdateAddHTLC_set_payment_hash(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.UpdateAddHTLC_set_payment_hash(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -174,16 +178,18 @@ public class UpdateAddHTLC : CommonBase {
         * Serialize the UpdateAddHTLC object into a byte array which can be read by UpdateAddHTLC_read
         */
        public byte[] write() {
-               byte[] ret = bindings.UpdateAddHTLC_write(this.ptr);
+               long ret = bindings.UpdateAddHTLC_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a UpdateAddHTLC from a byte array, created by UpdateAddHTLC_write
         */
        public static Result_UpdateAddHTLCDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.UpdateAddHTLC_read(ser);
+               long ret = bindings.UpdateAddHTLC_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_UpdateAddHTLCDecodeErrorZ ret_hu_conv = Result_UpdateAddHTLCDecodeErrorZ.constr_from_ptr(ret);
index 2c29d8857fbd437a324e13426d0ab046873a848c..78ff71d344ddee8b5c2ed7e5199eb191b5cd3ec9 100644 (file)
@@ -21,16 +21,18 @@ public class UpdateFailHTLC : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.UpdateFailHTLC_get_channel_id(this.ptr);
+               long ret = bindings.UpdateFailHTLC_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.UpdateFailHTLC_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.UpdateFailHTLC_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -92,16 +94,18 @@ public class UpdateFailHTLC : CommonBase {
         * Serialize the UpdateFailHTLC object into a byte array which can be read by UpdateFailHTLC_read
         */
        public byte[] write() {
-               byte[] ret = bindings.UpdateFailHTLC_write(this.ptr);
+               long ret = bindings.UpdateFailHTLC_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a UpdateFailHTLC from a byte array, created by UpdateFailHTLC_write
         */
        public static Result_UpdateFailHTLCDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.UpdateFailHTLC_read(ser);
+               long ret = bindings.UpdateFailHTLC_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_UpdateFailHTLCDecodeErrorZ ret_hu_conv = Result_UpdateFailHTLCDecodeErrorZ.constr_from_ptr(ret);
index 8d8cbea4d720ad8e359c3d52a47e1cfef62ad802..8d83b6461510b37d0a98fb39d66e03dd11d399f8 100644 (file)
@@ -21,16 +21,18 @@ public class UpdateFailMalformedHTLC : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.UpdateFailMalformedHTLC_get_channel_id(this.ptr);
+               long ret = bindings.UpdateFailMalformedHTLC_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.UpdateFailMalformedHTLC_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.UpdateFailMalformedHTLC_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -110,16 +112,18 @@ public class UpdateFailMalformedHTLC : CommonBase {
         * Serialize the UpdateFailMalformedHTLC object into a byte array which can be read by UpdateFailMalformedHTLC_read
         */
        public byte[] write() {
-               byte[] ret = bindings.UpdateFailMalformedHTLC_write(this.ptr);
+               long ret = bindings.UpdateFailMalformedHTLC_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a UpdateFailMalformedHTLC from a byte array, created by UpdateFailMalformedHTLC_write
         */
        public static Result_UpdateFailMalformedHTLCDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.UpdateFailMalformedHTLC_read(ser);
+               long ret = bindings.UpdateFailMalformedHTLC_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_UpdateFailMalformedHTLCDecodeErrorZ ret_hu_conv = Result_UpdateFailMalformedHTLCDecodeErrorZ.constr_from_ptr(ret);
index ef67d259f9f26749b6bfbf1aa6072e31cc49a422..c90ea37c07a600799a0cdc235fb9f2378ed5c10e 100644 (file)
@@ -21,16 +21,18 @@ public class UpdateFee : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.UpdateFee_get_channel_id(this.ptr);
+               long ret = bindings.UpdateFee_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.UpdateFee_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.UpdateFee_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -57,7 +59,7 @@ public class UpdateFee : CommonBase {
         * Constructs a new UpdateFee given each field
         */
        public static UpdateFee of(byte[] channel_id_arg, int feerate_per_kw_arg) {
-               long ret = bindings.UpdateFee_new(InternalUtils.check_arr_len(channel_id_arg, 32), feerate_per_kw_arg);
+               long ret = bindings.UpdateFee_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), feerate_per_kw_arg);
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(feerate_per_kw_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -105,16 +107,18 @@ public class UpdateFee : CommonBase {
         * Serialize the UpdateFee object into a byte array which can be read by UpdateFee_read
         */
        public byte[] write() {
-               byte[] ret = bindings.UpdateFee_write(this.ptr);
+               long ret = bindings.UpdateFee_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a UpdateFee from a byte array, created by UpdateFee_write
         */
        public static Result_UpdateFeeDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.UpdateFee_read(ser);
+               long ret = bindings.UpdateFee_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_UpdateFeeDecodeErrorZ ret_hu_conv = Result_UpdateFeeDecodeErrorZ.constr_from_ptr(ret);
index 4cd599915ec6c3c2e75e69e01989fc375f57ae74..4177127e89f0bc0a38e60a77e5b34503b29bb650 100644 (file)
@@ -21,16 +21,18 @@ public class UpdateFulfillHTLC : CommonBase {
         * The channel ID
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.UpdateFulfillHTLC_get_channel_id(this.ptr);
+               long ret = bindings.UpdateFulfillHTLC_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               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.UpdateFulfillHTLC_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.UpdateFulfillHTLC_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -57,16 +59,18 @@ public class UpdateFulfillHTLC : CommonBase {
         * The pre-image of the payment hash, allowing HTLC redemption
         */
        public byte[] get_payment_preimage() {
-               byte[] ret = bindings.UpdateFulfillHTLC_get_payment_preimage(this.ptr);
+               long ret = bindings.UpdateFulfillHTLC_get_payment_preimage(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * The pre-image of the payment hash, allowing HTLC redemption
         */
        public void set_payment_preimage(byte[] val) {
-               bindings.UpdateFulfillHTLC_set_payment_preimage(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.UpdateFulfillHTLC_set_payment_preimage(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -75,7 +79,7 @@ public class UpdateFulfillHTLC : CommonBase {
         * Constructs a new UpdateFulfillHTLC given each field
         */
        public static UpdateFulfillHTLC of(byte[] channel_id_arg, long htlc_id_arg, byte[] payment_preimage_arg) {
-               long ret = bindings.UpdateFulfillHTLC_new(InternalUtils.check_arr_len(channel_id_arg, 32), htlc_id_arg, InternalUtils.check_arr_len(payment_preimage_arg, 32));
+               long ret = bindings.UpdateFulfillHTLC_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), htlc_id_arg, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_preimage_arg, 32)));
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(htlc_id_arg);
                GC.KeepAlive(payment_preimage_arg);
@@ -124,16 +128,18 @@ public class UpdateFulfillHTLC : CommonBase {
         * Serialize the UpdateFulfillHTLC object into a byte array which can be read by UpdateFulfillHTLC_read
         */
        public byte[] write() {
-               byte[] ret = bindings.UpdateFulfillHTLC_write(this.ptr);
+               long ret = bindings.UpdateFulfillHTLC_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a UpdateFulfillHTLC from a byte array, created by UpdateFulfillHTLC_write
         */
        public static Result_UpdateFulfillHTLCDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.UpdateFulfillHTLC_read(ser);
+               long ret = bindings.UpdateFulfillHTLC_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_UpdateFulfillHTLCDecodeErrorZ ret_hu_conv = Result_UpdateFulfillHTLCDecodeErrorZ.constr_from_ptr(ret);
index 4f333b8f0d1c8e704b01882f4d8a20c5a5a3e8ab..6e47ecc6f60b1dd39e210f3e68fae4007c665102 100644 (file)
@@ -10,17 +10,20 @@ public class UtilMethods {
         * Gets the 128-bit integer, as 16 little-endian bytes
         */
        public static byte[] U128_le_bytes(org.ldk.util.UInt128 val) {
-               byte[] ret = bindings.U128_le_bytes(val.getLEBytes());
+               long ret = bindings.U128_le_bytes(InternalUtils.encodeUint8Array(val.getLEBytes()));
                GC.KeepAlive(val);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Constructs a new U128 from 16 little-endian bytes
         */
        public static UInt128 U128_new(byte[] le_bytes) {
-               byte[] ret = bindings.U128_new(InternalUtils.check_arr_len(le_bytes, 16));
+               long ret = bindings.U128_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(le_bytes, 16)));
                GC.KeepAlive(le_bytes);
+               if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.util.UInt128 ret_conv = new org.ldk.util.UInt128(ret);
                return ret_conv;
        }
@@ -45,7 +48,7 @@ public class UtilMethods {
         * Read a APIError from a byte array, created by APIError_write
         */
        public static Result_COption_APIErrorZDecodeErrorZ APIError_read(byte[] ser) {
-               long ret = bindings.APIError_read(ser);
+               long ret = bindings.APIError_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_COption_APIErrorZDecodeErrorZ ret_hu_conv = Result_COption_APIErrorZDecodeErrorZ.constr_from_ptr(ret);
@@ -57,24 +60,24 @@ public class UtilMethods {
         * A receiver knowing the PublicKey (e.g. the node's id) and the message can be sure that the signature was generated by the caller.
         * Signatures are EC recoverable, meaning that given the message and the signature the PublicKey of the signer can be extracted.
         */
-       public static Result_StringErrorZ sign(byte[] msg, byte[] sk) {
-               long ret = bindings.sign(msg, InternalUtils.check_arr_len(sk, 32));
+       public static Result_StrSecp256k1ErrorZ sign(byte[] msg, byte[] sk) {
+               long ret = bindings.sign(InternalUtils.encodeUint8Array(msg), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(sk, 32)));
                GC.KeepAlive(msg);
                GC.KeepAlive(sk);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_StringErrorZ ret_hu_conv = Result_StringErrorZ.constr_from_ptr(ret);
+               Result_StrSecp256k1ErrorZ ret_hu_conv = Result_StrSecp256k1ErrorZ.constr_from_ptr(ret);
                return ret_hu_conv;
        }
 
        /**
         * Recovers the PublicKey of the signer of the message given the message and the signature.
         */
-       public static Result_PublicKeyErrorZ recover_pk(byte[] msg, string sig) {
-               long ret = bindings.recover_pk(msg, sig);
+       public static Result_PublicKeySecp256k1ErrorZ recover_pk(byte[] msg, string sig) {
+               long ret = bindings.recover_pk(InternalUtils.encodeUint8Array(msg), InternalUtils.encodeString(sig));
                GC.KeepAlive(msg);
                GC.KeepAlive(sig);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PublicKeyErrorZ ret_hu_conv = Result_PublicKeyErrorZ.constr_from_ptr(ret);
+               Result_PublicKeySecp256k1ErrorZ ret_hu_conv = Result_PublicKeySecp256k1ErrorZ.constr_from_ptr(ret);
                return ret_hu_conv;
        }
 
@@ -83,7 +86,7 @@ public class UtilMethods {
         * and the PublicKey.
         */
        public static bool verify(byte[] msg, string sig, byte[] pk) {
-               bool ret = bindings.verify(msg, sig, InternalUtils.check_arr_len(pk, 33));
+               bool ret = bindings.verify(InternalUtils.encodeUint8Array(msg), InternalUtils.encodeString(sig), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(pk, 33)));
                GC.KeepAlive(msg);
                GC.KeepAlive(sig);
                GC.KeepAlive(pk);
@@ -94,17 +97,35 @@ public class UtilMethods {
         * Construct the invoice's HRP and signatureless data into a preimage to be hashed.
         */
        public static byte[] construct_invoice_preimage(byte[] hrp_bytes, UInt5[] data_without_signature) {
-               byte[] ret = bindings.construct_invoice_preimage(hrp_bytes, data_without_signature != null ? InternalUtils.convUInt5Array(data_without_signature) : null);
+               long ret = bindings.construct_invoice_preimage(InternalUtils.encodeUint8Array(hrp_bytes), InternalUtils.encodeUint8Array(InternalUtils.convUInt5Array(data_without_signature)));
                GC.KeepAlive(hrp_bytes);
                GC.KeepAlive(data_without_signature);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read previously persisted [`ChannelMonitor`]s from the store.
+        */
+       public static Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ read_channel_monitors(org.ldk.structs.KVStore kv_store, org.ldk.structs.EntropySource entropy_source, org.ldk.structs.SignerProvider signer_provider) {
+               long ret = bindings.read_channel_monitors(kv_store.ptr, entropy_source.ptr, signer_provider.ptr);
+               GC.KeepAlive(kv_store);
+               GC.KeepAlive(entropy_source);
+               GC.KeepAlive(signer_provider);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ ret_hu_conv = Result_CVec_C2Tuple_ThirtyTwoBytesChannelMonitorZZIOErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(kv_store); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(entropy_source); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(signer_provider); };
+               return ret_hu_conv;
        }
 
        /**
         * Read a MonitorEvent from a byte array, created by MonitorEvent_write
         */
        public static Result_COption_MonitorEventZDecodeErrorZ MonitorEvent_read(byte[] ser) {
-               long ret = bindings.MonitorEvent_read(ser);
+               long ret = bindings.MonitorEvent_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_COption_MonitorEventZDecodeErrorZ ret_hu_conv = Result_COption_MonitorEventZDecodeErrorZ.constr_from_ptr(ret);
@@ -112,22 +133,22 @@ public class UtilMethods {
        }
 
        /**
-        * Read a C2Tuple_BlockHashChannelMonitorZ from a byte array, created by C2Tuple_BlockHashChannelMonitorZ_write
+        * Read a C2Tuple_ThirtyTwoBytesChannelMonitorZ from a byte array, created by C2Tuple_ThirtyTwoBytesChannelMonitorZ_write
         */
-       public static Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ C2Tuple_BlockHashChannelMonitorZ_read(byte[] ser, org.ldk.structs.EntropySource arg_a, org.ldk.structs.SignerProvider arg_b) {
-               long ret = bindings.C2Tuple_BlockHashChannelMonitorZ_read(ser, arg_a.ptr, arg_b.ptr);
+       public static Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ C2Tuple_ThirtyTwoBytesChannelMonitorZ_read(byte[] ser, org.ldk.structs.EntropySource arg_a, org.ldk.structs.SignerProvider arg_b) {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesChannelMonitorZ_read(InternalUtils.encodeUint8Array(ser), arg_a.ptr, arg_b.ptr);
                GC.KeepAlive(ser);
                GC.KeepAlive(arg_a);
                GC.KeepAlive(arg_b);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ ret_hu_conv = Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.constr_from_ptr(ret);
+               Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(arg_a); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(arg_b); };
                return ret_hu_conv;
        }
 
        /**
-        * Fetches the set of [`InitFeatures`] flags which are provided by or required by
+        * Fetches the set of [`InitFeatures`] flags that are provided by or required by
         * [`ChannelManager`].
         */
        public static InitFeatures provided_init_features(org.ldk.structs.UserConfig config) {
@@ -141,10 +162,10 @@ public class UtilMethods {
        }
 
        /**
-        * Read a C2Tuple_BlockHashChannelManagerZ from a byte array, created by C2Tuple_BlockHashChannelManagerZ_write
+        * Read a C2Tuple_ThirtyTwoBytesChannelManagerZ from a byte array, created by C2Tuple_ThirtyTwoBytesChannelManagerZ_write
         */
-       public static Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ C2Tuple_BlockHashChannelManagerZ_read(byte[] ser, EntropySource arg_entropy_source, NodeSigner arg_node_signer, SignerProvider arg_signer_provider, FeeEstimator arg_fee_estimator, Watch arg_chain_monitor, BroadcasterInterface arg_tx_broadcaster, Router arg_router, Logger arg_logger, UserConfig arg_default_config, ChannelMonitor[] arg_channel_monitors) {
-               long ret = bindings.C2Tuple_BlockHashChannelManagerZ_read(ser, bindings.ChannelManagerReadArgs_new(arg_entropy_source.ptr, arg_node_signer.ptr, arg_signer_provider.ptr, arg_fee_estimator.ptr, arg_chain_monitor.ptr, arg_tx_broadcaster.ptr, arg_router.ptr, arg_logger.ptr, arg_default_config == null ? 0 : arg_default_config.ptr, arg_channel_monitors != null ? InternalUtils.mapArray(arg_channel_monitors, arg_channel_monitors_conv_16 => arg_channel_monitors_conv_16 == null ? 0 : arg_channel_monitors_conv_16.ptr) : null));
+       public static Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ C2Tuple_ThirtyTwoBytesChannelManagerZ_read(byte[] ser, EntropySource arg_entropy_source, NodeSigner arg_node_signer, SignerProvider arg_signer_provider, FeeEstimator arg_fee_estimator, Watch arg_chain_monitor, BroadcasterInterface arg_tx_broadcaster, Router arg_router, Logger arg_logger, UserConfig arg_default_config, ChannelMonitor[] arg_channel_monitors) {
+               long ret = bindings.C2Tuple_ThirtyTwoBytesChannelManagerZ_read(InternalUtils.encodeUint8Array(ser), bindings.ChannelManagerReadArgs_new(arg_entropy_source.ptr, arg_node_signer.ptr, arg_signer_provider.ptr, arg_fee_estimator.ptr, arg_chain_monitor.ptr, arg_tx_broadcaster.ptr, arg_router.ptr, arg_logger.ptr, arg_default_config == null ? 0 : arg_default_config.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(arg_channel_monitors, arg_channel_monitors_conv_16 => arg_channel_monitors_conv_16 == null ? 0 : arg_channel_monitors_conv_16.ptr))));
                GC.KeepAlive(ser);
                GC.KeepAlive(arg_entropy_source);
                GC.KeepAlive(arg_node_signer);
@@ -157,7 +178,7 @@ public class UtilMethods {
                GC.KeepAlive(arg_default_config);
                GC.KeepAlive(arg_channel_monitors);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ ret_hu_conv = Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ.constr_from_ptr(ret);
+               Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(arg_entropy_source); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(arg_node_signer); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(arg_signer_provider); };
@@ -188,7 +209,7 @@ public class UtilMethods {
         * [phantom node payments]: crate::sign::PhantomKeysManager
         * [`NodeSigner::get_inbound_payment_key_material`]: crate::sign::NodeSigner::get_inbound_payment_key_material
         */
-       public static Result_C2Tuple_PaymentHashPaymentSecretZNoneZ create(org.ldk.structs.ExpandedKey keys, org.ldk.structs.Option_u64Z min_value_msat, int invoice_expiry_delta_secs, org.ldk.structs.EntropySource entropy_source, long current_time, org.ldk.structs.Option_u16Z min_final_cltv_expiry_delta) {
+       public static Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ create(org.ldk.structs.ExpandedKey keys, org.ldk.structs.Option_u64Z min_value_msat, int invoice_expiry_delta_secs, org.ldk.structs.EntropySource entropy_source, long current_time, org.ldk.structs.Option_u16Z min_final_cltv_expiry_delta) {
                long ret = bindings.create(keys == null ? 0 : keys.ptr, min_value_msat.ptr, invoice_expiry_delta_secs, entropy_source.ptr, current_time, min_final_cltv_expiry_delta.ptr);
                GC.KeepAlive(keys);
                GC.KeepAlive(min_value_msat);
@@ -197,7 +218,7 @@ public class UtilMethods {
                GC.KeepAlive(current_time);
                GC.KeepAlive(min_final_cltv_expiry_delta);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_PaymentHashPaymentSecretZNoneZ ret_hu_conv = Result_C2Tuple_PaymentHashPaymentSecretZNoneZ.constr_from_ptr(ret);
+               Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ ret_hu_conv = Result_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZNoneZ.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(keys); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(min_value_msat); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(entropy_source); };
@@ -217,8 +238,8 @@ public class UtilMethods {
         * 
         * [phantom node payments]: crate::sign::PhantomKeysManager
         */
-       public static Result_PaymentSecretNoneZ create_from_hash(org.ldk.structs.ExpandedKey keys, org.ldk.structs.Option_u64Z min_value_msat, byte[] payment_hash, int invoice_expiry_delta_secs, long current_time, org.ldk.structs.Option_u16Z min_final_cltv_expiry_delta) {
-               long ret = bindings.create_from_hash(keys == null ? 0 : keys.ptr, min_value_msat.ptr, InternalUtils.check_arr_len(payment_hash, 32), invoice_expiry_delta_secs, current_time, min_final_cltv_expiry_delta.ptr);
+       public static Result_ThirtyTwoBytesNoneZ create_from_hash(org.ldk.structs.ExpandedKey keys, org.ldk.structs.Option_u64Z min_value_msat, byte[] payment_hash, int invoice_expiry_delta_secs, long current_time, org.ldk.structs.Option_u16Z min_final_cltv_expiry_delta) {
+               long ret = bindings.create_from_hash(keys == null ? 0 : keys.ptr, min_value_msat.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), invoice_expiry_delta_secs, current_time, min_final_cltv_expiry_delta.ptr);
                GC.KeepAlive(keys);
                GC.KeepAlive(min_value_msat);
                GC.KeepAlive(payment_hash);
@@ -226,13 +247,27 @@ public class UtilMethods {
                GC.KeepAlive(current_time);
                GC.KeepAlive(min_final_cltv_expiry_delta);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentSecretNoneZ ret_hu_conv = Result_PaymentSecretNoneZ.constr_from_ptr(ret);
+               Result_ThirtyTwoBytesNoneZ ret_hu_conv = Result_ThirtyTwoBytesNoneZ.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(keys); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(min_value_msat); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(min_final_cltv_expiry_delta); };
                return ret_hu_conv;
        }
 
+       /**
+        * Parses an OnionV3 host and port into a [`SocketAddress::OnionV3`].
+        * 
+        * The host part must end with \".onion\".
+        */
+       public static Result_SocketAddressSocketAddressParseErrorZ parse_onion_address(string host, short port) {
+               long ret = bindings.parse_onion_address(InternalUtils.encodeString(host), port);
+               GC.KeepAlive(host);
+               GC.KeepAlive(port);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SocketAddressSocketAddressParseErrorZ ret_hu_conv = Result_SocketAddressSocketAddressParseErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
        /**
         * Gets the weight for an HTLC-Success transaction.
         */
@@ -255,7 +290,7 @@ public class UtilMethods {
         * Check if a given input witness attempts to claim a HTLC.
         */
        public static Option_HTLCClaimZ HTLCClaim_from_witness(byte[] witness) {
-               long ret = bindings.HTLCClaim_from_witness(witness);
+               long ret = bindings.HTLCClaim_from_witness(InternalUtils.encodeUint8Array(witness));
                GC.KeepAlive(witness);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.Option_HTLCClaimZ ret_hu_conv = org.ldk.structs.Option_HTLCClaimZ.constr_from_ptr(ret);
@@ -267,23 +302,27 @@ public class UtilMethods {
         * Build the commitment secret from the seed and the commitment number
         */
        public static byte[] build_commitment_secret(byte[] commitment_seed, long idx) {
-               byte[] ret = bindings.build_commitment_secret(InternalUtils.check_arr_len(commitment_seed, 32), idx);
+               long ret = bindings.build_commitment_secret(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(commitment_seed, 32)), idx);
                GC.KeepAlive(commitment_seed);
                GC.KeepAlive(idx);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Build a closing transaction
         */
        public static byte[] build_closing_transaction(long to_holder_value_sat, long to_counterparty_value_sat, byte[] to_holder_script, byte[] to_counterparty_script, org.ldk.structs.OutPoint funding_outpoint) {
-               byte[] ret = bindings.build_closing_transaction(to_holder_value_sat, to_counterparty_value_sat, to_holder_script, to_counterparty_script, funding_outpoint == null ? 0 : funding_outpoint.ptr);
+               long ret = bindings.build_closing_transaction(to_holder_value_sat, to_counterparty_value_sat, InternalUtils.encodeUint8Array(to_holder_script), InternalUtils.encodeUint8Array(to_counterparty_script), funding_outpoint == null ? 0 : funding_outpoint.ptr);
                GC.KeepAlive(to_holder_value_sat);
                GC.KeepAlive(to_counterparty_value_sat);
                GC.KeepAlive(to_holder_script);
                GC.KeepAlive(to_counterparty_script);
                GC.KeepAlive(funding_outpoint);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -291,10 +330,12 @@ public class UtilMethods {
         * from the base secret and the per_commitment_point.
         */
        public static byte[] derive_private_key(byte[] per_commitment_point, byte[] base_secret) {
-               byte[] ret = bindings.derive_private_key(InternalUtils.check_arr_len(per_commitment_point, 33), InternalUtils.check_arr_len(base_secret, 32));
+               long ret = bindings.derive_private_key(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_point, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(base_secret, 32)));
                GC.KeepAlive(per_commitment_point);
                GC.KeepAlive(base_secret);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -303,10 +344,12 @@ public class UtilMethods {
         * 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) {
-               byte[] ret = bindings.derive_public_key(InternalUtils.check_arr_len(per_commitment_point, 33), InternalUtils.check_arr_len(base_point, 33));
+               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);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -318,10 +361,12 @@ public class UtilMethods {
         * of the transaction spending with this key knowledge.
         */
        public static byte[] derive_private_revocation_key(byte[] per_commitment_secret, byte[] countersignatory_revocation_base_secret) {
-               byte[] ret = bindings.derive_private_revocation_key(InternalUtils.check_arr_len(per_commitment_secret, 32), InternalUtils.check_arr_len(countersignatory_revocation_base_secret, 32));
+               long ret = bindings.derive_private_revocation_key(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_secret, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(countersignatory_revocation_base_secret, 32)));
                GC.KeepAlive(per_commitment_secret);
                GC.KeepAlive(countersignatory_revocation_base_secret);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -338,10 +383,12 @@ public class UtilMethods {
         * generated (ie our own).
         */
        public static byte[] derive_public_revocation_key(byte[] per_commitment_point, byte[] countersignatory_revocation_base_point) {
-               byte[] ret = bindings.derive_public_revocation_key(InternalUtils.check_arr_len(per_commitment_point, 33), InternalUtils.check_arr_len(countersignatory_revocation_base_point, 33));
+               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);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -350,11 +397,26 @@ public class UtilMethods {
         * 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) {
-               byte[] ret = bindings.get_revokeable_redeemscript(InternalUtils.check_arr_len(revocation_key, 33), contest_delay, InternalUtils.check_arr_len(broadcaster_delayed_payment_key, 33));
+               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)));
                GC.KeepAlive(revocation_key);
                GC.KeepAlive(contest_delay);
                GC.KeepAlive(broadcaster_delayed_payment_key);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Returns the script for the counterparty's output on a holder's commitment transaction based on
+        * the channel type.
+        */
+       public static byte[] get_counterparty_payment_script(org.ldk.structs.ChannelTypeFeatures channel_type_features, byte[] payment_key) {
+               long ret = bindings.get_counterparty_payment_script(channel_type_features == null ? 0 : channel_type_features.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_key, 33)));
+               GC.KeepAlive(channel_type_features);
+               GC.KeepAlive(payment_key);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -362,11 +424,13 @@ public class UtilMethods {
         * does not need to have its previous_output_index filled.
         */
        public static byte[] get_htlc_redeemscript(org.ldk.structs.HTLCOutputInCommitment htlc, org.ldk.structs.ChannelTypeFeatures channel_type_features, org.ldk.structs.TxCreationKeys keys) {
-               byte[] ret = bindings.get_htlc_redeemscript(htlc == null ? 0 : htlc.ptr, channel_type_features == null ? 0 : channel_type_features.ptr, keys == null ? 0 : keys.ptr);
+               long ret = bindings.get_htlc_redeemscript(htlc == null ? 0 : htlc.ptr, channel_type_features == null ? 0 : channel_type_features.ptr, keys == null ? 0 : keys.ptr);
                GC.KeepAlive(htlc);
                GC.KeepAlive(channel_type_features);
                GC.KeepAlive(keys);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -374,10 +438,12 @@ public class UtilMethods {
         * Note that the order of funding public keys does not matter.
         */
        public static byte[] make_funding_redeemscript(byte[] broadcaster, byte[] countersignatory) {
-               byte[] ret = bindings.make_funding_redeemscript(InternalUtils.check_arr_len(broadcaster, 33), InternalUtils.check_arr_len(countersignatory, 33));
+               long ret = bindings.make_funding_redeemscript(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(broadcaster, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(countersignatory, 33)));
                GC.KeepAlive(broadcaster);
                GC.KeepAlive(countersignatory);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -390,7 +456,7 @@ public class UtilMethods {
         * 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) {
-               byte[] ret = bindings.build_htlc_transaction(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.check_arr_len(broadcaster_delayed_payment_key, 33), InternalUtils.check_arr_len(revocation_key, 33));
+               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)));
                GC.KeepAlive(commitment_txid);
                GC.KeepAlive(feerate_per_kw);
                GC.KeepAlive(contest_delay);
@@ -398,29 +464,35 @@ public class UtilMethods {
                GC.KeepAlive(channel_type_features);
                GC.KeepAlive(broadcaster_delayed_payment_key);
                GC.KeepAlive(revocation_key);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Returns the witness required to satisfy and spend a HTLC input.
         */
-       public static byte[] build_htlc_input_witness(byte[] local_sig, byte[] remote_sig, org.ldk.structs.Option_PaymentPreimageZ preimage, byte[] redeem_script, org.ldk.structs.ChannelTypeFeatures channel_type_features) {
-               byte[] ret = bindings.build_htlc_input_witness(InternalUtils.check_arr_len(local_sig, 64), InternalUtils.check_arr_len(remote_sig, 64), preimage.ptr, redeem_script, channel_type_features == null ? 0 : channel_type_features.ptr);
+       public static byte[] build_htlc_input_witness(byte[] local_sig, byte[] remote_sig, org.ldk.structs.Option_ThirtyTwoBytesZ preimage, byte[] redeem_script, org.ldk.structs.ChannelTypeFeatures channel_type_features) {
+               long ret = bindings.build_htlc_input_witness(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(local_sig, 64)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(remote_sig, 64)), preimage.ptr, InternalUtils.encodeUint8Array(redeem_script), channel_type_features == null ? 0 : channel_type_features.ptr);
                GC.KeepAlive(local_sig);
                GC.KeepAlive(remote_sig);
                GC.KeepAlive(preimage);
                GC.KeepAlive(redeem_script);
                GC.KeepAlive(channel_type_features);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Gets the witnessScript for the to_remote output when anchors are enabled.
         */
        public static byte[] get_to_countersignatory_with_anchors_redeemscript(byte[] payment_point) {
-               byte[] ret = bindings.get_to_countersignatory_with_anchors_redeemscript(InternalUtils.check_arr_len(payment_point, 33));
+               long ret = bindings.get_to_countersignatory_with_anchors_redeemscript(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_point, 33)));
                GC.KeepAlive(payment_point);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -432,19 +504,23 @@ public class UtilMethods {
         * (empty vector required to satisfy compliance with MINIMALIF-standard rule)
         */
        public static byte[] get_anchor_redeemscript(byte[] funding_pubkey) {
-               byte[] ret = bindings.get_anchor_redeemscript(InternalUtils.check_arr_len(funding_pubkey, 33));
+               long ret = bindings.get_anchor_redeemscript(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(funding_pubkey, 33)));
                GC.KeepAlive(funding_pubkey);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Returns the witness required to satisfy and spend an anchor input.
         */
        public static byte[] build_anchor_input_witness(byte[] funding_key, byte[] funding_sig) {
-               byte[] ret = bindings.build_anchor_input_witness(InternalUtils.check_arr_len(funding_key, 33), InternalUtils.check_arr_len(funding_sig, 64));
+               long ret = bindings.build_anchor_input_witness(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(funding_key, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(funding_sig, 64)));
                GC.KeepAlive(funding_key);
                GC.KeepAlive(funding_sig);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -456,7 +532,7 @@ public class UtilMethods {
         * \"decrypt\" the commitment transaction number given a commitment transaction on-chain.
         */
        public static long get_commitment_transaction_number_obscure_factor(byte[] broadcaster_payment_basepoint, byte[] countersignatory_payment_basepoint, bool outbound_from_broadcaster) {
-               long ret = bindings.get_commitment_transaction_number_obscure_factor(InternalUtils.check_arr_len(broadcaster_payment_basepoint, 33), InternalUtils.check_arr_len(countersignatory_payment_basepoint, 33), outbound_from_broadcaster);
+               long ret = bindings.get_commitment_transaction_number_obscure_factor(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(broadcaster_payment_basepoint, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(countersignatory_payment_basepoint, 33)), outbound_from_broadcaster);
                GC.KeepAlive(broadcaster_payment_basepoint);
                GC.KeepAlive(countersignatory_payment_basepoint);
                GC.KeepAlive(outbound_from_broadcaster);
@@ -467,7 +543,7 @@ public class UtilMethods {
         * Read a NetworkUpdate from a byte array, created by NetworkUpdate_write
         */
        public static Result_COption_NetworkUpdateZDecodeErrorZ NetworkUpdate_read(byte[] ser) {
-               long ret = bindings.NetworkUpdate_read(ser);
+               long ret = bindings.NetworkUpdate_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_COption_NetworkUpdateZDecodeErrorZ ret_hu_conv = Result_COption_NetworkUpdateZDecodeErrorZ.constr_from_ptr(ret);
@@ -531,8 +607,8 @@ public class UtilMethods {
         * 
         * Note that first_hops (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
-       public static Result_RouteLightningErrorZ find_route(byte[] our_node_pubkey, org.ldk.structs.RouteParameters route_params, org.ldk.structs.NetworkGraph network_graph, ChannelDetails[] first_hops, org.ldk.structs.Logger logger, org.ldk.structs.Score scorer, org.ldk.structs.ProbabilisticScoringFeeParameters score_params, byte[] random_seed_bytes) {
-               long ret = bindings.find_route(InternalUtils.check_arr_len(our_node_pubkey, 33), route_params == null ? 0 : route_params.ptr, network_graph == null ? 0 : network_graph.ptr, first_hops != null ? InternalUtils.mapArray(first_hops, first_hops_conv_16 => first_hops_conv_16 == null ? 0 : first_hops_conv_16.ptr) : null, logger.ptr, scorer.ptr, score_params == null ? 0 : score_params.ptr, InternalUtils.check_arr_len(random_seed_bytes, 32));
+       public static Result_RouteLightningErrorZ find_route(byte[] our_node_pubkey, org.ldk.structs.RouteParameters route_params, org.ldk.structs.NetworkGraph network_graph, ChannelDetails[] first_hops, org.ldk.structs.Logger logger, org.ldk.structs.ScoreLookUp scorer, org.ldk.structs.ProbabilisticScoringFeeParameters score_params, byte[] random_seed_bytes) {
+               long ret = bindings.find_route(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(our_node_pubkey, 33)), route_params == null ? 0 : route_params.ptr, network_graph == null ? 0 : network_graph.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(first_hops, first_hops_conv_16 => first_hops_conv_16 == null ? 0 : first_hops_conv_16.ptr)), logger.ptr, scorer.ptr, score_params == null ? 0 : score_params.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(random_seed_bytes, 32)));
                GC.KeepAlive(our_node_pubkey);
                GC.KeepAlive(route_params);
                GC.KeepAlive(network_graph);
@@ -559,7 +635,7 @@ public class UtilMethods {
         * Re-uses logic from `find_route`, so the restrictions described there also apply here.
         */
        public static Result_RouteLightningErrorZ build_route_from_hops(byte[] our_node_pubkey, byte[][] hops, org.ldk.structs.RouteParameters route_params, org.ldk.structs.NetworkGraph network_graph, org.ldk.structs.Logger logger, byte[] random_seed_bytes) {
-               long ret = bindings.build_route_from_hops(InternalUtils.check_arr_len(our_node_pubkey, 33), hops != null ? InternalUtils.mapArray(hops, hops_conv_8 => InternalUtils.check_arr_len(hops_conv_8, 33)) : null, route_params == null ? 0 : route_params.ptr, network_graph == null ? 0 : network_graph.ptr, logger.ptr, InternalUtils.check_arr_len(random_seed_bytes, 32));
+               long ret = bindings.build_route_from_hops(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(our_node_pubkey, 33)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(hops, hops_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(hops_conv_8, 33)))), route_params == null ? 0 : route_params.ptr, network_graph == null ? 0 : network_graph.ptr, logger.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(random_seed_bytes, 32)));
                GC.KeepAlive(our_node_pubkey);
                GC.KeepAlive(hops);
                GC.KeepAlive(route_params);
@@ -592,20 +668,66 @@ public class UtilMethods {
         * 
         * We do not enforce that outputs meet the dust limit or that any output scripts are standard.
         */
-       public static Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ SpendableOutputDescriptor_create_spendable_outputs_psbt(SpendableOutputDescriptor[] descriptors, TxOut[] outputs, byte[] change_destination_script, int feerate_sat_per_1000_weight, org.ldk.structs.Option_PackedLockTimeZ locktime) {
-               long ret = bindings.SpendableOutputDescriptor_create_spendable_outputs_psbt(descriptors != null ? InternalUtils.mapArray(descriptors, descriptors_conv_27 => descriptors_conv_27.ptr) : null, outputs != null ? InternalUtils.mapArray(outputs, outputs_conv_7 => outputs_conv_7.ptr) : null, change_destination_script, feerate_sat_per_1000_weight, locktime.ptr);
+       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) {
+               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);
                GC.KeepAlive(change_destination_script);
                GC.KeepAlive(feerate_sat_per_1000_weight);
                GC.KeepAlive(locktime);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ ret_hu_conv = Result_C2Tuple_PartiallySignedTransactionusizeZNoneZ.constr_from_ptr(ret);
+               Result_C2Tuple_CVec_u8ZusizeZNoneZ ret_hu_conv = Result_C2Tuple_CVec_u8ZusizeZNoneZ.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;
        }
 
+       /**
+        * 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.
+        * 
+        * 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) {
+               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);
+               GC.KeepAlive(path);
+               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);
+               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); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(contents); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(reply_path); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Decode one layer of an incoming [`OnionMessage`].
+        * 
+        * Returns either the next layer of the onion for forwarding or the decrypted content for the
+        * receiver.
+        */
+       public static Result_PeeledOnionNoneZ peel_onion_message(org.ldk.structs.OnionMessage msg, org.ldk.structs.NodeSigner node_signer, org.ldk.structs.Logger logger, org.ldk.structs.CustomOnionMessageHandler custom_handler) {
+               long ret = bindings.peel_onion_message(msg == null ? 0 : msg.ptr, node_signer.ptr, logger.ptr, custom_handler.ptr);
+               GC.KeepAlive(msg);
+               GC.KeepAlive(node_signer);
+               GC.KeepAlive(logger);
+               GC.KeepAlive(custom_handler);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PeeledOnionNoneZ ret_hu_conv = Result_PeeledOnionNoneZ.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); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(custom_handler); };
+               return ret_hu_conv;
+       }
+
        /**
         * Returns whether `tlv_type` corresponds to a TLV record for Offers.
         */
@@ -615,11 +737,26 @@ public class UtilMethods {
                return ret;
        }
 
+       /**
+        * Create a one-hop blinded path for a payment.
+        */
+       public static Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ BlindedPath_one_hop_for_payment(byte[] payee_node_id, org.ldk.structs.ReceiveTlvs payee_tlvs, org.ldk.structs.EntropySource entropy_source) {
+               long ret = bindings.BlindedPath_one_hop_for_payment(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payee_node_id, 33)), payee_tlvs == null ? 0 : payee_tlvs.ptr, entropy_source.ptr);
+               GC.KeepAlive(payee_node_id);
+               GC.KeepAlive(payee_tlvs);
+               GC.KeepAlive(entropy_source);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ ret_hu_conv = Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ.constr_from_ptr(ret);
+               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
         */
        public static Result_COption_PathFailureZDecodeErrorZ PathFailure_read(byte[] ser) {
-               long ret = bindings.PathFailure_read(ser);
+               long ret = bindings.PathFailure_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_COption_PathFailureZDecodeErrorZ ret_hu_conv = Result_COption_PathFailureZDecodeErrorZ.constr_from_ptr(ret);
@@ -630,7 +767,7 @@ public class UtilMethods {
         * Read a ClosureReason from a byte array, created by ClosureReason_write
         */
        public static Result_COption_ClosureReasonZDecodeErrorZ ClosureReason_read(byte[] ser) {
-               long ret = bindings.ClosureReason_read(ser);
+               long ret = bindings.ClosureReason_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_COption_ClosureReasonZDecodeErrorZ ret_hu_conv = Result_COption_ClosureReasonZDecodeErrorZ.constr_from_ptr(ret);
@@ -641,7 +778,7 @@ public class UtilMethods {
         * Read a HTLCDestination from a byte array, created by HTLCDestination_write
         */
        public static Result_COption_HTLCDestinationZDecodeErrorZ HTLCDestination_read(byte[] ser) {
-               long ret = bindings.HTLCDestination_read(ser);
+               long ret = bindings.HTLCDestination_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_COption_HTLCDestinationZDecodeErrorZ ret_hu_conv = Result_COption_HTLCDestinationZDecodeErrorZ.constr_from_ptr(ret);
@@ -652,7 +789,7 @@ public class UtilMethods {
         * Read a Event from a byte array, created by Event_write
         */
        public static Result_COption_EventZDecodeErrorZ Event_read(byte[] ser) {
-               long ret = bindings.Event_read(ser);
+               long ret = bindings.Event_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_COption_EventZDecodeErrorZ ret_hu_conv = Result_COption_EventZDecodeErrorZ.constr_from_ptr(ret);
@@ -668,13 +805,13 @@ public class UtilMethods {
         * 
         * If you wish to use a different payment idempotency token, see [`pay_invoice_with_id`].
         */
-       public static Result_PaymentIdPaymentErrorZ pay_invoice(org.ldk.structs.Bolt11Invoice invoice, org.ldk.structs.Retry retry_strategy, org.ldk.structs.ChannelManager channelmanager) {
+       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_PaymentIdPaymentErrorZ ret_hu_conv = Result_PaymentIdPaymentErrorZ.constr_from_ptr(ret);
+               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); };
@@ -694,7 +831,7 @@ public class UtilMethods {
         * See [`pay_invoice`] for a variant which uses the [`PaymentHash`] for the idempotency token.
         */
        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.check_arr_len(payment_id, 32), retry_strategy.ptr, channelmanager == null ? 0 : channelmanager.ptr);
+               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);
                GC.KeepAlive(invoice);
                GC.KeepAlive(payment_id);
                GC.KeepAlive(retry_strategy);
@@ -718,14 +855,14 @@ public class UtilMethods {
         * If you wish to use a different payment idempotency token, see
         * [`pay_zero_value_invoice_with_id`].
         */
-       public static Result_PaymentIdPaymentErrorZ pay_zero_value_invoice(org.ldk.structs.Bolt11Invoice invoice, long amount_msats, org.ldk.structs.Retry retry_strategy, org.ldk.structs.ChannelManager channelmanager) {
+       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);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_PaymentIdPaymentErrorZ ret_hu_conv = Result_PaymentIdPaymentErrorZ.constr_from_ptr(ret);
+               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); };
@@ -746,7 +883,7 @@ public class UtilMethods {
         * idempotency token.
         */
        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.check_arr_len(payment_id, 32), retry_strategy.ptr, channelmanager == null ? 0 : channelmanager.ptr);
+               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);
                GC.KeepAlive(invoice);
                GC.KeepAlive(amount_msats);
                GC.KeepAlive(payment_id);
@@ -760,6 +897,44 @@ public class UtilMethods {
                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;
+       }
+
        /**
         * Utility to create an invoice that can be paid to one of multiple nodes, or a \"phantom invoice.\"
         * See [`PhantomKeysManager`] for more information on phantom node payments.
@@ -802,8 +977,8 @@ public class UtilMethods {
         * This can be used in a `no_std` environment, where [`std::time::SystemTime`] is not
         * available and the current time is supplied by the caller.
         */
-       public static Result_Bolt11InvoiceSignOrCreationErrorZ create_phantom_invoice(org.ldk.structs.Option_u64Z amt_msat, org.ldk.structs.Option_PaymentHashZ payment_hash, string description, int invoice_expiry_delta_secs, PhantomRouteHints[] phantom_route_hints, org.ldk.structs.EntropySource entropy_source, org.ldk.structs.NodeSigner node_signer, org.ldk.structs.Logger logger, Currency network, org.ldk.structs.Option_u16Z min_final_cltv_expiry_delta, long duration_since_epoch) {
-               long ret = bindings.create_phantom_invoice(amt_msat.ptr, payment_hash.ptr, description, invoice_expiry_delta_secs, phantom_route_hints != null ? InternalUtils.mapArray(phantom_route_hints, phantom_route_hints_conv_19 => phantom_route_hints_conv_19 == null ? 0 : phantom_route_hints_conv_19.ptr) : null, entropy_source.ptr, node_signer.ptr, logger.ptr, network, min_final_cltv_expiry_delta.ptr, duration_since_epoch);
+       public static Result_Bolt11InvoiceSignOrCreationErrorZ create_phantom_invoice(org.ldk.structs.Option_u64Z amt_msat, org.ldk.structs.Option_ThirtyTwoBytesZ payment_hash, string description, int invoice_expiry_delta_secs, PhantomRouteHints[] phantom_route_hints, org.ldk.structs.EntropySource entropy_source, org.ldk.structs.NodeSigner node_signer, org.ldk.structs.Logger logger, Currency network, org.ldk.structs.Option_u16Z min_final_cltv_expiry_delta, long duration_since_epoch) {
+               long ret = bindings.create_phantom_invoice(amt_msat.ptr, payment_hash.ptr, InternalUtils.encodeString(description), invoice_expiry_delta_secs, InternalUtils.encodeUint64Array(InternalUtils.mapArray(phantom_route_hints, phantom_route_hints_conv_19 => phantom_route_hints_conv_19 == null ? 0 : phantom_route_hints_conv_19.ptr)), entropy_source.ptr, node_signer.ptr, logger.ptr, network, min_final_cltv_expiry_delta.ptr, duration_since_epoch);
                GC.KeepAlive(amt_msat);
                GC.KeepAlive(payment_hash);
                GC.KeepAlive(description);
@@ -867,8 +1042,8 @@ public class UtilMethods {
         * This can be used in a `no_std` environment, where [`std::time::SystemTime`] is not
         * available and the current time is supplied by the caller.
         */
-       public static Result_Bolt11InvoiceSignOrCreationErrorZ create_phantom_invoice_with_description_hash(org.ldk.structs.Option_u64Z amt_msat, org.ldk.structs.Option_PaymentHashZ payment_hash, int invoice_expiry_delta_secs, org.ldk.structs.Sha256 description_hash, PhantomRouteHints[] phantom_route_hints, org.ldk.structs.EntropySource entropy_source, org.ldk.structs.NodeSigner node_signer, org.ldk.structs.Logger logger, Currency network, org.ldk.structs.Option_u16Z min_final_cltv_expiry_delta, long duration_since_epoch) {
-               long ret = bindings.create_phantom_invoice_with_description_hash(amt_msat.ptr, payment_hash.ptr, invoice_expiry_delta_secs, description_hash == null ? 0 : description_hash.ptr, phantom_route_hints != null ? InternalUtils.mapArray(phantom_route_hints, phantom_route_hints_conv_19 => phantom_route_hints_conv_19 == null ? 0 : phantom_route_hints_conv_19.ptr) : null, entropy_source.ptr, node_signer.ptr, logger.ptr, network, min_final_cltv_expiry_delta.ptr, duration_since_epoch);
+       public static Result_Bolt11InvoiceSignOrCreationErrorZ create_phantom_invoice_with_description_hash(org.ldk.structs.Option_u64Z amt_msat, org.ldk.structs.Option_ThirtyTwoBytesZ payment_hash, int invoice_expiry_delta_secs, org.ldk.structs.Sha256 description_hash, PhantomRouteHints[] phantom_route_hints, org.ldk.structs.EntropySource entropy_source, org.ldk.structs.NodeSigner node_signer, org.ldk.structs.Logger logger, Currency network, org.ldk.structs.Option_u16Z min_final_cltv_expiry_delta, long duration_since_epoch) {
+               long ret = bindings.create_phantom_invoice_with_description_hash(amt_msat.ptr, payment_hash.ptr, invoice_expiry_delta_secs, description_hash == null ? 0 : description_hash.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(phantom_route_hints, phantom_route_hints_conv_19 => phantom_route_hints_conv_19 == null ? 0 : phantom_route_hints_conv_19.ptr)), entropy_source.ptr, node_signer.ptr, logger.ptr, network, min_final_cltv_expiry_delta.ptr, duration_since_epoch);
                GC.KeepAlive(amt_msat);
                GC.KeepAlive(payment_hash);
                GC.KeepAlive(invoice_expiry_delta_secs);
@@ -911,7 +1086,7 @@ public class UtilMethods {
         * [`MIN_FINAL_CLTV_EXPIRY_DETLA`]: lightning::ln::channelmanager::MIN_FINAL_CLTV_EXPIRY_DELTA
         */
        public static Result_Bolt11InvoiceSignOrCreationErrorZ create_invoice_from_channelmanager(org.ldk.structs.ChannelManager channelmanager, org.ldk.structs.NodeSigner node_signer, org.ldk.structs.Logger logger, Currency network, org.ldk.structs.Option_u64Z amt_msat, string description, int invoice_expiry_delta_secs, org.ldk.structs.Option_u16Z min_final_cltv_expiry_delta) {
-               long ret = bindings.create_invoice_from_channelmanager(channelmanager == null ? 0 : channelmanager.ptr, node_signer.ptr, logger.ptr, network, amt_msat.ptr, description, invoice_expiry_delta_secs, min_final_cltv_expiry_delta.ptr);
+               long ret = bindings.create_invoice_from_channelmanager(channelmanager == null ? 0 : channelmanager.ptr, node_signer.ptr, logger.ptr, network, amt_msat.ptr, InternalUtils.encodeString(description), invoice_expiry_delta_secs, min_final_cltv_expiry_delta.ptr);
                GC.KeepAlive(channelmanager);
                GC.KeepAlive(node_signer);
                GC.KeepAlive(logger);
@@ -1002,7 +1177,7 @@ public class UtilMethods {
         * available and the current time is supplied by the caller.
         */
        public static Result_Bolt11InvoiceSignOrCreationErrorZ create_invoice_from_channelmanager_and_duration_since_epoch(org.ldk.structs.ChannelManager channelmanager, org.ldk.structs.NodeSigner node_signer, org.ldk.structs.Logger logger, Currency network, org.ldk.structs.Option_u64Z amt_msat, string description, long duration_since_epoch, int invoice_expiry_delta_secs, org.ldk.structs.Option_u16Z min_final_cltv_expiry_delta) {
-               long ret = bindings.create_invoice_from_channelmanager_and_duration_since_epoch(channelmanager == null ? 0 : channelmanager.ptr, node_signer.ptr, logger.ptr, network, amt_msat.ptr, description, duration_since_epoch, invoice_expiry_delta_secs, min_final_cltv_expiry_delta.ptr);
+               long ret = bindings.create_invoice_from_channelmanager_and_duration_since_epoch(channelmanager == null ? 0 : channelmanager.ptr, node_signer.ptr, logger.ptr, network, amt_msat.ptr, InternalUtils.encodeString(description), duration_since_epoch, invoice_expiry_delta_secs, min_final_cltv_expiry_delta.ptr);
                GC.KeepAlive(channelmanager);
                GC.KeepAlive(node_signer);
                GC.KeepAlive(logger);
@@ -1029,7 +1204,7 @@ public class UtilMethods {
         * the payment hash is also involved outside the scope of lightning.
         */
        public static Result_Bolt11InvoiceSignOrCreationErrorZ create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_hash(org.ldk.structs.ChannelManager channelmanager, org.ldk.structs.NodeSigner node_signer, org.ldk.structs.Logger logger, Currency network, org.ldk.structs.Option_u64Z amt_msat, string description, long duration_since_epoch, int invoice_expiry_delta_secs, byte[] payment_hash, org.ldk.structs.Option_u16Z min_final_cltv_expiry_delta) {
-               long ret = bindings.create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_hash(channelmanager == null ? 0 : channelmanager.ptr, node_signer.ptr, logger.ptr, network, amt_msat.ptr, description, duration_since_epoch, invoice_expiry_delta_secs, InternalUtils.check_arr_len(payment_hash, 32), min_final_cltv_expiry_delta.ptr);
+               long ret = bindings.create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_hash(channelmanager == null ? 0 : channelmanager.ptr, node_signer.ptr, logger.ptr, network, amt_msat.ptr, InternalUtils.encodeString(description), duration_since_epoch, invoice_expiry_delta_secs, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash, 32)), min_final_cltv_expiry_delta.ptr);
                GC.KeepAlive(channelmanager);
                GC.KeepAlive(node_signer);
                GC.KeepAlive(logger);
index 8874553c64bcdbe8bdaa28df1323b9978c807112..8c885663adfb620e3d8a788f359e9eca50f7dfb5 100644 (file)
@@ -146,7 +146,7 @@ public class Utxo : CommonBase {
         * Returns a `Utxo` with the `satisfaction_weight` estimate for a legacy P2PKH output.
         */
        public static Utxo new_p2pkh(org.ldk.structs.OutPoint outpoint, long value, byte[] pubkey_hash) {
-               long ret = bindings.Utxo_new_p2pkh(outpoint == null ? 0 : outpoint.ptr, value, InternalUtils.check_arr_len(pubkey_hash, 20));
+               long ret = bindings.Utxo_new_p2pkh(outpoint == null ? 0 : outpoint.ptr, value, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(pubkey_hash, 20)));
                GC.KeepAlive(outpoint);
                GC.KeepAlive(value);
                GC.KeepAlive(pubkey_hash);
index ebb18f7a28cb10a872e777c8861aedd2e0685caf..baa1ac394ce166d70fe2a5f673f9e9b7b30edcd9 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,59 +6,69 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of UtxoLookup */
+public interface UtxoLookupInterface {
+       /**Returns the transaction output of a funding transaction encoded by [`short_channel_id`].
+        * Returns an error if `chain_hash` is for a different chain or if such a transaction output is
+        * unknown.
+        * 
+        * [`short_channel_id`]: https://github.com/lightning/bolts/blob/master/07-routing-gossip.md#definition-of-short_channel_id
+        */
+       UtxoResult get_utxo(byte[] chain_hash, long short_channel_id);
+}
+
 /**
  * The `UtxoLookup` trait defines behavior for accessing on-chain UTXOs.
  */
 public class UtxoLookup : CommonBase {
-       internal readonly bindings.LDKUtxoLookup bindings_instance;
+       internal bindings.LDKUtxoLookup bindings_instance;
+       internal long instance_idx;
+
        internal UtxoLookup(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private UtxoLookup(bindings.LDKUtxoLookup arg) : base(bindings.LDKUtxoLookup_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~UtxoLookup() {
                if (ptr != 0) { bindings.UtxoLookup_free(ptr); }
        }
 
-       public interface UtxoLookupInterface {
-               /**
-                * Returns the transaction output of a funding transaction encoded by [`short_channel_id`].
-                * Returns an error if `genesis_hash` is for a different chain or if such a transaction output
-                * is unknown.
-                * 
-                * [`short_channel_id`]: https://github.com/lightning/bolts/blob/master/07-routing-gossip.md#definition-of-short_channel_id
-                */
-               UtxoResult get_utxo(byte[] _genesis_hash, long _short_channel_id);
-       }
        private class LDKUtxoLookupHolder { internal UtxoLookup held; }
        private class LDKUtxoLookupImpl : bindings.LDKUtxoLookup {
                internal LDKUtxoLookupImpl(UtxoLookupInterface arg, LDKUtxoLookupHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private UtxoLookupInterface arg;
                private LDKUtxoLookupHolder impl_holder;
-               public long get_utxo(byte[] _genesis_hash, long _short_channel_id) {
-                       UtxoResult ret = arg.get_utxo(_genesis_hash, _short_channel_id);
+               public long get_utxo(long _chain_hash, long _short_channel_id) {
+                       byte[] _chain_hash_conv = InternalUtils.decodeUint8Array(_chain_hash);
+                       UtxoResult ret = arg.get_utxo(_chain_hash_conv, _short_channel_id);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        if (impl_holder.held != null) { impl_holder.held.ptrs_to.AddLast(ret); };
                        return result;
                }
        }
+
+       /** Creates a new instance of UtxoLookup from a given implementation */
        public static UtxoLookup new_impl(UtxoLookupInterface arg) {
                LDKUtxoLookupHolder impl_holder = new LDKUtxoLookupHolder();
-               impl_holder.held = new UtxoLookup(new LDKUtxoLookupImpl(arg, impl_holder));
+               LDKUtxoLookupImpl impl = new LDKUtxoLookupImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKUtxoLookup_new(impl);
+
+               impl_holder.held = new UtxoLookup(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Returns the transaction output of a funding transaction encoded by [`short_channel_id`].
-        * Returns an error if `genesis_hash` is for a different chain or if such a transaction output
-        * is unknown.
+        * Returns an error if `chain_hash` is for a different chain or if such a transaction output is
+        * unknown.
         * 
         * [`short_channel_id`]: https://github.com/lightning/bolts/blob/master/07-routing-gossip.md#definition-of-short_channel_id
         */
-       public UtxoResult get_utxo(byte[] genesis_hash, long short_channel_id) {
-               long ret = bindings.UtxoLookup_get_utxo(this.ptr, InternalUtils.check_arr_len(genesis_hash, 32), short_channel_id);
+       public UtxoResult get_utxo(byte[] chain_hash, long short_channel_id) {
+               long ret = bindings.UtxoLookup_get_utxo(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(chain_hash, 32)), short_channel_id);
                GC.KeepAlive(this);
-               GC.KeepAlive(genesis_hash);
+               GC.KeepAlive(chain_hash);
                GC.KeepAlive(short_channel_id);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.UtxoResult ret_hu_conv = org.ldk.structs.UtxoResult.constr_from_ptr(ret);
diff --git a/c_sharp/src/org/ldk/structs/VerifiedInvoiceRequest.cs b/c_sharp/src/org/ldk/structs/VerifiedInvoiceRequest.cs
new file mode 100644 (file)
index 0000000..4269231
--- /dev/null
@@ -0,0 +1,308 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * An [`InvoiceRequest`] that has been verified by [`InvoiceRequest::verify`] and exposes different
+ * ways to respond depending on whether the signing keys were derived.
+ */
+public class VerifiedInvoiceRequest : CommonBase {
+       internal VerifiedInvoiceRequest(object _dummy, long ptr) : base(ptr) { }
+       ~VerifiedInvoiceRequest() {
+               if (ptr != 0) { bindings.VerifiedInvoiceRequest_free(ptr); }
+       }
+
+       /**
+        * Keys used for signing a [`Bolt12Invoice`] if they can be derived.
+        * 
+        * If `Some`, must call [`respond_using_derived_keys`] when responding. Otherwise, call
+        * [`respond_with`].
+        * 
+        * [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
+        * [`respond_using_derived_keys`]: Self::respond_using_derived_keys
+        * [`respond_with`]: Self::respond_with
+        */
+       public Option_SecretKeyZ get_keys() {
+               long ret = bindings.VerifiedInvoiceRequest_get_keys(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_SecretKeyZ ret_hu_conv = org.ldk.structs.Option_SecretKeyZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Keys used for signing a [`Bolt12Invoice`] if they can be derived.
+        * 
+        * If `Some`, must call [`respond_using_derived_keys`] when responding. Otherwise, call
+        * [`respond_with`].
+        * 
+        * [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
+        * [`respond_using_derived_keys`]: Self::respond_using_derived_keys
+        * [`respond_with`]: Self::respond_with
+        */
+       public void set_keys(org.ldk.structs.Option_SecretKeyZ val) {
+               bindings.VerifiedInvoiceRequest_set_keys(this.ptr, val.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.VerifiedInvoiceRequest_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the VerifiedInvoiceRequest
+        */
+       public VerifiedInvoiceRequest clone() {
+               long ret = bindings.VerifiedInvoiceRequest_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.VerifiedInvoiceRequest ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.VerifiedInvoiceRequest(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The chains that may be used when paying a requested invoice (e.g., bitcoin mainnet).
+        * Payments must be denominated in units of the minimal lightning-payable unit (e.g., msats)
+        * for the selected chain.
+        */
+       public byte[][] chains() {
+               long ret = bindings.VerifiedInvoiceRequest_chains(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_8_len = InternalUtils.getArrayLength(ret);
+               byte[][] ret_conv_8_arr = new byte[ret_conv_8_len][];
+               for (int i = 0; i < ret_conv_8_len; i++) {
+                       long ret_conv_8 = InternalUtils.getU64ArrayElem(ret, i);
+                       byte[] ret_conv_8_conv = InternalUtils.decodeUint8Array(ret_conv_8);
+                       ret_conv_8_arr[i] = ret_conv_8_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_8_arr;
+       }
+
+       /**
+        * Opaque bytes set by the originator. Useful for authentication and validating fields since it
+        * is reflected in `invoice_request` messages along with all the other fields from the `offer`.
+        */
+       public Option_CVec_u8ZZ metadata() {
+               long ret = bindings.VerifiedInvoiceRequest_metadata(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_CVec_u8ZZ ret_hu_conv = org.ldk.structs.Option_CVec_u8ZZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The minimum amount required for a successful payment of a single item.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public Amount amount() {
+               long ret = bindings.VerifiedInvoiceRequest_amount(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Amount ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Amount(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * A complete description of the purpose of the payment. Intended to be displayed to the user
+        * but with the caveat that it has not been verified in any way.
+        */
+       public PrintableString description() {
+               long ret = bindings.VerifiedInvoiceRequest_description(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PrintableString ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PrintableString(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Features pertaining to the offer.
+        */
+       public OfferFeatures offer_features() {
+               long ret = bindings.VerifiedInvoiceRequest_offer_features(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.OfferFeatures ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.OfferFeatures(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Duration since the Unix epoch when an invoice should no longer be requested.
+        * 
+        * If `None`, the offer does not expire.
+        */
+       public Option_u64Z absolute_expiry() {
+               long ret = bindings.VerifiedInvoiceRequest_absolute_expiry(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 issuer of the offer, 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.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public PrintableString issuer() {
+               long ret = bindings.VerifiedInvoiceRequest_issuer(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PrintableString ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PrintableString(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Paths to the recipient originating from publicly reachable nodes. Blinded paths provide
+        * recipient privacy by obfuscating its node id.
+        */
+       public BlindedPath[] paths() {
+               long ret = bindings.VerifiedInvoiceRequest_paths(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_13_len = InternalUtils.getArrayLength(ret);
+               BlindedPath[] ret_conv_13_arr = new BlindedPath[ret_conv_13_len];
+               for (int n = 0; n < ret_conv_13_len; n++) {
+                       long ret_conv_13 = InternalUtils.getU64ArrayElem(ret, n);
+                       org.ldk.structs.BlindedPath ret_conv_13_hu_conv = null; if (ret_conv_13 < 0 || ret_conv_13 > 4096) { ret_conv_13_hu_conv = new org.ldk.structs.BlindedPath(null, ret_conv_13); }
+                       if (ret_conv_13_hu_conv != null) { ret_conv_13_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_13_arr[n] = ret_conv_13_hu_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_13_arr;
+       }
+
+       /**
+        * The quantity of items supported.
+        */
+       public Quantity supported_quantity() {
+               long ret = bindings.VerifiedInvoiceRequest_supported_quantity(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Quantity ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Quantity(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The public key used by the recipient to sign invoices.
+        */
+       public byte[] signing_pubkey() {
+               long ret = bindings.VerifiedInvoiceRequest_signing_pubkey(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * An unpredictable series of bytes, typically containing information about the derivation of
+        * [`payer_id`].
+        * 
+        * [`payer_id`]: Self::payer_id
+        */
+       public byte[] payer_metadata() {
+               long ret = bindings.VerifiedInvoiceRequest_payer_metadata(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * A chain from [`Offer::chains`] that the offer is valid for.
+        */
+       public byte[] chain() {
+               long ret = bindings.VerifiedInvoiceRequest_chain(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The amount to pay in msats (i.e., the minimum lightning-payable unit for [`chain`]), which
+        * must be greater than or equal to [`Offer::amount`], converted if necessary.
+        * 
+        * [`chain`]: Self::chain
+        */
+       public Option_u64Z amount_msats() {
+               long ret = bindings.VerifiedInvoiceRequest_amount_msats(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;
+       }
+
+       /**
+        * Features pertaining to requesting an invoice.
+        */
+       public InvoiceRequestFeatures invoice_request_features() {
+               long ret = bindings.VerifiedInvoiceRequest_invoice_request_features(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.InvoiceRequestFeatures ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.InvoiceRequestFeatures(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The quantity of the offer's item conforming to [`Offer::is_valid_quantity`].
+        */
+       public Option_u64Z quantity() {
+               long ret = bindings.VerifiedInvoiceRequest_quantity(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;
+       }
+
+       /**
+        * A possibly transient pubkey used to sign the invoice request.
+        */
+       public byte[] payer_id() {
+               long ret = bindings.VerifiedInvoiceRequest_payer_id(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * A payer-provided note which will be seen by the recipient and reflected back in the invoice
+        * response.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public PrintableString payer_note() {
+               long ret = bindings.VerifiedInvoiceRequest_payer_note(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PrintableString ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PrintableString(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 4c9182825204e4617f29ae522551a7c8a3a99141..7ad196cedc970a34be90eb5301d426ff64dfbba7 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,38 +6,37 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of WalletSource */
+public interface WalletSourceInterface {
+       /**Returns all UTXOs, with at least 1 confirmation each, that are available to spend.
+        */
+       Result_CVec_UtxoZNoneZ list_confirmed_utxos();
+       /**Returns a script to use for change above dust resulting from a successful coin selection
+        * attempt.
+        */
+       Result_CVec_u8ZNoneZ get_change_script();
+       /**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`]).
+        */
+       Result_TransactionNoneZ sign_tx(byte[] tx);
+}
+
 /**
  * An alternative to [`CoinSelectionSource`] that can be implemented and used along [`Wallet`] to
  * provide a default implementation to [`CoinSelectionSource`].
  */
 public class WalletSource : CommonBase {
-       internal readonly bindings.LDKWalletSource bindings_instance;
+       internal bindings.LDKWalletSource bindings_instance;
+       internal long instance_idx;
+
        internal WalletSource(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private WalletSource(bindings.LDKWalletSource arg) : base(bindings.LDKWalletSource_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~WalletSource() {
                if (ptr != 0) { bindings.WalletSource_free(ptr); }
        }
 
-       public interface WalletSourceInterface {
-               /**
-                * Returns all UTXOs, with at least 1 confirmation each, that are available to spend.
-                */
-               Result_CVec_UtxoZNoneZ list_confirmed_utxos();
-               /**
-                * Returns a script to use for change above dust resulting from a successful coin selection
-                * attempt.
-                */
-               Result_ScriptNoneZ get_change_script();
-               /**
-                * 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`]).
-                */
-               Result_TransactionNoneZ sign_tx(byte[] _tx);
-       }
        private class LDKWalletSourceHolder { internal WalletSource held; }
        private class LDKWalletSourceImpl : bindings.LDKWalletSource {
                internal LDKWalletSourceImpl(WalletSourceInterface arg, LDKWalletSourceHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
@@ -49,23 +49,32 @@ public class WalletSource : CommonBase {
                        return result;
                }
                public long get_change_script() {
-                       Result_ScriptNoneZ ret = arg.get_change_script();
+                       Result_CVec_u8ZNoneZ ret = arg.get_change_script();
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long sign_tx(byte[] _tx) {
-                       Result_TransactionNoneZ ret = arg.sign_tx(_tx);
+               public long sign_tx(long _tx) {
+                       byte[] _tx_conv = InternalUtils.decodeUint8Array(_tx);
+                       Result_TransactionNoneZ ret = arg.sign_tx(_tx_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
        }
+
+       /** Creates a new instance of WalletSource from a given implementation */
        public static WalletSource new_impl(WalletSourceInterface arg) {
                LDKWalletSourceHolder impl_holder = new LDKWalletSourceHolder();
-               impl_holder.held = new WalletSource(new LDKWalletSourceImpl(arg, impl_holder));
+               LDKWalletSourceImpl impl = new LDKWalletSourceImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKWalletSource_new(impl);
+
+               impl_holder.held = new WalletSource(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Returns all UTXOs, with at least 1 confirmation each, that are available to spend.
         */
@@ -81,11 +90,11 @@ public class WalletSource : CommonBase {
         * Returns a script to use for change above dust resulting from a successful coin selection
         * attempt.
         */
-       public Result_ScriptNoneZ get_change_script() {
+       public Result_CVec_u8ZNoneZ get_change_script() {
                long ret = bindings.WalletSource_get_change_script(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_ScriptNoneZ ret_hu_conv = Result_ScriptNoneZ.constr_from_ptr(ret);
+               Result_CVec_u8ZNoneZ ret_hu_conv = Result_CVec_u8ZNoneZ.constr_from_ptr(ret);
                return ret_hu_conv;
        }
 
@@ -95,7 +104,7 @@ public class WalletSource : CommonBase {
         * [`WalletSource::list_confirmed_utxos`]).
         */
        public Result_TransactionNoneZ sign_tx(byte[] tx) {
-               long ret = bindings.WalletSource_sign_tx(this.ptr, tx);
+               long ret = bindings.WalletSource_sign_tx(this.ptr, InternalUtils.encodeUint8Array(tx));
                GC.KeepAlive(this);
                GC.KeepAlive(tx);
                if (ret >= 0 && ret <= 4096) { return null; }
index 955d60b1ba5a756346ef1fb89d37b58453b1e42c..b9b7b52ffd2dde10deef35460e0302ccfaeb8cf0 100644 (file)
@@ -23,9 +23,11 @@ public class WarningMessage : CommonBase {
         * All-0s indicates a warning unrelated to a specific channel.
         */
        public byte[] get_channel_id() {
-               byte[] ret = bindings.WarningMessage_get_channel_id(this.ptr);
+               long ret = bindings.WarningMessage_get_channel_id(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
@@ -34,7 +36,7 @@ public class WarningMessage : CommonBase {
         * All-0s indicates a warning unrelated to a specific channel.
         */
        public void set_channel_id(byte[] val) {
-               bindings.WarningMessage_set_channel_id(this.ptr, InternalUtils.check_arr_len(val, 32));
+               bindings.WarningMessage_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -47,9 +49,11 @@ public class WarningMessage : CommonBase {
         * the terminal emulator or the logging subsystem.
         */
        public string get_data() {
-               string ret = bindings.WarningMessage_get_data(this.ptr);
+               long ret = bindings.WarningMessage_get_data(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
        }
 
        /**
@@ -60,7 +64,7 @@ public class WarningMessage : CommonBase {
         * the terminal emulator or the logging subsystem.
         */
        public void set_data(string val) {
-               bindings.WarningMessage_set_data(this.ptr, val);
+               bindings.WarningMessage_set_data(this.ptr, InternalUtils.encodeString(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -69,7 +73,7 @@ public class WarningMessage : CommonBase {
         * Constructs a new WarningMessage given each field
         */
        public static WarningMessage of(byte[] channel_id_arg, string data_arg) {
-               long ret = bindings.WarningMessage_new(InternalUtils.check_arr_len(channel_id_arg, 32), data_arg);
+               long ret = bindings.WarningMessage_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), InternalUtils.encodeString(data_arg));
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(data_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -117,16 +121,18 @@ public class WarningMessage : CommonBase {
         * Serialize the WarningMessage object into a byte array which can be read by WarningMessage_read
         */
        public byte[] write() {
-               byte[] ret = bindings.WarningMessage_write(this.ptr);
+               long ret = bindings.WarningMessage_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Read a WarningMessage from a byte array, created by WarningMessage_write
         */
        public static Result_WarningMessageDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.WarningMessage_read(ser);
+               long ret = bindings.WarningMessage_read(InternalUtils.encodeUint8Array(ser));
                GC.KeepAlive(ser);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_WarningMessageDecodeErrorZ ret_hu_conv = Result_WarningMessageDecodeErrorZ.constr_from_ptr(ret);
index 4fc936e0cc517fc7b7b6ca148ab3943d95523e17..95bf7129538f884abeb5f45e05d2f277bb6bfbf3 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,89 +6,92 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of Watch */
+public interface WatchInterface {
+       /**Watches a channel identified by `funding_txo` using `monitor`.
+        * 
+        * Implementations are responsible for watching the chain for the funding transaction along
+        * with any spends of outputs returned by [`get_outputs_to_watch`]. In practice, this means
+        * calling [`block_connected`] and [`block_disconnected`] on the monitor.
+        * 
+        * A return of `Err(())` indicates that the channel should immediately be force-closed without
+        * broadcasting the funding transaction.
+        * 
+        * If the given `funding_txo` has previously been registered via `watch_channel`, `Err(())`
+        * must be returned.
+        * 
+        * [`get_outputs_to_watch`]: channelmonitor::ChannelMonitor::get_outputs_to_watch
+        * [`block_connected`]: channelmonitor::ChannelMonitor::block_connected
+        * [`block_disconnected`]: channelmonitor::ChannelMonitor::block_disconnected
+        */
+       Result_ChannelMonitorUpdateStatusNoneZ watch_channel(OutPoint funding_txo, ChannelMonitor monitor);
+       /**Updates a channel identified by `funding_txo` by applying `update` to its monitor.
+        * 
+        * Implementations must call [`ChannelMonitor::update_monitor`] with the given update. This
+        * may fail (returning an `Err(())`), in which case this should return
+        * [`ChannelMonitorUpdateStatus::InProgress`] (and the update should never complete). This
+        * generally implies the channel has been closed (either by the funding outpoint being spent
+        * on-chain or the [`ChannelMonitor`] having decided to do so and broadcasted a transaction),
+        * and the [`ChannelManager`] state will be updated once it sees the funding spend on-chain.
+        * 
+        * In general, persistence failures should be retried after returning
+        * [`ChannelMonitorUpdateStatus::InProgress`] and eventually complete. If a failure truly
+        * cannot be retried, the node should shut down immediately after returning
+        * [`ChannelMonitorUpdateStatus::UnrecoverableError`], see its documentation for more info.
+        * 
+        * [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
+        */
+       ChannelMonitorUpdateStatus update_channel(OutPoint funding_txo, ChannelMonitorUpdate update);
+       /**Returns any monitor events since the last call. Subsequent calls must only return new
+        * events.
+        * 
+        * Note that after any block- or transaction-connection calls to a [`ChannelMonitor`], no
+        * further events may be returned here until the [`ChannelMonitor`] has been fully persisted
+        * to disk.
+        * 
+        * For details on asynchronous [`ChannelMonitor`] updating and returning
+        * [`MonitorEvent::Completed`] here, see [`ChannelMonitorUpdateStatus::InProgress`].
+        */
+       ThreeTuple_OutPointCVec_MonitorEventZPublicKeyZ[] release_pending_monitor_events();
+}
+
 /**
  * The `Watch` trait defines behavior for watching on-chain activity pertaining to channels as
  * blocks are connected and disconnected.
  * 
  * Each channel is associated with a [`ChannelMonitor`]. Implementations of this trait are
- * responsible for maintaining a set of monitors such that they can be updated accordingly as
- * channel state changes and HTLCs are resolved. See method documentation for specific
- * requirements.
- * 
- * Implementations **must** ensure that updates are successfully applied and persisted upon method
- * completion. If an update fails with a [`PermanentFailure`], then it must immediately shut down
- * without taking any further action such as persisting the current state.
+ * responsible for maintaining a set of monitors such that they can be updated as channel state
+ * changes. On each update, *all copies* of a [`ChannelMonitor`] must be updated and the update
+ * persisted to disk to ensure that the latest [`ChannelMonitor`] state can be reloaded if the
+ * application crashes.
  * 
- * If an implementation maintains multiple instances of a channel's monitor (e.g., by storing
- * backup copies), then it must ensure that updates are applied across all instances. Otherwise, it
- * could result in a revoked transaction being broadcast, allowing the counterparty to claim all
- * funds in the channel. See [`ChannelMonitorUpdateStatus`] for more details about how to handle
- * multiple instances.
- * 
- * [`PermanentFailure`]: ChannelMonitorUpdateStatus::PermanentFailure
+ * See method documentation and [`ChannelMonitorUpdateStatus`] for specific requirements.
  */
 public class Watch : CommonBase {
-       internal readonly bindings.LDKWatch bindings_instance;
+       internal bindings.LDKWatch bindings_instance;
+       internal long instance_idx;
+
        internal Watch(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private Watch(bindings.LDKWatch arg) : base(bindings.LDKWatch_new(arg)) {
-               this.ptrs_to.AddLast(arg);
-               this.bindings_instance = arg;
-       }
        ~Watch() {
                if (ptr != 0) { bindings.Watch_free(ptr); }
        }
 
-       public interface WatchInterface {
-               /**
-                * Watches a channel identified by `funding_txo` using `monitor`.
-                * 
-                * Implementations are responsible for watching the chain for the funding transaction along
-                * with any spends of outputs returned by [`get_outputs_to_watch`]. In practice, this means
-                * calling [`block_connected`] and [`block_disconnected`] on the monitor.
-                * 
-                * Note: this interface MUST error with [`ChannelMonitorUpdateStatus::PermanentFailure`] if
-                * the given `funding_txo` has previously been registered via `watch_channel`.
-                * 
-                * [`get_outputs_to_watch`]: channelmonitor::ChannelMonitor::get_outputs_to_watch
-                * [`block_connected`]: channelmonitor::ChannelMonitor::block_connected
-                * [`block_disconnected`]: channelmonitor::ChannelMonitor::block_disconnected
-                */
-               ChannelMonitorUpdateStatus watch_channel(OutPoint _funding_txo, ChannelMonitor _monitor);
-               /**
-                * Updates a channel identified by `funding_txo` by applying `update` to its monitor.
-                * 
-                * Implementations must call [`update_monitor`] with the given update. See
-                * [`ChannelMonitorUpdateStatus`] for invariants around returning an error.
-                * 
-                * [`update_monitor`]: channelmonitor::ChannelMonitor::update_monitor
-                */
-               ChannelMonitorUpdateStatus update_channel(OutPoint _funding_txo, ChannelMonitorUpdate _update);
-               /**
-                * Returns any monitor events since the last call. Subsequent calls must only return new
-                * events.
-                * 
-                * Note that after any block- or transaction-connection calls to a [`ChannelMonitor`], no
-                * further events may be returned here until the [`ChannelMonitor`] has been fully persisted
-                * to disk.
-                * 
-                * For details on asynchronous [`ChannelMonitor`] updating and returning
-                * [`MonitorEvent::Completed`] here, see [`ChannelMonitorUpdateStatus::InProgress`].
-                */
-               ThreeTuple_OutPointCVec_MonitorEventZPublicKeyZ[] release_pending_monitor_events();
-       }
        private class LDKWatchHolder { internal Watch held; }
        private class LDKWatchImpl : bindings.LDKWatch {
                internal LDKWatchImpl(WatchInterface arg, LDKWatchHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private WatchInterface arg;
                private LDKWatchHolder impl_holder;
-               public ChannelMonitorUpdateStatus watch_channel(long _funding_txo, long _monitor) {
+               public long watch_channel(long _funding_txo, long _monitor) {
                        org.ldk.structs.OutPoint _funding_txo_hu_conv = null; if (_funding_txo < 0 || _funding_txo > 4096) { _funding_txo_hu_conv = new org.ldk.structs.OutPoint(null, _funding_txo); }
                        if (_funding_txo_hu_conv != null) { _funding_txo_hu_conv.ptrs_to.AddLast(this); };
                        org.ldk.structs.ChannelMonitor _monitor_hu_conv = null; if (_monitor < 0 || _monitor > 4096) { _monitor_hu_conv = new org.ldk.structs.ChannelMonitor(null, _monitor); }
                        if (_monitor_hu_conv != null) { _monitor_hu_conv.ptrs_to.AddLast(this); };
-                       ChannelMonitorUpdateStatus ret = arg.watch_channel(_funding_txo_hu_conv, _monitor_hu_conv);
+                       Result_ChannelMonitorUpdateStatusNoneZ ret = arg.watch_channel(_funding_txo_hu_conv, _monitor_hu_conv);
                                GC.KeepAlive(arg);
-                       return ret;
+                       long result = ret == null ? 0 : ret.clone_ptr();
+                       return result;
                }
                public ChannelMonitorUpdateStatus update_channel(long _funding_txo, long _update) {
                        org.ldk.structs.OutPoint _funding_txo_hu_conv = null; if (_funding_txo < 0 || _funding_txo > 4096) { _funding_txo_hu_conv = new org.ldk.structs.OutPoint(null, _funding_txo); }
@@ -97,18 +101,26 @@ public class Watch : CommonBase {
                                GC.KeepAlive(arg);
                        return ret;
                }
-               public long[] release_pending_monitor_events() {
+               public long release_pending_monitor_events() {
                        ThreeTuple_OutPointCVec_MonitorEventZPublicKeyZ[] ret = arg.release_pending_monitor_events();
                                GC.KeepAlive(arg);
-                       long[] result = ret != null ? InternalUtils.mapArray(ret, ret_conv_49 => ret_conv_49 == null ? 0 : ret_conv_49.clone_ptr()) : null;
+                       long result = InternalUtils.encodeUint64Array(InternalUtils.mapArray(ret, ret_conv_49 => ret_conv_49 == null ? 0 : ret_conv_49.clone_ptr()));
                        return result;
                }
        }
+
+       /** Creates a new instance of Watch from a given implementation */
        public static Watch new_impl(WatchInterface arg) {
                LDKWatchHolder impl_holder = new LDKWatchHolder();
-               impl_holder.held = new Watch(new LDKWatchImpl(arg, impl_holder));
+               LDKWatchImpl impl = new LDKWatchImpl(arg, impl_holder);
+               long[] ptr_idx = bindings.LDKWatch_new(impl);
+
+               impl_holder.held = new Watch(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
                return impl_holder.held;
        }
+
        /**
         * Watches a channel identified by `funding_txo` using `monitor`.
         * 
@@ -116,30 +128,44 @@ public class Watch : CommonBase {
         * with any spends of outputs returned by [`get_outputs_to_watch`]. In practice, this means
         * calling [`block_connected`] and [`block_disconnected`] on the monitor.
         * 
-        * Note: this interface MUST error with [`ChannelMonitorUpdateStatus::PermanentFailure`] if
-        * the given `funding_txo` has previously been registered via `watch_channel`.
+        * A return of `Err(())` indicates that the channel should immediately be force-closed without
+        * broadcasting the funding transaction.
+        * 
+        * If the given `funding_txo` has previously been registered via `watch_channel`, `Err(())`
+        * must be returned.
         * 
         * [`get_outputs_to_watch`]: channelmonitor::ChannelMonitor::get_outputs_to_watch
         * [`block_connected`]: channelmonitor::ChannelMonitor::block_connected
         * [`block_disconnected`]: channelmonitor::ChannelMonitor::block_disconnected
         */
-       public ChannelMonitorUpdateStatus watch_channel(org.ldk.structs.OutPoint funding_txo, org.ldk.structs.ChannelMonitor monitor) {
-               ChannelMonitorUpdateStatus ret = bindings.Watch_watch_channel(this.ptr, funding_txo == null ? 0 : funding_txo.ptr, monitor == null ? 0 : monitor.ptr);
+       public Result_ChannelMonitorUpdateStatusNoneZ watch_channel(org.ldk.structs.OutPoint funding_txo, org.ldk.structs.ChannelMonitor monitor) {
+               long ret = bindings.Watch_watch_channel(this.ptr, funding_txo == null ? 0 : funding_txo.ptr, monitor == null ? 0 : monitor.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(funding_txo);
                GC.KeepAlive(monitor);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_ChannelMonitorUpdateStatusNoneZ ret_hu_conv = Result_ChannelMonitorUpdateStatusNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(funding_txo); };
                if (this != null) { this.ptrs_to.AddLast(monitor); };
-               return ret;
+               return ret_hu_conv;
        }
 
        /**
         * Updates a channel identified by `funding_txo` by applying `update` to its monitor.
         * 
-        * Implementations must call [`update_monitor`] with the given update. See
-        * [`ChannelMonitorUpdateStatus`] for invariants around returning an error.
+        * Implementations must call [`ChannelMonitor::update_monitor`] with the given update. This
+        * may fail (returning an `Err(())`), in which case this should return
+        * [`ChannelMonitorUpdateStatus::InProgress`] (and the update should never complete). This
+        * generally implies the channel has been closed (either by the funding outpoint being spent
+        * on-chain or the [`ChannelMonitor`] having decided to do so and broadcasted a transaction),
+        * and the [`ChannelManager`] state will be updated once it sees the funding spend on-chain.
+        * 
+        * In general, persistence failures should be retried after returning
+        * [`ChannelMonitorUpdateStatus::InProgress`] and eventually complete. If a failure truly
+        * cannot be retried, the node should shut down immediately after returning
+        * [`ChannelMonitorUpdateStatus::UnrecoverableError`], see its documentation for more info.
         * 
-        * [`update_monitor`]: channelmonitor::ChannelMonitor::update_monitor
+        * [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
         */
        public ChannelMonitorUpdateStatus update_channel(org.ldk.structs.OutPoint funding_txo, org.ldk.structs.ChannelMonitorUpdate update) {
                ChannelMonitorUpdateStatus ret = bindings.Watch_update_channel(this.ptr, funding_txo == null ? 0 : funding_txo.ptr, update == null ? 0 : update.ptr);
@@ -163,16 +189,18 @@ public class Watch : CommonBase {
         * [`MonitorEvent::Completed`] here, see [`ChannelMonitorUpdateStatus::InProgress`].
         */
        public ThreeTuple_OutPointCVec_MonitorEventZPublicKeyZ[] release_pending_monitor_events() {
-               long[] ret = bindings.Watch_release_pending_monitor_events(this.ptr);
+               long ret = bindings.Watch_release_pending_monitor_events(this.ptr);
                GC.KeepAlive(this);
-               int ret_conv_49_len = ret.Length;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_49_len = InternalUtils.getArrayLength(ret);
                ThreeTuple_OutPointCVec_MonitorEventZPublicKeyZ[] ret_conv_49_arr = new ThreeTuple_OutPointCVec_MonitorEventZPublicKeyZ[ret_conv_49_len];
                for (int x = 0; x < ret_conv_49_len; x++) {
-                       long ret_conv_49 = ret[x];
+                       long ret_conv_49 = InternalUtils.getU64ArrayElem(ret, x);
                        ThreeTuple_OutPointCVec_MonitorEventZPublicKeyZ ret_conv_49_hu_conv = new ThreeTuple_OutPointCVec_MonitorEventZPublicKeyZ(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;
                }
+               bindings.free_buffer(ret);
                return ret_conv_49_arr;
        }
 
index da8e277167706d52be1227c4d1ec0e5435704c8d..01192182eef2f61bdb96493fa49af7308b23f8dc 100644 (file)
@@ -28,11 +28,11 @@ public class WatchedOutput : CommonBase {
        /**
         * First block where the transaction output may have been spent.
         */
-       public Option_BlockHashZ get_block_hash() {
+       public Option_ThirtyTwoBytesZ get_block_hash() {
                long ret = bindings.WatchedOutput_get_block_hash(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_BlockHashZ ret_hu_conv = org.ldk.structs.Option_BlockHashZ.constr_from_ptr(ret);
+               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;
        }
@@ -40,7 +40,7 @@ public class WatchedOutput : CommonBase {
        /**
         * First block where the transaction output may have been spent.
         */
-       public void set_block_hash(org.ldk.structs.Option_BlockHashZ val) {
+       public void set_block_hash(org.ldk.structs.Option_ThirtyTwoBytesZ val) {
                bindings.WatchedOutput_set_block_hash(this.ptr, val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
@@ -73,16 +73,18 @@ public class WatchedOutput : CommonBase {
         * Spending condition of the transaction output.
         */
        public byte[] get_script_pubkey() {
-               byte[] ret = bindings.WatchedOutput_get_script_pubkey(this.ptr);
+               long ret = bindings.WatchedOutput_get_script_pubkey(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        /**
         * Spending condition of the transaction output.
         */
        public void set_script_pubkey(byte[] val) {
-               bindings.WatchedOutput_set_script_pubkey(this.ptr, val);
+               bindings.WatchedOutput_set_script_pubkey(this.ptr, InternalUtils.encodeUint8Array(val));
                GC.KeepAlive(this);
                GC.KeepAlive(val);
        }
@@ -90,8 +92,8 @@ public class WatchedOutput : CommonBase {
        /**
         * Constructs a new WatchedOutput given each field
         */
-       public static WatchedOutput of(org.ldk.structs.Option_BlockHashZ block_hash_arg, org.ldk.structs.OutPoint outpoint_arg, byte[] script_pubkey_arg) {
-               long ret = bindings.WatchedOutput_new(block_hash_arg.ptr, outpoint_arg == null ? 0 : outpoint_arg.ptr, script_pubkey_arg);
+       public static WatchedOutput of(org.ldk.structs.Option_ThirtyTwoBytesZ block_hash_arg, org.ldk.structs.OutPoint outpoint_arg, byte[] script_pubkey_arg) {
+               long ret = bindings.WatchedOutput_new(block_hash_arg.ptr, outpoint_arg == null ? 0 : outpoint_arg.ptr, InternalUtils.encodeUint8Array(script_pubkey_arg));
                GC.KeepAlive(block_hash_arg);
                GC.KeepAlive(outpoint_arg);
                GC.KeepAlive(script_pubkey_arg);
index 71f6f1255652ffb97e58458732e04dfcc21acee4..d7b0988e41ac76ba6939b08eee0980409eb2c8ed 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,6 +6,15 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of WriteableEcdsaChannelSigner */
+public interface WriteableEcdsaChannelSignerInterface {
+       /**Serialize the object into a byte array
+        */
+       byte[] write();
+}
+
 /**
  * A writeable signer.
  * 
@@ -15,67 +25,52 @@ namespace org { namespace ldk { namespace structs {
  * [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor
  */
 public class WriteableEcdsaChannelSigner : CommonBase {
-       internal readonly bindings.LDKWriteableEcdsaChannelSigner bindings_instance;
+       internal bindings.LDKWriteableEcdsaChannelSigner bindings_instance;
+       internal long instance_idx;
+
        internal WriteableEcdsaChannelSigner(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private WriteableEcdsaChannelSigner(bindings.LDKWriteableEcdsaChannelSigner arg, bindings.LDKEcdsaChannelSigner EcdsaChannelSigner, bindings.LDKChannelSigner ChannelSigner, ChannelPublicKeys pubkeys) : base(bindings.LDKWriteableEcdsaChannelSigner_new(arg, EcdsaChannelSigner, ChannelSigner, pubkeys == null ? 0 : pubkeys.clone_ptr())) {
-               this.ptrs_to.AddLast(arg);
-               this.ptrs_to.AddLast(EcdsaChannelSigner);
-               this.ptrs_to.AddLast(ChannelSigner);
-               this.bindings_instance = arg;
-       }
        ~WriteableEcdsaChannelSigner() {
                if (ptr != 0) { bindings.WriteableEcdsaChannelSigner_free(ptr); }
        }
 
-       public interface WriteableEcdsaChannelSignerInterface {
-               /**
-                * Serialize the object into a byte array
-                */
-               byte[] write();
-       }
        private class LDKWriteableEcdsaChannelSignerHolder { internal WriteableEcdsaChannelSigner held; }
        private class LDKWriteableEcdsaChannelSignerImpl : bindings.LDKWriteableEcdsaChannelSigner {
                internal LDKWriteableEcdsaChannelSignerImpl(WriteableEcdsaChannelSignerInterface arg, LDKWriteableEcdsaChannelSignerHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private WriteableEcdsaChannelSignerInterface arg;
                private LDKWriteableEcdsaChannelSignerHolder impl_holder;
-               public byte[] write() {
+               public long write() {
                        byte[] ret = arg.write();
                                GC.KeepAlive(arg);
-                       return ret;
+                       long result = InternalUtils.encodeUint8Array(ret);
+                       return result;
                }
        }
-       public static WriteableEcdsaChannelSigner new_impl(WriteableEcdsaChannelSignerInterface arg, EcdsaChannelSigner.EcdsaChannelSignerInterface EcdsaChannelSigner_impl, ChannelSigner.ChannelSignerInterface ChannelSigner_impl, ChannelPublicKeys pubkeys) {
-               LDKWriteableEcdsaChannelSignerHolder impl_holder = new LDKWriteableEcdsaChannelSignerHolder();
-               impl_holder.held = new WriteableEcdsaChannelSigner(new LDKWriteableEcdsaChannelSignerImpl(arg, impl_holder), EcdsaChannelSigner.new_impl(EcdsaChannelSigner_impl, ChannelSigner_impl, pubkeys).bindings_instance, ChannelSigner.new_impl(ChannelSigner_impl, pubkeys).bindings_instance, pubkeys);
-               return impl_holder.held;
-       }
-
-       /**
-        * Gets the underlying EcdsaChannelSigner.
-        */
-       public EcdsaChannelSigner get_ecdsa_channel_signer() {
-               EcdsaChannelSigner res = new EcdsaChannelSigner(null, bindings.LDKWriteableEcdsaChannelSigner_get_EcdsaChannelSigner(this.ptr));
-               this.ptrs_to.AddLast(res);
-               return res;
-       }
 
+       /** Creates a new instance of WriteableEcdsaChannelSigner from a given implementation */
+       public static WriteableEcdsaChannelSigner new_impl(WriteableEcdsaChannelSignerInterface arg, EcdsaChannelSignerInterface ecdsaChannelSigner_impl, ChannelSignerInterface channelSigner_impl, ChannelPublicKeys pubkeys) {
+               LDKWriteableEcdsaChannelSignerHolder impl_holder = new LDKWriteableEcdsaChannelSignerHolder();
+               LDKWriteableEcdsaChannelSignerImpl impl = new LDKWriteableEcdsaChannelSignerImpl(arg, impl_holder);
+               EcdsaChannelSigner ecdsaChannelSigner = EcdsaChannelSigner.new_impl(ecdsaChannelSigner_impl, channelSigner_impl, pubkeys);
+               ChannelSigner channelSigner = ChannelSigner.new_impl(channelSigner_impl, pubkeys);
+               long[] ptr_idx = bindings.LDKWriteableEcdsaChannelSigner_new(impl, ecdsaChannelSigner.instance_idx, channelSigner.instance_idx, pubkeys == null ? 0 : pubkeys.clone_ptr());
 
-       /**
-        * Gets the underlying ChannelSigner.
-        */
-       public ChannelSigner get_channel_signer() {
-               ChannelSigner res = new ChannelSigner(null, bindings.LDKWriteableEcdsaChannelSigner_get_ChannelSigner(this.ptr));
-               this.ptrs_to.AddLast(res);
-               return res;
+               impl_holder.held = new WriteableEcdsaChannelSigner(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
+               impl_holder.held.ptrs_to.AddLast(ecdsaChannelSigner);
+               impl_holder.held.ptrs_to.AddLast(channelSigner);
+               return impl_holder.held;
        }
 
        /**
         * Serialize the object into a byte array
         */
        public byte[] write() {
-               byte[] ret = bindings.WriteableEcdsaChannelSigner_write(this.ptr);
+               long ret = bindings.WriteableEcdsaChannelSigner_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
        internal long clone_ptr() {
index bd6d974dc475e1d56bbb5f423f7ad0c5d0eee2ec..634aa9690f75e5df23bec755eb99c4763f0dcddf 100644 (file)
@@ -1,3 +1,4 @@
+
 using org.ldk.impl;
 using org.ldk.enums;
 using org.ldk.util;
@@ -5,6 +6,15 @@ using System;
 
 namespace org { namespace ldk { namespace structs {
 
+
+
+/** An implementation of WriteableScore */
+public interface WriteableScoreInterface {
+       /**Serialize the object into a byte array
+        */
+       byte[] write();
+}
+
 /**
  * Refers to a scorer that is accessible under lock and also writeable to disk
  * 
@@ -12,56 +22,50 @@ namespace org { namespace ldk { namespace structs {
  * use the Persister to persist it.
  */
 public class WriteableScore : CommonBase {
-       internal readonly bindings.LDKWriteableScore bindings_instance;
+       internal bindings.LDKWriteableScore bindings_instance;
+       internal long instance_idx;
+
        internal WriteableScore(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }
-       private WriteableScore(bindings.LDKWriteableScore arg, bindings.LDKLockableScore LockableScore) : base(bindings.LDKWriteableScore_new(arg, LockableScore)) {
-               this.ptrs_to.AddLast(arg);
-               this.ptrs_to.AddLast(LockableScore);
-               this.bindings_instance = arg;
-       }
        ~WriteableScore() {
                if (ptr != 0) { bindings.WriteableScore_free(ptr); }
        }
 
-       public interface WriteableScoreInterface {
-               /**
-                * Serialize the object into a byte array
-                */
-               byte[] write();
-       }
        private class LDKWriteableScoreHolder { internal WriteableScore held; }
        private class LDKWriteableScoreImpl : bindings.LDKWriteableScore {
                internal LDKWriteableScoreImpl(WriteableScoreInterface arg, LDKWriteableScoreHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private WriteableScoreInterface arg;
                private LDKWriteableScoreHolder impl_holder;
-               public byte[] write() {
+               public long write() {
                        byte[] ret = arg.write();
                                GC.KeepAlive(arg);
-                       return ret;
+                       long result = InternalUtils.encodeUint8Array(ret);
+                       return result;
                }
        }
-       public static WriteableScore new_impl(WriteableScoreInterface arg, LockableScore.LockableScoreInterface LockableScore_impl) {
+
+       /** Creates a new instance of WriteableScore from a given implementation */
+       public static WriteableScore new_impl(WriteableScoreInterface arg, LockableScoreInterface lockableScore_impl) {
                LDKWriteableScoreHolder impl_holder = new LDKWriteableScoreHolder();
-               impl_holder.held = new WriteableScore(new LDKWriteableScoreImpl(arg, impl_holder), LockableScore.new_impl(LockableScore_impl).bindings_instance);
-               return impl_holder.held;
-       }
+               LDKWriteableScoreImpl impl = new LDKWriteableScoreImpl(arg, impl_holder);
+               LockableScore lockableScore = LockableScore.new_impl(lockableScore_impl);
+               long[] ptr_idx = bindings.LDKWriteableScore_new(impl, lockableScore.instance_idx);
 
-       /**
-        * Gets the underlying LockableScore.
-        */
-       public LockableScore get_lockable_score() {
-               LockableScore res = new LockableScore(null, bindings.LDKWriteableScore_get_LockableScore(this.ptr));
-               this.ptrs_to.AddLast(res);
-               return res;
+               impl_holder.held = new WriteableScore(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
+               impl_holder.held.ptrs_to.AddLast(lockableScore);
+               return impl_holder.held;
        }
 
        /**
         * Serialize the object into a byte array
         */
        public byte[] write() {
-               byte[] ret = bindings.WriteableScore_write(this.ptr);
+               long ret = bindings.WriteableScore_write(this.ptr);
                GC.KeepAlive(this);
-               return ret;
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
        }
 
 }
index 214420a8bd249af0f252da43b43f4953f118fe7b..927409e2a4e2ce7782447ff809f38bebe7edae2c 100644 (file)
@@ -1,5 +1,7 @@
 using System;
+using System.Text;
 using org.ldk.util;
+using org.ldk.impl;
 
 internal class InternalUtils {
        public static T[] check_arr_len<T>(T[] arr, int length) {
@@ -10,6 +12,7 @@ internal class InternalUtils {
        }
 
        public static byte[] convUInt5Array(UInt5[] u5s) {
+               if (u5s == null) return null;
                byte[] res = new byte[u5s.Length];
                for (int i = 0; i < u5s.Length; i++) {
                        res[i] = u5s[i].getVal();
@@ -18,8 +21,123 @@ internal class InternalUtils {
        }
 
        public static T[] mapArray<F, T>(F[] arr, Func<F, T> f) {
+               if (arr == null) return null;
                T[] ret = new T[arr.Length];
                for (int i = 0; i < arr.Length; i++) ret[i] = f(arr[i]);
                return ret;
        }
+
+       public static string decodeString(long strptr) {
+               byte[] bytes = decodeUint8Array(strptr);
+               return Encoding.UTF8.GetString(bytes);
+       }
+
+       public static long encodeString(string s) {
+               byte[] bytes = Encoding.UTF8.GetBytes(s);
+               return encodeUint8Array(bytes);
+       }
+
+
+       public static int getArrayLength(long arrptr) {
+               long len;
+               unsafe {
+                       long* arrlen = (long*) arrptr;
+                       len = *arrlen;
+               }
+               if (len > 0xffffffffL) {
+                       throw new ArgumentException("Array length was out of bounds");
+               }
+               return (int)len;
+       }
+
+
+       public static long getU64ArrayElem(long arrptr, int idx) {
+               unsafe {
+                       long* arr = (long*) (arrptr + 8);
+                       return arr[idx];
+               }
+       }
+       public static int getU32ArrayElem(long arrptr, int idx) {
+               unsafe {
+                       int* arr = (int*) (arrptr + 8);
+                       return arr[idx];
+               }
+       }
+       public static short getU16ArrayElem(long arrptr, int idx) {
+               unsafe {
+                       short* arr = (short*) (arrptr + 8);
+                       return arr[idx];
+               }
+       }
+       public static byte getU8ArrayElem(long arrptr, int idx) {
+               unsafe {
+                       byte* arr = (byte*) (arrptr + 8);
+                       return arr[idx];
+               }
+       }
+
+
+       public static long encodeUint8Array(byte[] arr) {
+               long buf = bindings.allocate_buffer(arr.Length + 8);
+               unsafe { *((long*)buf) = (long)arr.Length; }
+               for (int i = 0; i < arr.Length; i++) {
+                       unsafe {
+                               ((byte*)(buf + 8))[i] = arr[i];
+                       }
+               }
+               return buf;
+       }
+       public static long encodeUint16Array(short[] arr) {
+               long buf = bindings.allocate_buffer(arr.Length * 2 + 8);
+               unsafe { *((long*)buf) = (long)arr.Length; }
+               for (int i = 0; i < arr.Length; i++) {
+                       unsafe {
+                               ((short*)(buf + 8))[i] = arr[i];
+                       }
+               }
+               return buf;
+       }
+       public static long encodeUint32Array(int[] arr) {
+               long buf = bindings.allocate_buffer(arr.Length * 4 + 8);
+               unsafe { *((long*)buf) = (long)arr.Length; }
+               for (int i = 0; i < arr.Length; i++) {
+                       unsafe {
+                               ((int*)(buf + 8))[i] = arr[i];
+                       }
+               }
+               return buf;
+       }
+       public static long encodeUint64Array(long[] arr) {
+               long buf = bindings.allocate_buffer(arr.Length * 8 + 8);
+               unsafe { *((long*)buf) = (long)arr.Length; }
+               for (int i = 0; i < arr.Length; i++) {
+                       unsafe {
+                               ((long*)(buf + 8))[i] = arr[i];
+                       }
+               }
+               return buf;
+       }
+
+
+       public static byte[] decodeUint8Array(long arrptr) {
+               int len = getArrayLength(arrptr);
+               byte[] res = new byte[len];
+               for (int i = 0; i < len; i++)
+                       res[i] = getU8ArrayElem(arrptr, i);
+               return res;
+       }
+       public static short[] decodeUint16Array(long arrptr) {
+               int len = getArrayLength(arrptr);
+               short[] res = new short[len];
+               for (int i = 0; i < len; i++)
+                       res[i] = getU16ArrayElem(arrptr, i);
+               return res;
+       }
+       public static long[] decodeUint64Array(long arrptr) {
+               int len = getArrayLength(arrptr);
+               long[] res = new long[len];
+               for (int i = 0; i < len; i++)
+                       res[i] = getU64ArrayElem(arrptr, i);
+               return res;
+       }
 }
diff --git a/c_sharp/test/src/tests.cs b/c_sharp/test/src/tests.cs
new file mode 100644 (file)
index 0000000..e27160c
--- /dev/null
@@ -0,0 +1,224 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using org.ldk.enums;
+using org.ldk.util;
+using org.ldk.structs;
+
+namespace tests {
+       static class Tests {
+               static void Assert(bool a, int assertion) {
+                       if (!a) {
+                               Console.WriteLine("Assertion " + assertion + " failed at");
+                               Console.WriteLine(new StackTrace().ToString());
+                               Environment.Exit(45);
+                       }
+               }
+
+               static void SimpleConstructionTest() {
+                       Ping ping = Ping.of(42, 43);
+                       Assert(ping.get_ponglen() == 42, 0);
+               }
+
+               class TestBroadcaster : BroadcasterInterfaceInterface {
+                       public bool broadcasted = false;
+                       public void broadcast_transactions(byte[][] txn) {
+                               Assert(txn.Length == 1, 1);
+                               Assert(txn[0].Length == 42, 2);
+                               broadcasted = true;
+                       }
+               }
+
+               static void SimpleTraitTest() {
+                       TestBroadcaster impl = new TestBroadcaster();
+                       BroadcasterInterface broadcaster = BroadcasterInterface.new_impl(impl);
+                       byte[][] txn = new byte[1][];
+                       txn[0] = new byte[42];
+                       broadcaster.broadcast_transactions(txn);
+                       Assert(impl.broadcasted == true, 3);
+               }
+
+               class TestEstimator : FeeEstimatorInterface {
+                       public int get_est_sat_per_1000_weight(ConfirmationTarget confirmation_target) {
+                               if (confirmation_target == ConfirmationTarget.LDKConfirmationTarget_MinAllowedNonAnchorChannelRemoteFee) {
+                                       return 253;
+                               } else {
+                                       return 300;
+                               }
+                       }
+               }
+
+               class TestLogger : LoggerInterface {
+                       public void log(Record record) {
+                               Console.WriteLine(record.get_module_path() + ":" + record.get_line() + " " + record.get_args());
+                       }
+               }
+
+               class TestPersister : PersistInterface {
+                       public ChannelMonitorUpdateStatus persist_new_channel(OutPoint channel_id, ChannelMonitor data, MonitorUpdateId update_id) {
+                               return ChannelMonitorUpdateStatus.LDKChannelMonitorUpdateStatus_Completed;
+                       }
+                       public ChannelMonitorUpdateStatus update_persisted_channel(OutPoint channel_id, ChannelMonitorUpdate update, ChannelMonitor data, MonitorUpdateId update_id) {
+                               return ChannelMonitorUpdateStatus.LDKChannelMonitorUpdateStatus_Completed;
+                       }
+               }
+
+               class TestEventHandler : EventHandlerInterface {
+                       public List<Event> events = new List<Event>();
+                       public void handle_event(Event ev) {
+                               events.Add(ev);
+                       }
+               }
+               static Event get_event(ChannelManager manager) {
+                       TestEventHandler impl = new TestEventHandler();
+                       org.ldk.structs.EventHandler handler = org.ldk.structs.EventHandler.new_impl(impl);
+                       manager.as_EventsProvider().process_pending_events(handler);
+                       Assert(impl.events.Count == 1, 100);
+                       return impl.events[0];
+               }
+
+               class Node {
+                       public BroadcasterInterface broadcaster = BroadcasterInterface.new_impl(new TestBroadcaster());
+                       public FeeEstimator estimator = FeeEstimator.new_impl(new TestEstimator());
+                       public Logger logger = Logger.new_impl(new TestLogger());
+                       public Persist persister = Persist.new_impl(new TestPersister());
+                       public ChainParameters chain_params = ChainParameters.of(Network.LDKNetwork_Bitcoin, BestBlock.from_network(Network.LDKNetwork_Bitcoin));
+
+                       public ChainMonitor chain_monitor;
+                       public NetworkGraph graph;
+                       public MultiThreadedLockableScore scorer;
+                       public DefaultRouter router;
+                       public KeysManager keys;
+                       public ChannelManager manager;
+
+                       public Node(byte seed) {
+                               chain_monitor = ChainMonitor.of(Option_FilterZ.none(), broadcaster, logger, estimator, persister);
+                               graph = NetworkGraph.of(Network.LDKNetwork_Bitcoin, logger);
+                               scorer = MultiThreadedLockableScore.of(ProbabilisticScorer.of(ProbabilisticScoringDecayParameters.with_default(), graph, logger).as_Score());
+                               router = DefaultRouter.of(graph, logger, new byte[32], scorer.as_LockableScore(), ProbabilisticScoringFeeParameters.with_default());
+
+                               byte[] seed_bytes = new byte[32];
+                               for (int i = 0; i < 32; i++) seed_bytes[i] = seed;
+                               keys = KeysManager.of(seed_bytes, 42, 43);
+
+                               manager = ChannelManager.of(estimator, chain_monitor.as_Watch(), broadcaster, router.as_Router(), logger, keys.as_EntropySource(), keys.as_NodeSigner(), keys.as_SignerProvider(), UserConfig.with_default(), chain_params, 42);
+                       }
+               }
+
+               static void NodeTest() {
+                       Node node_a = new Node(1);
+                       Node node_b = new Node(2);
+
+                       InitFeatures init_features = node_a.manager.as_ChannelMessageHandler().provided_init_features(node_b.manager.get_our_node_id());
+                       Init init_msg = Init.of(init_features, Option_CVec_ThirtyTwoBytesZZ.none(), Option_SocketAddressZ.none());
+                       node_a.manager.as_ChannelMessageHandler().peer_connected(node_b.manager.get_our_node_id(), init_msg, false);
+                       node_b.manager.as_ChannelMessageHandler().peer_connected(node_a.manager.get_our_node_id(), init_msg, false);
+
+                       Result_ThirtyTwoBytesAPIErrorZ res = node_a.manager.create_channel(node_b.manager.get_our_node_id(), 100000, 42, new UInt128(43), UserConfig.with_default());
+                       Assert(res.is_ok(), 4);
+
+                       MessageSendEvent[] msgs = node_a.manager.as_MessageSendEventsProvider().get_and_clear_pending_msg_events();
+                       Assert(msgs.Length == 1, 5);
+                       Assert(msgs[0] is MessageSendEvent.MessageSendEvent_SendOpenChannel, 6);
+                       node_b.manager.as_ChannelMessageHandler().handle_open_channel(node_a.manager.get_our_node_id(), ((MessageSendEvent.MessageSendEvent_SendOpenChannel) msgs[0]).msg);
+
+                       MessageSendEvent[] response_msgs = node_b.manager.as_MessageSendEventsProvider().get_and_clear_pending_msg_events();
+                       Assert(response_msgs.Length == 1, 7);
+                       Assert(response_msgs[0] is MessageSendEvent.MessageSendEvent_SendAcceptChannel, 8);
+                       node_a.manager.as_ChannelMessageHandler().handle_accept_channel(node_b.manager.get_our_node_id(), ((MessageSendEvent.MessageSendEvent_SendAcceptChannel) response_msgs[0]).msg);
+
+                       Event funding_ready = get_event(node_a.manager);
+                       Assert(funding_ready is Event.Event_FundingGenerationReady, 9);
+
+                       // We could use funding_transaction_generated here, but test batching
+                       TwoTuple_ThirtyTwoBytesPublicKeyZ[] channel = new TwoTuple_ThirtyTwoBytesPublicKeyZ[1];
+                       channel[0] = TwoTuple_ThirtyTwoBytesPublicKeyZ.of(((Event.Event_FundingGenerationReady) funding_ready).temporary_channel_id, ((Event.Event_FundingGenerationReady) funding_ready).counterparty_node_id);
+
+                       // Hand-crafted transaction which has a dummy witness and can pay to our script
+                       byte[] transaction = new byte[99];
+                       transaction[0] = 2;
+                       transaction[1] = 0;
+                       transaction[2] = 0;
+                       transaction[3] = 0;
+                       transaction[4] = 0;
+                       transaction[5] = 1;
+                       transaction[6] = 1;
+                       transaction[7] = 66;
+                       transaction[8] = 66;
+                       transaction[9] = 66;
+                       transaction[10] = 66;
+                       transaction[11] = 66;
+                       transaction[12] = 66;
+                       transaction[13] = 66;
+                       transaction[14] = 66;
+                       transaction[15] = 66;
+                       transaction[16] = 66;
+                       transaction[17] = 66;
+                       transaction[18] = 66;
+                       transaction[19] = 66;
+                       transaction[20] = 66;
+                       transaction[21] = 66;
+                       transaction[22] = 66;
+                       transaction[23] = 66;
+                       transaction[24] = 66;
+                       transaction[25] = 66;
+                       transaction[26] = 66;
+                       transaction[27] = 66;
+                       transaction[28] = 66;
+                       transaction[29] = 66;
+                       transaction[30] = 66;
+                       transaction[31] = 66;
+                       transaction[32] = 66;
+                       transaction[33] = 66;
+                       transaction[34] = 66;
+                       transaction[35] = 66;
+                       transaction[36] = 66;
+                       transaction[37] = 66;
+                       transaction[38] = 66;
+                       transaction[39] = 18;
+                       transaction[40] = 0;
+                       transaction[41] = 0;
+                       transaction[42] = 0;
+                       transaction[43] = 0;
+                       transaction[44] = 253;
+                       transaction[45] = 255;
+                       transaction[46] = 255;
+                       transaction[47] = 255;
+                       transaction[48] = 1;
+                       transaction[49] = 34;
+                       transaction[50] = 2;
+                       transaction[51] = 0;
+                       transaction[52] = 0;
+                       transaction[53] = 0;
+                       transaction[54] = 0;
+                       transaction[55] = 0;
+                       transaction[56] = 0;
+                       transaction[57] = 34;
+
+                       Assert(((Event.Event_FundingGenerationReady) funding_ready).output_script.Length == 34, 10);
+                       for (int i = 0; i < 34; i++) {
+                               transaction[58 + i] = ((Event.Event_FundingGenerationReady) funding_ready).output_script[i];
+                       }
+
+                       transaction[92] = 1;
+                       transaction[93] = 1;
+                       transaction[94] = 1;
+                       transaction[95] = 0;
+                       transaction[96] = 0;
+                       transaction[97] = 0;
+                       transaction[98] = 0;
+
+                       node_a.manager.batch_funding_transaction_generated(channel, transaction);
+               }
+
+               static void Main(string[] args) {
+                       SimpleConstructionTest();
+                       SimpleTraitTest();
+                       NodeTest();
+
+                       Console.WriteLine("\n\nTESTS PASSED\n\n");
+                       System.GC.Collect();
+                       GC.WaitForPendingFinalizers();
+               }
+       }
+}
index 4df1d34c688fb5d4b1d976cbbcfc75b64546446c..b1ae3d20e2349c9547af623411744accbc3a26b2 100644 (file)
@@ -5,21 +5,34 @@ import sys
 class Target(Enum):
     CSHARP = 1,
 
+def first_to_lower(string: str) -> str:
+    first = string[0]
+    return first.lower() + string[1:]
+
+def safe_arg_name(arg_name):
+    return "_" + arg_name if arg_name == "lock" or arg_name == "event" or arg_name == "params" else arg_name
+
+def arg_name_repl(s, arg_name):
+    return s.replace(arg_name, "_" + arg_name) if arg_name == "lock" or arg_name == "event" or arg_name == "params" else s
+
 class Consts:
-    def __init__(self, DEBUG: bool, target: Target, **kwargs):
+    def __init__(self, DEBUG: bool, target: Target, outdir: str, **kwargs):
+        self.outdir = outdir
         self.target = target
         self.c_array_class_caches = set()
+        self.function_ptr_counter = 0
+        self.function_ptrs = {}
         self.c_type_map = dict(
-            bool = ['bool'],
-            uint8_t = ['byte'],
-            uint16_t = ['short'],
-            uint32_t = ['int'],
-            uint64_t = ['long'],
-            int64_t = ['long'],
-            double = ['double'],
+            bool = ['bool', 'long', 'bool[]'],
+            uint8_t = ['byte', 'long', 'byte[]'],
+            uint16_t = ['short', 'long', 'short[]'],
+            uint32_t = ['int', 'long', 'int[]'],
+            uint64_t = ['long', 'long', 'long[]'],
+            int64_t = ['long', 'long', 'long[]'],
+            double = ['double', 'long', 'double[]'],
         )
         self.java_type_map = dict(
-            String = "string"
+            String = "long"
         )
         self.java_hu_type_map = dict(
             String = "string"
@@ -34,55 +47,20 @@ class Consts:
 using org.ldk.enums;
 using org.ldk.impl;
 using System;
+using System.Collections.Generic;
 using System.Runtime.InteropServices;
 
 namespace org { namespace ldk { namespace impl {
 
 internal class bindings {
-       internal class ArrayCoder : ICustomMarshaler {
-               int size = 0;
-               GCHandle pinnedArray;
-               public static ICustomMarshaler GetInstance(string pstrCookie) {
-                       return new ArrayCoder();
-               }
-
-               public Object MarshalNativeToManaged(IntPtr pNativeData) { throw new NotImplementedException(); }
-               public IntPtr MarshalManagedToNative(Object obj) {
-                       if (obj.GetType() == typeof(byte[])) {
-                               byte[] inp = (byte[])obj;
-                               IntPtr data = Marshal.AllocHGlobal(inp.Length + 8);
-                               Marshal.WriteInt64(data, inp.Length);
-                               Marshal.Copy(inp, 0, data + 8, inp.Length);
-                               this.size = inp.Length + 8;
-                               return data;
-                       } else {
-                               throw new NotImplementedException();
-                       }
-               }
-               public void CleanUpNativeData(IntPtr pNativeData) {
-                       Marshal.FreeHGlobal(pNativeData);
-               }
-               public void CleanUpManagedData(Object ManagedObj) { }
-               public int GetNativeDataSize() {
-                       // Blindly guess based on the last allocation, no idea how else to implement this.
-                       return this.size;
-               }
-       }
+       static List<WeakReference> js_objs = new List<WeakReference>();
 
-       /*static {
-               init(java.lang.Enum.class, VecOrSliceDef.class);
-               init_class_cache();
-               if (!get_lib_version_string().equals(version.get_ldk_java_bindings_version()))
-                       throw new ArgumentException("Compiled LDK library and LDK class failes do not match");
-               // Fetching the LDK versions from C also checks that the header and binaries match
-               Console.Error.WriteLine("Loaded LDK-Java Bindings " + version.get_ldk_java_bindings_version() + " with LDK " + get_ldk_version() + " and LDK-C-Bindings " + get_ldk_c_bindings_version());
-       }*/
-       //static extern void init(java.lang.Class c);
-       //static native void init_class_cache();
 """
         self.bindings_header += self.native_meth_decl("get_lib_version_string", "string") + "();\n"
         self.bindings_header += self.native_meth_decl("get_ldk_c_bindings_version", "string") + "();\n"
         self.bindings_header += self.native_meth_decl("get_ldk_version", "string") + "();\n\n"
+        self.bindings_header += self.native_meth_decl("allocate_buffer", "long") + "(long buflen);\n\n"
+        self.bindings_header += self.native_meth_decl("free_buffer", "void") + "(long buf);\n\n"
 
         self.bindings_version_file = """
 
@@ -125,14 +103,14 @@ public class CommonBase {
        public readonly int previous_vout;
 
        internal TxIn(object _dummy, long ptr) : base(ptr) {
-               this.witness = bindings.TxIn_get_witness(ptr);
-               this.script_sig = bindings.TxIn_get_script_sig(ptr);
+               this.witness = InternalUtils.decodeUint8Array(bindings.TxIn_get_witness(ptr));
+               this.script_sig = InternalUtils.decodeUint8Array(bindings.TxIn_get_script_sig(ptr));
                this.sequence = bindings.TxIn_get_sequence(ptr);
-               this.previous_txid = bindings.TxIn_get_previous_txid(ptr);
+               this.previous_txid = InternalUtils.decodeUint8Array(bindings.TxIn_get_previous_txid(ptr));
                this.previous_vout = bindings.TxIn_get_previous_vout(ptr);
        }
        public TxIn(byte[] witness, byte[] script_sig, int sequence, byte[] previous_txid, int previous_vout)
-       : this(null, bindings.TxIn_new(witness, script_sig, sequence, previous_txid, previous_vout)) {}
+       : this(null, bindings.TxIn_new(InternalUtils.encodeUint8Array(witness), InternalUtils.encodeUint8Array(script_sig), sequence, InternalUtils.encodeUint8Array(previous_txid), previous_vout)) {}
 
        ~TxIn() {
                if (ptr != 0) { bindings.TxIn_free(ptr); }
@@ -146,10 +124,10 @@ public class CommonBase {
        public readonly long value;
 
     internal TxOut(object _dummy, long ptr) : base(ptr) {
-               this.script_pubkey = bindings.TxOut_get_script_pubkey(ptr);
+               this.script_pubkey = InternalUtils.decodeUint8Array(bindings.TxOut_get_script_pubkey(ptr));
                this.value = bindings.TxOut_get_value(ptr);
        }
-    public TxOut(long value, byte[] script_pubkey) : this(null, bindings.TxOut_new(script_pubkey, value)) {}
+    public TxOut(long value, byte[] script_pubkey) : this(null, bindings.TxOut_new(InternalUtils.encodeUint8Array(script_pubkey), value)) {}
 
        ~TxOut() {
                if (ptr != 0) { bindings.TxOut_free(ptr); }
@@ -161,10 +139,10 @@ public class CommonBase {
        public readonly byte[] scalar_bytes;
 
     internal BigEndianScalar(object _dummy, long ptr) : base(ptr) {
-               this.scalar_bytes = bindings.BigEndianScalar_get_bytes(ptr);
+               this.scalar_bytes = InternalUtils.decodeUint8Array(bindings.BigEndianScalar_get_bytes(ptr));
        }
-    public BigEndianScalar(byte[] scalar_bytes) : base(bindings.BigEndianScalar_new(scalar_bytes)) {
-               this.scalar_bytes = bindings.BigEndianScalar_get_bytes(ptr);
+    public BigEndianScalar(byte[] scalar_bytes) : base(bindings.BigEndianScalar_new(InternalUtils.encodeUint8Array(scalar_bytes))) {
+               this.scalar_bytes = InternalUtils.decodeUint8Array(bindings.BigEndianScalar_get_bytes(ptr));
        }
 
        ~BigEndianScalar() {
@@ -349,7 +327,7 @@ void __attribute__((destructor)) check_leaks() {
        unsigned long alloc_count = 0;
        unsigned long alloc_size = 0;
        DEBUG_PRINT("The following LDK-allocated blocks still remain.\\n");
-       DEBUG_PRINT("Note that this is only accurate if System.gc(); System.runFinalization()\\n");
+       DEBUG_PRINT("Note that this is only accurate if System.GC.Collect(); GC.WaitForPendingFinalizers();\\n");
        DEBUG_PRINT("was called prior to exit after all LDK objects were out of scope.\\n");
        for (allocation* a = allocation_ll; a != NULL; a = a->next) {
                DEBUG_PRINT("%s %p (%lu bytes) remains:\\n", a->struct_name, a->ptr, a->alloc_len);
@@ -359,7 +337,7 @@ void __attribute__((destructor)) check_leaks() {
                alloc_size += a->alloc_len;
        }
        DEBUG_PRINT("%lu allocations remained for %lu bytes.\\n", alloc_count, alloc_size);
-       DEBUG_PRINT("Note that this is only accurate if System.gc(); System.runFinalization()\\n");
+       DEBUG_PRINT("Note that this is only accurate if System.GC.Collect(); GC.WaitForPendingFinalizers()\\n");
        DEBUG_PRINT("was called prior to exit after all LDK objects were out of scope.\\n");
 }
 """
@@ -410,6 +388,16 @@ static inline LDKStr str_ref_to_owned_c(const jstring str) {
        return res;
 }
 
+typedef bool jboolean;
+
+int64_t CS_LDK_allocate_buffer(int64_t len) {
+       return MALLOC(len, "C#-requested buffer");
+}
+
+void CS_LDK_free_buffer(int64_t buf) {
+       FREE(buf);
+}
+
 jstring CS_LDK_get_ldk_c_bindings_version() {
        return str_ref_to_cs(check_get_ldk_bindings_version(), strlen(check_get_ldk_bindings_version()));
 }
@@ -441,13 +429,13 @@ namespace org { namespace ldk { namespace structs {
         self.usize_native_ty = "long"
         self.native_zero_ptr = "0"
         self.unitary_enum_c_ty = "int32_t"
-        self.ptr_arr = "jobjectArray"
+        self.ptr_arr = "ptrArray"
         self.is_arr_some_check = ("", " != NULL")
-        self.get_native_arr_len_call = ("(*env)->GetArrayLength(env, ", ")")
+        self.get_native_arr_len_call = ("", "->arr_len")
 
         self.bindings_footer_wip = "\tstatic bindings() {\n"
     def bindings_footer(self):
-        return self.bindings_footer_wip + "\t}\n}\n} } }\n"
+        return ""
 
     def native_meth_decl(self, meth_name, ret_ty_str):
         return "\t[DllImport (\"ldkcsharp\", EntryPoint=\"CS_LDK_" + meth_name + "\")] public static extern " + ret_ty_str + " " + meth_name
@@ -496,31 +484,53 @@ namespace org { namespace ldk { namespace structs {
 
     def map_hu_array_elems(self, arr_name, conv_name, arr_ty, elem_ty, is_nullable):
         if elem_ty.java_hu_ty == "UInt5":
-            return arr_name + " != null ? InternalUtils.convUInt5Array(" + arr_name + ") : null"
+            return "InternalUtils.convUInt5Array(" + arr_name + ")"
         elif elem_ty.java_hu_ty == "WitnessVersion":
-            return arr_name + " != null ? InternalUtils.convWitnessVersionArray(" + arr_name + ") : null"
+            return "InternalUtils.convWitnessVersionArray(" + arr_name + ")"
         else:
-            return arr_name + " != null ? InternalUtils.mapArray(" + arr_name + ", " + conv_name + " => " + elem_ty.from_hu_conv[0] + ") : null"
+            return "InternalUtils.mapArray(" + arr_name + ", " + conv_name + " => " + elem_ty.from_hu_conv[0] + ")"
 
     def str_ref_to_native_call(self, var_name, str_len):
         return "str_ref_to_cs(" + var_name + ", " + str_len + ")"
     def str_ref_to_c_call(self, var_name):
         return "str_ref_to_owned_c(" + var_name + ")"
     def str_to_hu_conv(self, var_name):
-        return None
+        return "string " + var_name + "_conv = InternalUtils.decodeString(" + var_name + ");"
     def str_from_hu_conv(self, var_name):
-        return None
+        return ("InternalUtils.encodeString(" + var_name + ")", "")
 
     def init_str(self):
-        return ""
+        ret = ""
+        for fn_suffix in self.function_ptrs:
+            cret = self.function_ptrs[fn_suffix]["ret"][1]
+            cargs = self.function_ptrs[fn_suffix]["args"][1]
+            ret += f"""
+typedef {cret} (*invoker_{fn_suffix})(int obj_ptr, int fn_id{cargs});
+static invoker_{fn_suffix} js_invoke_function_{fn_suffix};
+int CS_LDK_register_{fn_suffix}_invoker(invoker_{fn_suffix} invoker) {{
+       js_invoke_function_{fn_suffix} = invoker;
+       return 0;
+}}
+"""
+
+        return ret
 
     def var_decl_statement(self, ty_string, var_name, statement):
         return ty_string + " " + var_name + " = " + statement
 
     def get_java_arr_len(self, arr_name):
-        return arr_name + ".Length"
+        return "InternalUtils.getArrayLength(" + arr_name + ")"
+
     def get_java_arr_elem(self, elem_ty, arr_name, idx):
-        return arr_name + "[" + idx + "]"
+        if elem_ty.c_ty == "int64_t" or elem_ty.c_ty == "uint64_t" or elem_ty.c_ty.endswith("Array") or elem_ty.c_ty == "uintptr_t":
+            return "InternalUtils.getU64ArrayElem(" + arr_name + ", " + idx + ")"
+        elif elem_ty.rust_obj == "LDKU5":
+            return "InternalUtils.getU8ArrayElem(" + arr_name + ", " + idx + ")"
+        elif elem_ty.rust_obj == "LDKStr":
+            return "InternalUtils.getU32ArrayElem(" + arr_name + ", " + idx + ")"
+        else:
+            assert False
+
     def constr_hu_array(self, ty_info, arr_len):
         base_ty = ty_info.subty.java_hu_ty.split("[")[0].split("<")[0]
         conv = "new " + base_ty + "[" + arr_len + "]"
@@ -529,22 +539,44 @@ namespace org { namespace ldk { namespace structs {
             conv += "[" + ty_info.subty.java_hu_ty.split("<")[0].split("[")[1]
         return conv
     def cleanup_converted_native_array(self, ty_info, arr_name):
-        return None
+        return "bindings.free_buffer(" + arr_name + ");"
 
     def primitive_arr_from_hu(self, arr_ty, fixed_len, arr_name):
         mapped_ty = arr_ty.subty
+        inner = arr_name
         if arr_ty.rust_obj == "LDKU128":
-            return ("" + arr_name + ".getLEBytes()", "")
+            return ("InternalUtils.encodeUint8Array(" + arr_name + ".getLEBytes())", "")
         if fixed_len is not None:
-            return ("InternalUtils.check_arr_len(" + arr_name + ", " + fixed_len + ")", "")
-        return None
+            inner = "InternalUtils.check_arr_len(" + arr_name + ", " + fixed_len + ")"
+        if mapped_ty.c_ty.endswith("Array"):
+            return ("InternalUtils.encodeUint64Array(" + inner + ")", "")
+        elif mapped_ty.c_ty == "uint8_t" or mapped_ty.c_ty == "int8_t":
+            return ("InternalUtils.encodeUint8Array(" + inner + ")", "")
+        elif mapped_ty.c_ty == "uint16_t" or mapped_ty.c_ty == "int16_t":
+            return ("InternalUtils.encodeUint16Array(" + inner + ")", "")
+        elif mapped_ty.c_ty == "uint32_t":
+            return ("InternalUtils.encodeUint32Array(" + inner + ")", "")
+        elif mapped_ty.c_ty == "int64_t" or mapped_ty.c_ty == "uint64_t" or mapped_ty.rust_obj == "LDKStr":
+            return ("InternalUtils.encodeUint64Array(" + inner + ")", "")
+        else:
+            print(mapped_ty.c_ty)
+            assert False
+
     def primitive_arr_to_hu(self, arr_ty, fixed_len, arr_name, conv_name):
+        mapped_ty = arr_ty.subty
         if arr_ty.rust_obj == "LDKU128":
             return "org.ldk.util.UInt128 " + conv_name + " = new org.ldk.util.UInt128(" + arr_name + ");"
-        return None
+        elif mapped_ty.c_ty == "uint8_t" or mapped_ty.c_ty == "int8_t":
+            return "byte[] " + conv_name + " = InternalUtils.decodeUint8Array(" + arr_name + ");"
+        elif mapped_ty.c_ty == "uint16_t" or mapped_ty.c_ty == "int16_t":
+            return "short[] " + conv_name + " = InternalUtils.decodeUint16Array(" + arr_name + ");"
+        elif mapped_ty.c_ty == "uint64_t" or mapped_ty.c_ty == "int64_t":
+            return "long[] " + conv_name + " = InternalUtils.decodeUint64Array(" + arr_name + ");"
+        else:
+            assert False
 
     def java_arr_ty_str(self, elem_ty_str):
-        return elem_ty_str + "[]"
+        return "long"
 
     def for_n_in_range(self, n, minimum, maximum):
         return "for (int " + n + " = " + minimum + "; " + n + " < " + maximum + "; " + n + "++) {"
@@ -632,89 +664,69 @@ namespace org { namespace ldk { namespace structs {
             ret = ret + ", " + param
         return ret + ")"
 
-    def native_c_map_trait(self, struct_name, field_vars, flattened_field_vars, field_fns, trait_doc_comment):
-        out_java_trait = ""
-        out_java = ""
-
-        # First generate most of the Java code, note that we need information about java method argument strings for C
-        out_java_trait += self.hu_struct_file_prefix
-        if trait_doc_comment is not None:
-            out_java_trait += "/**\n * " + trait_doc_comment.replace("\n", "\n * ") + "\n */\n"
-        out_java_trait = out_java_trait + "public class " + struct_name.replace("LDK","") + " : CommonBase {\n"
-        out_java_trait = out_java_trait + "\tinternal readonly bindings." + struct_name + " bindings_instance;\n"
-        out_java_trait = out_java_trait + "\tinternal " + struct_name.replace("LDK", "") + "(object _dummy, long ptr) : base(ptr) { bindings_instance = null; }\n"
-        out_java_trait = out_java_trait + "\tprivate " + struct_name.replace("LDK", "") + "(bindings." + struct_name + " arg"
-        for var in flattened_field_vars:
-            if isinstance(var, ConvInfo):
-                out_java_trait += ", " + var.java_hu_ty + " " + var.arg_name
-            else:
-                out_java_trait += ", bindings." + var[0] + " " + var[1]
-        out_java_trait += ") : base(bindings." + struct_name + "_new(arg"
-        for var in flattened_field_vars:
+    def native_c_map_trait(self, struct_name, field_var_conversions, flattened_field_var_conversions, field_function_lines, trait_doc_comment):
+        out_typescript_bindings = ""
+        super_instantiator = ""
+        bindings_instantiator = ""
+        pointer_to_adder = ""
+        impl_constructor_arguments = ""
+        for var in flattened_field_var_conversions:
             if isinstance(var, ConvInfo):
+                impl_constructor_arguments += f", {var.java_hu_ty} {var.arg_name}"
                 if var.from_hu_conv is not None:
-                    out_java_trait = out_java_trait + ", " + var.from_hu_conv[0]
+                    bindings_instantiator += ", " + var.from_hu_conv[0]
+                    if var.from_hu_conv[1] != "":
+                        pointer_to_adder += "\t\t\t" + var.from_hu_conv[1] + ";\n"
                 else:
-                    out_java_trait = out_java_trait + ", " + var.arg_name
+                    bindings_instantiator += ", " + first_to_lower(var.arg_name)
             else:
-                out_java_trait = out_java_trait + ", " + var[1]
-        out_java_trait = out_java_trait + ")) {\n"
-        out_java_trait = out_java_trait + "\t\tthis.ptrs_to.AddLast(arg);\n"
-        for var in flattened_field_vars:
+                bindings_instantiator += ", " + first_to_lower(var[1]) + ".instance_idx"
+                pointer_to_adder += "\t\timpl_holder.held.ptrs_to.AddLast(" + first_to_lower(var[1]) + ");\n"
+                impl_constructor_arguments += f", {var[0].replace('LDK', '')}Interface {first_to_lower(var[1])}_impl"
+
+        super_constructor_statements = ""
+        trait_constructor_arguments = ""
+        for var in field_var_conversions:
             if isinstance(var, ConvInfo):
-                if var.from_hu_conv is not None and var.from_hu_conv[1] != "":
-                    out_java_trait = out_java_trait + "\t\t" + var.from_hu_conv[1].replace("\n", "\n\t\t") + ";\n"
+                trait_constructor_arguments += ", " + var.arg_name
             else:
-                out_java_trait = out_java_trait + "\t\tthis.ptrs_to.AddLast(" + var[1] + ");\n"
-        out_java_trait = out_java_trait + "\t\tthis.bindings_instance = arg;\n"
-        out_java_trait = out_java_trait + "\t}\n"
-        out_java_trait = out_java_trait + "\t~" + struct_name.replace("LDK","") + "() {\n"
-        out_java_trait = out_java_trait + "\t\tif (ptr != 0) { bindings." + struct_name.replace("LDK","") + "_free(ptr); }\n"
-        out_java_trait = out_java_trait + "\t}\n\n"
+                super_constructor_statements += "\t\t" + var[1] + " " + first_to_lower(var[1]) + " = " + var[1] + ".new_impl(" + first_to_lower(var[1]) + "_impl"
+                super_instantiator = ""
+                for suparg in var[2]:
+                    if isinstance(suparg, ConvInfo):
+                        super_instantiator += ", " + suparg.arg_name
+                    else:
+                        super_instantiator += ", " + first_to_lower(suparg[1]) + "_impl"
+                super_constructor_statements += super_instantiator + ");\n"
+                trait_constructor_arguments += ", " + first_to_lower(var[1]) + ".instance_idx"
+                for suparg in var[2]:
+                    if isinstance(suparg, ConvInfo):
+                        trait_constructor_arguments += ", " + suparg.arg_name
+                    else:
+                        # Blindly assume that we can just strip the first arg to build the args for the supertrait
+                        super_constructor_statements += "\t\t" + suparg[1] + " " + first_to_lower(suparg[1]) + " = " + suparg[1] + ".new_impl(" + super_instantiator.split(", ", 1)[1] + ");\n"
+                        trait_constructor_arguments += ", " + suparg[1]
+
+        # BUILD INTERFACE METHODS
 
         java_trait_wrapper = "\tprivate class " + struct_name + "Holder { internal " + struct_name.replace("LDK", "") + " held; }\n"
         java_trait_wrapper += "\tprivate class " + struct_name + "Impl : bindings." + struct_name + " {\n"
         java_trait_wrapper += "\t\tinternal " + struct_name + "Impl(" + struct_name.replace("LDK", "") + "Interface arg, " + struct_name + "Holder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }\n"
         java_trait_wrapper += "\t\tprivate " + struct_name.replace("LDK", "") + "Interface arg;\n"
         java_trait_wrapper += "\t\tprivate " + struct_name + "Holder impl_holder;\n"
-        java_trait_constr = "\tpublic static " + struct_name.replace("LDK", "") + " new_impl(" + struct_name.replace("LDK", "") + "Interface arg"
-        for var in flattened_field_vars:
-            if isinstance(var, ConvInfo):
-                java_trait_constr += ", " + var.java_hu_ty + " " + var.arg_name
-            else:
-                # Ideally we'd be able to take any instance of the interface, but our C code can only represent
-                # Java-implemented version, so we require users pass a Java implementation here :/
-                java_trait_constr += ", " + var[0].replace("LDK", "") + "." + var[0].replace("LDK", "") + "Interface " + var[1] + "_impl"
-        java_trait_constr = java_trait_constr + ") {\n\t\t" + struct_name + "Holder impl_holder = new " + struct_name + "Holder();\n"
-        java_trait_constr = java_trait_constr + "\t\timpl_holder.held = new " + struct_name.replace("LDK", "") + "(new " + struct_name + "Impl(arg, impl_holder)"
-        out_java_trait += "\tpublic interface " + struct_name.replace("LDK", "") + "Interface {\n"
-        out_java += "\tpublic interface " + struct_name + " {\n"
-        java_meths = []
-        for fn_line in field_fns:
-            java_meth_descr = "("
+
+        for fn_line in field_function_lines:
             if fn_line.fn_name != "free" and fn_line.fn_name != "cloned":
                 fn_name = fn_line.fn_name
                 if fn_name == "lock": # reserved symbol
                     fn_name = "do_lock"
-                out_java += "\t\t" + fn_line.ret_ty_info.java_ty + " " + fn_name + "("
                 java_trait_wrapper += "\t\tpublic " + fn_line.ret_ty_info.java_ty + " " + fn_name + "("
-                out_java_trait += "\t\t/**\n\t\t * " + fn_line.docs.replace("\n", "\n\t\t * ") + "\n\t\t */\n"
-                out_java_trait += "\t\t" + fn_line.ret_ty_info.java_hu_ty + " " + fn_name + "("
 
                 for idx, arg_conv_info in enumerate(fn_line.args_ty):
                     if idx >= 1:
-                        out_java += ", "
                         java_trait_wrapper += ", "
-                        out_java_trait += ", "
-                    out_java += arg_conv_info.java_ty + " _" + arg_conv_info.arg_name
-                    out_java_trait += arg_conv_info.java_hu_ty + " _" + arg_conv_info.arg_name
                     java_trait_wrapper += arg_conv_info.java_ty + " _" + arg_conv_info.arg_name
-                    java_meth_descr = java_meth_descr + arg_conv_info.java_fn_ty_arg
-                java_meth_descr = java_meth_descr + ")" + fn_line.ret_ty_info.java_fn_ty_arg
-                java_meths.append((fn_line.fn_name, java_meth_descr))
 
-                out_java += ");\n"
-                out_java_trait += ");\n"
                 java_trait_wrapper += ") {\n"
 
                 for arg_info in fn_line.args_ty:
@@ -746,66 +758,133 @@ namespace org { namespace ldk { namespace structs {
                         java_trait_wrapper += "\t\t\treturn ret;\n"
                 java_trait_wrapper += "\t\t}\n"
         java_trait_wrapper += "\t}"
-        for var in field_vars:
-            if isinstance(var, ConvInfo):
-                java_trait_constr = java_trait_constr + ", " + var.arg_name
-            else:
-                java_trait_constr += ", " + var[1] + ".new_impl(" + var[1] + "_impl"
-                suptrait_constr = ""
-                for suparg in var[2]:
-                    if isinstance(suparg, ConvInfo):
-                        suptrait_constr += ", " + suparg.arg_name
-                    else:
-                        suptrait_constr += ", " + suparg[1] + "_impl"
-                java_trait_constr += suptrait_constr + ").bindings_instance"
-                for suparg in var[2]:
-                    if isinstance(suparg, ConvInfo):
-                        java_trait_constr += ", " + suparg.arg_name
-                    else:
-                        java_trait_constr += ", " + suparg[1] + ".new_impl("
-                        # Blindly assume that we can just strip the first arg to build the args for the supertrait
-                        java_trait_constr += suptrait_constr.split(", ", 1)[1]
-                        java_trait_constr += ").bindings_instance"
-        out_java_trait += "\t}\n" + java_trait_wrapper + "\n"
-        out_java_trait += java_trait_constr + ");\n\t\treturn impl_holder.held;\n\t}\n"
 
-        out_java += "\t}\n"
+        out_java_interface = ""
+        java_methods = []
+        for fn_line in field_function_lines:
+            java_method_descriptor = ""
+            if fn_line.fn_name != "free" and fn_line.fn_name != "cloned":
+                out_java_interface += "\t/**" + fn_line.docs.replace("\n", "\n\t * ") + "\n\t */\n"
+                out_java_interface += "\t" + fn_line.ret_ty_info.java_hu_ty + " " + fn_line.fn_name + "("
+
+                for idx, arg_conv_info in enumerate(fn_line.args_ty):
+                    if idx >= 1:
+                        out_java_interface += ", "
+                    out_java_interface += f"{arg_conv_info.java_hu_ty} {safe_arg_name(arg_conv_info.arg_name)}"
+                    java_method_descriptor += arg_conv_info.java_fn_ty_arg
+                out_java_interface += f");\n"
+                java_method_descriptor += ")" + fn_line.ret_ty_info.java_fn_ty_arg
+                java_methods.append((fn_line.fn_name, java_method_descriptor))
+
+        formatted_trait_docs = trait_doc_comment.replace("\n", "\n * ")
+        out_typescript_human = f"""
+{self.hu_struct_file_prefix}
+
+/** An implementation of {struct_name.replace("LDK","")} */
+public interface {struct_name.replace("LDK", "")}Interface {{
+{out_java_interface}}}
+
+/**
+ * {formatted_trait_docs}
+ */
+public class {struct_name.replace("LDK","")} : CommonBase {{
+       internal bindings.{struct_name} bindings_instance;
+       internal long instance_idx;
+
+       internal {struct_name.replace("LDK","")}(object _dummy, long ptr) : base(ptr) {{ bindings_instance = null; }}
+       ~{struct_name.replace("LDK","")}() {{
+               if (ptr != 0) {{ bindings.{struct_name.replace("LDK","")}_free(ptr); }}
+       }}
+
+{java_trait_wrapper}
+
+       /** Creates a new instance of {struct_name.replace("LDK","")} from a given implementation */
+       public static {struct_name.replace("LDK", "")} new_impl({struct_name.replace("LDK", "")}Interface arg{impl_constructor_arguments}) {{
+               {struct_name}Holder impl_holder = new {struct_name}Holder();
+               {struct_name}Impl impl = new {struct_name}Impl(arg, impl_holder);
+{super_constructor_statements}         long[] ptr_idx = bindings.{struct_name}_new(impl{bindings_instantiator});
+
+               impl_holder.held = new {struct_name.replace("LDK", "")}(null, ptr_idx[0]);
+               impl_holder.held.instance_idx = ptr_idx[1];
+               impl_holder.held.bindings_instance = impl;
+{pointer_to_adder}             return impl_holder.held;
+       }}
+
+"""
+
+        out_typescript_bindings += "\tpublic interface " + struct_name + " {\n"
+        java_meths = []
+        for fn_line in field_function_lines:
+            if fn_line.fn_name != "free" and fn_line.fn_name != "cloned":
+                out_typescript_bindings += f"\t\t{fn_line.ret_ty_info.java_ty} {fn_line.fn_name}("
 
-        out_java += self.native_meth_decl(struct_name + "_new", "long") + "(" + struct_name + " impl"
-        for var in flattened_field_vars:
+                for idx, arg_conv_info in enumerate(fn_line.args_ty):
+                    if idx >= 1:
+                        out_typescript_bindings = out_typescript_bindings + ", "
+                    out_typescript_bindings += f"{arg_conv_info.java_ty} {safe_arg_name(arg_conv_info.arg_name)}"
+
+                out_typescript_bindings += f");\n"
+
+        out_typescript_bindings += "\t}\n"
+
+        c_call_extra_args = ""
+        native_fn_args = "long impl_idx"
+        for var in flattened_field_var_conversions:
             if isinstance(var, ConvInfo):
-                out_java += ", " + var.java_ty + " " + var.arg_name
+                native_fn_args += ", " + var.java_ty + " " + var.arg_name
             else:
-                out_java += ", " + var[0] + " " + var[1]
-        out_java += ");\n"
+                native_fn_args += ", long " + var[1]
+        out_typescript_bindings += self.native_meth_decl(struct_name + "_new", "long") + "_native(" + native_fn_args + ");\n"
+        out_typescript_bindings += f"\tpublic static long[] {struct_name}_new({struct_name} impl"
+        for var in flattened_field_var_conversions:
+            if isinstance(var, ConvInfo):
+                out_typescript_bindings += f", {var.java_ty} {var.arg_name}"
+                c_call_extra_args += f", {var.arg_name}"
+            else:
+                out_typescript_bindings += f", long {var[1]}"
+                c_call_extra_args += f", {var[1]}"
+
+
+        out_typescript_bindings += f""") {{
+               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] = {struct_name}_new_native(i{c_call_extra_args});
+               ret[1] = i;
+               return ret;
+       }}
+"""
 
         # Now that we've written out our java code (and created java_meths), generate C
         out_c = "typedef struct " + struct_name + "_JCalls {\n"
-        out_c = out_c + "\tatomic_size_t refcnt;\n"
-        out_c = out_c + "\tJavaVM *vm;\n"
-        out_c = out_c + "\tjweak o;\n"
-        for var in flattened_field_vars:
+        out_c += "\tatomic_size_t refcnt;\n"
+        out_c += "\tuint32_t instance_ptr;\n"
+        for var in flattened_field_var_conversions:
             if isinstance(var, ConvInfo):
                 # We're a regular ol' field
                 pass
             else:
                 # We're a supertrait
                 out_c = out_c + "\t" + var[0] + "_JCalls* " + var[1] + ";\n"
-        for fn in field_fns:
-            if fn.fn_name != "free" and fn.fn_name != "cloned":
-                out_c = out_c + "\tjmethodID " + fn.fn_name + "_meth;\n"
         out_c = out_c + "} " + struct_name + "_JCalls;\n"
 
-        for fn_line in field_fns:
+        for fn_line in field_function_lines:
             if fn_line.fn_name == "free":
                 out_c = out_c + "static void " + struct_name + "_JCalls_free(void* this_arg) {\n"
                 out_c = out_c + "\t" + struct_name + "_JCalls *j_calls = (" + struct_name + "_JCalls*) this_arg;\n"
                 out_c = out_c + "\tif (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {\n"
-                out_c = out_c + "\t\t(*env)->DeleteWeakGlobalRef(env, j_calls->o);\n"
                 out_c = out_c + "\t\tFREE(j_calls);\n"
                 out_c = out_c + "\t}\n}\n"
 
-        for idx, fn_line in enumerate(field_fns):
+        for idx, fn_line in enumerate(field_function_lines):
             if fn_line.fn_name != "free" and fn_line.fn_name != "cloned":
                 assert fn_line.ret_ty_info.ty_info.get_full_rust_ty()[1] == ""
                 out_c = out_c + fn_line.ret_ty_info.ty_info.get_full_rust_ty()[0] + " " + fn_line.fn_name + "_" + struct_name + "_jcall("
@@ -826,87 +905,92 @@ namespace org { namespace ldk { namespace structs {
                         out_c = out_c + arg_info.arg_name
                         out_c = out_c + arg_info.ret_conv[1].replace('\n', '\n\t') + "\n"
 
-                out_c = out_c + "\tjobject obj = (*env)->NewLocalRef(env, j_calls->o);\n\tCHECK(obj != NULL);\n"
+                ty_to_c = lambda jty, ty: "b" if jty == "bool" else "c" if jty == "char" else "s" if jty == "short" else "i" if jty == "int" else "l" if jty == "long" else "void" if jty == "void" else jty
+
+                fn_java_callback_args = ""
+                fn_c_callback_args = ""
+                fn_callback_call_args = ""
+                fn_suffix = ty_to_c(fn_line.ret_ty_info.java_ty, fn_line.ret_ty_info) + "_"
+                idx = 0
+                for arg_info in fn_line.args_ty:
+                    fn_suffix += ty_to_c(arg_info.java_ty, arg_info)
+                    fn_java_callback_args += ", " + arg_info.java_ty + " " + chr(ord("a") + idx)
+                    fn_c_callback_args += ", " + arg_info.c_ty + " " + chr(ord("a") + idx)
+                    if idx != 0:
+                        fn_callback_call_args += ", "
+                    fn_callback_call_args += chr(ord("a") + idx)
+                    idx += 1
                 if fn_line.ret_ty_info.c_ty.endswith("Array"):
-                    out_c = out_c + "\t" + fn_line.ret_ty_info.c_ty + " ret = (*env)->CallObjectMethod(env, obj, j_calls->" + fn_line.fn_name + "_meth"
-                elif fn_line.ret_ty_info.c_ty == "void":
-                    out_c += "\t(*env)->CallVoidMethod(env, obj, j_calls->" + fn_line.fn_name + "_meth"
-                elif fn_line.ret_ty_info.java_hu_ty == "string" or "org/ldk/enums" in fn_line.ret_ty_info.java_fn_ty_arg:
-                    # Manually write out string methods as they're just an Object
-                    out_c += "\t" + fn_line.ret_ty_info.c_ty + " ret = (*env)->CallObjectMethod(env, obj, j_calls->" + fn_line.fn_name + "_meth"
-                elif not fn_line.ret_ty_info.passed_as_ptr:
-                    out_c += "\t" + fn_line.ret_ty_info.c_ty + " ret = (*env)->Call" + fn_line.ret_ty_info.java_ty.title() + "Method(env, obj, j_calls->" + fn_line.fn_name + "_meth"
+                    out_c += "\t" + fn_line.ret_ty_info.c_ty + " ret = (" + fn_line.ret_ty_info.c_ty + ")"
+                    out_c += "js_invoke_function_" + fn_suffix + "(j_calls->instance_ptr, " + str(self.function_ptr_counter)
+                elif fn_line.ret_ty_info.java_ty == "void":
+                    out_c = out_c + "\tjs_invoke_function_" + fn_suffix + "(j_calls->instance_ptr, " + str(self.function_ptr_counter)
+                elif fn_line.ret_ty_info.java_hu_ty == "string":
+                    out_c += "\tjstring ret = (jstring)js_invoke_function_" + fn_suffix + "(j_calls->instance_ptr, " + str(self.function_ptr_counter)
+                elif fn_line.ret_ty_info.arg_conv is None:
+                    out_c += "\treturn js_invoke_function_" + fn_suffix + "(j_calls->instance_ptr, " + str(self.function_ptr_counter)
                 else:
-                    out_c = out_c + "\tuint64_t ret = (*env)->CallLongMethod(env, obj, j_calls->" + fn_line.fn_name + "_meth"
+                    out_c += "\tuint64_t ret = js_invoke_function_" + fn_suffix + "(j_calls->instance_ptr, " + str(self.function_ptr_counter)
+
+                if fn_suffix not in self.function_ptrs:
+                    self.function_ptrs[fn_suffix] = {"args": [fn_java_callback_args, fn_c_callback_args], "ret": [fn_line.ret_ty_info.java_ty, fn_line.ret_ty_info.c_ty]}
+                self.function_ptrs[fn_suffix][self.function_ptr_counter] = (struct_name, fn_line.fn_name, fn_callback_call_args)
+                self.function_ptr_counter += 1
 
                 for idx, arg_info in enumerate(fn_line.args_ty):
                     if arg_info.ret_conv is not None:
-                        out_c = out_c + ", " + arg_info.ret_conv_name
+                        if arg_info.c_ty.endswith("Array"):
+                            out_c += ", (int64_t)" + arg_info.ret_conv_name
+                        else:
+                            out_c += ", " + arg_info.ret_conv_name
                     else:
-                        out_c = out_c + ", " + arg_info.arg_name
+                        assert False # TODO: Would we need some conversion here?
+                        out_c += ", (int64_t)" + arg_info.arg_name
                 out_c = out_c + ");\n"
-
-                out_c += "\tif (UNLIKELY((*env)->ExceptionCheck(env))) {\n"
-                out_c += "\t\t(*env)->ExceptionDescribe(env);\n"
-                out_c += "\t\t(*env)->FatalError(env, \"A call to " + fn_line.fn_name + " in " + struct_name + " from rust threw an exception.\");\n"
-                out_c += "\t}\n"
-
                 if fn_line.ret_ty_info.arg_conv is not None:
-                    out_c += "\t" + fn_line.ret_ty_info.arg_conv.replace("\n", "\n\t") + "\n"
-                    out_c += "\treturn " + fn_line.ret_ty_info.arg_conv_name + ";\n"
-                else:
-                    if not fn_line.ret_ty_info.passed_as_ptr and fn_line.ret_ty_info.c_ty != "void":
-                        out_c += "\treturn ret;\n"
+                    out_c = out_c + "\t" + fn_line.ret_ty_info.arg_conv.replace("\n", "\n\t") + "\n\treturn " + fn_line.ret_ty_info.arg_conv_name + ";\n"
 
                 out_c = out_c + "}\n"
 
-        # If we can, write out a clone function whether we need one or not, as we use them in moving to rust
-        can_clone_with_ptr = True
-        for var in field_vars:
-            if isinstance(var, ConvInfo):
-                can_clone_with_ptr = False
-        if can_clone_with_ptr:
-            out_c = out_c + "static void " + struct_name + "_JCalls_cloned(" + struct_name + "* new_obj) {\n"
-            out_c = out_c + "\t" + struct_name + "_JCalls *j_calls = (" + struct_name + "_JCalls*) new_obj->this_arg;\n"
-            out_c = out_c + "\tatomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);\n"
-            for var in field_vars:
-                if not isinstance(var, ConvInfo):
-                    out_c = out_c + "\tatomic_fetch_add_explicit(&j_calls->" + var[1] + "->refcnt, 1, memory_order_release);\n"
-            out_c = out_c + "}\n"
-
-        out_c = out_c + "static inline " + struct_name + " " + struct_name + "_init (" + self.c_fn_args_pfx + ", jobject o"
-        for var in flattened_field_vars:
+        # Write out a clone function whether we need one or not, as we use them in moving to rust
+        out_c = out_c + "static void " + struct_name + "_JCalls_cloned(" + struct_name + "* new_obj) {\n"
+        out_c = out_c + "\t" + struct_name + "_JCalls *j_calls = (" + struct_name + "_JCalls*) new_obj->this_arg;\n"
+        out_c = out_c + "\tatomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);\n"
+        for var in flattened_field_var_conversions:
+            if not isinstance(var, ConvInfo):
+                out_c = out_c + "\tatomic_fetch_add_explicit(&j_calls->" + var[2].replace(".", "->") + "->refcnt, 1, memory_order_release);\n"
+        out_c = out_c + "}\n"
+
+        out_c = out_c + "static inline " + struct_name + " " + struct_name + "_init (int64_t o"
+        for var in flattened_field_var_conversions:
             if isinstance(var, ConvInfo):
                 out_c = out_c + ", " + var.c_ty + " " + var.arg_name
             else:
-                out_c = out_c + ", jobject " + var[1]
+                out_c = out_c + ", int64_t " + var[1]
         out_c = out_c + ") {\n"
 
-        out_c = out_c + "\tjclass c = (*env)->GetObjectClass(env, o);\n"
-        out_c = out_c + "\tCHECK(c != NULL);\n"
         out_c = out_c + "\t" + struct_name + "_JCalls *calls = MALLOC(sizeof(" + struct_name + "_JCalls), \"" + struct_name + "_JCalls\");\n"
         out_c = out_c + "\tatomic_init(&calls->refcnt, 1);\n"
-        out_c = out_c + "\tDO_ASSERT((*env)->GetJavaVM(env, &calls->vm) == 0);\n"
-        out_c = out_c + "\tcalls->o = (*env)->NewWeakGlobalRef(env, o);\n"
+        out_c = out_c + "\tcalls->instance_ptr = o;\n"
 
         for (fn_name, java_meth_descr) in java_meths:
             if fn_name != "free" and fn_name != "cloned":
                 out_c = out_c + "\tcalls->" + fn_name + "_meth = (*env)->GetMethodID(env, c, \"" + fn_name + "\", \"" + java_meth_descr + "\");\n"
                 out_c = out_c + "\tCHECK(calls->" + fn_name + "_meth != NULL);\n"
 
-        for var in flattened_field_vars:
+        for var in flattened_field_var_conversions:
             if isinstance(var, ConvInfo) and var.arg_conv is not None:
                 out_c = out_c + "\n\t" + var.arg_conv.replace("\n", "\n\t") +"\n"
         out_c = out_c + "\n\t" + struct_name + " ret = {\n"
         out_c = out_c + "\t\t.this_arg = (void*) calls,\n"
-        for fn_line in field_fns:
+        for fn_line in field_function_lines:
             if fn_line.fn_name != "free" and fn_line.fn_name != "cloned":
                 out_c = out_c + "\t\t." + fn_line.fn_name + " = " + fn_line.fn_name + "_" + struct_name + "_jcall,\n"
             elif fn_line.fn_name == "free":
                 out_c = out_c + "\t\t.free = " + struct_name + "_JCalls_free,\n"
             else:
                 out_c = out_c + "\t\t.cloned = " + struct_name + "_JCalls_cloned,\n"
-        for var in field_vars:
+        for var in field_var_conversions:
             if isinstance(var, ConvInfo):
                 if var.arg_conv_name is not None:
                     out_c = out_c + "\t\t." + var.arg_name + " = " + var.arg_conv_name + ",\n"
@@ -915,30 +999,30 @@ namespace org { namespace ldk { namespace structs {
                     out_c = out_c + "\t\t." + var.var_name + " = " + var.var_name + ",\n"
                     out_c = out_c + "\t\t.set_" + var.var_name + " = NULL,\n"
             else:
-                out_c += "\t\t." + var[1] + " = " + var[0] + "_init(env, clz, " + var[1]
+                out_c += "\t\t." + var[1] + " = " + var[0] + "_init(" + var[1]
                 for suparg in var[2]:
                     if isinstance(suparg, ConvInfo):
-                        out_c = out_c + ", " + suparg.arg_name
+                        out_c += ", " + suparg.arg_name
                     else:
-                        out_c = out_c + ", " + suparg[1]
+                        out_c += ", " + suparg[1]
                 out_c += "),\n"
         out_c = out_c + "\t};\n"
-        for var in flattened_field_vars:
+        for var in flattened_field_var_conversions:
             if not isinstance(var, ConvInfo):
-                out_c = out_c + "\tcalls->" + var[1] + " = ret." + var[1] + ".this_arg;\n"
+                out_c = out_c + "\tcalls->" + var[1] + " = ret." + var[2] + ".this_arg;\n"
         out_c = out_c + "\treturn ret;\n"
         out_c = out_c + "}\n"
 
-        out_c += "int64_t " + self.c_fn_name_define_pfx(struct_name + "_new", True) + "jobject o"
-        for var in flattened_field_vars:
+        out_c = out_c + self.c_fn_ty_pfx + "uint64_t " + self.c_fn_name_define_pfx(struct_name + "_new", True) + "int32_t o"
+        for var in flattened_field_var_conversions:
             if isinstance(var, ConvInfo):
                 out_c = out_c + ", " + var.c_ty + " " + var.arg_name
             else:
-                out_c = out_c + ", jobject " + var[1]
+                out_c = out_c + ", int32_t " + var[1]
         out_c = out_c + ") {\n"
         out_c = out_c + "\t" + struct_name + " *res_ptr = MALLOC(sizeof(" + struct_name + "), \"" + struct_name + "\");\n"
-        out_c = out_c + "\t*res_ptr = " + struct_name + "_init(env, clz, o"
-        for var in flattened_field_vars:
+        out_c = out_c + "\t*res_ptr = " + struct_name + "_init(o"
+        for var in flattened_field_var_conversions:
             if isinstance(var, ConvInfo):
                 out_c = out_c + ", " + var.arg_name
             else:
@@ -947,27 +1031,7 @@ namespace org { namespace ldk { namespace structs {
         out_c = out_c + "\treturn tag_ptr(res_ptr, true);\n"
         out_c = out_c + "}\n"
 
-        for var in flattened_field_vars:
-            if not isinstance(var, ConvInfo):
-                out_java_trait += "\n\t/**\n"
-                out_java_trait += "\t * Gets the underlying " + var[1] + ".\n"
-                out_java_trait += "\t */\n"
-                underscore_name = ''.join('_' + c.lower() if c.isupper() else c for c in var[1]).strip('_')
-                out_java_trait += "\tpublic " + var[1] + " get_" + underscore_name + "() {\n"
-                out_java_trait += "\t\t" + var[1] + " res = new " + var[1] + "(null, bindings." + struct_name + "_get_" + var[1] + "(this.ptr));\n"
-                out_java_trait += "\t\tthis.ptrs_to.AddLast(res);\n"
-                out_java_trait += "\t\treturn res;\n"
-                out_java_trait += "\t}\n"
-                out_java_trait += "\n"
-
-                out_java += self.native_meth_decl(struct_name + "_get_" + var[1], "long") + "(long arg);\n"
-
-                out_c += "int64_t " + self.c_fn_name_define_pfx(struct_name + "_get_" + var[1], True) + "int64_t arg) {\n"
-                out_c += "\t" + struct_name + " *inp = (" + struct_name + " *)untag_ptr(arg);\n"
-                out_c += "\treturn tag_ptr(&inp->" + var[1] + ", false);\n"
-                out_c += "}\n"
-
-        return (out_java, out_java_trait, out_c)
+        return (out_typescript_bindings, out_typescript_human, out_c)
 
     def trait_struct_inc_refcnt(self, ty_info):
         base_conv = "\nif (" + ty_info.var_name + "_conv.free == " + ty_info.rust_obj + "_JCalls_free) {\n"
@@ -1031,7 +1095,7 @@ namespace org { namespace ldk { namespace structs {
                 fn_name = f"{struct_name}_{var.var_name}_get_{field_map.arg_name}"
                 out_c += self.c_fn_ty_pfx + field_map.c_ty + self.c_fn_name_define_pfx(fn_name, True) + self.ptr_c_ty + " ptr) {\n"
                 out_c += "\t" + struct_name + " *obj = (" + struct_name + "*)untag_ptr(ptr);\n"
-                out_c += f"\tassert(obj->tag == {struct_name}_{var.var_name});\n"
+                out_c += f"\tCHECK(obj->tag == {struct_name}_{var.var_name});\n"
                 if field_map.ret_conv is not None:
                     out_c += ("\t" + field_map.ret_conv[0].replace("\n", "\n\t"))
                     if var.tuple_variant:
@@ -1123,7 +1187,6 @@ namespace org { namespace ldk { namespace structs {
         return java_hu_struct
 
     def map_function(self, argument_types, c_call_string, method_name, meth_n, return_type_info, struct_meth, default_constructor_args, takes_self, takes_self_as_ref, args_known, type_mapping_generator, doc_comment):
-        arg_name_repl = lambda s, arg_name: s.replace(arg_name, "_" + arg_name) if arg_name == "lock" or arg_name == "event" or arg_name == "params" else s
         out_java = ""
         out_c = ""
         out_java_struct = None
@@ -1141,8 +1204,6 @@ namespace org { namespace ldk { namespace structs {
                 out_c += (", ")
             if arg_conv_info.c_ty != "void":
                 out_c += (arg_conv_info.c_ty + " " + arg_conv_info.arg_name)
-                if "[]" in arg_conv_info.java_ty:
-                    out_java += "[MarshalAs(UnmanagedType.CustomMarshaler, MarshalType=\"org.ldk.impl.ArrayCoder\")] "
                 out_java += (arg_conv_info.java_ty + " _" + arg_conv_info.arg_name) # Add a _ to avoid using reserved words
 
         out_java_struct = ""
@@ -1320,4 +1381,54 @@ namespace org { namespace ldk { namespace structs {
         return (out_java, out_c, out_java_struct + extra_java_struct_out)
 
     def cleanup(self):
-        pass
+        with open(self.outdir + "src/org/ldk/impl/bindings.cs", "a") as bindings:
+            for fn_suffix in self.function_ptrs:
+                jret = self.function_ptrs[fn_suffix]["ret"][0]
+                jargs = self.function_ptrs[fn_suffix]["args"][0]
+
+                bindings.write(f"""
+       static {jret} c_callback_{fn_suffix}(int obj_ptr, int fn_id{jargs}) {{
+               if (obj_ptr >= js_objs.Count) {{
+                       Console.Error.WriteLine("Got function call on unknown/free'd JS object in {fn_suffix}");
+                       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 {fn_suffix}");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }}
+""")
+                bindings.write("\t\tswitch (fn_id) {\n")
+                for f in self.function_ptrs[fn_suffix]:
+                    if f != "ret" and f != "args" and f != "call":
+                        bindings.write(f"""\t\t\tcase {str(f)}:
+                               if (!(obj is {self.function_ptrs[fn_suffix][f][0]})) {{
+                                       Console.Error.WriteLine("Got function call to object that wasn't a {self.function_ptrs[fn_suffix][f][0]} in {fn_suffix}");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }}\n""")
+                        call = f"(({self.function_ptrs[fn_suffix][f][0]})obj).{self.function_ptrs[fn_suffix][f][1]}({self.function_ptrs[fn_suffix][f][2]});"
+                        if jret != "void":
+                            bindings.write("\t\t\t\treturn " + call)
+                        else:
+                            bindings.write("\t\t\t\t" + call + "\n\t\t\t\treturn;")
+                        bindings.write("\n")
+
+                bindings.write(f"""\t\t\tdefault:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in {fn_suffix}");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return{" false" if jret == "bool" else " 0" if jret != "void" else ""};
+               }}
+       }}
+       public delegate {jret} {fn_suffix}_callback(int obj_ptr, int fn_id{jargs});
+""")
+                bindings.write(self.native_meth_decl(f"register_{fn_suffix}_invoker", "int") + f"({fn_suffix}_callback callee);\n")
+                # Easiest way to get a static run is just define a variable, even if we dont care
+                bindings.write(f"\tstatic int _run_{fn_suffix}_registration = register_{fn_suffix}_invoker(c_callback_{fn_suffix});")
+
+            bindings.write("""
+}
+} } }""")
index e1d5c9d93a629c42cd281707ddd24dc90072881c..c4a1b270edd68be57433106cb9054bf3a8a64b66 100755 (executable)
@@ -31,6 +31,8 @@ if [ "$TARGET_STRING" = "" ]; then
 fi
 
 IS_MAC=false
+IS_WIN=false
+
 [ "$($CC --version | grep apple-darwin)" != "" ] && IS_MAC=true
 IS_APPLE_CLANG=false
 [ "$($CC --version | grep "Apple clang version")" != "" ] && IS_APPLE_CLANG=true
@@ -38,19 +40,28 @@ IS_APPLE_CLANG=false
 case "$TARGET_STRING" in
        "x86_64-pc-linux"*)
                LDK_TARGET_SUFFIX="_Linux-amd64"
+               CS_PLATFORM_NAME="linux-x64"
                LDK_JAR_TARGET=true
                ;;
        "x86_64-apple-darwin"*)
                LDK_TARGET_SUFFIX="_MacOSX-x86_64"
+               CS_PLATFORM_NAME="osx-x64"
                LDK_JAR_TARGET=true
                IS_MAC=true
                ;;
        "aarch64-apple-darwin"*)
                LDK_TARGET_CPU="apple-a14"
                LDK_TARGET_SUFFIX="_MacOSX-aarch64"
+               CS_PLATFORM_NAME="osx-arm64"
                LDK_JAR_TARGET=true
                IS_MAC=true
                ;;
+       "x86_64-pc-windows"*)
+               LDK_TARGET_SUFFIX="_Win-amd64"
+               CS_PLATFORM_NAME="win-x64"
+               LDK_JAR_TARGET=true
+               IS_WIN=true
+               ;;
        *)
                LDK_TARGET_SUFFIX="_${TARGET_STRING}"
 esac
@@ -108,30 +119,65 @@ if [ "$2" = "c_sharp" ]; then
        IS_APPLE_CLANG=false
        [ "$($CC --version | grep "Apple clang version")" != "" ] && IS_APPLE_CLANG=true
 
+       if is_gnu_sed; then
+               sed -i "s/<version>.*<\/version>/<version>${LDK_GARBAGECOLLECTED_GIT_OVERRIDE:1:100}<\/version>/g" c_sharp/packaging_artifacts/org.ldk.nuspec
+               sed -i "s/<version>.*<\/version>/<version>${LDK_GARBAGECOLLECTED_GIT_OVERRIDE:1:100}<\/version>/g" c_sharp/packaging_artifacts/package/services/metadata/core-properties/ldk.psmdcp
+       else
+               # OSX sed is for some reason not compatible with GNU sed
+               sed -i '' "s/<version>.*<\/version>/<version>${LDK_GARBAGECOLLECTED_GIT_OVERRIDE:1:100}<\/version>/g" c_sharp/packaging_artifacts/org.ldk.nuspec
+               sed -i '' "s/<version>.*<\/version>/<version>${LDK_GARBAGECOLLECTED_GIT_OVERRIDE:1:100}<\/version>/g" c_sharp/packaging_artifacts/package/services/metadata/core-properties/ldk.psmdcp
+       fi
+
        # Compiling C# bindings with Mono
-       MONO_COMPILE="-out:csharpldk.dll -langversion:3 -t:library c_sharp/src/org/ldk/enums/*.cs c_sharp/src/org/ldk/impl/*.cs c_sharp/src/org/ldk/util/*.cs c_sharp/src/org/ldk/structs/*.cs"
+       MONO_COMPILE="-out:csharpldk.dll -langversion:3 -t:library -unsafe c_sharp/src/org/ldk/enums/*.cs c_sharp/src/org/ldk/impl/*.cs c_sharp/src/org/ldk/util/*.cs c_sharp/src/org/ldk/structs/*.cs"
        if [ "$3" = "true" ]; then
-               mono-csc $MONO_COMPILE
+               mono-csc -g $MONO_COMPILE
        else
-               mono-csc -o $MONO_COMPILE
+               mono-csc -optimize+ $MONO_COMPILE
        fi
 
        echo "Building C# bindings..."
-       COMPILE="$COMMON_COMPILE -Isrc/main/jni -pthread -fPIC"
-       LINK="-ldl -shared"
+       COMPILE="$COMMON_COMPILE -pthread -fPIC"
+       LINK="-shared"
+       [ "$IS_WIN" = "false" ] && LINK="$LINK -ldl"
        [ "$IS_MAC" = "false" ] && LINK="$LINK -Wl,--no-undefined"
        [ "$IS_MAC" = "true" ] && COMPILE="$COMPILE -mmacosx-version-min=10.9"
        [ "$IS_MAC" = "true" -a "$IS_APPLE_CLANG" = "false" ] && LINK="$LINK -fuse-ld=lld"
        [ "$IS_MAC" = "true" -a "$IS_APPLE_CLANG" = "false" ] && echo "WARNING: Need at least upstream clang 13!"
        [ "$IS_MAC" = "false" -a "$3" != "false" ] && LINK="$LINK -Wl,-wrap,calloc -Wl,-wrap,realloc -Wl,-wrap,malloc -Wl,-wrap,free"
 
-       exit 0 # Sadly compilation doesn't currently work
        if [ "$3" = "true" ]; then
-               $COMPILE $LINK -o liblightningjni_debug$LDK_TARGET_SUFFIX.so -g -fsanitize=address -shared-libasan -rdynamic -I"$1"/lightning-c-bindings/include/ $2 c_sharp/bindings.c "$1"/lightning-c-bindings/target/$LDK_TARGET/debug/libldk.a -lm
+               $COMPILE $LINK -o libldkcsharp_debug$LDK_TARGET_SUFFIX.so -g -fsanitize=address -shared-libasan -rdynamic -I"$1"/lightning-c-bindings/include/ c_sharp/bindings.c "$1"/lightning-c-bindings/target/$LDK_TARGET/debug/libldk.a -lm
        else
-               $COMPILE -o bindings.o -c -flto -O3 -I"$1"/lightning-c-bindings/include/ $2 c_sharp/bindings.c
-               $COMPILE $LINK -o liblightningjni_release$LDK_TARGET_SUFFIX.so -flto -O3 -Wl,--lto-O3 -Wl,-O3 -Wl,--version-script=c_sharp/libcode.version -I"$1"/lightning-c-bindings/include/ $2 bindings.o "$1"/lightning-c-bindings/target/$LDK_TARGET/release/libldk.a -lm
-               [ "$IS_APPLE_CLANG" != "true" ] && llvm-strip liblightningjni_release$LDK_TARGET_SUFFIX.so
+               [ "$IS_APPLE_CLANG" = "false" ] && LINK="$LINK -flto -Wl,-O3 -fuse-ld=lld"
+               [ "$IS_APPLE_CLANG" = "false" ] && COMPILE="$COMPILE -flto"
+               [ "$IS_MAC" = "false" ] && LINK="$LINK -Wl,--no-undefined"
+               [ "$IS_WIN" = "false" ] && LINK="$LINK -Wl,--lto-O3"
+               [ "$IS_WIN" = "true" ] && LINK="$LINK --target=x86_64-pc-windows-gnu -L/usr/lib/gcc/x86_64-w64-mingw32/12-win32/ -lbcrypt -static-libgcc"
+               [ "$IS_WIN" = "true" ] && COMPILE="$COMPILE --target=x86_64-pc-windows-gnu"
+               LDK_LIB="$1"/lightning-c-bindings/target/$LDK_TARGET/release/libldk.a
+               if [ "$IS_MAC" = "false" -a "$IS_WIN" = "false" -a "$4" = "false" ]; then
+                       LINK="$LINK -Wl,--version-script=c_sharp/libcode.version"
+               fi
+
+               $COMPILE -o bindings.o -c -O3 -I"$1"/lightning-c-bindings/include/ c_sharp/bindings.c
+               $COMPILE $LINK -o libldkcsharp_release$LDK_TARGET_SUFFIX.so -O3 bindings.o $LDK_LIB -lm
+               [ "$IS_APPLE_CLANG" != "true" ] && llvm-strip libldkcsharp_release$LDK_TARGET_SUFFIX.so
+
+               if [ "$LDK_JAR_TARGET" = "true" ]; then
+                       # Copy resulting native binary for inclusion in release nuget zip
+                       mkdir -p c_sharp/packaging_artifacts/lib/net3.0/
+                       cp csharpldk.dll c_sharp/packaging_artifacts/lib/net3.0/
+
+                       mkdir -p c_sharp/packaging_artifacts/runtimes/"$CS_PLATFORM_NAME"/native/
+                       if [ "$IS_WIN" = "true" ]; then
+                               cp libldkcsharp_release$LDK_TARGET_SUFFIX.so c_sharp/packaging_artifacts/runtimes/"$CS_PLATFORM_NAME"/native/ldkcsharp.dll
+                       elif [ "$IS_MAC" = "true" ]; then
+                               cp libldkcsharp_release$LDK_TARGET_SUFFIX.so c_sharp/packaging_artifacts/runtimes/"$CS_PLATFORM_NAME"/native/libldkcsharp.dylib
+                       else
+                               cp libldkcsharp_release$LDK_TARGET_SUFFIX.so c_sharp/packaging_artifacts/runtimes/"$CS_PLATFORM_NAME"/native/libldkcsharp.so
+                       fi
+               fi
        fi
 elif [ "$2" = "python" ]; then
        echo "Creating Python bindings..."
@@ -264,7 +310,8 @@ else
 
        echo "Building Java bindings..."
        COMPILE="$COMMON_COMPILE -Isrc/main/jni -pthread -fPIC"
-       LINK="-ldl -shared"
+       LINK="-shared"
+       [ "$IS_WIN" = "false" ] && LINK="$LINK -ldl"
        [ "$IS_MAC" = "false" ] && LINK="$LINK -Wl,--no-undefined"
        [ "$IS_MAC" = "true" ] && COMPILE="$COMPILE -mmacosx-version-min=10.9"
        [ "$IS_MAC" = "true" -a "$IS_APPLE_CLANG" = "false" ] && LINK="$LINK -fuse-ld=lld"
@@ -273,16 +320,18 @@ else
        if [ "$3" = "true" ]; then
                $COMPILE $LINK -o liblightningjni_debug$LDK_TARGET_SUFFIX.so -g -fsanitize=address -shared-libasan -rdynamic -I"$1"/lightning-c-bindings/include/ $2 src/main/jni/bindings.c "$1"/lightning-c-bindings/target/$LDK_TARGET/debug/libldk.a -lm
        else
-               [ "$IS_MAC" = "false" ] && LINK="$LINK -Wl,--no-undefined -flto -Wl,-O3 -Wl,--lto-O3"
-               [ "$IS_MAC" = "false" ] && COMPILE="$COMPILE -flto"
-               [ "$IS_MAC" = "true" -a "$IS_APPLE_CLANG" = "false" ] && LINK="$LINK -flto -Wl,-O3 -Wl,--lto-O3"
-               [ "$IS_MAC" = "true" -a "$IS_APPLE_CLANG" = "false" ] && COMPILE="$COMPILE -flto"
+               [ "$IS_APPLE_CLANG" = "false" ] && LINK="$LINK -flto -Wl,-O3 -fuse-ld=lld"
+               [ "$IS_APPLE_CLANG" = "false" ] && COMPILE="$COMPILE -flto"
+               [ "$IS_MAC" = "false" ] && LINK="$LINK -Wl,--no-undefined"
+               [ "$IS_WIN" = "false" ] && LINK="$LINK -Wl,--lto-O3"
+               [ "$IS_WIN" = "true" ] && LINK="$LINK -L/usr/lib/gcc/x86_64-w64-mingw32/12-win32/ -lbcrypt"
                LDK_LIB="$1"/lightning-c-bindings/target/$LDK_TARGET/release/libldk.a
-               if [ "$IS_MAC" = "false" -a "$4" = "false" ]; then
-                       LINK="$LINK -Wl,--version-script=libcode.version -fuse-ld=lld"
+               if [ "$IS_MAC" = "false" -a "$IS_WIN" = "false" -a "$4" = "false" ]; then
+                       LINK="$LINK -Wl,--version-script=c_sharp/libcode.version"
                fi
+
                $COMPILE -o bindings.o -c -O3 -I"$1"/lightning-c-bindings/include/ $2 src/main/jni/bindings.c
-               $COMPILE $LINK -o liblightningjni_release$LDK_TARGET_SUFFIX.so -O3 -I"$1"/lightning-c-bindings/include/ $2 bindings.o $LDK_LIB -lm
+               $COMPILE $LINK -o liblightningjni_release$LDK_TARGET_SUFFIX.so -O3 $2 bindings.o $LDK_LIB -lm
                [ "$IS_APPLE_CLANG" != "true" ] && llvm-strip liblightningjni_release$LDK_TARGET_SUFFIX.so
                if [ "$LDK_JAR_TARGET" = "true" ]; then
                        # Copy to JNI native directory for inclusion in JARs